Forum profesionist despre scenariu de amanet

YANS (încă un alt sistem neon), sau scrie abilitatea de a instala neon de la zero.

Oricărei zile, dragi utilizatori.
Știu că există deja o mulțime de soluții pentru instalarea luminilor neonului pe mașină, dar nu am văzut un tutorial explicativ cu o explicație detaliată a modului și a motivului pentru care totul funcționează. Ei bine, trebuie să corectezi gafa asta enervantă.

Deci, mai întâi vom analiza principiul muncii.
După cum mulți știu, SAMP este permis să atașeze obiecte la mașini. Și deoarece în prezent există obiecte cu lămpi cu halogen, sarcina devine cea mai simplă - când instalăm un neon, creează un obiect de lampă și îl atașăm la mașină, când dezmembrăm, îl ștergem.
Obiectele lămpilor au ID de la 18647 la 18651 (în acest exemplu - roșu, albastru, verde, galben și, respectiv, roz).

Destul de ciudat, dar - cu teoria tuturor, este timpul să mergem mai departe la practică. Creați o nouă versiune, conectați biblioteca a_samp. Pentru cei care doresc, puteți conecta și unitatea de bandă, tutorialul va folosi funcțiile standard pentru a lucra cu obiecte.

Declarați o matrice pentru stocarea informațiilor despre mașini și lumini de neon. In elementul zero este stocat informații despre prezența și culoarea lămpii (-1 - care nu este stabilită, de la 0 la 4 - respectiv roșu, albastru, verde, roz si galben), primul și al doilea va fi utilizat pentru stocarea indicii în aceasta la obiecte, acesta din urmă - pentru a salva starea curentă a lămpii (activată sau dezactivată).

nou neon # 91; MAX_VEHICLES # 93; # 91; 4 # 93 ;;

Acum continuăm cu funcțiile principale. Prima dintre acestea va fi instalarea de neon pe masina. Parametrii funcției sunt ID-ul mașinii în joc și culoarea de la 0 la 4 - atunci când creați obiectul 18647 se va trece la valoarea de culoare (18647 - obiectul lămpii roșii). Algoritmul este după cum urmează: elementului zero i se atribuie valoarea culorii, celui de-al treilea element îi este atribuită unitatea (lampa este pornită după instalare), două obiecte (primul și al doilea element) sunt create și atașate la mașină.

