Guten Tag,
füge das hier als Plugin ein und telle die Serverlogs nochmal rein
http://forum.sa-mp.com/showthread.php?t=249226
Dazu solltest du dein sccanf Plugin überprüfen da es nicht Läd wo sicherlich auch der Fehler liegt
Guten Tag,
füge das hier als Plugin ein und telle die Serverlogs nochmal rein
http://forum.sa-mp.com/showthread.php?t=249226
Dazu solltest du dein sccanf Plugin überprüfen da es nicht Läd wo sicherlich auch der Fehler liegt
Warum bekomme ich einen Error:
format(string,sizeof(string),"* HQ: Officer %s hat die S.W.A.T erlaubnis entzogen.",SpielerName(playerid));
new string[258];
new SpielerName[MAX_PLAYER_NAME];
SpielerName(playerid)
Es wäre gut zu wissen, wo und wie du GetPlayerName nutzt...
Aber anhand deiner Variable musst du es so schreiben:
format(string,sizeof(string),"* HQ: Officer %s hat die S.W.A.T erlaubnis entzogen.",SpielerName);
mfg.
Soweit ich weiß brauchst du mindestens 1 AddPlayerClass unter GameModeInit
Hatte ich, war aber der selbe fehler, hab das kommentiert hat auch nix gebracht
Wieso werden mir hier keine Nachrichten gesendet? Der Spieler wird zwar Entbannt, aber es wird mir, wenn ich einen nicht Existierenden Namen angebe, wird mir dort keine Nachricht gesendet.
In der Log wird es richtig angezeigt: 19/01/2015-18:51:47 | Admin: Eddy_Mind * Zielperson: Eddy * Grund: Test
geprintet wird: [18:51:47] {FF1111}Admin Info: {E5E5E5}Der Admin {23A7F5}Eddy_Mind {E5E5E5}(ID:{23A7F5}0{E5E5E5}) hat den Spieler {23A7F5}Eddy{E5E5E5} Entbannt.- {FF7979}Grund: {E5E5E5}Test
{
new query[1000],rows,fields;
switch(sqlresultid)
{
case MySQL_Check_UnBan:
{
cache_get_data(rows,fields);
if(!rows)
{
if(!IsPlayerAnAdmin(extraid,1)) return SendClientMessage(extraid,0xCC4747,"Dieser Spieler ist laut der Datenbank nicht Gesperrt oder nicht Registriert! Bitte Überprüfen Sie den Spielernamen.");
return 1;
}
format(query,sizeof(query),"DELETE FROM `Banned` WHERE Name = '%s'",index);
mysql_function_query(DBHandle,query,false,"","");
format(query,sizeof(query),"{FF1111}Admin Info: {E5E5E5}Der Admin {23A7F5}%s {E5E5E5}(ID:{23A7F5}%i{E5E5E5}) hat den Spieler {23A7F5}%s{E5E5E5} Entbannt.- {FF7979}Grund: {E5E5E5}%s",Spieler[extraid][pName],extraid,index,index2);
SendClientMessageToAll(0xCC4747,query);
printf(query);
format(query,sizeof(query),"Admin: %s * Zielperson: %s * Grund: %s",Spieler[extraid][pName],index,index2);
SavePlayerData(extraid);
Log("Unbansqllog",query);
return 1;
}
}
return 1;
}
Die Nachricht hat mehr als 144 angezeigte Zeichen, mehr kann nicht angezeigt werden. Setze die query Variable auf 145 (wegen EOS), dann siehst du ab wann es zu viel ist.
Ich versuche mich derzeit von Funktionen fernzuhalten und probiere mit Makros rum, nur warum bekomme ich hier denn Fehlermeldungen.
PWN CODE
#define givePlayerMoney(%0,%1) pInfo[%0][pGeld]+=%1 && GivePlayerMoney(%0,%1)
#define setPlayerMoney(%0,%1) ResetPlayerMoney(%0) && pInfo[%0][pGeld]=0 && GivePlayerMoney(%0,%1)
Fehlermeldung
Zitaterror 022: must be lvalue (non-constant)
Zeile
setPlayerMoney(playerid, cache_get_field_content_int(0, "Geld", Handle));
mfg
Schreib mal deine Makros so:
#define givePlayerMoney(%0,%1) pInfo[%0][pGeld]+=%1,GivePlayerMoney(%0,%1)
#define setPlayerMoney(%0,%1) ResetPlayerMoney(%0),pInfo[%0][pGeld]=%1,GivePlayerMoney(%0,%1)
mfg.
Schreib mal deine Makros so:
#define givePlayerMoney(%0,%1) pInfo[%0][pGeld]+=%1,GivePlayerMoney(%0,%1)
#define setPlayerMoney(%0,%1) ResetPlayerMoney(%0),pInfo[%0][pGeld]=%1,GivePlayerMoney(%0,%1)
mfg.
Okay wusste nicht dass ich das so schreiben muss. Vielen Dank
mfg
Bin gerade an einem Tut Textdraw und wollte fragen ob es eine andere Möglichekit gibt ein Große flächte mit Text zufüllen als mit 20 Textdraws.
Bin gerade an einem Tut Textdraw und wollte fragen ob es eine andere Möglichekit gibt ein Große flächte mit Text zufüllen als mit 20 Textdraws.
Ja, du kannst mit ~n~ einen Zeilenumbruch in deinem TextDraw machen und somit über mehrere Zeilen schreiben
mfg.
Ich bin hier gerade mächtig am überlegen wie man eine Variable durchgeht.
Ist nützlich für meine Skin Auswahl.
PWN CODE:
new skins[16][1] = {
{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},
};
for(new i;i<sizeof skins;i++)
{
if(GetPlayerSkin(playerid) == skins[i]){
SendClientMessage(playerid, -1, "Du warst auf dem Wert bereits, der Integer wird erhöht.");
SetPlayerSkin(playerid,skins[i+1]);
}
}
Ich weiß aber nicht direkt ob ich das richtig angehe, habt ihr bessere Vorschläge?
Das soll heißen, das ich am ende mit der Rechten und Linken Pfeiltaste den Skin 1-15 Switchen kann, jetzt so als Beispiel.
mfg
Zitathabt ihr bessere Vorschläge?
Ja.
A) Änder deinen Avatar, sieht nicht so schön aus.
B) Achte bitte auf die Rechtschreibung, auch in DEBUG Nachrichten
ZitatDu warst auf dem Wert bereits, der Integer wird erhöht. -> Du warst bereits auf diesem Wert
C) Sehe eig. keinen Fehler, ich denke ich würde es nicht anders angehen. Wie wär's wenn du es mal ausprobierst ?
EDIT
Du solltest dir angewöhnen, Befehle(Funktionen) zusammen ausführen zu lassen.
SendClientMessage(playerid, -1, "Du warst auf dem Wert bereits, der Integer wird erhöht."); //Du lässt erst die Nachricht abschicken
SetPlayerSkin(playerid,skins[i+1]);//Dann setzt du den Skin
SendClientMessage(playerid, -1, "Du warst auf dem Wert bereits, der Integer wird erhöht."),//Du schickst die Nachricht ab
SetPlayerSkin(playerid,skins[i+1]);//Und setzt direkt den Skin
Der nette [DT]Sniper: hatte dazu mal was geschrieben, ich suchs dir gleich raus.
Alles anzeigenWie Blackace bereits sagte ist es für den Kompiler etwas anderes ob er die Befehle einzeln oder hintereinander verknüpft bekommt.
Stell dir vor du schreibst mit Hilfe von Pawn einen Code der ähnlich einer Einkaufsliste ist:
schreibst du den code so:
BuyMilk(),BuyToast(),BuyCheese(),BuyCookies();
würde das für den Compiler so viel bedeuten dass er los gehen soll und Milch, Toast, Käse und Kekse kaufen soll.
Bei der Methode:
BuyMilk();
BuyToast();
BuyChesse();
BuyCookies();
würdest du den Compiler sagen, dass er los gehen soll Milch kaufen, wenn er wieder zurück ist sagst du ihm er soll Toast kaufen, wenn er wieder da ist sagst du ihm er soll Käse kaufen und wenn er dannach wieder bei dir ist sagst du ihm noch er soll Keckse kaufen.
Alles anzeigendas hintereinander schreiben von anweisungen ist jedoch nur ein sehr kleiner Teil von Ressourcen schonenden Scripten, wichtiger ist es Timer richtig und wenig zu verwenden, möglichst wenig Variablen zu nutzen so wir unnötige Rechenschritte zu vermeiden.
Vor allen sollten nicht mehr verwendete PVars wieder deltet werden etc. alles was Arbeitsspeicher und cpu schont.
Eines der Bekanntesten Beispiele kommt aus den alten Godfather Systemen, dort wurde bei OnPLayerUpdate die daten des Spielers gespeichert, dies hat bewirkt, dass die Speicherung für jeden Spieler je nach updaterate des spielers (diese ist durch handlungen höher als wenn ich dumm rum stehe). Du kannst dir bestimmt gut vorstellen, dass es dem PC nicht gut tut in der sekunde ungefähr 10 mal pro Spieler die entsprechende Spielerdatei zu öffnen und zu updaten.
edit:
Wie Blackace bereits sagte ist es für den Kompiler etwas anderes ob er die Befehle einzeln oder hintereinander verknüpft bekommt.
Stell dir vor du schreibst mit Hilfe von Pawn einen Code der ähnlich einer Einkaufsliste ist:
schreibst du den code so:
BuyMilk(),BuyToast(),BuyCheese(),BuyCookies();
würde das für den Compiler so viel bedeuten dass er los gehen soll und Milch, Toast, Käse und Kekse kaufen soll.
Bei der Methode:
BuyMilk();
BuyToast();
BuyChesse();
BuyCookies();
würdest du den Compiler sagen, dass er los gehen soll Milch kaufen, wenn er wieder zurück ist sagst du ihm er soll Toast kaufen, wenn er wieder da ist sagst du ihm er soll Käse kaufen und wenn er dannach wieder bei dir ist sagst du ihm noch er soll Keckse kaufen.
Bei der Schnelligkeit eines Computers, wird diese Art des Ressourcenshonenden Scripten jedoch nicht viel einsparren.
zu lesbarkeit, wenn ich mich nicht irre kannst du das ganze auch so schreiben:
BuyMilk(),
BuyToast(),
BuyCheese(),
BuyCookies();
Ich hoffe ich habe jetzt so schlaftrunken wie ich bin keine scheisse erzählt
jetzt so als Beispiel.
Schreib das mal so:
//Oben im Skript
stock const skins[] = {
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
};
//In deinem Callback
static x;
if(x == sizeof(skins)) x=0;
SetPlayerSkin(skins[x]),x++;
mfg.
Alles anzeigenjetzt so als Beispiel.
Schreib das mal so:
//Oben im Skript
stock const skins[] = {
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
};
//In deinem Callback
static x;
if(x == sizeof(skins)) x=0;
SetPlayerSkin(skins[x]),x++;
mfg.
Gut, ist soweit Funktionstüchtig.
Aber wenn ich das ganze zurücklaufen lassen will?
static x;
if(x == sizeof(SKINS_ZIVI)) x=1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
So Funktioniert das nicht
Außerdem mal ne frage nebenbei, wenn man die Pfeiltasten benutzt..wird dann OnPlayerKeyStateChange aufgerufen?
mfg
Als erstes muss das so:
static x;
if(x == sizeof(SKINS_ZIVI)) x=0;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
Die Pfeiltasten werden nicht über OnPlayerKeyStateChange aufgerufen, sondern die musst du mit OnPlayerUpdate abfragen.
Das ganze kannst du mit GetPlayerKeys anstellen
Als erstes muss das so:
static x;
if(x == sizeof(SKINS_ZIVI)) x=0;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
Die Pfeiltasten werden nicht über OnPlayerKeyStateChange aufgerufen, sondern die musst du mit OnPlayerUpdate abfragen.
Das ganze kannst du mit GetPlayerKeys anstellen
Ich weiß, habe ich bereits gemacht.
Über OnPlayerUpdate läuft mir das zu "Hyper aktiv " ab .....
if(GetPVarInt(playerid,"SkinC"))
{
new key[3];
GetPlayerKeys(playerid, key[0], key[1], key[2]);
switch(key[2])
{
case KEY_RIGHT:
{
static x;
if(x == sizeof(SKINS_ZIVI)) x=1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x++;
/*if(getPlayerTeam(playerid) == TEAM_ZIVI)
{
switch(GetPlayerSkin(playerid))
{
case 1:SetPlayerSkin(playerid,2);
case 2:SetPlayerSkin(playerid,3);
case 3:SetPlayerSkin(playerid,4);
case 4:SetPlayerSkin(playerid,5);
case 5:SetPlayerSkin(playerid,6);
case 6:SetPlayerSkin(playerid,7);
case 7:SetPlayerSkin(playerid,8);
case 8:SetPlayerSkin(playerid,14);
case 14:SetPlayerSkin(playerid,15);
case 15:SetPlayerSkin(playerid,16);
case 16:SetPlayerSkin(playerid,17);
case 17:SetPlayerSkin(playerid,18);
case 18:SetPlayerSkin(playerid,19);
case 19:SetPlayerSkin(playerid,20);
case 20:SetPlayerSkin(playerid,21);
case 21:SetPlayerSkin(playerid,22);
case 22:SetPlayerSkin(playerid,23);
case 23:SetPlayerSkin(playerid,24);
case 24:SetPlayerSkin(playerid,25);
case 25:SetPlayerSkin(playerid,26);
case 26:SetPlayerSkin(playerid,27);
case 27:SetPlayerSkin(playerid,28);
case 28:SetPlayerSkin(playerid,29);
case 29:SetPlayerSkin(playerid,30);
}
}*/
}
case KEY_LEFT:
{
static x;
if(x == sizeof(SKINS_ZIVI)) x=1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
/*if(getPlayerTeam(playerid) == TEAM_ZIVI)
{
switch(GetPlayerSkin(playerid))
{
case 30:SetPlayerSkin(playerid,29);
case 29:SetPlayerSkin(playerid,28);
case 28:SetPlayerSkin(playerid,27);
case 27:SetPlayerSkin(playerid,26);
case 26:SetPlayerSkin(playerid,25);
case 25:SetPlayerSkin(playerid,24);
case 24:SetPlayerSkin(playerid,23);
case 23:SetPlayerSkin(playerid,22);
case 22:SetPlayerSkin(playerid,21);
case 21:SetPlayerSkin(playerid,20);
case 20:SetPlayerSkin(playerid,19);
case 19:SetPlayerSkin(playerid,18);
case 18:SetPlayerSkin(playerid,17);
case 17:SetPlayerSkin(playerid,16);
case 16:SetPlayerSkin(playerid,15);
case 15:SetPlayerSkin(playerid,14);
case 14:SetPlayerSkin(playerid,8);
case 8:SetPlayerSkin(playerid,7);
case 7:SetPlayerSkin(playerid,6);
case 6:SetPlayerSkin(playerid,5);
case 5:SetPlayerSkin(playerid,4);
case 4:SetPlayerSkin(playerid,3);
case 3:SetPlayerSkin(playerid,2);
case 2:SetPlayerSkin(playerid,1);
}
}*/
}
}
}
Glaube ein Timer wäre dafür angebracht ..
mfg
Wozu denn einen Timer?
Unter OnPlayerUpdate wird doch nur abgefragt, ob er diese Taste drückt, wenn ja -> wird das ausgeführt, wenn nein -> wird das beendet.
Das ganze kannst du mit gutem Gewissen einbauen
Aber wenn ich das ganze zurücklaufen lassen will?
Dann musst du es so schreiben:
static x = sizeof(SKINS_ZIVI)-1;
if(x == -1) x=sizeof(SKINS_ZIVI)-1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
mfg.
Dann musst du es so schreiben:
static x = sizeof(SKINS_ZIVI)-1;
if(x == -1) x=sizeof(SKINS_ZIVI)-1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
mfg.
Funktioniert nicht ganz...
Und @lcy. ..wenn ich die Rechte Pfeiltaste verwende..dann switcht er bei OnPlayerUpdate 2x
mfg