Gibt 2 verschiedene Licht Mods (Sirenen Mods), beide benötigen Cleo.
Einmal ELM und einmal EVL. Kannst beides einmal mit google suchen.
ELM ist das wohl bekanntere von beiden.
Gibt 2 verschiedene Licht Mods (Sirenen Mods), beide benötigen Cleo.
Einmal ELM und einmal EVL. Kannst beides einmal mit google suchen.
ELM ist das wohl bekanntere von beiden.
#include <a_samp>
#include <streamer>
public OnFilterScriptInit()
{
//Hier deine Objekte
return 1;
}
Mehr ist es nicht, dann ganz normal wir jedes andere Filterscript in die server.cfg einfügen (Plugin eintragen nicht vergessen) und fertig.
Nutze format und strcat.
Beispiel:
new str[128];
format(str,sizeof(str),"Dieser Satz");
strcat(str," wurde hier weitergeschrieben.",sizeof(str));
//Würde mit printf das ausgeben:
printf("Ausgabe: %s",str);
//Ausgabe: Dieser Satz wurde hier weitergeschrieben.
^Würde dein Problem mit input line to long lösen^^
Kostenlos ist Navicat Lite: Navicat Lite Download
Was du meinst sind die Spieler die auf so und soviel Servern spielen. Derzeitig sind laut SA:MP 5248 Server online wobei 43362 Spieler auf SA:MP Servern spielen.
Im Clienten ist dies wie folgt zu lesen:
Servers: x players, playing on x servers. (x player slots available)
Kleiner Tipp solltest du nach Server suchen nutze am besten SACNR Monitor. (Hier sind alle Server vertretten)
Probiere diesen einmal aus: Essex Police Helicopter, nutzte diesen Mod dazumal selber und bekam nie beschwerden dass es irgendwie für andere komisch aussieht.
Nunja, ich verwende z.Z. ZCMD und schreibe aktuell wenige Befehle in den Public OnPlayerCommandText.
Zudem wird, wenn ich ein falschen Befehl eingegeben habe, die Fehlermeldung nicht angezeigt sondern "Unknow Command".
Bei zcmd funktioniert kein OnPlayerCommandText mehr. Siehe dazu den Hinweis von ZeeX:
ZitatImportant: Since v0.3 OnPlayerCommandText cannot be used anymore (also ZCMD_NO_CALLBACK option has been removed), but there are two new callbacks instead
Dafür werden diese beiden genutzt:
OnPlayerCommandReceived(playerid, cmdtext[]) //Wenn ein Spieler einen Befehl sendet
und
OnPlayerCommandPerformed(playerid, cmdtext[], success) //Wenn ein Befehl von einem Spieler ausgeführt wurde.
Hierbei kannst du bei dem zweiten Callback dies nutzen:
OnPlayerCommandPerformed(playerid,cmdtext[],success)
{
if(!success) // Befehl existiert nicht
{
SendClientMessage(playerid,COL_WHITE,"FEHLER");
}
return 1;
}
Mehr zum Include solltest du dir in dem entsprechenden Thema rauslesen: zcmd Topic
sind keine spieler varis, viele machen sie nur dazu^^
Sind Spielerspezifische Variablen. Siehe dazu: http://wiki.sa-mp.com/wiki/SetPVarString eine Lösung wäre das GVar Plugin von Incognito: GVar Plugin 1.3
Ähnelt den PVar's wird jedoch nicht auf einem Spieler bezogen und werden erst gelöscht wenn DeleteGVar genutzt worden ist.
Sorry aber dieses "Basic" Gamemode ist nicht zu verantworten...
Grund:
Es wird nicht DB_Escape genutzt was ein injecten der Datenbank möglich macht und sollte man darauf etwas aufbauen wollen, es einem Spieler ermöglicht sich als ein Admin einzuloggen.
Siehe dazu auch ein Beispiel von d0. :
Alles anzeigen
Noch genauer:
Beispiel: Folgende Abfrage:
gibt der Spieler jetzt für das Passwort einfach folgenden Text ein:
dann hat er sich erfolgreich in den Adminaccount gehackt. Dies wird durch DB_Escape verhindert indem es die ' Zeichen *escaped* (also man kann dann nicht mehr durch Eingabe von ' die Abfrage manipulieren).
Ohne DB_Escape wird das eingegebene Passwort einfach in die Abfrage eingefügt und diese dadurch manipuliert: (sollte einleuchtend sein wenn du dir die Abfrage unterhalb jetzt anschaust)
SELECT * FROM `players` WHERE `name` = 'Music4You' AND `password` = '' OR `name` = 'NAME EINES ADMINS'
PS: An die anderen es heisst immer noch SQLite und nicht SQLLite oder SQL-Lite.
Logisch oder?
new float:x,float:y,float:z; // <- deklarierst x,y,z
GetPlayerPos(x,y,z); //bekommst x,y,z
format(string,sizeof(string),"Datenbank Eintrag: x: %f | y: %f | z: %f | Name: %s",x1,y1,z1,name1); // <- nutzt x1,y1,z1
PS: Du deklarierst 2 Mal die 3 Floats.
EDIT:
CMD:test(playerid,params[])
{
new name[128]:Float:zPos[3],query[258];
if(sscanf(params,"s[128]",name)) return SendClientMessage(playerid,FARBE,"NUTZUNG: /test [name]");
{
GetPlayerPos(playerid,zPos[0],zPos[1],zPos[2]);
format(string,sizeof(str),"Datenbank Eintrag: x: %f | y: %f | z: %f | Name: %s",zPos[0],zPos[1],zPos[2],name);
SendClientMessage(playerid,COLOR_GREEN,str);
format(query,sizeof(query),"INSERT INTO autos x='%f',y='%f',z='%f',name='%s",zPos[0],zPos[1],zPos[2],name);
mysql_function_query(Data,query,false,"","");
}
return 1;
}
Nehme einmal in der sscanf2 Abfrage das return 1 weg.
Züge lassen sich nur mit AddStaticVehicle(Ex) erstellen und nicht mit CreateVehicle.
Dieser Fehler: [01:05:50] AllowAdminTeleport() : function is deprecated. Please see OnPlayerClickMap() ist, weil AllowAdminTeleport(); seit 0.3d entfernt wurden ist.
D.h. alle Zeilen die das beinhalten löschen und dafür das Callback OnPlayerClickMap nutzen.
Plugins:
Plugins sowie Includes mit neuen ersetzen und das Script neu compilen!
enum TTollGate
{
GateID,
GateStatus,
Float:OpenX,
Float:OpenY,
Float:OpenZ,
Float:RotX,
Float:RotY,
Float:RotZ,
TimeToClose
}
new ATollGates[MAX_TOLLS][TTollGate];
Dazu dieser Stock:
stock AddTollGate(GateModel, Float:OX, Float:OY, Float:OZ, Float:RX, Float:RY, Float:RZ)
{
for (new TollGate;TollGate<MAX_TOLLS;TollGate++)
{
if (ATollGates[TollGate][GateID] == 0)
{
ATollGates[TollGate][GateID] = CreateDynamicObject(GateModel, OX, OY, OZ, RX, RY, RZ,-1,-1,-1,250);
ATollGates[TollGate][GateStatus] = 0;
ATollGates[TollGate][OpenX] = OX;
ATollGates[TollGate][OpenY] = OY;
ATollGates[TollGate][OpenZ] = OZ;
ATollGates[TollGate][RotX] = RX;
ATollGates[TollGate][RotY] = RY;
ATollGates[TollGate][RotZ] = RZ;
break;
}
}
}
Dann das Object mit AddTollGate ganz normal wie CreateDynamicObject verwenden.
Beispiel:
#define MAX_TOLLS 100
forward GateCheck(playerid);
public OnGameModeInit()
{
AddTollGate(968,1751.79700, 521.95441, 27.55070, -3.00000, -90.00000, 341.42651);
SetTimer("GateCheck",1000,1);
return 1;
}
public GateCheck(playerid)
{
for (new TollGate; TollGate < MAX_TOLLS; TollGate++)
{
if (ATollGates[TollGate][GateID] != 0)
{
if(IsPlayerInRangeOfPoint(playerid,10,ATollGates[TollGate][OpenX], ATollGates[TollGate][OpenY], ATollGates[TollGate][OpenZ])) //hier wird abgefragt ob der Spieler in der Nähe des kreierten Gates ist!
{
if(ATollGates[TollGate][GateStatus]==0) //Gate/Tor ist geschlossen
{
MoveDynamicObject(öffnen);
}
}
}
if(ATollGates[TollGate][GateStatus]==1)
{
if(ATollGates[TollGate][TimeToClose]==DEINE_ZEIT_HIER)
{
MoveDynamicObject(schliessen);
ATollGates[TollGate][TimeToClose]=0;
ATollGates[TollGate][GateStatus]=0;
}
else
{
ATollGates[TollGate][TimeToClose]++;
}
}
}
return 1;
}
Nun nutzt ihr nur einen Timer und könnt weitere Tore simple mit der Funktion unter OnGameModeInit oder OnFilterScriptInit einfügen.
Credits: PowerPC aus dem Gamemode PPC_Trucking.
Pseudocode:
new bool:Banned[MAX_PLAYERS];
public ServerTimer()
{
for(new i=0; i<GetMaxPlayers(); i++)
{
if(GetPlayerPing(i) >= 300)
{
new string[128];
format(string,sizeof(string),"Server | %s wurde vom Server gekickt. Grund: High-Ping (>300)",PlayerName[i]);
SendClientMessageToAll(COLOR_BLASSRED,string);
SetTimerEx("KickTimer",500,false,"i",i);
}
if(Banned[i]==false)
{
new w = GetPlayerWeapon(i);
if(w == 38 || w == 37 || w == 36 || w == 35 || w == 39 || w == 40 || w == 18 || w == 9 || w == 8)
{
new query[128], string[128];
format(string,sizeof(string),"Server | %s wurde vom Anti-Cheatsystem gebannt. Grund: Waffenhack",PlayerName[i]);
SendClientMessageToAll(COLOR_BLASSRED,string);
SetTimerEx("BanTimer",500,false,"i",i);
format(query, sizeof(query), "INSERT INTO BanLog (Benutzer, Grund, Admin) VALUES ('%s', 'Waffenhack', 'Anticheat')", PlayerName[i]);
mysql_query(query);
mysql_free_result();
Banned[i]=true;
}
return 1;
}
}
return 1;
}
PS: Deine strings müssen auch nicht so groß sein, kannst maximal nur 128 Zeichen im Chat pro Zeile wiedergeben.
Wäre auch mit einem Array getan
Beispiel:
new LevelName[7][24] =
{
{"Player"},
{"Admin LVL 1"},
{"Admin LVL 2"},
{"Admin LVL 3"},
{"Admin LVL 4"},
{"Co-Owner"},
{"Owner"}
}
Nutzung mit deiner Abfrage:
LevelName[SpielerInfo[playerid][pAdmin]]
Bitte nicht vergessen das es auch ein pAdmin 0 gibt, daher Player oder auch Spieler mit in den Array
Erstelle eine Spielervariable und frage ab ob sie 0 ist, wenn ja und er gebannt wird setze sie auf 1.
Da dadurch dass der ServerTimer 1 Sekunde hat und der Bantimer 2 Sekunden es so gesehen 3 mal auch detected wird.
1 mal durchgelaufen = Cheater gefunden, setze Timer auf 2 Sekunden
während der Bantimer die erste Sekunde durchläuft, hat der ServerTimer jedoch schon wieder eine Sekunde weg und da der Spieler noch Online ist, wird er nochmals detected
Nun ist der BanTimer endlich bei seiner 2ten Sekunde angekommen und kann nun den Spieler kicken, da aber der ServerTimer wie ich mir denke vor deinem BanTimer aufgerufen wird detected ihn es ein drittes mal und es kommt auch ein drittes mal diese Nachricht.
Zumal ein Timer von 500>250 ms sogar reichen würde um den Spieler zu kicken
Das Filterscript wird nicht funktionieren, da Google (Youtube) eine neue API verwendet.
stock GetPlayerSpeed(playerid)
{
new Float:ST[4];
if(IsPlayerInAnyVehicle(playerid))
GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 179.28625;
return floatround(ST[3]);
}
Nun kannst du die Funktion GetPlayerSpeed(playerid) da nutzen wo du die Geschwindigkeit bekommen möchtest.
Beispiel:
forward SpeedTimer(playerid);
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
{
SetTimer("SpeedTimer",1000,1);
}
return 1;
}
public SpeedTimer(playerid)
{
printf("%d km/h",GetPlayerSpeed(playerid));
return 1;
}