sSpieler[playerid][Geld] = dini_Int(Spieler,"Geld");
Zu
sSpieler[playerid][Geld] = dini_Int(Spieler,"Geld");
GivePlayerMoney(playerid, sSpieler[playerid][Geld]);
Beiträge von Jeffry
-
-
Hast du den Code auch eingefügt? Mir fehlt da dieser print:
printf("Timer aufgerufen: %d -> RobSek: %d", playerid, RobSek[playerid]);
Dem Ablauf nach muss der drin sein, wenn der Code eingefügt ist. -
Der Variable "RobbedBot" wurde die ID des Bots anstatt des Indexes (i) zugewiesen, daher hat der falsche Bot die Sperre bekommen.
Ich habe bei den Timern auch noch eine Sicherung hinzugefügt, dass die nicht doppelt gestartet werden, und ich habe die erste Abfrage angepasst.Deklariere dein Rob_Timer so:
new Rob_Timer[MAX_PLAYERS] = {-1, ...};Und versuche es mit dem Timer so:
void BotTimer()
{
for(new i = 0; i < sizeof(RobBot); i++)
{
if(RobBot[i][RobSperre] > 0)
{
RobBot[i][RobSperre]--;
}
}
for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
{
new playerTargetActor = GetPlayerTargetActor(playerid);
for(new i = 0; i < sizeof(RobBot); i++)
{
if(playerTargetActor == RobBot[i][rob_ID] && Spieler[playerid][Team] == 2 && IsRobbing[playerid] == false)
{
new playerWeapon = GetPlayerWeapon(playerid);
new keys, updown, leftright;
GetPlayerKeys(playerid, keys, updown, leftright);
printf("Spieler %d zielt auf Actor %d", playerid, i);
if(!ActorHandsup[RobBot[i][rob_ID]] && playerWeapon >= 22 && playerWeapon <= 42 && keys & KEY_AIM)
{
printf("Actor %d hat eine Sperre von: %d", i, RobBot[i][RobSperre]);
if(RobBot[i][RobSperre] > 0)
{
printf("Robbing: %d", IsRobbing[playerid]);
if(IsRobbing[playerid] == false)
{
new Sperre[145];
format(Sperre, sizeof(Sperre), "Dieses Geschäft kann erst wieder in %02d:%02d ausgeraubt werden.", RobBot[i][RobSperre]/60, RobBot[i][RobSperre]%60);
SendClientMessage(playerid, COLOR_RED, Sperre);
}
printf("Beende.");
break;
}
else
{
printf("Raube Actor %d aus.", i);
ApplyActorAnimation(RobBot[i][rob_ID], "SHOP", "SHP_HandsUp_Scr",4.1,0,0,0,1,0); // Handsup
ActorHandsup[RobBot[i][rob_ID]] = true;
//ab hier startet der ROb
IsRobbing[playerid] = true;
RobbedBot[playerid] = i;
RobSek[playerid] = random(10)+30;
if(Rob_Timer[playerid] != -1) KillTimer(Rob_Timer[playerid]);
Rob_Timer[playerid] = SetTimerEx("RobTimer", 1000, true, "i", playerid);
break;
}
}
}
else if(playerTargetActor != RobBot[i][rob_ID] && Spieler[playerid][Team] == 2 && IsRobbing[playerid] == true)
{
//nicht anvisiert
IsRobbing[playerid] = false;
KillTimer(Rob_Timer[playerid]);
Rob_Timer[playerid] = -1;
new string[128];
format(string, sizeof(string), "Du hast %d$ ausgeraubt.", RobMoney[playerid]);
printf("string = %s", string);
SendClientMessage(playerid, COLOR_LIGHTBLUE,string);
GivePlayerMoney(playerid, RobMoney[playerid]);
RobBot[i][RobSperre] = 60;
printf("Actor %d hat nun eine Sperre von: %d", i, RobBot[i][RobSperre]);
RobMoney[playerid] = 0;
RobbedBot[playerid] = -1;
ActorHandsup[RobBot[i][rob_ID]] = false;
ClearActorAnimations(RobBot[i][rob_ID]);
break;
}
}
}
return 1;
}void RobTimer(playerid)
{
printf("Timer aufgerufen: %d -> RobSek: %d", playerid, RobSek[playerid]);
new sekMoney = random(100)+10, moneyText[128];
RobSek[playerid]--;
RobMoney[playerid] += sekMoney;
format(moneyText, sizeof(moneyText), "~g~%d$", RobMoney[playerid]);
GameTextForPlayer(playerid, moneyText, 988, 6);
if(RobSek[playerid] == 0)
{
//RobBot[RobbedBot[playerid]][RobSperre] = 60;
IsRobbing[playerid] = false;
KillTimer(Rob_Timer[playerid]);
Rob_Timer[playerid] = -1;
new string[128];
format(string, sizeof(string), "Du hast %d$ ausgeraubt.", RobMoney[playerid]);
SendClientMessage(playerid, COLOR_LIGHTBLUE,string);
GivePlayerMoney(playerid, RobMoney[playerid]);
RobMoney[playerid] = 0;
RobBot[RobbedBot[playerid]][RobSperre] = 60;
printf("Actor %d hat nun eine Sperre von: %d", RobbedBot[playerid], RobBot[RobbedBot[playerid]][RobSperre]);
ActorHandsup[RobbedBot[playerid]] = false;
ClearActorAnimations(RobBot[RobbedBot[playerid]][rob_ID]);
RobbedBot[playerid] = -1;
}
return 1;
} -
Das ist die Rotation, also die Blickrichtung in Grad.
-
Versuche Folgendes:
Setze nach
Rob_Timer[playerid] = SetTimerEx("RobTimer", 1000, true, "i", playerid);
und im else-if Teil drunter nach
ClearActorAnimations(RobBot[i][rob_ID]);
jeweils ein
break;
hin. -
Man kann den Server doch nicht ständig bei 200 Usern neu starten, nur weil ein User was im CP ändert...
Das stimmt allerdings.
Was hast du denn geändert? Etwas an der Struktur, oder einen Wert?Es wäre interessant da mal die Logs zu sehen, von dem Login, zusammen mit dem Code davon, einmal wenn es klappt, und einmal wenn es nicht klappt. Könntest du das generieren lassen und dann posten?
-
Dann füge bitte beim SpielerSpeichern am Ende noch ein
print(query);
hinzu, und poste dann was im Server Log steht, wenn du dich registrierst und dann den Server verlässt.Steht zeitgleich etwas im MySQL Log, ein Error oder so?
-
Lasse dir das Query mal per print ausgeben und poste dann was im Server Log steht, wenn zeitgleich der Fehler im MySQL Log auftritt (Error).
mysql_function_query(MySqlConnection,mainquery,false,"","");
zu:
print(mainquery);
mysql_function_query(MySqlConnection,mainquery,false,"",""); -
Steht es denn in der Datenbank, wenn du aus dem Server gehst und dann, bevor du wieder rein gehst, nachschaust?
-
if(sscanf(params,"s",cmd))return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /unloadnewspaperpoint [LS/SF/Fabrik]");
zu
if(sscanf(params,"s[3]",cmd))return SendClientMessage(playerid,WRONGCMD,"BENUTZE: /unloadnewspaperpoint [LS/SF/Fabrik]"); -
Unter den Includes:
new blockedUntil[MAX_PLAYERS];Und in dem Befehl:
if(blockedUntil[playerid] > gettime())
{
new str[145], t = blockedUntil[playerid] - gettime();
format(str, sizeof(str), "Error: Du kannst diesen Befehl erst in %02d:%02d nutzen.", t/60, t%60);
return SendClientMessage(playerid, 0xFF0000FF, str);
}
blockedUntil[playerid] = gettime() + 60 * 5; //5 Minuten -
Wie gibst du dem Spieler denn ein Level (Code)?
-
Könntest du den Code posten, der das verursacht?
-
Alternativ zu der Erklärung hier ( [jTuT] MySQL R39-3 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System) ) kannst du es nach dem Code so machen:
if(dialogid == DIALOG_REGISTER)
{
//Spieler hat Abbrechen gewählt
if(!response) return Kick(playerid);//Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");//Wenn alles passt wird der Spieler in der Datenbank angelegt
//Als Verschlüsselung für das Passwort wird MD5 verwendet
new query[256];
mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, level, money) VALUES ('%e', MD5('%e'),1,2500)", PlayerInfo[playerid][pName], inputtext);//Das Query wird abgesendet und die playerid an OnUserRegister übergeben
mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
pFirstLog[playerid] = true;
PlayerInfo[playerid][pMoney] = 2500;
PlayerInfo[playerid][pLevel] = 1;
return 1;
}public OnPlayerSpawn(playerid)
{
SetPlayerPos(playerid, 329.0244,-1513.3033,36.0391);
SetPlayerCameraPos(playerid, 329.0244,-1513.3033,36.0391);
SetPlayerCameraLookAt(playerid, 329.0244,-1513.3033,36.0391);
SetPlayerFacingAngle(playerid,49.4261);
if(pFirstLog[playerid] == true)//Erster Login
{
SetPlayerPos(playerid,0.0,0.0,0.0); // Tutorial Position
TogglePlayerControllable(playerid,false);
TutTime[playerid] = 1;
TutTimer[playerid] = SetTimerEx("Tutorial",1000,1,"i",playerid);
}
else if(pFirstLog[playerid] == false)//Nicht erster Login
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
}
return 1;
}Dann wird das Geld beim Spawn jedes mal wieder korrekt gesetzt, zu dem was in der Variable steht.
Außerdem musst du
else if(TutTime[playerid] == 50) // hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
{
KillTimer(TutTimer[playerid]); // der Tutorial Timer wird beendigt
TutTime[playerid] = -1; // die Tutorial Zeit auf INVALID gsetzt - nach Goldkiller :)
SpawnPlayer(playerid); // der Spawn, wo er nach dem Tutorial hinsoll
TogglePlayerControllable(playerid,true); // hier wird die Fähigkeit sich zu bewegen wieder auf "wahr" gesetzt
GameTextForPlayer(playerid,"~g~Willkommen, ~r~ auf -",6000,1); // GameText am Ende des Tutorials
pFirstLog[playerid] = false;
}
zu
else if(TutTime[playerid] == 50) // hier wird abgefragt wieviel Sekunden seit dem Start des Tutorials verstrichen sind
{
pFirstLog[playerid] = false;
KillTimer(TutTimer[playerid]); // der Tutorial Timer wird beendigt
TutTime[playerid] = -1; // die Tutorial Zeit auf INVALID gsetzt - nach Goldkiller :)
SpawnPlayer(playerid); // der Spawn, wo er nach dem Tutorial hinsoll
TogglePlayerControllable(playerid,true); // hier wird die Fähigkeit sich zu bewegen wieder auf "wahr" gesetzt
GameTextForPlayer(playerid,"~g~Willkommen, ~r~ auf -",6000,1); // GameText am Ende des Tutorials
}
ändern, sonst startet das Tutorial ein zweites Mal. -
Das wird so nicht klappen, du wirst das Geld zwar in der Datenbank stehen haben, aber nach dem Register nicht bekommen.
Mache es so:
if(dialogid == DIALOG_REGISTER)
{
//Spieler hat Abbrechen gewählt
if(!response) return Kick(playerid);//Wenn der Spieler kein, oder ein zu kurzes, Passwort eingegeben hat
if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrierung", "Bitte registrieren Sie sich:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");//Wenn alles passt wird der Spieler in der Datenbank angelegt
//Als Verschlüsselung für das Passwort wird MD5 verwendet
new query[256];
mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password, level, money) VALUES ('%e', MD5('%e'),1,2500)", PlayerInfo[playerid][pName], inputtext);//Das Query wird abgesendet und die playerid an OnUserRegister übergeben
mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
PlayerInfo[playerid][pMoney] = 2500;
PlayerInfo[playerid][pLevel] = 1;
GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
return 1;
}public OnPlayerSpawn(playerid)
{
if(PlayerInfo[playerid][pErsterLogin] == 0)
{
PlayerInfo[playerid][pErsterLogin] = 1;
//Tutorial(playerid);
}
else if(PlayerInfo[playerid][pErsterLogin] >= 1)
{
}
return 1;
}Das Ganze unter OnPlayerSpawn zu regeln ist nicht gut, da das ja jedes mal aufgerufen wird, wenn der Spieler spawnt.
Was höchstens gehen würde wäre:public OnPlayerSpawn(playerid)
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
if(PlayerInfo[playerid][pErsterLogin] == 0)
{
PlayerInfo[playerid][pErsterLogin] = 1;
//Tutorial(playerid);
}
else if(PlayerInfo[playerid][pErsterLogin] >= 1)
{
}
return 1;
}Dann wird das Geld beim Spawn jedes mal wieder korrekt gesetzt, zu dem was in der Variable steht.
-
Das GetPVarString darf nicht im format stehen, sondern nur die Variable.
Das GetPVarString muss jeweils vor das format. -
Hier hast du ein Beispiel, wie du es setzen und auslesen kannst:
http://wiki.sa-mp.com/wiki/GetPVarString -
Der Grund und der Admin sind kein Integer (ganze Zahl) sondern ein String.
Nutze daher Get- und SetPVarString.
-
Ja, eines im einen Code, und eines im anderen Code, das die geänderten Daten in Empfang nimmt und dann die Variable entsprechend ändert, die du referenzieren wolltest.
Als Alternativen:
- Alles in einem Code haben.
- Über Dateien/Datenbank die Daten hin- und herschicken/übergeben (CallRemoteFunction dann nur als Event nutzen). -
Es muss so aussehen, so habe ich es dir auch gepostet:
stock SpielerSpeichern(playerid)
{
if(sInfo[playerid][pEingeloggt] == 0)return 1;
new query[1024], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(query, sizeof(query), "UPDATE user SET Age='%i', Geschlecht='%i', AdminLevel='%i', Mapper='%i', Scripter='%i', Premium='%i', Level='%i', Respektpunkte='%i', ",
sInfo[playerid][pAge], sInfo[playerid][pSex], sInfo[playerid][pAdminLevel], sInfo[playerid][pMapper], sInfo[playerid][pScripter],
sInfo[playerid][pPremium], sInfo[playerid][pLevel], sInfo[playerid][pRespektpunkte]);
format(query, sizeof(query), "%sBarGeld='%i', BankKonto='%i', BankGeld='%i',Skin='%i', Fraktion='%i', FraktionRang='%i', Spawn='%i', Handy='%i', Handynummer='%i', ",
query, GetPlayerMoney(playerid), sInfo[playerid][pBankKonto], sInfo[playerid][pBankGeld],sInfo[playerid][pSkin], sInfo[playerid][pFraktion],
sInfo[playerid][pFraktionRang], sInfo[playerid][pSpawn], sInfo[playerid][pHandy], sInfo[playerid][pHandynummer]);
format(query, sizeof(query), "%sPayDay='%i', Spielzeit='%i', Jail='%i', JailTime='%i', Prison='%i', PrisonCheckpoints='%i' WHERE username='%s'",
query, sInfo[playerid][pPayDay], sInfo[playerid][pSpielzeit], sInfo[playerid][pJail], sInfo[playerid][pJailTime],
sInfo[playerid][pPrison], sInfo[playerid][pPrisonCheckpoints], name);
mysql_function_query(Handle, query, false, "", "");
return 1;
}Du hast die Query-Übergabe jeweils entfernt.