Szerző Téma: A 3. feltétel nem fut le  (Megtekintve 1730 alkalommal)

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Dátum: 2011. augusztus 10. - 02:19:56 »
0 Show voters
üdv
Hol a hiba az alábbi példa szkriptben?
Az a bajom, hogy a 3. feltétel nem hajtódik végre. A pawn nem ír hibát. Ha az elsõ 2 pickupra rámegyek, végrehajtódik aminek kellene, de a 3.-nál nem. A 2.nál nincs belsõ feltételvizsgálat.
[pawn]public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid == pickup1)
{
   if(Work[playerid] == 1)
   SendClientMessage(playerid,0x800080AA,\"Felvetted az 1-est!\");
}
    else
     if(pickupid == pickup2)
{
           SendClientMessage(playerid,0x800080AA,\"Felvetted az 2-est!\");
}
else
    if(pickupid == pickup3)  // Ez a vizsgálat nem fut le
{
   if(Work[playerid] == 3)
           SendClientMessage(playerid,0x800080AA,\"Felvetted az 3-ast!\");  // nem hajtódik végre
}
return 1;
}[/pawn]

herban

  • Vendég
A 3. feltétel nem fut le
« Válasz #1 Dátum: 2011. augusztus 10. - 02:38:57 »
0 Show voters
Talán így:
[pawn]public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid == pickup1)
{
   if(Work[playerid] == 1)
   SendClientMessage(playerid,0x800080AA,\"Felvetted az 1-est!\");
}
    else if(pickupid == pickup2)
{
           SendClientMessage(playerid,0x800080AA,\"Felvetted az 2-est!\");
}
else if(pickupid == pickup3)  // Ez a vizsgálat nem fut le
{
   if(Work[playerid] == 3)
           SendClientMessage(playerid,0x800080AA,\"Felvetted az 3-ast!\");  // nem hajtódik végre
}
return 1;
}
[/pawn]

A 3. feltétel nem fut le
« Válasz #2 Dátum: 2011. augusztus 10. - 09:39:36 »
0 Show voters
Csakis ennek a változónak az értéknövelésénél keresd a hibát,
[pawn]
Work[playerid]
[/pawn]
 mivel gondolom a pickupok jók ezért egy teszt erejéig próbáld ki így:
[pawn]
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid == pickup1)
{
   SendClientMessage(playerid,0x800080AA,\"Felvetted az 1-est!\");
}
else if(pickupid == pickup2)
{
   SendClientMessage(playerid,0x800080AA,\"Felvetted az 2-est!\");
}
else if(pickupid == pickup3)
{
   SendClientMessage(playerid,0x800080AA,\"Felvetted az 3-ast!\");
}
return 1;
}
[/pawn]

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #3 Dátum: 2011. augusztus 10. - 15:23:10 »
0 Show voters
Idézetet írta: herban date=1312936737\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10311\" data-ipsquote-contentclass=\"forums_Topic
Talán így:
 
Szerintem tökmindegy, hogy az else if-et 1 vagy 2 sorba írom. Más változást nem látok abban amit írtál.

Dupla hozzászólás automatikusan összefûzve. ( 2011. augusztus 10. - 15:26:31 )


Csakis ennek a változónak az értéknövelésénél keresd a hibát,
[pawn]
Work[playerid]
[/pawn]
 mivel gondolom a pickupok jók ezért egy teszt erejéig próbáld ki így:
 
[/quote]
Az csak egy példa, de amikor a 3. vizsgálatnál a belsõ feltételt if(Work[playerid] == 3)  kivettem, akkor sem hajtódott végre az utasítás. Tehát valahol a return van rossz helyen, vagy az egész szerkezete nem jó.
« Utoljára szerkesztve: 2011. augusztus 10. - 15:29:27 írta Zsox »

A 3. feltétel nem fut le
« Válasz #4 Dátum: 2011. augusztus 10. - 16:08:31 »
+1 Show voters
Lehet nem is azzal a pickupot veszed fel játékban amit a \"pickup3\" takar, a lényeg hogy nem az else if szerkezet a hiba oka.
Itt csak az lehet hogy te nem veszed észre mit vétettél el, és hamis következtetéseket vonsz le.
Tesztelj újból nézd meg a pickupok koordinátáit tényleg azok-e amiknek lennie kell.
A pawn eléggé megbízható program nyelv itt olyasmikre nem mûködik megfelelõen mint:
[pawn]
if(20 > t < 100)
[/pawn]
Vagy lebegõpontos visszatéréses vizsgálat.
[pawn]
stock heal(playerid)
{
    new Float:health;
    GetPlayerHealth(playerid, health);
    return _:health;
}
if(heal(playerid) < 50)
[/pawn]
De ezekkel lehet csak össze zavarlak és arra véled a dolgot hogy nem jó az else if szerkezet akkor próbáld a switch case párost:
[pawn]
public OnPlayerPickUpPickup(playerid, pickupid)
{
switch(pickupid)
{
   case pickup1:
   {
      SendClientMessage(playerid,0x800080AA,\"Felvetted az 1-est!\");
   }
   case pickup2:
   {
      SendClientMessage(playerid,0x800080AA,\"Felvetted az 2-est!\");
   }
   case pickup3:
   {
      SendClientMessage(playerid,0x800080AA,\"Felvetted az 3-ast!\");
   }
}
return 1;
}
[/pawn]
Több ötletem nincs, ebben a témában, másnak tökéletesen mûködik.

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #5 Dátum: 2011. augusztus 10. - 18:24:26 »
0 Show voters
Idézetet írta: Zsolesszka date=1312985311\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10311\" data-ipsquote-contentclass=\"forums_Topic
De ezekkel lehet csak össze zavarlak és arra véled a dolgot hogy nem jó az else if szerkezet akkor próbáld a switch case párost:
[pawn]
public OnPlayerPickUpPickup(playerid, pickupid)
{
switch(pickupid)
{
   case pickup1:
   {
      SendClientMessage(playerid,0x800080AA,\"Felvetted az 1-est!\");
   }
   case pickup2:
   {
      SendClientMessage(playerid,0x800080AA,\"Felvetted az 2-est!\");
   }
   case pickup3:
   {
      SendClientMessage(playerid,0x800080AA,\"Felvetted az 3-ast!\");
   }
}
return 1;
}
[/pawn]
Több ötletem nincs, ebben a témában, másnak tökéletesen mûködik.
 
A case sorokra ezt a hibát írja:
error 008: must be a constant expression; assumed zero
Egyébként kipróbáltam egy külön FS-ben, más koordinátákkal a 3 pickupot és úgy tényleg mûködik. Szóval ötletem sincs hol romlik el nálam.

A 3. feltétel nem fut le
« Válasz #6 Dátum: 2011. augusztus 10. - 19:22:58 »
0 Show voters
Uh bocsánat tényleg a switch csak konstans értékekhez használható (elõre megadott fix értékekhez). Ez van mikor nem próbálom átfordítani csak beírom ide.
Pedig vagy a koordináták lehetnek a hibásak, vagy nézd meg az összes részt a pickup3 kifejezésre, hátha valahol más értéket kap és nem a megfelelõ pickupid-t (azonosító számot) tárolja.
« Utoljára szerkesztve: 2011. augusztus 10. - 19:25:25 írta Zsolesszka »

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #7 Dátum: 2011. augusztus 10. - 20:44:04 »
0 Show voters
Nem tudom mit csináltam vele, ??? de most mûködik.
Viszont további rejtélyes dolog: van a szerveren egy fegyver drop FS. Ha a fenti pickupos FS-ben amivel problémám volt, beírok egy bizonyos parancsot, ami törli a 3. (eddig problémás) pickupot DestroyPickup-pal, ÉS rámegyek egy ezután eldobott Brass Knuckles-re (331-es kód, a boxer), akkor végrehajtódik a 3. (imént törölt) pickup aktiválásánál lévõ utasítás. Tehát a 331-es fegyvert úgy veszi, mintha az a pickup3 lenne, és kiírja a pickup3-hoz tartozó szöveget.
Fordított sorrendben viszont, tehát ha a 331-es dropja UTÁN törlöm a pickup3-at, akkor ez nem történik meg.
Nem értem, hogy akadhat így össze 2 filterscript. Egyébként a pickup3 nevét már többször átírtam másra, szóval nem a változónevekkel lehet a gond.

A 3. feltétel nem fut le
« Válasz #8 Dátum: 2011. augusztus 10. - 22:41:56 »
+1 Show voters
Ebben semmi furcsaság nincs.
Ha te létrehozol egy pickupot annak lesz egy azonosító száma ami 0-tól kezdõdik.
[pawn]
#include <a_samp>
new pickup0, pickup1, pickup2, pickup3;
public OnGameModeInit()
{   
pickup0 = CreatePickup(1242, 2, 1503.3359, 1432.3585, 10.1191, -1); // Legelsõ pickup azonosító szám 0
pickup1 = CreatePickup(1242, 2, 1503.3359, 1432.3585+10, 10.1191, -1); // Következõ 1
pickup2 = CreatePickup(1242, 2, 1503.3359, 1432.3585+20, 10.1191, -1);
pickup3 = CreatePickup(1242, 2, 1503.3359, 1432.3585+30, 10.1191, -1);
return 1;
}
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickup0 == pickupid) SendClientMessage(playerid,0x800080AA,\"Felvetted a 0-t!\");
else if(pickup1 == pickupid) SendClientMessage(playerid,0x800080AA,\"Felvetted az 1-est!\");
else if(pickup2 == pickupid) SendClientMessage(playerid,0x800080AA,\"Felvetted az 2-est!\");
else if(pickup3 == pickupid) SendClientMessage(playerid,0x800080AA,\"Felvetted az 3-ast!\");
return 1;
}
[/pawn]
és te törölsz belõlük egyet mondjuk a 3 azonosító számmal rendelkezõt (pickup3), majd létrehozol egyet akkor az a 3-as azonosító számot fogja megkapni, és ezért megfog jelenni az üzenet, az újonnan létrehozott pickupnál.
Ezeknek és szinte mindennek az indexelése ugyanúgy történik mint a játékosoknak ha kilép egy játékos akkor felszabadul egy slot, aki következõleg csatlakozik az a legkisebb üres slot értéket fogja kapni.
Pl.: a szerveren lévõ playerid értékek ezek: 0,1,3,7,8
aki következõleg csatlakozik az a 2-es azonosítószámot fogja kapni. (természetesen közben mindenki online marad),
aki utána csatlakozik az pedig 4-es index értéket kapja.
Ugyanez az elv érvényes szinte mindenhol SA-MP -nél.
És emiatt nincs furcsaság két filterscript között se a dolgok indexelése ugyanaz, mindegy melyik scriptben van létrehozva.
Röviden ne törölj olyan pickupot amihez társítasz valami dolgot az OnPlayerPickUpPickup alatt.
« Utoljára szerkesztve: 2011. augusztus 10. - 22:45:21 írta Zsolesszka »

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #9 Dátum: 2011. augusztus 11. - 01:04:58 »
0 Show voters
Idézetet írta: Zsolesszka date=1313008916\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10311\" data-ipsquote-contentclass=\"forums_Topic
Ebben semmi furcsaság nincs.
Ha te létrehozol egy pickupot annak lesz egy azonosító száma ami 0-tól kezdõdik.
és te törölsz belõlük egyet mondjuk a 3 azonosító számmal rendelkezõt (pickup3), majd létrehozol egyet akkor az a 3-as azonosító számot fogja megkapni, és ezért megfog jelenni az üzenet, az újonnan létrehozott pickupnál.
Röviden ne törölj olyan pickupot amihez társítasz valami dolgot az OnPlayerPickUpPickup alatt.
 
Na, ezt se tudtam.  :o
De hát azért néha szükség lehet rá, hogy töröljünk pickupokat, fõleg olyat amihez valami társítva van OnPlayerPickUpPickup-pal.

Nem elérhető Epsilon

  • 1854
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #10 Dátum: 2011. augusztus 11. - 07:24:50 »
0 Show voters
[pawn]new bool: pCreated[ MAX_PICKUPS ] = false;
stock _CreatePickup(model, type, Float:X, Float:Y, Float:Z, virtualworld = 0)
{
new id = CreatePickup(model, type, X,Y, Z, virtualworld );
bCreated[id] = true;
return id;
}
stock _DestroyPickup(p)
return bCreated[p] = false, DestroyPickup(p);
#define CreatePickup _CreatePickup
#define DestroyPickup _DestroyPickup[/pawn]
Ezt tedd a szkripted elejére.
Az OnPlayerPickupPickup elejére pedig szúrd be ezt:
 
if(!bCreated[pickupid]) return bCreated[pickupid];

A 3. feltétel nem fut le
« Válasz #11 Dátum: 2011. augusztus 11. - 09:39:48 »
+1 Show voters
Hát én is valami hasonlón gondolkoztam Epsilon de én egy kicsit egyszerûbbre gondoltam mivel egy változó tárolja a pickup azonosító számát ami 0 tól MAX_PICKUPS értékéig tart,
 
#define MAX_PICKUPS                        (2048)[/quote]
streamer esetében is 0 -tól kezdõdik és tart addig míg létrehozunk pickupot.
Ezért mikor törlésre kerül a pickup mi lenne ha olyan értéket adnánk a változónak ami valószínûleg nem lehet érvényes pickupid, mondjuk
\"-1\" vagy \"INVALID_OBJECT_ID (0xFFFF) (65535)\".
Röviden itt lenne a kód csak nem teszteltem:  (de megfogom tenni estére,  és ha mûködik megírom azt a verziót is ahol megmarad az eredeti native funkció név használat a scriptben)
[pawn]
stock
    _DestroyPickup(&pickup)
{
    DestroyPickup(pickup);
    pickup = -1;
}
[/pawn]
Edit:
@Zsox
Az egyszerûség kedvéért, ahol törlöd a pickup3 változó által tárolt pickupot, írj oda egy plussz sort:
[pawn]
DestroyPickup(pickup3);
pickup3 = -1;
[/pawn]
« Utoljára szerkesztve: 2011. augusztus 11. - 10:24:42 írta Zsolesszka »

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #12 Dátum: 2011. augusztus 11. - 21:10:08 »
0 Show voters
Én egy még egyszerûbb megoldásra gondoltam. Mi lenne, ha rögtön a pickup törlés után létrehoznánk valahol a senkiföldjén egy másik pickupot, ami így felvenné a törölt pickup azonosítóját?
Az a baj, hogy Epsilon megoldásából én egy kukkot se értek, így meg nem akarom használni.

A 3. feltétel nem fut le
« Válasz #13 Dátum: 2011. augusztus 11. - 21:26:43 »
0 Show voters
Annál egyszerûbb megoldás nincs, mint amit postoltam maximum ha ezt beteszed a módod elejére:
[pawn]stock _DestroyPickup(&pickup) { DestroyPickup(pickup); pickup = -1; }
#define DestroyPickup _DestroyPickup[/pawn]
És nincs több probléma OnPlayerPickUpPickup alatt.
És mindent ugyanúgy használsz mint eddig, semmit extra dolgot nem kell csinálnod.
Edit: Kis helyesírás hiba javítva.
« Utoljára szerkesztve: 2011. augusztus 11. - 22:40:17 írta Zsolesszka »

Nem elérhető Zsox

  • 140
    • Profil megtekintése
A 3. feltétel nem fut le
« Válasz #14 Dátum: 2011. augusztus 11. - 23:31:19 »
0 Show voters
Idézetet írta: Zsolesszka date=1313048388\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10311\" data-ipsquote-contentclass=\"forums_Topic
Az egyszerûség kedvéért, ahol törlöd a pickup3 változó által tárolt pickupot, írj oda egy plussz sort:
[pawn]
DestroyPickup(pickup3);
pickup3 = -1;
[/pawn]
 
Úgy tûnik jó lesz, köszi!
« Utoljára szerkesztve: 2011. augusztus 11. - 23:32:52 írta Zsox »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal