TELJESEN AUTOMATA AJTÓK ÉS KAPUK
Elõzmények:
Úgy egy hete azt álmodtam, hogy van egy RP szerverem.
Nem tudom miért, de ilyet szerintem nem mindenki szokott éjjel megálmodni. Na, ezt az álmot kezdtem el megvalósítani. Kezdtem írogatni egy teljesen saját, egyedi RP módot, mely egy teljesen saját, egyedileg map-olt településen játszódik. Ahogyan írogattam, gondoltam legyen benne egy bevásárlóközpont. Amint az említett bevásárlóközpontot építgettem, hatalmas dolog ugrott be: mi lenne ha itt a
/bemegy
és
/kimegy
helyett \"fotocellás\" ajtó lenne, mint IRL (In Real Life = a való életben)...
Feltételek:
Ebben a leírásban az
IsPlayerInRangeOfPoint
függvényt fogjuk használni, mely csak a v0.3a vagy annál újabb kiadásokban mûködik. Régebbi kiadás esetén a következõ függvény kódba való beillesztése szükségeltetik:
stock IsPlayerInRangeOfPoint(playerid, Float:radius, Float:X, Float:Y, Float:Z){
new Float:px,Float:py,Float:pz;
GetPlayerPos(playerid,px,py,pz);
return ( ( ((px-X)*(px-X))+((py-Y)*(py-Y))+((pz-Z)*(pz-Z)) ) >= radius*radius );
}
Változó, változó, mindennek az alapja:
Minden függvényen kívül hozzunk létre egy új változót, valahogy így:
new valamicske;
Az újonnan létrehozott változónak OnFilterScriptInit vagy OnGameModeInit alatt adjuk értékül a mozgatni kívált objektum azonosítóját.
valamicske = CreateObject(objectid, X, Y, Z, elfX, elfY, elfZ); // itt a csukott állapot koordinátáit adjuk meg
Idõzítés:
Most hozzunk létre egy idõzítõt, mely adott idõközönként (ajánlott 500ms) meghív egy saját függvényt, mely ellenõrzi van-e játékos a közelben, és ha van, kinyitja az ajtót vagy a kaput:
SetTimer(\"ajtotimer\", 500, true);
Egy rövidke függvényecske:
Végül íme maga a \"központi\" függvény, melyet igyekeztem bõségesen felkommentezni:
forward ajtotimer(); // prototípus
public ajtotimer(){
new bool:nyissuk = false; // egy helyi változó
for(new i; i<MAX_PLAYERS; i++){ // minden játékost ellenõrzünk
if(!IsPlayerConnected(i)) continue; // ha nincs ilyen játékos, ugrunk a következõre
if(IsPlayerInRangeOfPoint(i, 7.5, X, Y, Z)){
nyissuk=true; // ha 7.5 egységen belül van, legyen kinyitva neki - az értékeket itt is helyettesítsük a csukott állapotéval
break; // ha egy játékos a közelben van, nem nézünk tovább, hanem nyitunk
}
}
if(nyissuk)
MoveObject(valamicske, nyX, nyY, nyZ, seb); // ha van játékos a közelben lassan áthelyezzük az objektumot - \"kinyissuk\" - az értékeket itt a nyitott állapotéval helyettesítsük be
else
MoveObject(valamicske, X, Y, Z, seb); // ha nincs játékos a közelben, becsukjuk - az értékeket itt is helyettesítsük a csukott állapotéval
}
Írta: Y2K (2010. augusztus 12.)Frissítette: Y2K (2010. augusztus 23.)