SuFu, da gibts genug Autosysteme, auch mit einer "amx"...
Beiträge von Mann im Mond
-
-
Wann willst du sie zerstören? Wenn sie explodieren oder einfach eine gewisse Zeit unbenutzt rumstehen?
Beides mal DestroyVehicle
Entweder bei OnVehicleDeath oder du machst einen Timer der das überprüft
-
// OnPlayerStateChange
if(newstate == PLAYER_STATE_DRIVER)
{
new
carid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(carid) == 427 || GetVehicleModel(carid) == 523 || GetVehicleModel(carid) == 596)// hier deine Definition, wann ein Auto ein Polizeiauto ist bzw. die Models austauschen/ergänzen
{
SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid)+1);// Spieler ein Wanted geben, je nachdem wie du Wanteds vergibst
}
} -
Es gibt ja auch noch die Möglichkeit, für jeden User eine eigene .ini abzuspeichern, dann kannst du deine Admingeschichte gleich mit den restlichen Userdaten verknüpfen.
ZitatName.ini
Name2.iniDateifunktionen sind hier beschrieben
http://wiki.sa-mp.com/wiki/File_Functions -
Warte auf 0.3, da gibt es RepairVehicle, welches das automatisch übernehmen soll, also den kompletten Schaden reparieren
Falls du nicht warten wills/kannst, musst du den Wagen einfach respawnwn und dann wieder herporten und den Spieler reinsetzen.
Also
SetVehicleToRespawn
PuPlayerInVehicle
SetVehiclePosNatürlich vorher noch die Position des Spielers speichern, der in dem Auto sitzt
GetPlayerPos -
Mag jetzt ne dumme Antwort sein, die dir nichts bringt, aber ich empfehle dir ein eigenes zu machen, das auf deinen GM zugeschneidert ist. So kannst du dich am besten schützen. Prinzipiell ist es ganz einfach und immer das selbe. Du überlässt das Geld nicht mehr GTA und benutzt somit die Funktionen
GetPlayerMoney
und
GivePlayerMoney
nicht mehr bei jedem Mal, wenn du Geld gibts bzw. holst. Stattdessen übernimmt das dann eine Variable im Script, die das Geld speichert. Wenn du jemanden Geld gibts bzw. das aktuelle herausfinden willst benutzt du eine eigene Funktion dafür:
stock GiveUserMoney(playerid, amount)
{
pMoney[playerid] += amount; // Deine variable im Script die das Geld speichern soll musst du erstellen und beim Login usw. entsprechend setzen
GivePlayerMoney(playerid, amount);
}
Jetzt entspricht also pMoney deinem Geldbetrag, den der Spieler durch das Script haben sollte, sollte er geld cheaten, ist GetPlayerMoney > pMoney[playerid]. Das kannst du mit einem Timer z.B. überprüfen und entsprechende Schritte ziehen.
Oder du lässt das Geld (pMoney[playerid]) einfach überhalb deines richtigen Geldes mit einem Textdraw anzeigen, sodass das alte Geld verdeckt wird. Somit ist das Geldcheaten unmöglich, eine ständige Überprüfung bräuchtest dann auch nciht unbedigt, außer du willst den Spieler trotzdem bannen/kicken -
Id Verschiebung wo bzw. wenn er wo was löscht? im Spiel oder in der Datenbank?
-
-
Das GetPlayerName unter das new, dann gehts
-
Ich habs doch oben geschreiben wies geht, das andere war falsch! Lesen, danke!
-
Kleiner + random(Größer-Kleiner);
Mit deiner Methode könnte auch eine Wert kleinere als der Minimalwert rauskommen -
Dann poste die Befehle wenisgtens hier ?!
-
Danke , dass du uns so viel zeigst, wobei mir dir helfen könnten...
-
Danke, habs übersehen und editiert
-
Gibt mehrere Möglichkeiten dies zu Lösen, unten ein Ansatz. Ich denke die Arena geht nach Runden, also reicht das so aus, wenn sie nicht nach Runden geht, sondern man immer dazukann, wann man will, dann kann man dies auch entsprechend anpassen. Grunsätzätzlich kann man es so machen, indem man ein Array erstellt mit der Größe der Spawns. Beim betreten wird es dann alles ausgewertet un der Spieler an einen entsprechende Position gespawnt. Man kann es auch über PlayerToPoint regeln, dann kann man auf den Array verzichten. Wie du willst, hier mal die erstere Variante.
// oben
#define MAX_DERBYSPAWNS 5 // maximale Anzahl der Spawnsnew
bool:dSpawn[MAX_DERBYSPAWNS];// beim Betreten der Arena
new
spawn = MAX_DERBYSPAWNS;
for(new s = 0; s < MAX_DERBYSPAWNS; s++);
{
if(!dSpawn[s]) spawn = s; break;
}
switch(spawn)
{
case 0:
{
// Position setzen von Platz 1
}
case 1:
{
// Position setzen von Platz 2
}
case 2:
{
// Position setzen von Platz 2
}
[... usw. ...]
default:
{
SendClientMessage(playerid, Farbe, "Die Arena ist voll");
return 1;
}
}
dSpawn[spawn] = true;// Beim Beenden der aktuellen Runde
for(new s = 0; s < MAX_DERBYSPAWNS; s++)
{
dSpawn[s] = false;
} -
Zitat
Bis 0.2x hats ja geklappt, doch als ich 0.3 getestet habe, bin ich in meine Bank gegangen und musste feststellen, das das Geld nicht resetet wird
public money()
{
new playerid;
GivePlayerMoney(playerid,pInfo[playerid][Geld]);
}
Hat NIEMALS unter 0.2 funktioniert, genauso wenig wie in irgendeiner anderen Funktion. Dein von dir geposteter Code bringt nur soviel, dass jede Sekunde "money" aufgerufen wird und SPielerid 0 (sonst NIEMAND) dauerhaft "pInfo[playerid][pGeld] hinzuaddiert bekommt, er hat irgendwann undlich Geld in seiner Anzeige, auch wenn du das Geld nicht benutzt.
Es ist mir egal, ob ich merke, ob jmd. cheatet (100 % ist das eh nicht machbar, da Geld ja auch beim Pay'n Spray abgezogen wird und es deshalb zu unregelmäßigkeiten kommt.
Durch lesen meines Codes UND meines Textes hättest du bemerkt, dass nicht überprüft wird, ob das Geld kleiner ist, sondern nur überrüft wird ob das Geld größer ist, falls ja wird das Geld wieder zurückgesetzt auf die Variable in deinem Script, sofern du diese überhaupt mit hochzählen lasst durch z.B. "GiveUserMoney" anstatt "GivePlayerMoney" bei JEDEM Geld geben.
stock GiveUserMoney(playerid, amount)
{
GivePlayerMoney(playerid, amount);
pInfo[playerid][pGeld] += amount;
}
Bekanntlicherweise macht ein PaynSpray somit nichts aus, da es Geld abzieht, genauso wie ein Sprunk Automat usw. -
Benutze eine Schleife dafür innerhalb von dem Callback "money", so wird das nciht funktionieren, auch früher schon nicht
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected[i])
{
//hier dein Code mit "i" anstatt "playerid"
}
}Dein Money System wird aber sowieso nicht funktionieren... Du musst das Geld mit dem Geld des Scriptes vergleichen und dann wenn die beiden Zahlen unterscheidlich sind, weißt du, dass er gecheatet hat
if(GetPlayerMoney(i) > pInfo[i][Geld]) ResetPlayerMoney(i); GivePlayerMoney(i, pInfo[i][Geld]);
Natürlich musst du jedes mal im Script wenn du dem Spieler Geld gibst vorher auch die pInfo[playerid][pGeld] Variable aktualisieren
pInfo[playerid][pGeld] += value;
GivePlayerMoney(playerid, value); -
Habe zwar nur kurz über den Code geschaut, aber mir ist aufgefallen, dass das nicht stimmen sollte:
PlayerInfo[playerid][pJob][FAHRSCHULE]
Das Gleiche gibts weiter unter auch noch für Waffebhändler. Deine restlichen "PlayerInfo" sind nämlich sonst alle im Format
PlayerInfo[][]
Ändere also die beiden Zeilen in wahrscheinlich
PlayerInfo[playerid][pJob]
Eine Warning kommt außerdem durch falsches Einrücken -
versuchs doch aus, er gibt nur die zahl aus, also die ModelID.
Wenn du den Namen willst, benutzt die Suchfunktion, da gibts genug Sachen, auch im englischen Forum ("Vehiclenames", "Autonamen" oder wie auch immer) -
Du musst dafür eine Schleife benutzen, die durch alle Autos loopt und bei jedem Auto vergleicht, ob dieses Fahrzeug in der Nähe des Punktes ist, wo du stehst
for(new c = 1; c < MAX_VEHICLES; c++)
{
// hier dein Vergleich
}