-
Sziasztok abban kérném segitségetek hogy Hogyan lehet megoldani azt hogy bizonyos helyeken ne használhassanak parancsokat PL:Épületben
Valaki leirná részletesen Köszi.
PL: /speed ne lehessen Dm-ben használni
-
if(!strcmp(cmdtext,\"/speed\",true))
{
if(dm[playerid] == 1) { return SendClientMessage(playerid,0xFF6600FF,\"Itt nem tudod használni ezt a parancsot !\"); }
// kód
return 1;
}
-
OFF:
És megelõzött
ON:
Ne felejsd el definiálni a
dm
new dm[MAX_PLAYERS];
Valamint azt se felejsd el hogy amikor a dmbe áll akkor legyen a dm = 1
public OnPlayerConnect(playerid)
{
dm[playerid] = 0;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
dm[playerid] = 0;
return 1;
}
if(!strcmp(cmdtext,\"/dmbe\",true))
{
dm[playerid] = 1;
return 1;
}
if(!strcmp(cmdtext,\"/dmki\",true))
{
dm[playerid] = 0;
return 1;
}
-
Úgy értettem megyarázattal mi mire jó
-
3 megoldás ajánlott:
az egyikek leírta cappsy amikor eltárolod 1 változóban hogy bent van a dm-ben...de ezt kifejtem bõvebben és magyarázom is mindjárt...de kezdjük a másik kettõvel mert azok rövidebbek :D
1. megoldás:
http://wiki.sa-mp.com/wiki/GetPlayerInterior
if(GetPlayerInterior(playerid) != 0) { return 1; }
HA a játékos interiorja NEM 0 akkor nem fut le az alatta levõ kód !
Ennél csak annyi a gond hogy pl van a bank interior ami 0-s int-en van és ott már tudja használni...
2. megoldás:
http://wiki.sa-mp.com/wiki/IsPlayerInRangeOfPoint
Ez arra jó ha bizonyos távolságnál messzebb van a játékos egy megadott ponttól akkor hamis értékkel tér vissza...
if(!IsPlayerInRangeOfPoint(playerid,100.0,X,Y,Z) { return 1; }
HA a játékos X Y Z pozíciótól 100 méternél messzebb van nem tudja használni a parancsot ! Ez zónához kötött parancs ha kiveszed a !-et akkor fordított szóval a zónában nem tudja majd használni...
3. megoldás V1:
Egy változóban eltárolod hogy a játékos bent van e a DM zónában:
Tömb amiben tárolod a játékosok adatait:
new bool:dm[MAX_PLAYERS];
DM-be csatlakozásnál / DM elhagyásnál érték változtatás:
dm[playerid] = true;
dm[playerid] = false;
Amikor fellép/lelép törlöd a játékos adatot ! ( elég 1x törölni ! )
dm[playerid] = false;
Ellenõrzés, hogy a zónában van e, ha nincs a zónában ne fusson tovább a parancs:
if(!dm[playerid]) { return 1; }
Ez 1 zónára vonatkozik ha több zónád van akkor nem ajánlott több változót használni mert az kicsit megdobná a forráskód méretét és minden feltétel ellenõrzésnél többször kell ellenõriznie szóval még kicsit lassabb is lesz a kód...
Több zóna esetén:
3. megoldás V2:
Létrehozol 1 tömböt amiben tárolod a játékos zóna ID-ját...
new zone[MAX_PLAYERS];
Ajánlott a zóna ID-kat konstans-al használni hogy egyszerûsítsd a dolgod...
#define ZONE_NONE
#define ZONE_DM1
#define ZONE_DM2
#define ZONE_DERBY
#define ZONE_RACE
Zóna értékét változtatod minden zóna belépésnél / kilépésnél...
zone[playerid] = ZONE_NONE;
zone[playerid] = ZONE_DM1;
Amikor elhagyja a játékos a szervert akkor ZONE_NONE-ra állítod !
Feltétel:
if(zone[playerid] == ZONE_DM1)
if(zone[playerid] == ZONE_DERBY || zone[playerid] == ZONE_RACE)
És ha akarod nem csak pozíciót hanem Virtuális Világot állítasz be egyes zónákhoz és akár ezt is használhatod Zóna azonosításnak csak akkor figyelj milyen scripteket alkalmazol a módod mellett !
http://wiki.sa-mp.com/wiki/SetPlayerVirtualWorld
http://wiki.sa-mp.com/wiki/GetPlayerVirtualWorld
-
Csinálunk egy változót ez a dm
new dm[MAX_PLAYERS];
most hogy ez megvan betudjuk állítani hogy a mi legyen ha a dm 1 és 0
Feladatok:
Létrehozzuk a változót :
new dm[MAX_PLAYERS];
Az disconnectnél és a connectél beállítjuk 0 ra
public OnPlayerConnect(playerid)
{
dm[playerid] = 0;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
dm[playerid] = 0;
return 1;
}
3. csinálunk vele amit kell
Mi micsoda??:
if(!strcmp(cmdtext,\"/speed\",true))
{
if(dm[playerid] == 1) { return SendClientMessage(playerid,0xFF6600FF,\"Itt nem tudod használni ezt a parancsot !\"); }//definiáljuk hogyha a dm egyenlõ 1 el akkor mi legyen...ez most kiír egy szöveget
// ide kell írni alá hogy mi legyen hogyha a dm egyenlõ 0-val
return 1;
}
if(!strcmp(cmdtext,\"/dmbe\",true))
{
dm[playerid] = 1;//az érték 1
return 1;
}
if(!strcmp(cmdtext,\"/dmki\",true))
{
dm[playerid] = 0;// az érték 0
return 1;
}
Kérdések:
Miért kell a parancsba betenni hogy a dm egyenlõ legyen 1 el??
Mivel az on palyer connecnél alapból nulla
Miért kell kiszedni ha kijön??
Hogyha már ne dm be van akkor tudja használni
A csatlakozásnál miért kell 0 ra állítani??
Hogy tudja használni a parancsokat
UI: van olyan témahely ahol tutorialok vannak
http://sampforum.hu/index.php?board=17.0
((megelõztek de mind1 2 jobb mint 1 :)))
UI: szép TUT :)
kaptál likot :)
-
A csatlakozásnál miért kell 0 ra állítani??
Hogy tudja használni a parancsokat
[/quote]
és miért kell kilépésnél is 0-ra állítani? :)
elég 1x és azért jobb kilépésnél mert akkor az 1. csatlakozásnál nem fut le feleslegesen a kód
és a kezdõk sokszor rosszul használják a ciklusokat és bele számolhat olyan játékost a DM-be aki már offline :) + inkább ne akkor lassítsuk a játékost amikor jönne játszani :D ha egy RP módnál van ( ne legyen sok ) 300 változó/tömb cella amit resetel a szerver az már felesleges hátráltatás ha a játékos jönne játszani akkor ne töltsön neki annyit a szerver :)
new count;
for(new i; i < GetMaxPlayers(); i++)
{
if(dm) { count++; }
}
30 slotos szervernél lefut 0-tól 29-ig a ciklus és minden olyan ID-t beleszámol akinél a DM 1...persze ezt is ki lehet védeni és lehetpség szerint ki is kell...
persze meg van annak is az elõnye hogy csatlakozásnál reseteljük az adatokat :)
-
A csatlakozásnál miért kell 0 ra állítani??
Hogy tudja használni a parancsokat
és miért kell kilépésnél is 0-ra állítani? :)
elég 1x és azért jobb kilépésnél mert akkor az 1. csatlakozásnál nem fut le feleslegesen a kód
és a kezdõk sokszor rosszul használják a ciklusokat és bele számolhat olyan játékost a DM-be aki már offline :) + inkább ne akkor lassítsuk a játékost amikor jönne játszani :D ha egy RP módnál van ( ne legyen sok ) 300 változó/tömb cella amit resetel a szerver az már felesleges hátráltatás ha a játékos jönne játszani akkor ne töltsön neki annyit a szerver :)
new count;
for(new i; i < GetMaxPlayers(); i++)
{
if(dm) { count++; }
}
30 slotos szervernél lefut 0-tól 29-ig a ciklus és minden olyan ID-t beleszámol akinél a DM 1...persze ezt is ki lehet védeni és lehetpség szerint ki is kell...
persze meg van annak is az elõnye hogy csatlakozásnál reseteljük az adatokat :)
[/quote]
hm....
Én így tanultam így használom :)
-
A csatlakozásnál miért kell 0 ra állítani??
Hogy tudja használni a parancsokat
és miért kell kilépésnél is 0-ra állítani? :)
elég 1x és azért jobb kilépésnél mert akkor az 1. csatlakozásnál nem fut le feleslegesen a kód
és a kezdõk sokszor rosszul használják a ciklusokat és bele számolhat olyan játékost a DM-be aki már offline :) + inkább ne akkor lassítsuk a játékost amikor jönne játszani :D ha egy RP módnál van ( ne legyen sok ) 300 változó/tömb cella amit resetel a szerver az már felesleges hátráltatás ha a játékos jönne játszani akkor ne töltsön neki annyit a szerver :)
new count;
for(new i; i < GetMaxPlayers(); i++)
{
if(dm) { count++; }
}
30 slotos szervernél lefut 0-tól 29-ig a ciklus és minden olyan ID-t beleszámol akinél a DM 1...persze ezt is ki lehet védeni és lehetpség szerint ki is kell...
persze meg van annak is az elõnye hogy csatlakozásnál reseteljük az adatokat :)
[/quote]
hm....
Én így tanultam így használom :)
[/quote]
akkor csak gondolj bele logikusan 2x fut le mondhatni egymás után a kód :) van értelme? de te tudod én nem szólok bele, én meg sehogy nem tanultam és helyzettõl függõen használom :D de én minél gyorsabb kódot szeretnék :) minden felesleges részt mellõzök :)
-
A csatlakozásnál miért kell 0 ra állítani??
Hogy tudja használni a parancsokat
és miért kell kilépésnél is 0-ra állítani? :)
elég 1x és azért jobb kilépésnél mert akkor az 1. csatlakozásnál nem fut le feleslegesen a kód
és a kezdõk sokszor rosszul használják a ciklusokat és bele számolhat olyan játékost a DM-be aki már offline :) + inkább ne akkor lassítsuk a játékost amikor jönne játszani :D ha egy RP módnál van ( ne legyen sok ) 300 változó/tömb cella amit resetel a szerver az már felesleges hátráltatás ha a játékos jönne játszani akkor ne töltsön neki annyit a szerver :)
new count;
for(new i; i < GetMaxPlayers(); i++)
{
if(dm) { count++; }
}
30 slotos szervernél lefut 0-tól 29-ig a ciklus és minden olyan ID-t beleszámol akinél a DM 1...persze ezt is ki lehet védeni és lehetpség szerint ki is kell...
persze meg van annak is az elõnye hogy csatlakozásnál reseteljük az adatokat :)
[/quote]
hm....
Én így tanultam így használom :)
[/quote]
akkor csak gondolj bele logikusan 2x fut le mondhatni egymás után a kód :) van értelme? de te tudod én nem szólok bele, én meg sehogy nem tanultam és helyzettõl függõen használom :D de én minél gyorsabb kódot szeretnék :) minden felesleges részt mellõzök :)
[/quote]
Igaz azért mondom hogy igazad van mert kevesebb ramot használ :)
Csak én még ilyen régimódi vagyok hogy ezeket nem használom
-
ne állj a változás útjába :D jön az új infó fogadd be :P
a konokság nem régimódi :D tanulni mindig lehet :) de ha elmondod az érveidet talán én tanulok valamit azt, hogy miért is érné meg mind2 helyen resetelni az adatokat :) kíváncsi vagyok a titkára hátha van valami amire én nem gondoltam és pont ez kell ahhoz hogy jobbá tegyem a kódjaimat :)
-
[mod] Idézgetést befejezni. [/mod]