[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
-
-
Soweit ich das in der Erinnerung hatte muss es zweimal gehasht werden.
-
Wie erstelle ich für ein NPC ein Chatbubble, wenn der Spieler in der nähe ist? (sage jetz mal sportan Radius von
-
Willkommen im Forum.
Du machst einen Timer der eine Schleife durch alle Spieler beinhaltet. Dort fragst du ab, ob der Spieler nahe einem NPC ist (noch ein Loop im Loop) und zwar mit:
http://forum.sa-mp.com/showthread.php?t=164379Wenn ja, dann zeigst du die Sprechblase an.
Falls du mit dem Code nicht klar kommst, poste bitte das, was du bis dahin schon gemacht hast.
-
Willkommen im Forum.
Du machst einen Timer der eine Schleife durch alle Spieler beinhaltet. Dort fragst du ab, ob der Spieler nahe einem NPC ist (noch ein Loop im Loop) und zwar mit:
http://forum.sa-mp.com/showthread.php?t=164379Wenn ja, dann zeigst du die Sprechblase an.
Falls du mit dem Code nicht klar kommst, poste bitte das, was du bis dahin schon gemacht hast.
Hm..
So habe ich das verstanden von Wiki aus:
if(NearestPlayer(poliziststadthalle,5, 10.0)){
SetPlayerChatBubble(poliziststadthalle,"Guten Tag Sir.", WEISS, 100.0, 10000);
return 1;
}stock NearestPlayer(playerid,targetid,Float:distance)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid,x,y,z);
if(IsPlayerInRangeOfPoint(targetid,distance,x,y,z))
{
return true;
}
return false;
}
Aber scheint man muss den NPC anders finden als den Namen. (Undefined stadthallepolizist) -
OnGameModeInit:
SetTimer("PoliceNPCCheck", 500, 1);Unten im Code:
forward PoliceNPCCheck();
public PoliceNPCCheck()
{
new spName[MAX_PLAYER_NAME], Float:x, Float:y, Float:z;
for(new i=0; i<MAX_PLAYERS; i++)
{
GetPlayerName(i, spName, MAX_PLAYER_NAME);
if(IsPlayerNPC(i) && !strcmp(spName, "NAME_DES_POLIZISTEN_HIER"))
{
GetPlayerPos(i, x, y, z);
for(new j=0; j<MAX_PLAYERS; j++)
{
if(IsPlayerConnected(j) && j != i && IsPlayerInRangeOfPoint(j, 8.0, x, y, z))
{
SetPlayerChatBubble(i,"Guten Tag Sir.", WEISS, 100.0, 10000);
return 1;
}
}
return 1;
}
}
return 1;
}NAME_DES_POLIZISTEN_HIER logischerweise mit dem Spieler-Name des NPCs ersetzen.
-
OnGameModeInit:
SetTimer("PoliceNPCCheck", 500, 1);Unten im Code:
forward PoliceNPCCheck();
public PoliceNPCCheck()
{
new spName[MAX_PLAYER_NAME], Float:x, Float:y, Float:z;
for(new i=0; i<max_players; i++)
{
GetPlayerName(i, spName, MAX_PLAYER_NAME);
if(IsPlayerNPC(i) && !strcmp(spName, "NAME_DES_POLIZISTEN_HIER"))
{
GetPlayerPos(i, x, y, z);
for(new j=0; j<max_players; j++)
{
if(IsPlayerConnected(j) && j != i && IsPlayerInRangeOfPoint(j, 8.0, x, y, z))
{
SetPlayerChatBubble(i,"Guten Tag Sir.", WEISS, 100.0, 10000);
return 1;
}
}
return 1;
}
}
return 1;
}NAME_DES_POLIZISTEN_HIER logischerweise mit dem Spieler-Name des NPCs ersetzen.
Könntest du vielleicht kurz erkären was bedeutet ist?
Möchte es nicht einfach so reinkopieren.
Ich verstehe folgendes nicht:
for(new i=0; i<MAX_PLAYERS; i++)
Aber vielen Dank für die Hilfe! -
Kannst du bitte von nun an davon absehen, den gesamten Post (mit Code!) zu zitieren? Dafür wäre ich, und sicher auch viele andere, dir sehr dankbar.
So, zurück zum Thema:
Das
for(new i=0; i<MAX_PLAYERS; i++)
ist eine Schleife von 0 bis MAX_PLAYERS-1, wobei MAX_PLAYERS in der Include a_samp definiert ist (z.B. 500).
i nimmt dabei bei jedem Durchlauf den nächsten Wert (++ = +1) an, also konkret 0,1,2,3,4,...498,499.Mehr dazu:
http://wiki.sa-mp.com/wiki/Loops -
Werde ich bein nächsten mal beachten.
Danke für die Hilfe. -
Guten morgen, ich habe da ein Problem mit meinem Login System. Ich möchte das man maximal 3 mal das Passwort falsch eingeben darf ( danach Kick ). Aber bei mir will das nicht so ganz, zum einen bekomme ich beim 3 mal keine Kicknachricht, werde jedoch vom Server gekickt. Und ich kann mich nicht mehr einloggen, immer wenn ich normal auf den Server komme, und das "richtige" Passwort eingebe kommt das mit dem "Passwort Falsch". Ich hoffe mir kann jemand Helfen.
Spoiler anzeigen public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case Dialog_Register:
{
if(!response)
{
SendClientMessage(playerid,0xFF0000FF,"Dieser Vorgang wurde Ab.-oder Unterbrochen\nBitte beenden Sie das Spiel, indem Sie /q als Textnachricht in den Chat eingeben.");
SetTimerEx("KickPlayer",250,0,"i",playerid);
return 1;
}
if(!inputtext[0] || !(3 <= strlen(inputtext) <= 10))
{
ShowPlayerDialog(playerid,Dialog_Register,DIALOG_STYLE_PASSWORD,"SmR: {0x3252BEFF}Registrierung","{FFFFFF}Herzlich Willkommen auf San Miami Roleplay\n\nUnser System hat Ihre Spielerinformationen\nnicht in unserer Datenbank gefunden. Um einen Charakter auf unserem Server zu Erstellen\nbenoetigen wir einige Informationen. Als erstes tragen Sie Bitte ein Sicheres Passwort in das untere Feld ein.\nMerken Sie sich Ihr Passwort Gut.\n\nKlicken Sie anschließend auf Annehmen.","Annehmen","Abbrechen");
return 1;
}
new query[650 + MAX_PLAYER_NAME],Tag,Monat,Jahr,Stunde,Minute,Sekunde;
getdate(Tag,Monat,Jahr);
gettime(Stunde,Minute,Sekunde);
format(query,sizeof(query),"d.d.%d - d:d:%d",Tag,Monat,Jahr,Stunde,Minute,Sekunde);
mysql_format(DBHandle, query, sizeof(query),"INSERT INTO `Accounts` (`pName`, `pPasswort`, `pAlter`, `pBargeld`, `pKontoguthaben`, `pLastLogin`, `pRegDatum`, `pVersuche`, `pLeben`) VALUES ('%e','%e','%d','0','0','%s','%s','%d','100.0')",Spieler[playerid][pName],inputtext,Spieler[playerid][pAlter],query,query,Spieler[playerid][pWrongPass],Spieler[playerid][pLeben]);
mysql_tquery(DBHandle, query, "", "");
Spieler[playerid][pLogged] = true;
SpawnPlayer(playerid);
return 1;
}
case Dialog_Login:
{
if(!response)
{
SendClientMessage(playerid,0xFF0000FF,"Dieser Vorgang wurde Ab.-oder Unterbrochen\nBitte beenden Sie das Spiel, indem Sie /q als Textnachricht in den Chat eingeben.");
SetTimerEx("KickPlayer",250,0,"i",playerid);
return 1;
}
switch(Login_Status[playerid])
{
case 0:
{
Login_Status[playerid]++;
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"{0x3252BEFF}Falsches Passwort","{FFFFFF}Das von Ihnen angegebene Passwort wurde abgelehnt,\ngeben Sie Bitte Ihr richtiges Passwort unten in das Feld ein.\nDrücken Sie danach auf Einloggen, damit Ihre Daten kontrolliert werden können.\n\nDenken Sie auch an die Groß-,Kleinschreibung\n\nSie haben 3/3 versuche!","Einloggen","Abbrechen");
return 1;
}
case 1:
{
Login_Status[playerid]++;
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"{0x3252BEFF}Falsches Passwort","{FFFFFF}Das von Ihnen angegebene Passwort wurde abgelehnt,\ngeben Sie Bitte Ihr richtiges Passwort unten in das Feld ein.\nDrücken Sie danach auf Einloggen, damit Ihre Daten kontrolliert werden können.\n\nDenken Sie auch an die Groß-,Kleinschreibung\n\nSie haben noch 2/3 versuche!","Einloggen","Abbrechen");
return 1;
}
case 2:
{
Login_Status[playerid]++;
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"{0x3252BEFF}Falsches Passwort","{FFFFFF}Das von Ihnen angegebene Passwort wurde abgelehnt,\ngeben Sie Bitte Ihr richtiges Passwort unten in das Feld ein.\nDrücken Sie danach auf Einloggen, damit Ihre Daten kontrolliert werden können.\n\nDenken Sie auch an die Groß-,Kleinschreibung\n\nSie haben nurnoch 1/3 versuche!","Einloggen","Abbrechen");
return 1;
}
case 3:
{
SendClientMessage(playerid,0x3252BEFF,"Sie haben zu oft Ihr Passwort falsch eingegeben, aus Sicherheitsgründen wurden Sie vom System gesperrt. Versuchen Sie es in einer Stunde nochmal, oder Melden Sie sich bei einem Administrator.");
SetTimerEx("KickPlayer",250,0,"i",playerid);
return 1;
}
}
if(!inputtext[0] || !(3 <= strlen(inputtext) <= 25))
{
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"SmR: {0x3252BEFF}Einloggen","{FFFFFF}Sie müssen von unserem System Identifiziert werden.\nGeben Sie dafür Ihr Passwort unten in das Feld ein.\n\n Klicken Sie anschließend auf Einloggen, damit Ihre Daten kontrolliert werden können.","Einloggen","Abbrechen");
return 1;
}
new query[180 + MAX_PLAYER_NAME];
mysql_format(DBHandle, query,sizeof(query),"SELECT COUNT(*) AS `count` FROM `Accounts` WHERE `pName` ='%e' AND `pPasswort` ='%e'",Spieler[playerid][pName],inputtext);
mysql_function_query(DBHandle, query, true,"LoadPlayerDataSequence","dd",playerid,2);
SpawnPlayer(playerid);
Spieler[playerid][pLogged] = true;
return 1;
}
}
return 1;
}Spoiler anzeigen public LoadPlayerDataSequence(playerid, l_step)
{
switch(l_step)
{
case 1:
{
new count = cache_get_field_content_int(0,"count");
if(count)
{
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"SmR: {0x3252BEFF}Einloggen","{FFFFFF}Sie m�ssen von unserem System Identifiziert werden.\nGeben Sie daf�r Ihr Passwort unten in das Feld ein.\n\n Klicken Sie anschlie�end auf Einloggen, damit Ihre Daten kontrolliert werden k�nnen.\n\nSie haben noch 3/3 versuche!","Einloggen","Abbrechen");
return 1;
}
else
{
ShowPlayerDialog(playerid,Dialog_Register,DIALOG_STYLE_PASSWORD,"SmR: {0x3252BEFF}Registrierung","{FFFFFF}Herzlich Willkommen auf San Miami Roleplay\n\nUnser System hat Ihre Spielerinformationen\nnicht in unserer Datenbank gefunden. Um einen Charakter auf unserem Server zu Erstellen\nben�tigen wir einige Informationen. Als erstes tragen Sie Bitte ein Sicheres Passwort in das untere Feld ein.\n\nMerken Sie sich Ihr Passwort Gut.\n\nKlicken Sie anschlie�end auf Annehmen.","Annehmen","Abbrechen");
return 1;
}
}
case 2:
{
new count = cache_get_field_content_int(0,"count");
if(count)
{
new query[160 + MAX_PLAYER_NAME];
mysql_format(DBHandle, query ,sizeof(query),"SELECT * FROM `Accounts` WHERE `pName` = '%e'",Spieler[playerid][pName]);
mysql_function_query(DBHandle, query, true,"LoadPlayerDataSequence","dd",playerid,3);
return 1;
}
else
{
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_PASSWORD,"SmR: {0xFF0000EE}Falsches Passwort","{FFFFFF}Das von Ihnen gew�hlte Passwort war leider nicht Richtig.\nGegebenfalls beachten Sie die Gro� und Kleinschreibung.\n\nAchtung! Sie haben nur noch 2/3 versuche.","Einloggen","Abbrechen");
return 1;
}
}
case 3:
{
Spieler[playerid][pAlter] = cache_get_field_content_int(0,"pAlter");
Spieler[playerid][pAdminlevel] = cache_get_field_content_int(0,"pAdminlevel");
Spieler[playerid][pBargeld] = cache_get_field_content_int(0,"pBargeld");
Spieler[playerid][pKontoguthaben] = cache_get_field_content_int(0,"pKontoguthaben");
cache_get_field_content(0,"pLastLogin",Spieler[playerid][pLastLogin],DBHandle,30);
cache_get_field_content(0,"pRegDatum",Spieler[playerid][pRegDatum],DBHandle,30);
Spieler[playerid][pWrongPass] = cache_get_field_content_int(0,"pVersuche");
Spieler[playerid][pLeben] = cache_get_field_content_float(0,"pLeben");
Spieler[playerid][pLogged] = true;
return 1;
}
default:
{
SendClientMessage(playerid,0x7D0000FF,"Es ist ein Fehler aufgetreten, Bitte starten Sie Ihren Clienten neu, und versuchen Sie es erneut,\nSollten weiterhin Fehler auftreten, so Melde Sie sich umgehend Bitte bei einem Teammitglied.");
return 1;
}
}
return 1;
}
//Edit
Etwas hinzugefügt -
-
Wo fragst du denn ab, ob das Passwort falsch war?
-
Wo fragst du denn ab, ob das Passwort falsch war?
Das unterste vielleicht? da stehts doch....mysql_format(DBHandle, query,sizeof(query),"SELECT COUNT(*) AS `count` FROM `Accounts` WHERE `pName` ='%e' AND `pPasswort` ='%e'",Spieler[playerid][pName],inputtext);
-
Du könntest das auch eigentlich anders machen.
In dem Callback LoadPlayerDataSequence, wenn num_rows false / 0 ist, dann ist das Passwort falsch. Da könntest du die Variable immer um einen erhöhen. Wenn die Variable dann 3 ist, => Kick -
Du könntest das auch eigentlich anders machen.
In dem Callback LoadPlayerDataSequence, wenn num_rows false / 0 ist, dann ist das Passwort falsch. Da könntest du die Variable immer um einen erhöhen. Wenn die Variable dann 3 ist, => Kick
Welches der beiden ist dMn nach der beste Weg, und welcher am besten für Anfänger? -
Ich würde es so machen wie ich es erklärt habe.
Welche Methode du natürlich jetzt nimmst, ist dir selbst überlassen. -
Auf Anfrage in PN:
Eddy:
So wie mir das scheint, hast du das bei OnPlayerDisconnect vergessen:
Login_Status[playerid] = -1;
du kannst es aber auch direkt dort machen, wo du den Timer startest um den Spieler zu kicken.Die Nachricht bekommst du nicht, weil das hier mehr als 144 Zeichen sind:
ZitatSie haben zu oft Ihr Passwort falsch eingegeben, aus Sicherheitsgründen wurden Sie vom System gesperrt. Versuchen Sie es in einer Stunde nochmal, oder Melden Sie sich bei einem Administrator.
Nämlich 191.Syno: Ach ja, stimmt natürlich. Das fängt ja bei 0 an, hab ich glatt übersehen. Danke für den Hinweis.
Dann müsste auch die Initialisierung so aussehen:
new Login_Status[MAX_PLAYERS] = {-1,...};
Schätze mal das hat er auch nicht. -
Aber wenn er diese Variable auf 0 hat wird das hier ja trotzdem ausgeführt:
switch(Login_Status[playerid])
{
case 0:
{
Login_Status[playerid]++;
ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_INPUT,"{0x3252BEFF}Falsches Passwort","{FFFFFF}Das von Ihnen angegebene Passwort wurde abgelehnt,\ngeben Sie Bitte Ihr richtiges Passwort unten in das Feld ein.\nDrücken Sie danach auf Einloggen, damit Ihre Daten kontrolliert werden können.\n\nDenken Sie auch an die Groß-,Kleinschreibung\n\nSie haben 3/3 versuche!","Einloggen","Abbrechen");
return 1;
}
(...)Also wenn dann auf -1 setzen
-
Hallo ich habe eine Kleine Frage wenn ich mich Registriere bekomme ich Level1 und 2500$ aber der Server speichert das nicht in der Datenbank
also ich will das Sofern ein Spieler auf dem Server ist er Level 1 und 2500$ bekommt bekommt er auch aber wenn ich mich auslogge und wieder einlogge ist das Level auf 0 genauso wie mein Geld auf 0kann mir jemand helfen ?
savePlayer(playerid)
{
if(sInfo[playerid][eingeloggt]==0)return 1;
//speichern
new query[128];
format(query,sizeof(query),"UPDATE user SET level='%i',money='%i',alevel='%i' WHERE id='%i'",sInfo[playerid][level],
GetPlayerMoney(playerid),sInfo[playerid][alevel],sInfo[playerid][db_id]);
mysql_function_query(dbhandle,query,false,"","");
return 1;
}public OnPasswordResponse(playerid)
{
new num_fields,num_rows;
cache_get_data(num_rows,num_fields,dbhandle);
if(num_rows==1)
{
//Spieler ladensInfo[playerid][eingeloggt] = 1;
sInfo[playerid][level] = cache_get_field_content_int(0,"level",dbhandle);
SetPlayerScore(playerid,sInfo[playerid][level]);
sInfo[playerid][db_id] = cache_get_field_content_int(0,"id",dbhandle);
SetPlayerMoney(playerid,cache_get_field_content_int(0,"money",dbhandle));
sInfo[playerid][alevel] = cache_get_field_content_int(0,"alevel",dbhandle);
SendClientMessage(playerid,GRÜN,"Erfolgreich eingeloggt!");
loadPlayerCars(playerid);
}
else
{
SendClientMessage(playerid,ROT,"Das eigegeben Passwort ist fasch");
ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Login","Willkommen auf Red-Game0v3r-Reallife,\n\n\n\n Bitte logge dich nun ein!\n\n\n","Login","Abbrechen");
}
return 1;
}if(dialogid==DIALOG_REGISTER)
{
if(response)
{
new name[MAX_PLAYER_NAME],query[128],passwort[35];
GetPlayerName(playerid,name,sizeof(name));
if(strlen(inputtext)>3)
{
//Registrierungsfunktion
mysql_escape_string(inputtext,passwort,dbhandle);
format(query,sizeof(query),"INSERT INTO user (username,password) VALUES ('%s','%s') ",name,passwort);
mysql_function_query(dbhandle,query,false,"OnPlayerRegister","d",playerid);
}
else
{
//Kleiner als 4 Zeichen
SendClientMessage(playerid,ROT,"Dein Passwort muss mindestens 4 Zeichen lang sein.");
ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_INPUT,"Registrierung","Gib bitte dein gewünschtes Passwort an:","Okay","Abbrechen");
}
}
else
{
Kick(playerid);
}
return 1;
}
return 1;
}public OnPlayerRegister(playerid)
{
sInfo[playerid][db_id] = mysql_insert_id();
SendClientMessage(playerid, ROT, "Du hast dich Erfolgreich Registriert !");
SendClientMessage(playerid, LEUCHTENDBLAU, "=====>Willkommen auf Red-Game0v3r-Reallife<=====");
SetPlayerMoney(playerid, 2500);
SetPlayerScore(playerid,1);
savePlayer(playerid);
SetPlayerColor(playerid, 0xFF00FFFF);
} -
GetPlayerMoney(playerid),sInfo[playerid][alevel],sInfo[playerid][db_id]);
Da ist eindeutig was falsch
-
GetPlayerMoney(playerid),sInfo[playerid][alevel],sInfo[playerid][db_id]);
Da ist eindeutig was falsch
und was ist dadranne falsch ?
-