Értem, hát elkezdtem tesztelni igaz kivettem a GetPlayerName eljárást de így érdekes módon az strcmp már hamis eredményt adott vissza abban az esetben ha üres karakterlánccal lett összehasonlítva, szóval el se jutottam az strfind részhez:
#include <a_samp>
#define GetPlayerName(%0,%1,%2) macskasszendvics = GetName[%0]
new
GetName[MAX_PLAYERS][128];
public
OnFilterScriptInit()
{
GetName[0] = \"Vaami\";
GetName[1] = \"mi\";
GetName[2] = \"i\";
GetName[3] = \"mi\";
GetName[4] = \"ami\";
GetName[5] = \"Valami\";
GetName[6] = \"alami\";
printf(\"\\n\\n\\nGetPlayerID: %d\\n\\n\\n\", GetPlayerID(\"Val\", 1));
return 1;
}
stock GetPlayerID(const sprintvan[], demar=0)
{
new macskasszendvics[128];
for(new i = 0; i < MAX_PLAYERS; i++)
{
printf(\"strcmp elõtt: %s <-> %s = %d\", macskasszendvics, sprintvan, i);
GetPlayerName(i, macskasszendvics, sizeof(macskasszendvics));
if(strcmp(macskasszendvics, sprintvan, true) == 0)
{
printf(\"strcmp után: %s <-> %s = %d\", macskasszendvics, sprintvan, i);
return i;
}
}
new sajtkukac = -1;
new kutyasmacska[128];
new nefurgyele = -1;
if(demar)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
GetPlayerName(i, kutyasmacska ,sizeof(kutyasmacska));
if(!strfind(kutyasmacska, macskasszendvics[demar], true, 0))
nefurgyele++, sajtkukac=i;
if(nefurgyele > 0) return -2;
}
}
return sajtkukac;
}
strcmp elõtt: <-> Val = 0
strcmp elõtt: Vaami <-> Val = 1
strcmp elõtt: mi <-> Val = 2
strcmp elõtt: i <-> Val = 3
strcmp elõtt: mi <-> Val = 4
strcmp elõtt: ami <-> Val = 5
strcmp elõtt: Valami <-> Val = 6
strcmp elõtt: alami <-> Val = 7
strcmp után: <-> Val = 7
GetPlayerID: 7
[/quote]
Ez az elsõ része annak hogy az IsPlayerConnected használata szükséges. :D
Most megnézem az strfind részét is.
Edit: Nem is vizsgálom tovább mivel az strfind résznél:
if(!strfind(kutyasmacska, macskasszendvics[demar], true, 0))
Nem látom az eredeti keresett szövegrészhez tartozó változó használatát (sprintvan). Így igazából nem értem hogy miként került át a macskasszendvics[demar] változóba a keresett kifejezés mivel semmi erre utaló eljárással nem találkoztam elõtte. Amúgy ez a változó macskasszendvics[demar] a legutolsónak csatlakozott játékos nevét tárolná, persze azt is csak akkor ha használva lenne az IsPlayerConnected.
Ezért szerintem vizsgáld át újra a kódod és ha tényleg megfelelõen mûködik azután postold ki a fórumra.
De minek eddig bonyolítani?
stock GetPlayerID(pname[])
{
new i;
sscanf(pname, \"u\", i);
return i;
}
Tudtam hogy valamit kiteszek, csak mert szeretném megosztani veletek, máris rossz lesz. Király. Akk 1 mod törölje a témát a p*ba. :)
Itt nem azzal van a gond, hogy te kiraktad, hanem az, hogy ha valaki olyan ember ír ide, aki ért a scripteléshez, egy olyan építõ jellegû kritikát, ami feljavítaná a kódod, te azt már egybõl sértésnek veszed... Illetve értelmét se látom ezt használni, mivel ha valaki visszaakarja keresni egy játékos IDjét, ott van az SSCANF. Illetve azt sem értem, minek ezt a kódot túl bonyolítani. Nem értem minek kell elõször strcmpvel végig futni egy neven, majd azt megtenni strfindel is (persze ha igaz az érték). Mindegy lenne, ha egész végig strfinddal ellenõriznéd végig a játékos neveket.
Rövidített:
stock GetPlayerID(const nev[])
{
new i = -1,
d[MAX_PLAYER_NAME];
for(;++i < MAX_PLAYERS;)
if(IsPlayerConnected(i) && (strfind((GetPlayerName(i, d, MAX_PLAYER_NAME), d), nev) != -1))
return i;
return INVALID_PLAYER_ID;
}
Tudtam hogy valamit kiteszek, csak mert szeretném megosztani veletek, máris rossz lesz. Király. Akk 1 mod törölje a témát a p*ba. :)
Itt nem azzal van a gond, hogy te kiraktad, hanem az, hogy ha valaki olyan ember ír ide, aki ért a scripteléshez, egy olyan építõ jellegû kritikát, ami feljavítaná a kódod, te azt már egybõl sértésnek veszed... Illetve értelmét se látom ezt használni, mivel ha valaki visszaakarja keresni egy játékos IDjét, ott van az SSCANF. Illetve azt sem értem, minek ezt a kódot túl bonyolítani. Nem értem minek kell elõször strcmpvel végig futni egy neven, majd azt megtenni strfindel is (persze ha igaz az érték). Mindegy lenne, ha egész végig strfinddal ellenõriznéd végig a játékos neveket.
Rövidített:
stock GetPlayerID(const nev[])
{
new i = -1,
d[MAX_PLAYER_NAME];
for(;++i < MAX_PLAYERS;)
if(IsPlayerConnected(i) && (strfind((GetPlayerName(i, d, MAX_PLAYER_NAME), d), nev) != -1))
return i;
return INVALID_PLAYER_ID;
}
[/quote]
És ha két ilyen játékos van:
Sajtoscsokis
Sajtoscsokiska
Akkor Sajtoscsokiskát is beleszámolja, mivel benne van a sajtoscsokis, és azt észleli az strfind..
Valóban, csakhogy ha Sajtoscsokiskának kisebb az id-je vele fog elõször visszatérni és nem sajtoscsokissal, akik keresünk.
Így van mivel a for ciklus 0 tól indul el tehát a legkisebb id-vel rendelkezõ játékost ellenõrzi és ahol egyezést talál azzal tér vissza, erre már sokan próbáltak megoldást találni de az újabb sscanf pluginban már van olyan visszatérési értéke a sscanf-nek ami jelzi hogy több esetleges találat is létezik.
0) Y_Less
1) [CLAN]Y_Less
2) Jake
3) Alex
4) Hass
This code:
pawn Code:
new ids[3], i;
if (sscanf(\"Le\", \"?<MATCH_NAME_PARTIAL=1>u[3]\", ids)) printf(\"Error in input\");
for (i = 0; ids != INVALID_PLAYER_ID; ++i)
{
if (ids == cellmin)
{
printf(\"Too many matches\");
break;
}
printf(\"id = %d\", ids);
}
if (i == 0) printf(\"No matching players found.\");
[/quote]
Így fel lehet sorolni azokat a játékosokat akiknek a nevükben egyezés található a keresett kifejezésre.
Persze meg kell határozni mennyi találattal térjen vissza new ids[3] ezt az értéket növelhetjük, persze a keresett név részletet is legalább minimum 3 karakternyire határozzuk meg valóban kevesebb az esélye hogy 3-nál több egyezõ találatot kapunk.