Jak zrobić instrukcje if w skrypcie


(Podeszwaaaaaa) #1

Witam!

Mam pewny problem, robię skrypt w języku squirrel, jest to język który wykorzystuje Grand Theft Auto IV Multiplayer.

Na wikipedi znalazłem funkcje playerEnterCheckpoint i z nią mam problem.

Otóż na wikipedii znalazłem taki skrypt:

local checkpoint; // zmienna

function addCheckpoint() //funkcja dodająca checkpoint (inaczej taki punkt na mapie)

{

    checkpoint = createCheckpoint(6, -766.069,1407.84,1.48285, -740.31,1500.74,2.42586, 1.0);

}

addEvent("scriptInit", addCheckpoint);


function onPlayerEnterCheckpoint(playerid, checkpointId) // gdy gracz wejdzie do checkpointu 

{

    if(checkpointId == checkpoint)

    {

        sendPlayerMessage(playerid, "You entered the checkpoint!", 0xFF0000FF, false); // wysyla wiadomosc

    }

    return 1;

}

addEvent("playerEnterCheckpoint", onPlayerEnterCheckpoint);

Ma on na celu wyświetlenie tekstu "You entered the checkpoint!" gdy gracz wejdzie do checkpointu. Kolejny skrypt to taki który po wpisaniu "/komenda" coś wykonuje..

if(cmd[0] == "/komenda") // jesli gracz wpisze "/komenda"

	{

	//tutaj cos sie wykona

	}

I teraz chciałbym zrobić takie coś:

Jeśli gracz wpisze komendę "/komenda"

jeśli będzie w checkpoincie to wyświetli mu tekst "jesteś w checkpoincie"

jeśli NIE będzie w checkpoincie to wyświetli mu tekst "nie jesteś w checkpoincie".

Umiał bym to zrobić jeśli dało by się funkcje PlayerEnterCheckpoint dać do ifa.

Nie wiem jak to inaczej rozwiązać, ma ktoś jakiś pomysł?

Pozdrawiam i proszę o pomoc.


([alex]) #2

Globalna zmienna logiczna.


(Podeszwaaaaaa) #3

Masz na myśli to żeby stworzyć zmienną która będzie zmieniała się na 1 jeśli gracz wejdzie w checkpoint?

I gdy wpisze komendę to sprawdzi czy ta zmienna jest 0 czy 1?


([alex]) #4

Tak. Ale nie zapomnij przestawić na 0 kiedy zejdzie z checkpoint'a.


(Podeszwaaaaaa) #5

Na początku ustalam zmienną na 0:

local zmienna = 0

Oczywiście tworze checkpoint:

function addCheckpoint()

{

    checkpoint = createCheckpoint(6, 153.989090, 383.569000, 15.041459, -740.31, 1500.74, 2.42586, 1.0);

}

addEvent("scriptInit", addCheckpoint);

Następnie funkcje która jeśli gracz wejdzie w checkpoint to zmienia zmienna na 1.

function onPlayerEnterCheckpoint(playerid, checkpointId)

{

    if(checkpointId == checkpoint)

    {

        local zmienna = 1

    }

    return 1;

}

addEvent("playerEnterCheckpoint", onPlayerEnterCheckpoint);

I jeśli wpisze komendę: "/komenda" i jeśli zmienna będzie równała się 1 wyskoczy komunikat.

if(cmd[0] == "/komenda")

	{

	if(zmienna == 1)

	{

	sendPlayerMessage(playerid, "Jestes w czekponcie", 0xFF0000FF, false);

	}

	return 1;

	}

Niestety to nie działa, nie wiem dlaczego. Konsola nie wywala żadnych błędów.


(Grzelix) #6

odnośnie drugiego code

czy tam nie powinno być raczej tak:

function onPlayerEnterCheckpoint(playerid, checkpointId)

{

    if(checkpointId == checkpoint)

    {

        zmienna = 1

    }

    return 1;

}

addEvent("playerEnterCheckpoint", onPlayerEnterCheckpoint);

(Podeszwaaaaaa) #7

