Beiträge von Templer
-
-
-
forward countmedown(Float:StartX, Float:StartY, Float:StartZ);
new countdown = 5;
new countdowntimer;public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/starten", cmdtext, true, 10) == 0)
{
new Float:PlayerPos[3]; GetPlayerPos(playerid, PlayerPos[0], PlayerPos[1], PlayerPos[2]);
countdowntimer = SetTimerEx("countmedown",1000,1,"fff", PlayerPos[0], PlayerPos[1], PlayerPos[2]);
}
return 0;
}public countmedown(Float:StartX, Float:StartY, Float:StartZ)
{
if(countdown > 0)
{
new string[128];
format(string,sizeof(string),"%d",countdown);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerInRangeOfPoint(i, 20.0, StartX, StartY, StartZ)) continue;
GameTextForPlayer(i,string,1000,5);
}
countdown --;
}
else
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerInRangeOfPoint(i, 20.0, StartX, StartY, StartZ)) continue;
GameTextForPlayer(i,"~g~GO GO GO",1000,5);
}
KillTimer(countdowntimer);
countdown = 5;
}
} -
Schöner GF Copy & Paste DeadLock und es ist sogar falsch. Er will was anderes xD
new PlayerText3D:3DTextForPlayer[MAX_PLAYERS];public OnPlayerConnect(playerid)
{
3DTextForPlayer[playerid] = -1;
}public OnPlayerDisconnect(playerid)
{
if(3DTextForPlayer[playerid] != -1) DeletePlayer3DTextLabel(playerid, 3DTextForPlayer[playerid]);
}public OnPlayerCommandText(playerid, cmdtext[])
{
new string[128];
if(!strcmp(cmdtext, "/a", true, strfind(cmdtext, " ", false)))
{
if(!IsPlayerConnected(playerid)) return 1;
new reason[32], Float:PlayerPos[3];
strmid(reason, cmdtext, strfind(cmdtext, " ", false)+1, strlen(cmdtext));
if(!strlen(reason)) return SendClientMessage(playerid, 0xFFFFFF00, "Benutze : /a [Text]");
GetPlayerPos(playerid, PlayerPos[0], PlayerPos[1], PlayerPos[2]);
if(3DTextForPlayer[playerid] != -1) DeletePlayer3DTextLabel(playerid, 3DTextForPlayer[playerid]);
3DTextForPlayer = CreatePlayer3DTextLabel(playerid,reason,0x008080FF,PlayerPos[0], PlayerPos[1], PlayerPos[2],40.0);
return SendClientMessage(playerid, 0xFFFFFF00, "3D-Text (Spielerseitig) erstellt.");
}
}//Edit: Kleiner Fix..
-
Erstens falsches Thema, aber der Befehl
sudo kann nicht ausgeführt werden, wenn es über einen Nutzer ohne Root Rechte genützt wird, lösch also das sudo weg und probiers ohne ihm... -
if(strcmp(cmd, "/wanted", true) == 0)
{
if(!IsPlayerConnected(playerid)) return 1;
if(!IsACop(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Du bist kein Polizist / FBI Agent / Nationalgarde!");
new textstring[512], i;
strcat(textstring, "Gesuchte Verbrecher:~n~~w~");
while(i < MAX_PLAYERS)
{
if(!IsPlayerConnected(i) || WantedLevel[i] < 1) continue;
GetPlayerName(i, giveplayer, sizeof(giveplayer));
format(string, sizeof(string), "~>~%s: ~r~%d~w~~n~",giveplayer,WantedLevel[i]);
strcat(textstring, string);
i++;
}
TextDrawSetString(txtwanted, textstring);
TextDrawShowForPlayer(playerid, txtwanted);
return 1;
} -
Schau in den Includes nach. Vielleicht in morphinc.inc?
-
@ Trooper
ZitatAus 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.
Der Sinn dahinter ist klar, wenn man den Timer von Samp kennt. Viele plagen sich damit, dass Ihre Scripts oft stottern bzw. die Timer nur unnötig an Ressourcen verbrauchen. Nur weil uns die Samp Entwickler Funktionen bauen, heißt es nicht das man daran gebunden wäre. Ich meine von deiner Aussicht wäre ja auch dcmd, sscanf, YSI, SII und vieles mehr auch unnütz, denn es ist ja eigentlich schon vorhanden und nur weil es vorhanden ist, bedeutet es nicht, dass es oftmals auch gut ist. Natürlich kann man sich über die SetTimer Funktion nicht beschweren, kein Zweifel. Jedoch wenn es eine andere Methode gibt, welche genau den gleichen Nutzen bringen würde, wieso dann nicht in die Tat umsetzen? Ich will keinesfalls nun versuchen deinen "Senf" verfaulen zu lassen, sondern Ihn nur in den Kühlschrank zurückstellen... Anbei möchte ich dir aber einen Kritik ablassen. Bitte verwende richtige Wortwahlen und keine protzigen und leicht provozierende Anmerkungen wie "Angeblich es nicht geht" und "Absolut Sinnlos", denn was nach diesen Wörtern kommt wurde auch schon bereits erwähnt.
-
forward CheckVehicleLastPos();
new Float:gVehiclePos[MAX_VEHICLES][3];
new bool:gVehicleCreated[MAX_VEHICLES];public OnGameModeInit()
{
SetTimer("CheckVehicleLastPos", 1500, 1);
}public OnVehicleSpawn(vehicleid)
{
GetVehiclePos(vehicleid, gVehiclePos[vehicleid][0], gVehiclePos[vehicleid][1], gVehiclePos[vehicleid][2]);
gVehicleCreated[vehicleid] = true;
}public OnVehicleDeath(vehicleid)
{
gVehicleCreated[vehicleid] = false;
}public CheckVehicleLastPos()
{
new Float:nVehiclePos[3];
for(new vehicleid = 0; vehicleid < MAX_VEHICLES; vehicleid++)
{
if(!gVehicleCreated[vehicleid]) continue;
GetVehiclePos(vehicleid, nVehiclePos[0], nVehiclePos[1], nVehiclePos[2]);
if(nVehiclePos[0] != gVehiclePos[vehicleid][0] || nVehiclePos[1] != gVehiclePos[vehicleid][1] || nVehiclePos[2] != gVehiclePos[vehicleid][2])
{
//Code was geschehen soll, wenn er sich bewegt hat.
GetVehiclePos(vehicleid, gVehiclePos[vehicleid][0], gVehiclePos[vehicleid][1], gVehiclePos[vehicleid][2]);
}
}
} -
Ah sry, bei meinem Code müsstest du im Befehl diese Zeile ändern
gCarRespawnTimerID = SetTimer("carrespawn",1000,1);
Hab mich vertippt ^^. Also deine neue Methode würde auch so gehen, natürlich. Jedoch kann es passieren, dass wenn der Code zu langsam es berechnet, er früher schon abbricht, verstehst?
-
new gCarRespawnTimerID = -1;
dcmd_carrespawn(playerid,params[])
{
if(gCarRespawnTimerID != -1) return SendClientMessage(playerid, weiß, "CarRespawn wird gerade durchgeführt...");
new sekunden;
if(sscanf(params, "d",sekunden))
{
return SendClientMessage(playerid,weiß,"Benutzung: /carrespawn [sekunden]");
}
if(GetPVarInt(playerid,ADMIN_KEY) >= 4)
{
if(sekunden >= 1 && sekunden <= 60)
{
carrespawncounter = sekunden;
new string[32];
format(string,sizeof(string),"Carrespawn:~n~%d Sekunden",carrespawncounter);
TextDrawShowForAll(carrespawntext);
TextDrawSetString(carrespawntext,string);
gCarRespawnTimerID = SetTimer("carrespawn",1000,0);
new admin[MAX_PLAYER_NAME];
new string2[64];
GetPlayerName(playerid,admin,sizeof(admin));
format(string2,sizeof(string2),"Admin %s lässt alle unbenuzten Fahrzeuge respawnen",admin);
SendClientMessageToAll(grün,string2);
//admincmdlog(string2);
}
else
{
SendClientMessage(playerid,rot,"Fehler: Mögliche Sekunden 1-60");
}
}
else
{
SendClientMessage(playerid,rot,"Du besitzt nicht die nötige Einstufung zur Ausführung dieses Befehls");
}
return 1;
}public carrespawn()
{
if(carrespawncounter == 0)
{
TextDrawHideForAll(carrespawntext);
KillFastTimer(gCarRespawnTimerID);
gCarRespawnTimerID = -1;
for(new i=0;i<MAX_VEHICLES;i++)
{
if(IsVehicleOccupied(i) == 0)
{
SetVehicleToRespawn(i);
}
}
}
else
{
carrespawncounter --;
new string[128];
format(string,sizeof(string),"Carrespawn:~n~%d Sekunden",carrespawncounter);
TextDrawHideForAll(carrespawntext);
TextDrawShowForAll(carrespawntext);
TextDrawSetString(carrespawntext,string);
}
} -
Zeig die Code Auschnitte von OnPlayerConnect und OnPlayerRequestClass
-
Zeig mir mal kurz, wie du das public Aufrufst und ich zeig dir eine andere Variante, die besser ist.
-
Du meintest doch:
ZitatIch bekomms zwar jetzt compiled, aber wenn ich InGame zum Beispiel mein Carrespawn starte starte, dann zählt er mal die Zeit gar nicht runter, bzw zählt bis 0 und bricht dann einfach ab.
Also ich versteh dich irgendwie nicht xD
-
public carrespawn()
{
if(carrespawncounter == 0)
{
TextDrawHideForAll(carrespawntext);
for(new i=0;i<MAX_VEHICLES;i++)
{
if(IsVehicleOccupied(i) == 0)
{
SetVehicleToRespawn(i);
}
}
}
else
{
carrespawncounter --;
new string[128];
format(string,sizeof(string),"Carrespawn:~n~%d Sekunden",carrespawncounter);
TextDrawHideForAll(carrespawntext);
TextDrawShowForAll(carrespawntext);
TextDrawSetString(carrespawntext,string);
}
SetTimer("carrespawn",1000,0);
}Hast du auch oben GM folgendes definiert?
#define SetTimer SetFastTimer
#define SetTimerEx SetFastTimerEx
#define KillTimer KillFastTimer//Edit: Ich sehe grad deine Meldung und wie du dein Timer definiert hast! Zitat vom Topic Oben:
ZitatNatürlich bringt sich das Töten von Timern nichts, wenn es sich nicht wiederholt.
-
@ Hagi Danke für die Bugmeldung, ich habe nun einige Bugfixes betreffend FastKillTimer behoben. Ich editier oben mal das Thema...
//Edit wegen neuer Version:
Hier nun ein kleines Beispiel für dich Hagi, wie es funktioniert:forward PlayerTimer(playerid);
public OnPlayerConnect(playerid)
{
SetPVarInt(playerid,"PlayerTimerID",SetFastTimerEx("PlayerTimer", 1000, 1, "d", playerid)); //Erstellt für Spieler Timer und lagert ID in PVar 'PlayerTimerID' ab.
}
public OnPlayerDisconnect(playerid)
{
KillFastTimer(GetPVarInt(playerid, "PlayerTimerID")); //Killt den SpielerTimer mit der ID von 'PlayerTimerID'
DeletePVar(playerid, "PlayerTimerID"); //Löscht den PVar 'PlayerTimerID'
}public PlayerTimer(playerid) //Spielerseitiger Timer
{
//Blah Blah Blah
return true;
}@ RFT Naja, mir wäre es lieber wenn du mir keine Beurteilung gibst, wenn du es nichtmal getestet hast
Da ich jederzeit auf Vorschläge warte.
-
enum gteamInfo //Datentyp Definition für gTeam Fahrzeuge
{
gTeamCarID,
gTeamID,
gTeamModelID,
Float:gTeamSpawnX,
Float:gTeamSpawnY,
Float:gTeamSpawnZ,
Float:gTeamSpawnAngle,
gTeamColor1,
gTeamColor2,
}
new gTeamCar[][gteamInfo] = { //Fahrzeug Koordinaten für die Fahrzeuge
{0, 1, 560, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 1, 561, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 1, 522, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 1, 460, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 2, 611, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 2, 540, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 2, 535, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1},
{0, 2, 524, 1234.0, 1234.0, 1234.0, 1234.0, 1, 1}
};
new gTeamAllowed[MAX_VEHICLES]; //Zur Abspeicherung welches Team erlaubt ist.
new gTeam[MAX_PLAYERS]; //Die TeamID vom Spielerstock IsAgTeamCar(vehicleid)
{
new car;
for(; car < sizeof(gTeamCar); car++)
{
if(vehicleid != gTeamCar[car][gTeamCarID]) continue;
return car;
}
return -1;
}public OnGameModeInit()
{
for(new teamcar = 0; teamcar < sizeof(gTeamCar); teamcar++)
{
gTeamCar[teamcar][gTeamCarID] = CreateVehicle(gTeamCar[teamcar][gTeamModelID], gTeamCar[teamcar][gTeamSpawnX], gTeamCar[teamcar][gTeamSpawnY], gTeamCar[teamcar][gTeamSpawnZ], gTeamCar[teamcar][gTeamSpawnAngle], gTeamCar[teamcar][gTeamColor1], gTeamCar[teamcar][gTeamColor2], -1);
gTeamAllowed[gTeamCar[teamcar][gTeamCarID]] = gTeamCar[teamcar][gTeamID];
}
}public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
if(IsAgTeamCar(vehicleid) && gTeam[playerid] != gTeamAllowed[vehicleid]) return ClearAnimations(playerid);
} -
Dein OnGameModeInit Prozedur wird von einem anderen Code abgeblockt. Bedeutet er kann bei einer Sache nicht weitermachen und Lädt daher den Rest nicht. Deshalb empfehle ich dir in OnGameModeInit ab LoadPropertys (wegen den Logs) es zu debuggen mit sagen wir:
print("Debug 1");
//Dann paar Zeilen später, sagen wir 10 Zeilen halt
print("Debug 2");
//Danach wieder paar Zeilen später
print("Debug 3");
//...
//Und am Ende, machst du dann sowas wie
print("Script geladen...");Danach schickste uns den Log neu mit Scriptcode Teil, wo er nichtmehr weiterarbeitet
Außer du es selbst beheben kannst.
-
Die Theorie von Hijashy, jedoch mit optimiertem Code:
new cars[2]; //Fahrzeugdefinition. Die Zahl ersetzen durch Anzahl an Fahrzeuge.stock IsADefinedCar(vehicleid)
{
for(new v = 0; sizeof(cars); v++) //Geht alle Definierten Fahrzeuge durch.
{
if(vehicleid == cars[v]) return true; //Wenn vehicleid mit definiertem Car übereinstimmt, gebe Wert 'Wahr' zurück.
}
return false; //Ansonsten halt 'Falsch' ^^.
}public OnGameModeInit()
{
//Man fängt bei 0 an zu zählen, welche auch als Zahl angenommen wird.
cars[0] = CreateVehicle(...); //Fahrzeug 1
cars[1] = CreateVehicle(...); //Fahrzeug 2
}public OnVehicleStreamIn(vehicleid, forplayerid)
{
if(IsADefinedCar(vehicleid)) //Überprüft ob eingestreamtes Fahrzeug ein Definiertes Fahrzeug von 'cars' ist.
{
SetVehicleParamsForPlayer(vehicleid,forplayerid,0,1); //Sperrt das Fahrzeug für Spieler der es sieht ab.
}
} -
stock GetPlayerID(const SpielerName[]) // 14493
{
new pName5[MAX_PLAYER_NAME];
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
GetPlayerName(i, pName5, sizeof(pName5)); //14500
if(strcmp(SpielerName, pName5, true)==0)
{
return i;
}
}
}
return -1; //14507
}
Suche dann nachforward split(const strsrc[], strdest[][], delimiter);und lösche diese Zeile.