Hier hast du nochmal ein Beispiel, bzw. es ist schon fast ein kompletter Code:
new query[256];
format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime < %d", SpielerName(playerid), gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
format(query, sizeof(query), "DELETE FROM bans WHERE banID = %d", mysql_fetch_int());
mysql_query(query);
}
else
{
mysql_free_result();
format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime >= %d", SpielerName(playerid), gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
Kick(playerid); //Spieler noch gebannt.
}
}
mysql_free_result();
Ich habe das ohne Compiler und ohne zu testen einfach in den Texteditor getippt, da ich grade weder pawno noch SA-MP zu Verfügung habe.
Teste es mal aus, bzw. nimm die Änderungen vor die du brauchst und gib dann Bescheid. Falls es nicht klappt kann ich es mir später genauer anschauen, sage mir dann aber bitte genau was nicht geht.
TBan Problem!
- [KoSoVa]
- Geschlossen
- Erledigt
-
-
So,
ich habe dies alles in einen Stock eingefügt! Und jetzt versteh ich grad kein stück was ich in BanID eintragen soll etc... ? Denn ich weiß jetzt nicht ob ich bei der BanID z.b.: jetzt die Hauptdatebank eintragen soll , dann die Datenbank mit den TimeBans , und dann den namen oder?
//EDIT: habe es jetzt so gemacht:
stock LoadTBanAccount(playerid)
{
new query[256],spieler[MAX_PLAYERS];
GetPlayerName(playerid, spieler, MAX_PLAYER_NAME);
format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime < %d", spieler, gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
format(query, sizeof(query), "DELETE FROM spielertimebanned WHERE banID = %d", mysql_fetch_int());
mysql_query(query);
}
else
{
mysql_free_result();
format(query, sizeof(query), "SELECT banID FROM spielertimebanned WHERE Name = '%s' AND Dauer >= %d",spieler, gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
Kick(playerid);
}
}
mysql_free_result();
return true;
}Und wie frage ich ab, wie lange der Spieler noch gebannt ist? Also dass da stehen soll: Du bist noch für 2 Minute(n) gebannt ... oder so
-
stock LoadTBanAccount(playerid)
{
new query[256],spieler[MAX_PLAYERS];
GetPlayerName(playerid, spieler, MAX_PLAYER_NAME);
format(query, sizeof(query), "SELECT banID FROM bans WHERE banName = '%s' AND banTime < %d", spieler, gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
format(query, sizeof(query), "DELETE FROM spielertimebanned WHERE banID = %d", mysql_fetch_int());
mysql_query(query);
}
else
{
mysql_free_result();
format(query, sizeof(query), "SELECT Dauer FROM spielertimebanned WHERE Name = '%s' AND Dauer >= %d",spieler, gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
new dauer = mysql_fetch_int() - gettime(); //dauer = Zeit in Sekunden
new minuten = dauer / 60;
new str[145];
format(str, sizeof(str), "Du bist noch %d Minuten gebannt.", minuten);
SendClientMessage(playerid, 0xFF0000FF, str);
Kick(playerid);
}
}
mysql_free_result();
return true;
}Allerdings musst du bei den 3 Queries noch die Spalten und Tabellennamen teilweise anpassen, das hast du noch nicht für alle gemacht.
-
So, ich habs gemacht , dennoch wenn ich mich banne, und dann wieder online komme, ist der Account sofort automatisch gelöscht, obwohl ich eigentlich noch 3 Minuten oder so, gebannt sein sollte....
Hier mein derzeitiger Code:
stock LoadTBanAccount(playerid)
{
new query[256],spieler[MAX_PLAYERS];
GetPlayerName(playerid, spieler, MAX_PLAYER_NAME);
format(query, sizeof(query), "SELECT banID FROM spielertimebanned WHERE Name = '%s' AND Dauer < %d", spieler, gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
format(query, sizeof(query), "DELETE FROM spielertimebanned WHERE banID = %d", mysql_fetch_int());
mysql_query(query);
}
else
{
mysql_free_result();
format(query, sizeof(query), "SELECT Dauer FROM spielertimebanned WHERE Name = '%s' AND Dauer >= %d",spieler, gettime());
mysql_query(query);
mysql_store_result();
if(mysql_num_rows())
{
new dauer = mysql_fetch_int() - gettime(); //dauer = Zeit in Sekunden
new minuten = dauer / 60;
new str[145];
format(str, sizeof(str), "Du bist noch %d Minuten gebannt.", minuten);
SendClientMessage(playerid, 0xFF0000FF, str);
Kick(playerid);
}
}
mysql_free_result();
return true;
} -
Welcher Wert steht denn für Dauer in deiner Datenbank wenn du dich gebannt hast?
Poste dazu noch den Timeban Befehl. -
So, also hier steht der Wert in der DatenBank:
unter Dauer: "1415132329"
und hier nochmal screen wie das ingame aussieht: http://www.fotos-hochladen.net/uploads/samp0420yhfbmdewo.png
und hier nochmal der TimeBan Befehl:
ocmd:timeban(playerid,params[])
{
if(SpielerInfo[playerid][pAlevel] >= 1)
{
new pID, grund[32],dauer,string[128];
if(sscanf(params,"uds[32]",pID,dauer,grund)) return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /Timeban [Name/ID][Dauer][Grund]");
{
if(IsPlayerConnected(pID))
{
GetPlayerName(playerid, SpielerTimeBan[pID][pvonAdmin], MAX_PLAYER_NAME);
GetPlayerName(pID, SpielerTimeBan[pID][pNameTBan], MAX_PLAYER_NAME);
format(string,sizeof(string),"[INFO]{00CDFF} %s {FFFFFF}hat {00CDFF}%s {FFFFFF}für {00CDFF}%d Minute(n) {FFFFFF}vom Server verbannt! Grund: {00CDFF}%s",SpielerTimeBan[pID][pvonAdmin],SpielerTimeBan[pID][pNameTBan],dauer,grund);
SendClientMessageToAll(0xFF0000FF,string);
SpielerTimeBan[pID][pTBanDauer] = Now() + dauer*60;
GetPlayerIp(pID, SpielerTimeBan[pID][pTBanIP], 16);
SpielerTimeBan[pID][pTBanGrund] = grund;
CreateTBanAccount(pID);
Kick(pID);
}
else
{
SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} Dieser Spieler ist nicht Online!");
}
}
}
return 1;
}
//Kann man auch den GRUND auch verlängern?Also dass man mehr reinschreiben kann?Und irgendwie wird nichtsmehr in der DatenBank eingetragen über meinen BAN Befehl:
ocmd:ban(playerid,params[])
{
if(SpielerInfo[playerid][pAlevel] >= 2)
{
new pID, string[256], aname[MAX_PLAYERS], spieler[MAX_PLAYERS], grund[256];
GetPlayerName(playerid,aname,sizeof(aname));
GetPlayerName(pID,spieler,sizeof(spieler));
if(sscanf(params,"us",pID,grund))return SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} /Ban [Name/ID] [Grund]");
{
if(IsPlayerConnected(pID))
{
SpielerInfo[pID][pBanned] = 1;
format(string,sizeof(string),"[A-INFO]{00CDFF} %s {FFFFFF}hat {00CDFF}%s {FFFFFF}verbannt! Grund: {00CDFF}%s",aname,spieler,grund);
SendClientMessageToAll(0xFF0000FF,string);
printf("[A-INFO] %s hat %s einen AccountBan vergeben!",aname,spieler);
Kick(pID);
}
else
{
SendClientMessage(playerid,0xFF0000FF,"[FEHLER]{FFFFFF} Dieser Spieler ist nicht Online!");
}
}
}
return 1;
} -
Grund:
new pID, grund[32],dauer,string[128];
zu:
new pID, grund[32],dauer,string[145];Zeit:
SpielerTimeBan[pID][pTBanDauer] = Now() + dauer*60;
zu:
SpielerTimeBan[pID][pTBanDauer] = gettime() + dauer*60;Bei deinem Ban Befehl fehlt das Query, es kann nichts eingetragen werden.
Wenn der Timeban noch immer nicht geht nach diesen beiden Änderungen, poste die CreateTBanAccount Funktion.
-
Alles klar danke Jeffrey, geht jetzt alles perfekt!
Aber das mit den Ban versteh ich nicht ganz, denn früher ging das Bansystem perfekt, aber seid dem ich die Timeban Funktion eingeführt habe , geht es jetzt nicht mehr.
-
Schau dir deinen /ban Befehl an. Steht da irgendwas mit INSERT INTO? Nein => Es wird nichts in die Datenbank eingetragen, sprich du wirst auch nicht gebannt.
Das solltest du hinzufügen. -
Ja aber ich habe doch mit SpielerInfo[pID][pBanned] = 1; Tragt das auch nicht normal das in die DatenBank
-
-
Wie speicherst du den Ban-Status des Spielers in die Datenbank? Poste mal den Code mit dem du das speicherst.
Und wie prüfst du es beim Connect ab, ob der Spieler gebannt ist? -
stock SavePlayer(playerid)
{
if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid)) //wir überprüfen ob der Spieler überhaupt noch Connected ist und ob er nicht ein NPC ist.
{
if(GetPVarInt(playerid,"Eingeloggt") == 1) //Und hier ob er noch eingeloggt ist.
{
mysql_SetInt("user", "Score", SpielerInfo[playerid][pScore], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Alevel", SpielerInfo[playerid][pAlevel], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Member", SpielerInfo[playerid][pMember], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Leader", SpielerInfo[playerid][pLeader], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Geld", SpielerInfo[playerid][pGeld], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Kills", SpielerInfo[playerid][pKills], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Tode", SpielerInfo[playerid][pTode], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("user", "Banned", SpielerInfo[playerid][pBanned], "Name", SpielerInfo[playerid][pName]);
mysql_SetFloat("user", "Health", SpielerInfo[playerid][pHealth], "Name", SpielerInfo[playerid][pName]);
}
}
return 1;
}//So prüfe ich es ab , Ist ein Stock , der in OnPlayerConnect abgerufen wird!
stock LoadBanAccount(playerid)
{
if(SpielerInfo[playerid][pBanned] == 1)
{
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
SendClientMessage(playerid,0xFF0000FF," ");
Kick(playerid);
}
else
{
SpielerInfo[playerid][pBanned] = 0;
}
} -
Ich schätze mal du rufst den stock vor dem Login auf.
Ändere
if(SpielerInfo[playerid][pBanned] == 1)
zu:
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
if(mysql_GetInt("user", "Banned", "Name", name) == 1) -
Geändert , leider wird immernoch nichts eingetragen
-
Dann füge vor dem Kick im Ban Befehl noch das ein:
SavePlayer(pID); -
Okay , danke geht jetzt endlich! Vielen Dank!
-
breadfish.de
Hat das Thema geschlossen.