Dziękuje, wszystko działa.


([alex]) #8
function onPlayerEnterCheckpoint(playerid, checkpointId)

{

    if(checkpointId == checkpoint)

    {

        zmienna = 1

    }

    else

    {

        zmienna = 0

    }

    return 1;

}

Jeżeli chcesz aby działało na checkpoincie a nie w dowolnym miejscu po odwiedzeniu checkpointa.


(Podeszwaaaaaa) #9

No tak, ale mam następny problem. Zmienna zmienia się dla każdego gracza więc jeśli jeden będzie w checkpoincie to każdy kto wpisze "/komenda" wyświetli się tekst.

Macie pomysł jak to wykonać?


([alex]) #10

To niestety musisz mieć tablicę lub ograniczoną ilość graczy.


(Podeszwaaaaaa) #11

No mam do dyspozycji: (Wiki) Tablice. Oraz mogę ograniczyć ilość graczy do 32, tylko jak to rozwiązać?


([alex]) #12
local atchkpt={};

function onPlayerEnterCheckpoint(playerid, checkpointId)

{

    atchkpt[playerid]=(checkpointId == checkpoint);

    return 1;

}


   if(cmd[0] == "/komenda")

   {

   if(atchkpt[playerid])

   {

   sendPlayerMessage(playerid, "Jestes w czekponcie", 0xFF0000FF, false);

   }

   return 1;

(Podeszwaaaaaa) #13

No ok, byłbym bardzo wdzięczny gdybyś mi to wytłumaczył jak to ma działać:

local atchkpt={}; //ustala atchpt jako tabele

function onPlayerEnterCheckpoint(playerid, checkpointId) 

{

    atchkpt[playerid]=(checkpointId == checkpoint); //do tablicy dodajesz id gracza jeśli CheckpointId równa się checkpoint

    return 1;

}


   if(cmd[0] == "/komenda")

   {

   if(atchkpt[playerid]) // jeśli id gracza jest takie samo jak w tablicy

   {

   sendPlayerMessage(playerid, "Jestes w czekponcie", 0xFF0000FF, false);

   }

   return 1;

   } // tu powinno być zamknięcie

Nie wiem dlaczego wywala mi błąd w lini:

"if(atchkpt[playerid])"


([alex]) #14

W tablice z indeksem playerid przechowywane wartości logiczne jest ten gracz w checkpoint czy nie.


(Drobok) #15

Na chłopski rozum. Nie trza tej tablicy zainicjować 0 przypadkiem ? (jak nie wejdzie a wpisze komendę to wywali brak indeksu tablicy). A co jeśli wyjdzie ? (zapisujesz 1 po wejściu, a przy wyjściu już nie. (myślę, że po wyjściu dalej będzie 1)).

oc to tylko moje (niewielkie doświadczenie) przemyślenia.

//edit

@next page,

tak właśnie przypuszczałem :))


([alex]) #16

drobok , to nie jest język C++ ani C#.


(Podeszwaaaaaa) #17

Więc dlaczego wywala błąd? Przecież wszystko jest ok.


(Copycona) #18

Uważam, że byłoby prościej, gdybyś jeszcze podał treść tego błędu.


(Podeszwaaaaaa) #19

Gdy graczem o ID 0 wpisze komendę: "/komenda" w konsoli wywala:

AN ERROR HAS OCCURED [the index '0' does not exist]

CALLSTACK

*FUNCTION [onPlayerCommand()] /home/ivmp/scripts/cp.nut line [222]

LOCALS

[isPlayerLogged] ARRAY

[pAdminLevel] ARRAY

[atchkpt] TABLE

[cmd] ARRAY

[command] "/komenda"

[playerid] 0

[this] TABLE

(Grzelix) #20
local a = array(3, 0); // create a new array with three elements and initialize them to zeros

powyżej fragment z wiki

anaogicznie do tego powinieneś stworzyć tablicę z liczbą graczy i zainicjalować na false. Teraz masz pustą tablicę i nie możesz odwołać się do nie istniejącego elementu.