Beitrag von Genadj_Andrenov ()
Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Hat sich erledigt! ().
Wo? Hat da eins gefehlt? Bei meinem Beispiel war auch ein Komma nach DoubleEXP = %d platziert.
Sehe er hat vor jedem %d ein '' geadded, hat das einen Grund? Sollte ich das überall machen?
Vor dem WHERE .... muss das Komma weg
Und das mit dem " bei %d ist irrelevant, funktioniert sowohl mit als auch ohne, macht keinen Unterschied.
Alles klar danke, das habe ich nicht gewusst. Hat das trotzdem was mit dem ' vor und nach dem %d ?
Alles klar danke, das habe ich nicht gewusst. Hat das trotzdem was mit dem ' vor und nach dem %d ?
Hab meinen Post editiert.
Zitat von Ich selber?Und das mit dem " bei %d ist irrelevant, funktioniert sowohl mit als auch ohne, macht keinen Unterschied.
hey,
es werden beim folgenden Code die Accounts in der Datenbank immer verdoppelt.
Sprich wenn sich ein neuer Spieler registriert wird sein Account in der Datenbank doppelt gespeichert... und kann sich so nicht mehr anmelden...
Code:
Function OnPlayerRegister(playerid, password[])
{
if(IsPlayerConnected(playerid))
{
new name[MAX_PLAYER_NAME],query[128],passwort[50],string[100], year, month, day;
getdate(year, month, day);
GetPlayerName(playerid,name,sizeof(name));
mysql_escape_string(password,passwort,dbhandle);
format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort, Registrierungsdatum) VALUES ('%s',MD5('%s'),'%d.%d.%d')",name, passwort, day, month, year);
mysql_function_query(dbhandle,query,false,"","");
ShowPlayerDialog // Dialog für das Login wird angezeigt
}
return 1;
}
Alles anzeigen
Habe den Query geprintet und es wir mir nur einmal angezeigt, in der Datenbank jedoch ist der Account Doppelt
Was habe ich denn da falsch gemacht? Ich vermute es ist wieder ein Denkfehler oder so...
//Edit:
Ist es möglich 2 Primary Keys zu vergeben, denn einen Primary Key verwende ich für die Spalte ID.
Wenn ich 2 Primary Keys hätte ebenfalls beim Namen, dann würde doch nur eines der neu registrierten Accounts da stehe nund nicht doppelt... Aber ich verstehe nicht warum 2 Accounts gleiche Accounts gespeichert werden...
//Edit2:
Fehler behoben, lag darin das ich die selben querys in dem Function verwendet hatte und beim 2. falsche Datenbank eingetragen habe^^
Erledigt
Hallo, habe mal eine Frage.
Ich bin dabei ein "Skill System" zu erstellen und ich weiß auch wie ich genau vorgehen muss, aber ich bin mir 100 % sicher das sich das auch einfacher lösen lässt, nur habe ich keine Ahnung wie genau ich das anstellen soll.
Nehmen wir folgendes Beispiel:
Wenn man einen bestimmten Spieler tötet, erhält man Geld. Je nach Skill Level, hat man eine CHANCE doppeltes Geld zu bekommen. In OnPlayerDeath erstelle ich nun 5 "Skill Level" Abfragen womit ich ihn dann verschiedene Werte gebe.
Nun habe ich mir das so vorgestellt (ungetestet)
if(pData[playerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
pData[killerid][P_Weed] += 5;
GivePlayerExp(killerid, 25);
}
if(pData[playerid][P_DoubleEXP] == 1) //Double EXP Skill Level 1
switch(random(10))
{
case 0..1:
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, 50);
return 1;
}
}
}
}
Könnte ich nicht irgendwie einfach nur das Geld/die EXP multiplizieren beim jeweiligen Skill Level anstatt immer wieder alles davon zu kopieren?
So?
if(pData[playerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
pData[killerid][P_Weed] += 5;
GivePlayerExp(killerid, 25);
}
else if(pData[playerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
{
switch(random(10))
{
case 0..1:
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
new exp = 25*(pData[playerid][P_DoubleEXP]+1);
new str[16];
format(str, sizeof(str), "+%d", exp);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], str);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, exp);
}
}
}
new exp = 25*(pData[playerid][P_DoubleEXP]+1);
schaut schonmal gut aus, so werde ich es versuchen (btw, wofür steht die +1 dahinter)
Aber ich rede auch z.B. von den restlichen Funktionen. Es wird ja, wie bereits erwähnt 5 Skill Level geben (+ normale (0)) und ich möchte nicht jedes mal folgendes bei jeder Abfrage verwenden.
Edit:
Ach, ich bemerke gerade ich kanns ja so machen, habe das übersehen
else if(pData[playerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
dachte ich hätte jetzt jedes mal else if(pData[playerid][P_DoubleEXP] = 1)//Double EXP Skill Level 1+ (mit 1, 2, 3, 4, & 5) machen müssen.
Aber wenn ich das so wie du machst mit >=1 dann kann ich nicht verschiedene Zufallschancen bestimmen, oder?
schaut schonmal gut aus, so werde ich es versuchen (btw, wofür steht die +1 dahinter)
25 * das Level, aber da Level 1 50 gibt und Level 0 25, muss man es +1 machen, sprich Level+1 * 25, damit es bei Level 1 = 50 gibt.
Aber wenn ich das so wie du machst mit >=1 dann kann ich nicht verschiedene Zufallschancen bestimmen, oder?
Ja.
Dann muss ich ein anderen Weg wählen..
Hatte das so geplant.
Double EXP (EXP x2) Level 0: Normale EXP (+25 XP) , Level 1: (10 %), Level 2 (20%), Level 3(30%), Level 4(40%), Level 5(50%) - Chance das man doppelte EXP Bekommt.
Also muss ich das doch so umständlich machen und für jedes Skill Level die Funktionen erneut kopieren und einfügen?
Sprich so, mit der jeweiligen Zufälligkeit pro Level?
if(pData[playerid][P_DoubleEXP] == 1)
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, 50);
}
else if(pData[playerid][P_DoubleEXP] == 2)
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, 50);
}
else if(pData[playerid][P_DoubleEXP] == 3)
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, 50);
}
Double EXP (EXP x2) Level 0: Normale EXP (+25 XP) , Level 1: (10 %), Level 2 (20%), Level 3(30%), Level 4(40%), Level 5(50%) - Chance das man doppelte EXP Bekommt.
Das wiederrum geht, da es linear ist.
Das sähe dann so aus:
if(pData[playerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
pData[killerid][P_Weed] += 5;
GivePlayerExp(killerid, 25);
}
else if(pData[playerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
{
if(random(10) < pData[playerid][P_DoubleEXP])
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
new exp = 25*(pData[playerid][P_DoubleEXP]+1);
new str[16];
format(str, sizeof(str), "+%d", exp);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], str);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, exp);
}
}
Wo sind denn bei else if(pData[playerid][P_DoubleEXP] >= 1) die Chancen bzw. wie setze ich die dann? Wo wird bestimmt das man für Level 2, eine 20 %ige Chance hat doppelt EXP zu erhalten?
if(random(10) < pData[playerid][P_DoubleEXP])
Hier.
Beispiel:
Level ist 3, dann kann random(10) die Werte 0,1,2 haben, dass der Code darunter ausgeführt wird. Das sind 3 aus 10 Zahlen, was 30% für Level 3 ergibt. Analog ist es bei den anderen Levels.
Hmm, die Double XP Funktion wird irgendwie nicht aufgerufen, kommt immer nur die "normale" EXP Anzahl.
if(pData[playerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
pData[killerid][P_Weed] += 5;
GivePlayerExp(killerid, 25);
SendClientMessageToAll(COLOR_RED , "DEBUG: Normal EXP called");
}
else if(pData[playerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
{
if(random(10) < pData[playerid][P_DoubleEXP])
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
new exp = 25*(pData[playerid][P_DoubleEXP]+1);
new str[16];
format(str, sizeof(str), "+%d", exp);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], str);
PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, exp);
SendClientMessageToAll(COLOR_GREEN , "DEBUG: DOUBLE EXP called");
}
}
}
Dann hat pData[playerid][P_DoubleEXP] den Wert 0.
Wo setzt du das zu 1 oder mehr?
Habe mein Level auf 5 gesetzt und mit folgendem Befehl überprüft ob ich auch Level 5 habe.
EDIT:
Ach ich denke ich weiß woran das liegt, müsste playerid zu killerid umändern da dass ganze ja in OnPlayerDeath stattfindet, ich versuch's mal
!
Wenn es nicht nach dem Level des Getöteten gehen soll, dann mache es so:
if(killerid != INVALID_PLAYER_ID)
{
if(pData[killerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
pData[killerid][P_Weed] += 5;
GivePlayerExp(killerid, 25);
SendClientMessageToAll(COLOR_RED , "DEBUG: Normal EXP called");
}
else if(pData[killerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
{
if(random(10) < pData[killerid][P_DoubleEXP])
{
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
new exp = 25*(pData[killerid][P_DoubleEXP]+1);
new str[16];
format(str, sizeof(str), "+%d", exp);
PlayerTextDrawSetString(killerid, PlayerKill[killerid][0], str);
PlayerTextDrawSetString(killerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, exp);
SendClientMessageToAll(COLOR_GREEN , "DEBUG: DOUBLE EXP called");
}
}
}
Wie herum du das haben willst war deinem ursprünglichen Code nicht zu entnehmen, deshalb habe ich es einfach gelassen wie es war.
Versuche es mal so.
Alles klar, dankeschön.
Letze Frage (denke ich :D):
Mit EXP Skill Level 5 besteht ja die Möglichkeit das zu 50 % die Funktion nicht aufgerufen wird und der Spieler somit keine EXP erhält, da EXP Level ja nicht 0 & 5 gleichzeitig sein kann.
Das alles könnte ich mit einem boolean lösen, gibt's da auch andere, bessere Varienten für?
Dazu kannst du es etwas umstellen, dann klappt das ohne Aufwand.
Ich habe dir in den Kommentaren beschrieben, wann welcher Teil ausgeführt wird:
if(killerid != INVALID_PLAYER_ID)
{
if(pData[killerid][P_DoubleEXP] >= 1 && random(10) < pData[killerid][P_DoubleEXP])
{
//Spieler ist Level 1+ und die Zufallschance passt.
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
new exp = 25*(pData[killerid][P_DoubleEXP]+1);
new str[16];
format(str, sizeof(str), "+%d", exp);
PlayerTextDrawSetString(killerid, PlayerKill[killerid][0], str);
PlayerTextDrawSetString(killerid, PlayerKill[killerid][1], "Double EXP");
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
GivePlayerExp(killerid, exp);
SendClientMessageToAll(COLOR_GREEN , "DEBUG: DOUBLE EXP called");
}
else
{
//Spieler ist Level 0 oder die Zufallschance hat nicht gepasst.
PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
pData[killerid][P_Weed] += 5;
GivePlayerExp(killerid, 25);
SendClientMessageToAll(COLOR_RED , "DEBUG: Normal EXP called");
}
}