SetTimerEx("Timeban",30000,0,"d",playerid);
bevorzuge d, da es nicht ins Negative geht und Ressourcensparender ist.
SetTimerEx("Timeban",30000,0,"d",playerid);
bevorzuge d, da es nicht ins Negative geht und Ressourcensparender ist.
Es steht auch in meinem Text drinnen, dass ich damals dies haben wollte, aber danke. Sowas hab ich von ihm lang gesucht ^^. Jedoch anzumerken, dass mein Include mehr Funktionalität bietet, als das von Einstein.
Joa, wollte ich auch erwähnen! In meiner nächsten Version wird das mim String klappen. Denn beim jetzigen SetTimerEx funktioniert der String garnicht ^^.
Wiedermal Hallöle Leute ^^,
Vorwort:
Schon wieder der Templer mit seiner gleichen Include vorstellung, aber nunja ich kann einfach keine Zeit dafür aufbringen nun schöne Bilder zu posten, außerdem ist es auch eher in die Programmierung gedacht und nicht für Spieler am Server ^^, ich stelle euch vor das:
TimerSys Include by Templer
(for Samp 0.1 or higher) //auch wenn es blöd klingt
Dieses Include ersetzt die Bugghaften SetTimer und SetTimerEx. Aus diesem Grund bugghaft, weil diese Funktionen bei falschen Verwendung bzw. bei richtiger Verwendung meisten (betreffend Strings) Ihren Geist aufgeben und nur sinnlos an CPU Lastung bringen oder wie zum Beispiel dem Herrn Kollegen Hagi Probleme bereiten. Vorerst wollte ich es dem Hagi im Thread Posten, war aber jedoch noch unglücklich über das System betreffend ein paar Fehler. Dieses System (sollte es halt, hab ich noch nicht getestet) die Server von CPU Auslastung schützen, indem nur ein einziger Timer läuft. Dieser Timer überprüft ledeglich nur, ob Timer mit meinem Include eingestellt wurden ^^. Funktionieren tut das Abrufen per CallLocalFunction bzw. CallRemoteFunction, was anpassbar ist am Script oben. Die Standartkonfiguration ist nicht empfehlenswert, aber zu beachten ist, dass ihr mit dem Überprüfungstimer nicht zu niedrig geht bzw. wirklich nur soviel Einstellt wieviel Ihr braucht (Nähere Information unten...). Die Idee kam mir damals hoch, als ich sowas suchte und bei Einstein seinen ProTimer gehört habe. Leider sind alle Mirrors kaputt gewesen und ich war total gekränkt. (Nichtmal Erfahren wie seine Methode funktioniert hat ) Nun ich belasse es mal beim traurig sein und wünsche euch Viel Spaß damit ^^.
Verwendung:
SetFastTimer(startname[], time, repeat = 0, endtimer = 0)
SetFastTimerEx(startname[], time, repeat = 0, const params[], {Float,_}:...)
KillFastTimer(timerid) //*Verändert ab v1.1*
Funktionen:
Beispiele:
Ich zeige euch nun hier ein paar Beispiele von SetFastTimer, SetFastTimerEx und KillFastTimer, wir nehmen an, dass diese Funktion existiert:
forward Funktionstest();
public Funktionstest()
{
for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
{
SendClientMessage(playerid, 0xFFFFFFAA, "Stirbt der Bauer im Oktober, braucht er im Winter keinen Pullover!");
}
return 1;
}
Dann rufen wir diese Funktion zum einen einmalig auf ohne Wiederholung nach sagen wir 3 Sekunden:
SetFastTimer("Funktionstest", 3000, 0);
... Wenn er sich wiederholen soll, einfach so:
SetFastTimer("Funktionstest", 3000, 1);
... und wenn die Funktion sich wiederholen soll für 10 Sekunden, dann so:
SetFastTimer("Funktionstest", 3000, 1, 10000);
Denn wie oben zu sehen ist, gibt es den optionalen Parameter endtimer.
Nun sagen wir, die gleiche Funktion jedoch Spieler bezogen:
forward Funktionstest(playerid);
public Funktionstest(playerid)
{
SendClientMessage(playerid, 0xFFFFFFAA, "Stirbt der Bauer im Oktober, braucht er im Winter keinen Pullover!");
return 1;
}
Dann rufen wir diese Funktion zum einen einmalig auf ohne Wiederholung nach sagen wir 3 Sekunden:
SetFastTimerEx("Funktionstest", 3000, 0, "d", playerid);
... Wenn er sich wiederholen soll, einfach so:
SetFastTimerEx("Funktionstest", 3000, 1, "d", playerid);
... und wenn die Funktion sich wiederholen soll für 10 Sekunden, dann so:
SetFastTimerEx("Funktionstest", 3000, 1, "d", playerid, 10000);
Beim letzten kann es unmöglich erscheinen, aber diese Funktion endtimer existiert auch dort ^^.
Nun kommen wir dazu, einen Timer zu töten und dies geht nun einfach, indem wir die ID vom Timer in eine Variable ablagern und diese wie gewohnt töten.
new FunTimer;
FunTimer = SetFastTimer("Funktionstest", 3000, 1, "d", playerid);
KillFastTimer(FunTimer);
Diese Variante funktioniert genauso bei SetFastTimerEx auch und natürlich auch, wenn endzeit-Parameter bei beiden definiert wurde. Natürlich bringt sich das Töten von Timern nichts, wenn es sich nicht wiederholt.
Ansonsten bei weiteren Fragen einfach Posten ^^.
Installation:
Credits:
/* TimerSys Include by Templer
(for SAMP 0.3 / or higher)
Dieses Script darf von jedermann verändert und benutzt werden!
Mir ist es sogar egal, wenn Ihr was von hier für euren Vorteil rauskopiert!
Was jedoch nicht Geduldet wird, dass das Copyright entfernt wird vom Script!
Credits:
-Double-O-Seven : Für das Zeigen wie Include und GM am besten kommunizieren!
-Samp-Team : Die es überhaupt ermöglicht haben sowas Programmierbar für GTA zu machen!
-Hagi: Er mich darauf aufmerksam machte, dass KillFastTimer einige Bugs bereitstellte in der ersten Version*/
Download:
TimerSys v1.0 Pastebin-Link TimerSys v1.0 Download-Link
TimerSys v1.1 Pastebin-Link
TimerSys v1.1 Download-Link
(Nebenbei gemerkt ist es auch als Dateianhang hier im Forum verfügbar, sollte es zu DownloadProblemen von den Hosts kommen)
Changelog v1.1:
Für weitere Fragen oder Anregungen könnt Ihr natürlich unten posten ...
Mfg Templer
//Edit:
-Neue Version hinzugefügt und Co...
forward AdminTimer();
public OnGameModeInit()
{
SetTimer("AdminTimer", 2500, 1); //2,5 Sekunden reichen vollkommen.
//Restlicher Code
}
public AdminTimer()
{
for(new playerid = 0; playerid != MAX_PLAYERS; playerid++)
{
if(GetPlayerScore(playerid) == 50) continue;
if(IsPlayerInRangeOfPoint(playerid, radius, X, Y, Z))
{
//Code was passieren soll, wenn Spieler unter Score 50 drinnen ist.
}
}
}
Er hats falsch gepostet:
/* SA-MP Object Functions
*
* (c) Copyright 2005-2009, SA-MP Team
*
*/
#if defined _objects_included
#endinput
#endif
#define _objects_included
#pragma library objects
// Objects
native CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = 300.0);
native SetObjectPos(objectid, Float:X, Float:Y, Float:Z);
native GetObjectPos(objectid, &Float:X, &Float:Y, &Float:Z);
native SetObjectRot(objectid, Float:RotX, Float:RotY, Float:RotZ);
native GetObjectRot(objectid, &Float:RotX, &Float:RotY, &Float:RotZ);
native IsValidObject(objectid);
native DestroyObject(objectid);
native MoveObject(objectid, Float:X, Float:Y, Float:Z, Floatpeed);
native StopObject(objectid);
native CreatePlayerObject(playerid, modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ,Float:DrawDistance = 300.0);
native SetPlayerObjectPos(playerid, objectid, Float:X, Float:Y, Float:Z);
native GetPlayerObjectPos(playerid, objectid, &Float:X, &Float:Y, &Float:Z);
native SetPlayerObjectRot(playerid, objectid, Float:RotX, Float:RotY, Float:RotZ);
native GetPlayerObjectRot(playerid, objectid, &Float:RotX, &Float:RotY, &Float:RotZ);
native IsValidPlayerObject(playerid, objectid);
native DestroyPlayerObject(playerid, objectid);
native MovePlayerObject(playerid, objectid, Float:X, Float:Y, Float:Z, Floatpeed);
native StopPlayerObject(playerid, objectid);
native AttachObjectToPlayer(objectid, playerid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);
native AttachPlayerObjectToPlayer(objectplayer, objectid, attachplayer, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);
Nebenan gemerkt, welchen Streamer nützt du? Wenn es ein Plugin ist, musst du einen anderen nützen der 0.3b tauglich ist. Wenn es ein FS / Include ist, dann passt die Lösung
Es sollte nur für Samp 0.3b sein xD
Aber so nebenbei, schon gemerkt das PAWN bei einem kleinem Fehler sofort abstürzt?
Compiliert mal es so:
new Buchstaben[27][] ={
{"A"},//diese
{"B"},
{"C"},
{"D"},
{"E"},
{"F"},
{"G"},
{"H"},
{"I"},
{"J"},
{"K"},
{"L"},
{"M"},
{"N"},
{"O"},
{"P"},
{"Q"},
{"R"},
{"S"},
{"T"},
{"U"},
{"V"},
{"W"},
{"X"},
{"Y"},
{"Z"}
};
und er stürzt sofort ab Nur weil er es nicht schafft bei Multidimensionalen Arrays den Fehler zu erkennen.
Du müsstest nur folgende zwei Sachen in der Include a_objects.inc ändern:
native CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = 300.0);
native CreatePlayerObject(playerid, modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = 300.0);
Nun, ich weiß nicht wie Ihr es nützt, aber das return Funktioniert einwandfrei bei mir. Habe sein Problem ja doch nachscriptet in etwa.
ZKX, entweder du hast dich nun selbst erniedrigt oder kannst nicht lesen Ich habe diesen Code mit einem return abblocken lassen, wenn Spieler nicht eingeloggt ist (siehe obigen Posts), aber er meint das es nicht geht...
Bis auf das, dass bei deiner KameraPos oben das SetPlayerPos fehlt, hab ich es selbst getestet und es ging bei mir.
public OnPlayerRequestClass(playerid, classid)
{
new pname[MAX_PLAYERS],accFormat[128];
GetPlayerName(playerid,pname,sizeof pname);
format(accFormat,sizeof accFormat,"%s.datei",pname);
if(Spieler[playerid][Eingeloggt] < 1)
{
if(fexist(accFormat))
{
SetPlayerCameraPos(playerid,1334.1407,-1885.0770,194.1379);
SetPlayerCameraLookAt(playerid, 1528.7094,-1553.2479,67.2109);
ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Bitte logge dich ein","Weiter","Abbrechen");
}
else
{
SetPlayerCameraPos(playerid,2041.2831,-2717.3804,94.2059);
SetPlayerCameraLookAt(playerid, 1856.8364,-2562.0042,13.5469);
ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Weiter","Abbrechen");
}
return 1; //Dieses return blockiert nun den kommenden Scriptblock.
}
SetPlayerPos(playerid, 1-1983.5542,665.4218,46.5683);
SetPlayerCameraPos(playerid, -1977.6497,665.9248,46.5683);
SetPlayerCameraLookAt(playerid, -1983.5542,665.4218,46.5683);
SetPlayerFacingAngle(playerid,270.0000);
return 1;
}
Ok ich kommentiere dir nun den Scriptteil... Kommentare sind nach // zu sehen. Nun solltest du es sehen, was ich meine..
public OnPlayerRequestClass(playerid, classid) //Gut, aufgerufen wenn einer in Skinauswahl kommt/ist.
{
new pname[MAX_PLAYERS],accFormat[128]; //Schöne Arrays for Spieler-/Dateinamen
GetPlayerName(playerid,pname,sizeof pname); //Findet Spielernamen heraus
format(accFormat,sizeof accFormat,"%s.datei",pname); //formatiert Dateinamen zum auslesen
if(Spieler[playerid][Eingeloggt] < 1) //Ob Spieler eingeloggt ist, aber wenn nicht ...
{
if(fexist(accFormat)) //... überprüfe ob Account vorhanden ist, ansonsten...
{
SetPlayerCameraPos(playerid,1334.1407,-1885.0770,194.1379); //Setzt die SpielerKamera auf die Koordinaten für bereits registrierte Spieler.
SetPlayerCameraLookAt(playerid, 1528.7094,-1553.2479,67.2109); //Der Punkt für die SpielerKamera wohin sie schauen soll für bereits registrierte Spieler.
ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Bitte logge dich ein","Weiter","Abbrechen"); //LoginDialog für Spieler zeigen
}
else //...zwinge Ihn neu zum registrieren.
{
SetPlayerCameraPos(playerid,2041.2831,-2717.3804,94.2059); //Setzt die SpielerKamera auf die Koordinaten für neue Spieler.
SetPlayerCameraLookAt(playerid, 1856.8364,-2562.0042,13.5469); //Der Punkt für die SpielerKamera wohin sie schauen soll für neue Spieler.
ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Weiter","Abbrechen"); //Registrierungsdialog für Spieler zeigen.
}
}
SetPlayerPos(playerid, 1-1983.5542,665.4218,46.5683); //Setzt Spieler Koordinate auf Punkt, egal ob Registriert oder Neu.
SetPlayerCameraPos(playerid, -1977.6497,665.9248,46.5683); //Setzt SpielerKamera Neu für Spieler, egal ob Registriert oder Neu.
SetPlayerCameraLookAt(playerid, -1983.5542,665.4218,46.5683); //Setzt Punkt für Spielerkamera neu für Spieler, egal ob Registriert oder Neu.
SetPlayerFacingAngle(playerid,270.0000); //Richtet die Ausrichtung vom Skin, wohin der Skin schauen soll.
return 1;
}
Du ehm, ich will nix sagen, aber das wird doch langsam peinlich für dich oder? Schau mal die Letzten 4 Zeilen an xD
Jo perfekt
forward UpdateUserFile();
public OnGameModeInit()
{
SetTimer("UpdateUserFile", 600000, 1); //Alle 10min Funktion aufrufen
}
public UpdateUserFile()
{
for(new playerid = 0; playerid != MAX_PLAYERS; playerid++)
{
//Der Code zum abspeichern der Daten
//Die SpielerID ist 'playerid'
}
return true;
}
Hier bitte, du hast die Werte noch nicht ausgelesen gehabt, ich habs dir mal direkt gemacht ^^:
public OnPlayerSpawn(playerid)
{
new pname[MAX_PLAYERS],accFormat[128];
GetPlayerName(playerid,pname,sizeof pname);
format(accFormat,sizeof accFormat,"%s.datei",pname);
if(dini_Isset(accFormat,"lastx"))
{
SetPlayerPos(playerid,dini_Float(accFormat,"lastx"), dini_Float(accFormat,"lasty"), dini_Float(accFormat,"lastz"));
}
if(dini_Isset(accFormat,"skin"))
{
SetPlayerSkin(playerid,dini_Int(accFormat, "skin"));
}
//Restlicher Code ...
}