Ich habe irgendwo mal gelesen dass man mit OnPlayerupdate irgendwie checken könnte ob der Player aufm Desktop ist, da es ein anderes Return sendet, stimmt dass wenn ja könnte mir jemand einen kleinen Denk anstoss geben wie ich dies benutzen könnte als if abfrage.
Desktoper erkennen mit OnPlayerUpdate?
- [DT]Sniper
- Geschlossen
- Erledigt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Bin mir nicht sicher, aber sollte in der Regel über GetTickCount() funktionieren...
public OnPlayerUpdate(playerid)
{
new _desk = GetTickCount();
while(_desk) {} else { return kick(playerid); }
}Habs selber nicht ausprobiert, müsste mal ein paar Funktionen durchgehen, unter MTA wäre die Sache einfacher,
vermutlich ändert sich beim auf den Desktop wechseln Ping, Ip, Position des Spielers, Animation oder sonstiges... -
soweit ich dass verstanden habe gibt OnPlayerUpdate selber ein anderes return aber ob das stimmt ist ne andere Sache.
-
Hm...es müsste ja eine Funktion sein, die sich verändert ein anderes Ergebnis ausgibt wenn der Spieler den Server/Desktop betritt.
Trotzdem gäbs natürlich einen Weg, indem man einfach die Position des Spielers nimmt, bzw. (wenn das in Sa-mp möglich ist) die Position des Cursors. -
Du kannst es auch mal über den Ping des Spielers versuchen
-
Cursor kann man in samp nicht benutzen.
Warte mal habe hier was gefunden: http://wiki.sa-mp.com/wiki/OnPlayerUpdate
ZitatReturns 0 - Update from this player will not be replicated to other clients.
Returns 1 - Indicates that this update can be processed normally and sent to other players.könnte mann damit nicht sowas machen? Einen Timer der alle 2 skunden dies abfragt:
if(!OnPlayerUpdate(playerid)) {SendClientMessage(playerid,YELLOW,"Du darfst nicht auf den Desktop!");}
der Text ist nur als Beispiel.
edit: Teste das mal so.
edit2: Geht nicht OnPlayerUpdate kann man nicht als funktion benutzen da kommt dann: error 004: function "OnPlayerUpdate" is not implemented
-
public OnPlayerUpdate(playerid)
{
new _desk = GetTickCount();
while(_desk) {} else { return kick(playerid); }
}
Das würde den Server eigentlich nur aufhängen da es zu einem Unendlichem Loop kommt.Generell musst du bei OnPlayerUpdate() nur in einer Variable speichern zu welchem Tick der Spieler zuletzt etwas getan hat / Packet gesendet hat.
Wann du ihn kicken möchtest bleibt dir überlassen.
Entweder du guckst per Timer ob sein letzter Tick sich nicht verändert hat,oder du wartest bis OnPlayerUpdate() wieder aufgerufen wird für den Spieler,überprüfst die Differenz der Tick's und handelst entsprechend. -
du hast wahrscheinlich ein klammerfehler
-
War auch nur eine Idee, aber wie kann es sein, das man keine Pakette an den Server sendet sobald man den Desktop betritt ?
public OnPlayerUpdate(playerid)
{
new _desk[playerid] = GetTickCount(); /*Bringt vermutlich nichts, der Parameter muss ja auch ner Funktion zugewiesen werden, welche die Ticks vom Spieler ausgibt*/
while(_desk[playerid] > /*Menge*/) {} else { return kick(playerid); }
} -
Du meinst so etwas:
new PlayerDesk[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
PlayerDesk[playerid] = 0;
}Timer jede sekunde der jeden Spieler der on ist durch geht
{
PlayerDesk[i] ++;
if(PlayerDesk[i] >= 5) {kick(i)}
}edit:
@ Jason: Keine Ahnung aber es muss ja so sein, denn wenn man auf dem Desktop ist wird man nicht mehr mit dem Server synchronisiert (unsterblich, mann bekommt nur die Position wo er war befor er auf desktop(wenn er als beifahrer sitzt.))
-
-
public OnPlayerUpdate(playerid) {
PlayerDesk[playerid] = 0;
}So würdest du den Parameter, durch ein Event schicken, das ja öfter als einmal in der Sekunde (wenn ich mich nicht irre)
auf 0 setzen.ZitatDas würde den Server eigentlich nur aufhängen da es zu einem Unendlichem Loop kommt.
Wozu gibt es den break
public OnPlayerUpdate(playerid)
{
new _desk[playerid] = GetTickCount(); /*Bringt vermutlich nichts, der Parameter muss ja auch ner Funktion zugewiesen werden, welche die Ticks vom Spieler ausgibt*/
while(_desk[playerid] > /*Menge*/) {} else { break; return kick(playerid); }
} -
Also meine Idee funktioniert nur wenn der spieler nicht gspawnt ist wird onplayerupdate nicht aufgeruffen. Ich werde noch mal paar sachen kucken.
edit: Das mit dem nicht gespawnten ist gelöst, nur schlägt er auch alarm wenn mann im gamemenü ist, da dort auch kein onplayerupdate ausgeführt wird.Hat hierbei vielleicht einer eine Idee?
-
es währe cool wen man ein befehl machen kann um zu looken wer auf dem desktop is
-
Ich bin scho soweit er erkennt wenn jemand desktop ist, nur sagt er mir auch ich wäre desktop wenn ich im Menü bin... Da leider auch im Menü OnPlayerUpdate nicht ausgeführt wird.
-
Meinst du selbstgebaute Menüs oder von Sa:mp vorgegebene [Spielerliste, Spawndialog].
Bei eigens gebauten, müsstest du nur mit Parametern arbeiten. -
Nein ich meine das Hauptmenü, die anderen werde ich noch mal checken.
edit: Spawndialog und Playerliste ist kein Problem
-
Jason_Gregory Posts sind wirklich zum brüllen.
Ahja.. schonmal while else gesehn?new bool:PlayerUpdate[MAX_PLAYERS], PlayerChance[MAX_PLAYERS];
forward ResetPlayerUpdate(playerid);
public OnPlayerUpdate(playerid)
{
PlayerUpdate[playerid] = true;
}
public ResetPlayerUpdate(playerid)
{
if(!PlayerUpdate[playerid])
PlayerChance[playerid]++;
if(PlayerChance[playerid] == 3)
{
Kick(playerid);
return 1;
}
PlayerUpdate[playerid] = false;
return 1;
}public OnPlayerConnect(playerid)
{
OnPlayerUpdate(playerid); // Ich bin zu faul die Zeile von oben abzutippen :>
PlayerChance[playerid] = 0;
SetTimerEx("ResetPlayerUpdate", 4000, 1, "d", playerid); // Alle 4 Sekunden sollte passen.
return 1;
}Ungetestet, sollte aber eigendlich klappen.
-
So habe ich es auch nur dass ich es etwas kleiner habe:
new PlayerDesk[MAX_PLAYERS];
forward SyncTimer();public OnGameModeInit()
{
SetTimer("SyncTimer", 1000, 1);
}public OnPlayerUpdate(playerid)
{
PlayerDesk[playerid] = 0;
}public SyncTimer()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && GetPlayerState(i) != PLAYER_STATE_NONE)
PlayerDesk[i] ++;
if(PlayerDesk[i] >= 5) {SendClientMessage(i,COLOR_YELLOW,"Du darfst nicht auf den Desktop!");}
}
}Das besondere: GetPlayerState(i) != PLAYER_STATE_NONE ohne dies könnte er schon gekickt werden bevor er das erste mal spawnt.
-
Bei mir nicht, da er alle 4 Sek prüft und keiner 12 Sek braucht, um zu spawnen (zumal OnPlayerUpdate schon beim connecten tickt)
-
Ja da haste auch recht naja das einzige Problem ist dass mit dem Hauptmenü