Szerző Téma: X ideig bentlét  (Megtekintve 1056 alkalommal)

X ideig bentlét
« Dátum: 2014. július 09. - 16:04:26 »
0 Show voters
Halisztok.! Olyanba kéne nekem segítség hogy ha elteleportálok egy helyre, akkor 15 perc múlva dobjon ki mindenkit
ottvan[playerid] = 1;

 egy X kordinátára! ;\"D 
Hálás lennék aki megcsinálná nekem  <3

X ideig bentlét
« Válasz #1 Dátum: 2014. július 29. - 13:42:34 »
0 Show voters
Nem teszteltem de mûködnie kéne ;)
[pawn]
forward Teleportal();
public Teleportal()
{
for(new i; i < MAX_PLAYERS; i++)
{
   if(IsPlayerConnected(i))
   {
      if(ottvan == 1)

      {


         Kick(i);//Ledobja õket a szerverrõl.


         /*Nem biztos hogy erre gondoltál de ide kell írni azt hogy mi történjen azokkal a játékosokkal akiknél ottvan[playerid]=1;


         Csak a playerid helyett azt írd hogy: i


         */


      }


   }


}


return 1;


}


CMD:tele(playerid, params[ ])


{


SetPlayerPos(playerid, 1,2,3);//Ahova téged teleportáljon. Írd át


SetTimer(\"Teleportal\",900000,false);


return 1;


}


[/pawn]


Azokat ledobja a szerverrõl akiknél az ottvan[playerid] = 1;


Nem biztos hogy erre gondoltál, lehet csak rosszul értettem :D

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
X ideig bentlét
« Válasz #2 Dátum: 2014. július 29. - 18:32:05 »
0 Show voters
Idézetet írta: Gripen date=1406634154\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"49318\" data-ipsquote-contentclass=\"forums_Topic
...
 
Ez nem 15 perc múlva dob le a szerverrõl + nem is azt kérte hogy kickeljen a szerver mindenkit, hanem dobjon Xyz koordinátára + minek ennyi sorpazarlás?
Így csináld.. Lásd:
 
#define FILTERSCRIPT
#include a_samp
#include zcmd
new ottvan[MAX_PLAYERS];
CMD:teleport(playerid) {
SetPlayerPos(playerid, 0.0, 0.0, 3.0);
SendClientMessage(playerid, -1, \"Sikeresen elteleportáltál!\");
ottvan[playerid] = 1;
SetTimer(\"AllTele\", 60000*15, false);
return 1;
}
forward AllTele();
public AllTele() {
for(new i; i < MAX_PLAYERS; i++) if(IsPlayerConnected(i) && ottvan == 1) SetPlayerPos(i, 10.0, 10.0, 3.0);
}
« Utoljára szerkesztve: 2014. július 29. - 18:36:18 írta Flash »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
X ideig bentlét
« Válasz #3 Dátum: 2014. július 29. - 19:07:26 »
0 Show voters
Flash, a sorokkal egyszerûen nem lehet pazarolni :D Elõször is végtelen mennyiségûek, másodszor pedig ha ugyanazon kód hosszabban és rövidebben megírt változatárol beszélünk, pl.:
 
if(true)
{
    print(\"Teszt.\");
}

 
azaz
 
if(true) { print(\"Teszt.\"); }

 
...akkor a rövidebb példa lefordított forráskódja (az amx fájl tartalma, avagy a gépi kód) nem csak, hogy nem lesz gyorsabb, mint a hosszabb példa, hanem teljesen ugyanaz lesz. A témanyitó roppantul félreérthetõen írta le, hogy mit is szeretne elérni, így bizony a Kick is számításba jöhetett. Valamint Gripen kódja szép rendezett és azinte mûködõképes, bár van benne hiba. Méghozzá az, hogy nem váltja át a változó értékét 1-re. Képzeljük azt, hogy átvált. Ekkor marad még egy hiba, habár ez csak akkor hiba, ha a célt tartjuk szem elõtt. Errõl a hibáról pedig már írok is: az az állításod, hogy nem 15 perc múlva dob le a szerverrõl, részben helytelen. Ugyanis a timerne 15 percet adotr meg, ezért helytelen. Azért viszont helyes, mert ha más is beírja a parancsot, akkor a második ember hamarabb fog kirúgódni, mint 15 perc. De ha már itt járunk, te is elkövetted ugyanezt a baklövést. Ráadásul a te \"egyszerûsített\" és \"nem pazarló\" kódod lassabb, mint az övé. Már csak azért is, mert egy teljesen felesleges számítást végeztetsz el a programmal, méghozzá a 60000*15-öt - ahelyett, hogy szépen leírnád a 900000-et, ahogyan azt Gripen is tette. Illet a timernél egy elágazásban feleslegesen végeztetünk el egy vizsgálatot, amelyet elég lenne a késõbbiekben elvégezni csak akkor, ha szükség van rá. Igaz, így spóroltunk egy elágazást, ez tény. A ciklusváltozó értékadásáról pedig már nem is beszélnék, mert mindketten a - szerintem - lassabb módszert választottátok, bár erre szinte senki sem szokott odafigyelni a pawn nyelben, mert ez nem egy hû de nagy nyelv profi programozókkal és profi programokkal világszerte. Bár meg kell hagyni, írtak pár szép és profi módot az elmúlt évtized során.

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
X ideig bentlét
« Válasz #4 Dátum: 2014. július 29. - 20:06:46 »
0 Show voters
Most hogy meggondolom igazad lehet. És azon is elgondolkoztam hogy szükséges-e az IsPlayerConnect lekérdezés, mivel ott van a változó lekérdezése is, és nem azt kérdezzük le hogy 0 hanem hogy 1, és ugye nem lehet offline játékosnak az \"ottvan\" értéke 1.
ha jobban átértelmezed a szöveget akkor rájössz hogy kedves sutiwarrior nem azt kérte hogy kickeljen a szerver mindenkit, hanem hogy 15 perc múlva elteleportáljon mindenkit X koordinátához.
Jelenlegi scriptet használd:
 
#define FILTERSCRIPT
#include a_samp
#include zcmd
CMD:teleport(playerid) {
        SetPlayerPos(playerid, 0.0, 0.0, 3.0);
        SendClientMessage(playerid, -1, \"Sikeresen elteleportáltál!\");
SetPVarInt(playerid, \"ottvan\", 1);
        SetTimerEx(\"AllTele\", 900000, false, \"i\", playerid);
        return 1;
}
forward AllTele();
public AllTele() {
        for(new i; i < MAX_PLAYERS; i++) if(GetPVarInt(i, \"ottvan\")==1) SetPlayerPos(i, 10.0, 10.0, 3.0);
}

 
Esetleg kedves Dfoglalo, van ellene valami hozzáfûznivalód?
« Utoljára szerkesztve: 2014. július 29. - 20:27:23 írta Flash »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
X ideig bentlét
« Válasz #5 Dátum: 2014. július 29. - 20:23:35 »
+1 Show voters
Idézetet írta: Flash date=1406657206\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"49318\" data-ipsquote-contentclass=\"forums_Topic
ha jobban átértelmezed a szöveget akkor rájössz hogy kedves sutiwarrior nem azt kérte hogy kickeljen a szerver mindenkit, hanem hogy 15 perc múlva elteleportáljon mindenkit X koordinátához.
 
Nekem is a pozíció áthelyezés jött le, de ettõl függetlenül nem volt egyértelmû a megfogalmazás.
 

Most hogy meggondolom igazad lehet. És azon is elgondolkoztam hogy szükséges-e az IsPlayerConnect lekérdezés, mivel ott van a változó lekérdezése is, és nem azt kérdezzük le hogy 0 hanem hogy 1, és ugye nem lehet offline játékosnak az \"ottvan\" értéke 1.
 
[/quote]
De, lehet annak is az értéke egy, amennyiben változókat alkalmazunk és elfelejtjük azt a feladat zökkenõmentes végrehajtásához szükséges alapértékre állítani Connectkor vagy Disconnectkor. Ez az alapérték esetünkben nulla. PVaroknál azonban ez nem jelent veszélyt, így most helyes a forráskód ezen szempontból nézve. Azonban ez a része koránt sem:
 
if(GetPVarInt(i, \"ottvan\"))

 
Ugyanis 1 esetén false logikai értéket fog visszaadni és az elágazás hamis ága fog lefutni. Ezáltal pedig azok fognak áthelyezõni, akik be sem írták a parancsot.


Egyébként ez a SetTimeres megoldás nem túl optimális még mindig. Hogy miért? Azt már feljebb egy korábbi hozzászólásom keretein belül leírtam:
 

Ha más is beírja a parancsot, akkor a második ember hamarabb fog kirúgódni, mint 15 perc.
 
[/quote]
Ezt pedig kiegészíteném azzal, hogy ha ezek után 15 percen belül senki más nem írja be a parancsot, a timer senkit sem fog kirúgni. De ha jobban megnézzük a forráskódot, akad még itt probléma: a timer nincs leállítva egyszer sem, így állandóan feleslegesen fut tovább, illetve a parancs beírásával is csak egyre több timer jön létre. A parancs 10x faló beírása után már 10 timer fog menni, feleslegesen. Ez az egész pedig rövid idõn lagghoz vezethet - igaz, elég nagy idõközökrõl beszélünk. De ezt a sok problémát elfelejthetjük, elvégre valószínûleg a témanyitó a saját céljainak megfelelõen más idõzítõs rendszert fog alkalmazni.

X ideig bentlét
« Válasz #6 Dátum: 2014. július 29. - 22:12:50 »
0 Show voters
Elõször én is úgy csináltam meg, hogy az ott lévõ játékosokat elteleportálja. De ahogy elolvastam még egyszer hogy mit is kell, már elgondolkodtam rajta és oda is írtam hogy nem biztos hogy erre gondolt sutiwarrior.
Sorpazarlás nem hiszem hogy van mert szerintem az hogy pl. egy for ciklust szétírok 4 sorba(átláthatóbb), vagy megírom az egészet 1 sorba attól még az ugyan az.
Igen, most hogy mondjátok van benne hiba, ami nem is annyira baj, mert ebbõl csak tanulhatok :)
És lenne egy kérdésem is. Ha a timerbe azt írom hogy false az nem azt jelenti hogy 1x lefut a timer és többször nem? Mert lehet hogy rosszul tudom. ;)
Edit: már rá jöttem hogy miért hittem azt hogy kickelni kell. Amikor másodszor olvastam nem láttam azt hogy \"egy X kordinátára\" -.-
« Utoljára szerkesztve: 2014. július 29. - 22:44:44 írta Gripen »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
X ideig bentlét
« Válasz #7 Dátum: 2014. július 29. - 23:59:48 »
0 Show voters
Igen, azt jelenti. Ha false, akkor csak egyszer fut le . gyakorlatilag késleltet -, ha true, akkor pedig végtelenszer, kivéve, ha leállítod a KillTimer függvény segítségével, melyben az adott timer ID-je kerül megadásra. Ez az ID/azomosító legegyszerûbben úgy található- és adható meg, hogy egy változó értékének megadod magát a timert, lásd:
 
Timer = SetTimer();

 
Így könnyen használva a KillTimert, lásd:
 
KillTimer(Timer);

 
SetTimerExnél természetesen - amennyiben játékosok számára alkalmazod, többször, ugyanazt a timert - érdemes külön, több változót alkalmaznod, melyet a legegyszerûbb - valójában egy változóként - alkalmani, egy tömb segítségével, lásd:
 
Timer[playerid] = SetTimerEx();

 
Leállításkor pedig értelemszerûen tömbbel adjuk meg a változót:
 
KillTimer(Timer[playerid]);

X ideig bentlét
« Válasz #8 Dátum: 2014. július 30. - 11:32:27 »
0 Show voters
Akkor jól tudtam, köszi a választ :)

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal