Beiträge von Simon
-
-
Kurze Frage:
Ist es sinnvoller Cheats in OnPlayerUpdate oder in timern zu überprüfen? Wenn ja wieso und welche sollte man auf jedenfall, bzw auf jedenfall nicht wo überprüfen.
Gut waren paar mehr fragen aber bitte um Antwort
Liebe Grüße
SimonPS: kenne mich mit OnplayerUpdate etwa 1% aus
-
du machst es dir schwerer als es ist:
new Cheatwarn[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
new string[128],Geld=GetPlayerMoney(playerid);
if(Geld>SpielerInfo[playerid][pGeld])
{
if(Cheatwarn[playerid]<= 2)
{
SendClientMessage(playerid,ROT,"Du stehst in verdacht auf MoneyHack!");
SendClientMessage(playerid,GELB,"Es kann auch sein das durch ein Laag ein fehler auftrat!");
Cheatwarn[playerid]++;
}
else
{
format(string,sizeof(string),"AdmCmd: %s wurde wegen MoneyHack gebannt",SpielerName(playerid));
SendClientMessageToAll(ROT,string);
SpielerInfo[playerid][pGebannt]=1;
SavePlayer(playerid);
Kick(playerid);
}
}
else SpielerInfo[playerid][pGeld]=GetPlayerMoney(playerid);
return 1;
} -
du musst ja angeben WO es gespeichert wird.
-
Mal ne Frage:
Wie kann ich eine Nachricht an einen Spieler in einer vorher gewählten Farbe senden?
SendClientMessage(giveplayerid,colorcode,stringtogiveplayerid);
Kommt aber:
tag mismatchColorcode ist ein String (new colorcode[12])
Wie soll ich es denn sonst machen?
mit defines?//edit: ein beispiel mit sscanf:
new zahl;
if(sscanf(inputtext,"d", zahl)) return SendClientMessage(playerid,farbe,"Du musst eine Zahl angeben!");du kannst auch mehrere parameter benutzen. ne Zahl und ein String, oder eine ID..
-
sscanf ist wie gesagt besser, da es sonst auch wenn du "HALLO" eingibst er es als "0" erkennt.
Soweit ich weiß sagt die sscanf ganz genau obs eine Zahl ist oder nicht. und noch mehr, kannst ja bisschen mehr abfragen als nur eine Zahl. -
was steht denn in data[] ?
-
strval(inputtext)
-
füg noch ein else hinzu:
}
else SpielerInfo[playerid][pGeld] = GetPlayerMoney(playerid);und ich würde dir raten erstmal ein Warning senden zu lassen und das Geld abzuziehen. Könnte auch ein Lag sein und dann wird er gleich gebannt.
-
Wie meinst du das Abfragen?
-
GetPlayerPos(playerid, SpielerInfo[playerid][PosX],SpielerInfo[playerid][PosY],SpielerInfo[playerid][PosZ]);
GetPlayerFacingAngle(playerid,SpielerInfo[playerid][PosA]);
dini_FloatSet(DATEI, "PosXX", SpielerInfo[playerid][PosX]);
dini_FloatSet(DATEI, "PosYY", SpielerInfo[playerid][PosY]);
dini_FloatSet(DATEI, "PosZZ", SpielerInfo[playerid][PosZ]);
dini_FloatSet(DATEI, "PosAA", SpielerInfo[playerid][PosA]); -
umso weniger, umso besser.
Es ist das beste wenn man einmal den Namen abfragt und den dann in eine globale variable speichert.
Genauso ist das mit anderen sachen auch. wozu 20 mal etwas abfragen, wenn einmal reicht. -
wie fragst du die posi denn ab?
-
Immer die funktion nutzen und halt immer in einer 2. variablen speichern.
Dann wie BlackAce schon sagte in OnPlayerUpdate überprüfen ob das Geld höher ist. wenn es niedrieger ist, pass die variable an. -
public OnPlayerEnterVehicle(playerid, vehicleid)
{
SetPlayerArmedWeapon(playerid,0);
return 1;
}Du musst einen eigenen Textdraw erstellen und dann einfach:
new string[10];
format(string,sizeof(string),"$%09d",GetPlayerMoney(playerid)); //Ich glaube die normale Geldanzeige hat 9 stellen, bin mir nicht sicher.
PlayerTextDrawSetString(playerid, Textdrawid, string);Und wenn du ein AntiMoney CHeat haben willst, dann so wie ich es in der 1. antwort erklärt habe
-
Zum Speichern:
GetPlayerPos(playerid, SpielerInfo[playerid][PosX],SpielerInfo[playerid][PosY],SpielerInfo[playerid][PosZ]);
GetPlayerFacingAngle(playerid,SpielerInfo[playerid][PosA]);
dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosX]);
dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosY]);
dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosZ]);
dini_FloatSet(DATEI, "PosX", SpielerInfo[playerid][PosA]);
Zum Laden:
SpielerInfo[playerid][PosX] = dini_Float(DATEI, "PosX");
SpielerInfo[playerid][PosY] = dini_Float(DATEI, "PosY");
SpielerInfo[playerid][PosZ] = dini_Float(DATEI, "PosZ");
SpielerInfo[playerid][PosA] = dini_Float(DATEI, "PosA"); -
SetPlayerArmedWeapon(playerid, weaponid);
Sorry, hatte mich versehen
Ja kannst du genau mit dieser Funktion: Bei Deagle: SetPlayerArmedWeapon(playerid,24); Du musst ihm ggf. die Waffe vorher geben mit GivePlayerWeapon(playerid,24,munition);
3. Wie soll ich das verstehen?
-
das ist möglich. beispiel:
new name[MAX_PLAYER_NAME];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) continue;
GetPlayerName(i,name,sizeof(name));
dini_IntSet(DATEI,name,GetPlayerMoney(i));
} -
1. SetPlayerArmedWeapon(playerid,0);
2. GivePlayerWeapon(playerid, weaponid, ammo);
3. Eine 2. Variable erstellen in der Das geld gespeichert wird. Beispiel:
new pMoney[MAX_PLAYERS];
nun würde ich eine eigene funktion schreiben und die anstelle von GivePlayerMoney und ResetPlayerMoney benutzen:stock p_GivePlayerMoney(playerid, money)
{
GivePlayerMoney(playerid,money);
pMoney[playerid] += money;
return 1;
}stock p_ResetPlayerMoney(playerid)
{
ResetPlayerMoney(playerid);
pMoney[playerid] = 0;
return 1;
}und nun einfach mit GetPlayerMoney abfragen ob das geld was er auf der hand hat höher ist als das was in der variablen steht.
4. ist etwas komplizierter
-
Nimm einfach die ungefäre größe...
Bei einer Stringlänge von 13 kannst du auch ruhig 15 nehmen. Bei einer länge von 75 aber nicht 250