inainte de destinație (culoare vehiculului);
public PlaceNeon (vehicul. culoare)
neon # 91; vehicul # 93; # 91; 0 # 93; = culoare;
neon # 91; vehicul # 93; # 91; 3 # 93; = 1;
DestroyObject (neon # 91; vehicul # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicul # 93; # 91; 2 # 93;);
neon # 91; vehicul # 93; # 91; 1 # 93; = CreateObject (18647 + culoare 0. 0. 0. 0. 0. 0. 0. 100.0);
neon # 91; vehicul # 93; # 91; 2 # 93; = CreateObject (18647 + culoare 0. 0. 0. 0. 0. 0. 0. 100.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 1 # 93; vehicul. - 0,8. 0.0. - 0,70. 0.0. 0.0. 0.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 2 # 93; vehicul. 0.8. 0.0. - 0,70. 0.0. 0.0. 0.0);
retur 1;
>

Înainte este eliminarea neonului. Funcția acceptă ca parametru numai ID-ul auto. Am pus elementul zero -1 (nu neon), opriți lampa (al treilea element este zero), ștergeți obiectele.

înainte RemoveNeon (vehicul);
public RemoveNeon (vehicul)
neon # 91; vehicul # 93; # 91; 0 # 93; = - 1;
neon # 91; vehicul # 93; # 91; 3 # 93; = 0;
DestroyObject (neon # 91; vehicul # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicul # 93; # 91; 2 # 93;);
retur 1;
>

Ultima funcție este de a activa / dezactiva lampa instalată. Aici algoritmul este mai complicat.
Dacă lampa este instalată (primul element al matricei nu este -1), declanșatorul începe să funcționeze. Dacă lampa a fost oprită - creați două obiecte cu culoarea dorită. Dacă este activată - ștergeți-le. Desigur, fără a uita să punem etichetele necesare în starea lămpii.

înainte TurnNeon (vehicul);
public TurnNeon (vehicul)
dacă (neon # 91; vehicul # 93; # 91; 0 # 93; ! = - 1)
comutator (neon # 91; vehicul # 93; # 91; 3 # 93;)
cazul 0:
neon # 91; vehicul # 93; # 91; 3 # 93; = 1;
neon # 91; vehicul # 93; # 91; 1 # 93; = CreateObject (18647 + neon # 91; vehicul # 93; # 91; 0 # 93; 0. 0. 0. 0. 0. 0. 0. 100.0);
neon # 91; vehicul # 93; # 91; 2 # 93; = CreateObject (18647 + neon # 91; vehicul # 93; # 91; 0 # 93; 0. 0. 0. 0. 0. 0. 0. 100.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 1 # 93; vehicul. - 0,8. 0.0. - 0,70. 0.0. 0.0. 0.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 2 # 93; vehicul. 0.8. 0.0. - 0,70. 0.0. 0.0. 0.0);
>
cazul 1:
neon # 91; vehicul # 93; # 91; 3 # 93; = 0;
DestroyObject (neon # 91; vehicul # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicul # 93; # 91; 2 # 93;);
>
>
>
retur 1;
>

De fapt, avem funcțiile principale. Cum să lucrați cu ei - așa cum va spune fantezia, dar voi lua exemple specifice.
Deci, instalarea va fi efectuată utilizând comanda / neon. Creați o casetă de dialog cu o listă. Te implor să nu faci clic pe faptul că în primul meniu există doar un singur punct - a fost scris cu o marjă, deoarece va fi completat cu banda de conservare, cum ar fi instalarea de flash-uri și așa mai departe.

public OnPlayerCommandText (playerid. cmdtext # 91; # 93;)
dacă (! strcmp ("/ neon" .cmdtext. true))
dacă (IsPlayerInAnyVehicle (playerid))
dacă SendClientMessage (.. playerid 0xAFAFAFAA "Trebuie să stai la volanul masinii") (GetPlayerState (playerid) = PLAYER_STATE_DRIVER!);
altfel ShowPlayerDialog (playerul 6000. DIALOG_STYLE_LIST. "Meniu." "Neon." "Selectați" "Cancel");
>
retur 1;
>
retur 0;
>

public OnDialogResponse (playerid # 91; # 93;)
dacă (dialogid == 6000)
dacă (răspuns)
în cazul în care (listitem == 0) ShowPlayerDialog (playerid 6001. DIALOG_STYLE_LIST "Neon" "Red \ nSiny \ nZeleny \ nZhelty \ nRozovy \ nUbrat neon", "Next", "Cancel" .....);
>
retur 1;
>
dacă (dialogid == 6001)
dacă (răspuns)
dacă (listitem == 5)
RemoveNeon (GetPlayerVehicleID (playerid));
SendClientMessage (numărul jucatorului 0xff440000. "Neon șters");
>
altfel dacă (listitem> = 0 listitem <= 4 )
PlaceNeon (GetPlayerVehicleID (playerid), listitem);
SendClientMessage (playerid 0xff440000. "Neon instalat");
>
>
retur 1;
>
retur 0;
>

Comutator on-off la butonul sub-comision (standard - 2 pe partea alfabetică a tastaturii). Folosim vechiul defect defect:

#define PRESSED (% 0) (((chei noi (% 0)) == (% 0)) ((Oldkeys (% 0))! = (% 0)))

Și, de fapt, descriem acțiunile de pe buton:

public OnPlayerKeyStateChange (chei de jucători noi.
dacă (PRESED (512) GetPlayerState (playerid) == PLAYER_STATE_DRIVER) TurnNeon (GetPlayerVehicleID (playerid));
retur 1;
>

Și dacă mașina este distrusă? Obiectele trebuie șterse. Folosim OnVehicleDeath:

public OnVehicleDeath (vehicul.killerid)
DestroyObject (neon # 91; vehicleid # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicleid # 93; # 91; 2 # 93;);
retur 1;
>

Și pentru încărcarea și descărcarea corespunzătoare a obiectelor - curățăm matricele la început și când scriptul este oprit.

public OnFilterScriptInit ()
pentru (nou i = 0; i retur 1;
>

public OnFilterScriptExit ()
pentru (nou i = 0; i retur 1;
>

De fapt, totul! După asamblarea într-o grămadă de cod, codul arată astfel:


#define PRESSED (% 0) (((chei noi (% 0)) == (% 0)) ((Oldkeys (% 0))! = (% 0)))

// Array pentru a procesa. 0 - prezența (și culoarea) neonului (-1 - neinstalat), 1 și 2 - obiecte, 3 - stare (on-off)
nou neon # 91; MAX_VEHICLES # 93; # 91; 4 # 93 ;;

// Redirecționează funcțiile
inainte de destinație (culoare vehiculului);
înainte RemoveNeon (vehicul);
înainte TurnNeon (vehicul);

// Încarcă scriptul. La fiecare pompier - ștergerea informațiilor din matrice.
public OnFilterScriptInit ()
pentru (nou i = 0; i retur 1;
>

// Descărcați scriptul. Curățarea matricei.
public OnFilterScriptExit ()
pentru (nou i = 0; i retur 1;
>

public OnPlayerCommandText (playerid. cmdtext # 91; # 93;)
dacă (strcmp ("/ neon" .cmdtext.real .10) == 0)
dacă (IsPlayerInAnyVehicle (playerid))
dacă SendClientMessage (.. playerid 0xAFAFAFAA "Trebuie să stai la volanul masinii") (GetPlayerState (playerid) = PLAYER_STATE_DRIVER!);
altfel ShowPlayerDialog (playerul 6000. DIALOG_STYLE_LIST. "Meniu." "Neon." "Selectați" "Cancel");
>
retur 1;
>
retur 0;
>

public OnDialogResponse (playerid # 91; # 93;)
dacă (dialogid == 6000)
dacă (răspuns)
în cazul în care (listitem == 0) ShowPlayerDialog (playerid 6001. DIALOG_STYLE_LIST "Neon" "Red \ nSiny \ nZeleny \ nZhelty \ nRozovy \ nUbrat neon", "Next", "Cancel" .....);
>
retur 1;
>
dacă (dialogid == 6001)
dacă (răspuns)
dacă (listitem == 5)
RemoveNeon (GetPlayerVehicleID (playerid));
SendClientMessage (numărul jucatorului 0xff440000. "Neon șters");
>
altfel dacă (listitem> = 0 listitem <= 4 )
PlaceNeon (GetPlayerVehicleID (playerid), listitem);
SendClientMessage (playerid 0xff440000. "Neon instalat");
>
>
retur 1;
>
retur 0;
>

public OnPlayerKeyStateChange (chei de jucători noi.
dacă (PRESED (512) GetPlayerState (playerid) == PLAYER_STATE_DRIVER) TurnNeon (GetPlayerVehicleID (playerid));
retur 1;
>

public OnVehicleDeath (vehicul.killerid)
DestroyObject (neon # 91; vehicleid # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicleid # 93; # 91; 2 # 93;);
retur 1;
>

// Setați neonul. Parametrii - ID auto și culoare.
public PlaceNeon (vehicul. culoare)
neon # 91; vehicul # 93; # 91; 0 # 93; = culoare;
neon # 91; vehicul # 93; # 91; 3 # 93; = 1;
DestroyObject (neon # 91; vehicul # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicul # 93; # 91; 2 # 93;);
neon # 91; vehicul # 93; # 91; 1 # 93; = CreateObject (18647 + culoare 0. 0. 0. 0. 0. 0. 0. 100.0);
neon # 91; vehicul # 93; # 91; 2 # 93; = CreateObject (18647 + culoare 0. 0. 0. 0. 0. 0. 0. 100.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 1 # 93; vehicul. - 0,8. 0.0. - 0,70. 0.0. 0.0. 0.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 2 # 93; vehicul. 0.8. 0.0. - 0,70. 0.0. 0.0. 0.0);
retur 1;
>

// Îndepărtarea neonului
public RemoveNeon (vehicul)
neon # 91; vehicul # 93; # 91; 0 # 93; = - 1;
neon # 91; vehicul # 93; # 91; 3 # 93; = 0;
DestroyObject (neon # 91; vehicul # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicul # 93; # 91; 2 # 93;);
retur 1;
>

// Neon Management
public TurnNeon (vehicul)
dacă (neon # 91; vehicul # 93; # 91; 0 # 93; ! = - 1)
comutator (neon # 91; vehicul # 93; # 91; 3 # 93;)
cazul 0:
neon # 91; vehicul # 93; # 91; 3 # 93; = 1;
neon # 91; vehicul # 93; # 91; 1 # 93; = CreateObject (18647 + neon # 91; vehicul # 93; # 91; 0 # 93; 0. 0. 0. 0. 0. 0. 0. 100.0);
neon # 91; vehicul # 93; # 91; 2 # 93; = CreateObject (18647 + neon # 91; vehicul # 93; # 91; 0 # 93; 0. 0. 0. 0. 0. 0. 0. 100.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 1 # 93; vehicul. - 0,8. 0.0. - 0,70. 0.0. 0.0. 0.0);
AttachObjectToVehicle (neon # 91; vehicul # 93; # 91; 2 # 93; vehicul. 0.8. 0.0. - 0,70. 0.0. 0.0. 0.0);
>
cazul 1:
neon # 91; vehicul # 93; # 91; 3 # 93; = 0;
DestroyObject (neon # 91; vehicul # 93; # 91; 1 # 93;);
DestroyObject (neon # 91; vehicul # 93; # 91; 2 # 93;);
>
>
>
retur 1;
>


Nu am considerat salvarea parametrilor neonului în acest exemplu după ce am încărcat serverul într-un fișier sau într-o bază de date, verificând dacă playerul se află în mașină sau într-o motocicletă / elicopter etc. și lucruri similare. După cum puteți vedea din cod, chiar și banii nu sunt eliminați pentru instalare. Aceasta este universalitatea - puteți să vă asociați sursa pentru propriile dvs. nevoi.

Vă rog să nu loviți pentru posibilele zone de redundanță, decizii suboptimale și așa mai departe. Sugestiile și criticile constructive vor fi acceptate cu bucurie în acest subiect.

Re: YANS (încă un alt sistem neon), sau scrie abilitatea de a instala neon de la zero.

Dar dacă scrieți totul despre neon, scrieți despre posibilitatea amestecării culorilor

Re: YANS (încă un alt sistem neon), sau scrie abilitatea de a instala neon de la zero.

Nu există nici o amestecare, înainte de instalare, în orice caz, DestroyObject trece.

Re: YANS (încă un alt sistem neon), sau scrie abilitatea de a instala neon de la zero.

Altul ar fi un test al existenței obiectului.

Re: YANS (încă un alt sistem neon), sau scrie abilitatea de a instala neon de la zero.

În ceea ce privește existența automată pe server? Nu are sens, instalarea va avea loc numai dacă jucătorul se află pe scaunul șoferului.
Sau sunteți deja despre prezența unui neon stabilit? Puteți verifica celula zero a matricei. În același loc este vopsit - dacă -1, atunci neonka nu este instalat, dacă de la 0 la 4 - atunci o anumită culoare este setat. Un astfel de control în TurnNeon () este.

Re: YANS (încă un alt sistem neon), sau scrie abilitatea de a instala neon de la zero.

Nu vorbesc despre IsValidObject. La urma urmei, dacă limita obiectelor este epuizată, atunci obiectul nu este creat.

Articole similare