Ja dann soltest du den Taschenrechner anschmeißen und eine eigene Rechnung aufstellen oder du schaust nach Includes , welche dies beinhalten wie zum beispiel diese
Beiträge von IPrototypeI
-
-
Naja aber dann würde es doch reichen wenn man nur bei den 3 den Namen manuell ausgibt. Also iwie so
stock GetWeaponNameByID(wID) {
new wName[32];
switch (wID) {
case 1 .. 17, 22 .. 43, 46: GetWeaponName(wID,wName,32);
case 0: format(wName,32,"Fist");
case 18: format(wName,32,"Molotov Cocktail");
case 44: format(wName,32,"Night Vis Goggles");
case 45: format(wName,32,"Thermal Goggles");
default: format(wName,32,"Invalid Weapon Id");
}
return wName;
}maddin warum nur format ? Für was gibt es die möglichkeit strcatzu nutzen oder das ganze in dem Fall direkt gleich zu setzen.
case 0: wName="Fist";
case 18: wName="Molotov Cocktail";
case 44: wName="Night Vis Goggles";
case 45: wName="Thermal Goggles";
default: wName="Invalid Weapon Id";Wäre es so nicht viel einfacher?
new WaffenName[][] =
{
"Faust","Schlagring","Golfschläger","Schlagstock","Messer","Baseballschläger","Schaufel","Billiard Schläger","Katana","Kettensäge",
"Dildo","Vibrator","Vibrator","Dildo","Blumen","Stock","Granate","Tränengas","Molotow Coctail","-","-","-",
"9mm Pistole","SDPistole","Deagle","Shotgun","Sawn-Off Shotgun","Combat Shotgun","Micro Uzi","MP5","AK47","M4","Tec9",
"Rifle","Sniper","RPG","Raketenwerfer","Flammenwerfer","Minigun","Rucksackbomben","Detonator","Sprühdose","Feuerlöscher",
"Kamera","Nachtsichtgerät","Infrarotsichtgerät","Fallschirm"
};Das ganze hat optimierungspotenzial mit gepackten strings und stock const was zusätzlich den memory verbrauch reduziert bei der Benutzung.
stock const WeaponNames[44][20 char] = {
!"Unarmed",!"Brass Knuckles",!"Golf Club",!"Night Stick",!"Knife",!"Baseball Bat",!"Shovel",!"Katana",
!"Chainsaw",!"Purple Dildo",!"White Dildo",!"Long White Dildo",!"White Dildo 2",!"Flowers",!"Cane",
!"Grenades",!"Tear Gas",!"Molotovs",!"Pistol",!"Silenced Pistol",!"Desert Eagle",!"Shotgun",!"Sawn Off Shotgun",
!"Combat Shotgun",!"Micro Uzi",!"Mac 10",!"MP5",!"AK47",!"M4",!"Tec9",!"Rifle",!"Sniper Rifle",!"RPG",!"Missile Launcher",
!"Flame Thrower",!"Minigun",!"Sachel Charges",!"Detonator",!"Spray Paint",!"Fire Extinguisher",!"Camera",
!"Nightvision Goggles",!"Thermal Goggles",!"Parachute"
}; -
Oke also nicht wichtig danke^^
Du kannst das mit einem zusätzlichen kompileparameter hinzufügen
Dazu erstellst du in deinem Pawno ordner eine .cfg datei mit dem Namen pawn.cfg und schreibst in diese -d3 oder -d2 rein damit wird dein skript mit mehr informationen kompilt
Diese Nachricht wie du sie gepostet hast erscheint dann wenn dein dynamischer Memory zu hoch ist
so bekommt den warning weg wenn man dies via #pragma dynamic anpasst -
Naja ich weiß Grad nicht wie ich das scripten soll? Hab ins enum pSerial ist ja ein String wie frag ich ab ob beim cdonnerten der serial der gleiche also ser gebannte ist?
Wie wäre es wenn du die Hashes in einem file doer datenbank speicherst, wenn du diesen bannst. Dann solltest du den Hash des Users , welcher auf den Server Connectet auslesen und danach mit den anderen
in dem File oder der Datenbank vergleichen. -
Nein es ist kein interior.
das ist drausen.Also sind die Arenen gemappte und du fliegst durch diese dann solltest du den spieler kurz freezen und danach unfreezen.
TogglePlayerControllable(playerid, toggle); -
Sind diese Arenen Interiors ?
Wenn ja solltest du davor auch den Spieler in das jeweilige Interior setzen via SetPlayerInterior(playerid,id); -
Also ich weiß ja nicht was du machen willst , jedoch so klappt das nicht wie du willst.
Ich hab dir mal eine Funktion geschrieben damit kannst du das ganze abgleichen
CheckPass(cstring[],wstring[])return ((strlen(cstring) < 50 && cstring[0])?((!strcmp(cstring,wstring,true)?(1):(2))):(0));
Verwendung
switch(CheckPass(inputtext,Safe[AnSafe(playerid)][Loesung])){
case 0:ShowPlayerDialog(playerid,DIALOG_SAFE,DIALOG_STYLE_INPUT,"Safe Lösungswort","Bitte gebe nun das von dir geschätze Lösungswort ein:","Bestätigen","Abbrechen");
case 1:SendClientMessage(playerid,HELLBLAU,"Du hast das Wort herrausgefunden");
case 2:SendClientMessage(playerid,WRONGCMD,"Das Wort war leider falsch. Viel Glück beim nächsten mal.");
} -
Das liegt an deinem MySQL Plugin , welches nicht geladen wurde.
Ich denk mal das liegt an deinem OS , welches für den vServer , Root genutzt wird.
Daher ist es das beste du setzt dich mal mit maddint0r in Kontakt.//edit es gibt in dem Ordner ja zwei linux plugins kannst ja beide mal testen mysql.so und mysql_static.so
-
Wenn er das jetzt so macht bekommt er später Probleme aufgrund des fehlenden Null 'Zeichens'Also ein Größer
new nummerschild[2][3];sscanf kann so bleiben
sscanf würde ich nicht so lassen wenn der spieler das ganze so eingibt sollte man auch nach dem Zeichen "-" splitten und nicht nach dem leerzeichen
enum kenzeichen {
Block1[3],
Block2[3],
Block3,
}new Kennzeichen[kenzeichen];
sscanf(inputtext,"p<->e<s[3]s[3]i>",Kennzeichen) -
@IPrototypeI:
Danke sehr.
Ich habe die sachen die ich so ändern konnte geändert.
#define PlayerName(%0) PlayerInfo[%0][pName];
Das geht irgendwie nicht. Wenn ich dann PlayerName(playerid) mache bekomme ich fehler
Das mit den Dialogen und dem strcat habe ich nun umgesetzt@Azure Jr.:
Ist das Script den so in ordnung?
o. habt ihr noch andere Verbesserungs vorschläge?Ich weiß ja nicht ob du dich mit defines auskennst mit Directives. Defines sind dazu da dir alles etwas leichter zu machen. Da du diese erstellen kannst und das was sich dahinter verbirgt
nicht extra immer und immer wieder schreiben musst. Beim Kompilen existieren defines nicht mehr da diese ersetzt werden mit den code elementen was sich dahinter verbirgt.Daher ist das ganze auch logisch
return PlayerName(playerid);
würde so kompilt werdenreturn PlayerInfo[playerid][pName];;
resultat => Error daher einfach das Semicolon entfernen beim Define
-
@Artics:
Ist echt gut das du Lesen kannst
Desweiteren nicht 1zu1
Also ich errinnere mich das im pRP Script steht
Creater u. bei mir Ersteller
Also bitte 2zu1
Danke sehrZum Thema Skripten will ich dir mal paar Tipps geben.
Bitte wenn du ein string zusammenfügen willst ohne Platzhalter benutzt dazu nicht format , dazu gibt es strcat oder memcpy. Zu dem wenn der string in einer Anweisung deklariert ist
wie bei deinem einen Befehl.ocmd:zeigescheine(playerid,params[])
format(string,sizeof(string),"Führerschein: Nicht Bestanden");entweder
strcat(string,"Führerschein: Nicht Bestanden");
und davor
strdel(string,sizeof(string));oder
string="Führerschein: Nicht Bestanden";
Als weiteres benutz doch Bit-Arrays, wenn du nur 1 wert specihern musst
Das kannst du selbst machen oder eine include verwenden wie r-bits oder y_iterator.also weiteren Punkt du benutzt ja schon in deinem enum pName warum dazu noch eine extra Funktion um den Namen zurückzugeben
einfach bei OnPlayerConnect
GetPlayerName(playerid,PlayerInfo[playerid][pName],MAX_PLAYER_NAME+1);und oben das define
#define PlayerName(%0) PlayerInfo[%0][pName];Zu Thema Dialog
benutz doch auch ein enum dazu das nimmt dir viel Arbeit abenum {
Dialog_Reg,
DIALOG_GESCHLECHT,
}Dialog_Reg hat nun den wert 0 und DIALOG_GESCHLECHT 1 du kannst auch direkt bei 1 einsteigen
enum {
Dialog_Reg=1,
DIALOG_GESCHLECHT,
}Ahja so nebenbei
"#HTML_WHITE"
ist nicht nötig da reicht "HTML_WHITE" man verwendet # nur dann wenn man " " nicht verwenden kann und andersrum ist eine kleine ZeitersparnisPlayerInfo[playerid][LastLogin]
dazu muss man nicht umbedingt einen das ganze auslesne und als string formatieren dazu gibt es den SQL befehl NOW() und zum auslesen auch DATE_FORMATxD zur anschuldigung wegen der PRP skript muss ich sagen sind ja Absurd
Beispiel das Mutesystem
forward @MYSQL_QUERY_FINISH_MUTED_CHECK(playerid,UnMuteName[]);
@MYSQL_QUERY_FINISH_MUTED_CHECK(playerid,UnMuteName[])
{
new bool:muted = !!cache_get_field_content_int(0,"Muted");Ich glaube nicht das du sowas dort findest da erstens der Ersteller vom Prp bestimmt nichtmal weiß wozu das gut ist und zweitens ist das von mir was ich für ihn geschrieben habe bei seinem Problem Thread zum dem Thema hier im Forum.
Zu den Farben das soll ja wohl ein witz sein seit wann sind Farbcodes Copyright bei jemanden, genau bei den anderen Funktionen diese anderszuschreiben macht doch auch kein Sinn.(isPlayerInFrakt, PlayerTalkPublic nun gut dort hätte man ja wenigstens ein Array nutzen können).
-
Vielen Dank für das feedback
MFG
PAWN
Zum Thema i , i steht für Integer nicht id.
An deiner Stelle würde ich das einfach über eine Array laufen lassen und nicht über 2 Arrays und diverse unnötige Schleifen.
Zuzüglich möchte ich dich mal aufklären auf die verwendung von break in schleifen diese kannst du nutzen um die Schleife abzubrechen da es nicht umbedingt nötig ist
bei deinem call-befehl die schleife obwohl ein treffer erzielt werden konnte fortzuführen. Als weiterer Punkt ist es wenn du schon eine konstante Länge hast bei einem string so diese bei format auch zu nutzen da Konstante Werte immer schneller verarbeitet werden als dies erstmal auszulesen. Du hast ein kleinen Fehle runten bei OnPlayerText dies ist ein string also text kein integer.Ich denk mal mit dem ersten Punkt wirst du nix anfangen können daher habe ich dir das mal umgeschrieben
new Anrufer[MAX_PLAYERS] ={ -1,...};
command(h, playerid, params[])
{
if(sStats[playerid][pHandy] <= 0)return SendClientMessage(playerid,Rot,"Du hast kein Handy");
if(Anrufer[playerid] == -1)return SendClientMessage(playerid,Rot,"Du wurdest nicht angerufen!");
new str[128];
format(str,128,"%s hat aufgelegt!",GetName(playerid));
SendClientMessage((Anrufer[playerid]-1),Rot,str);
format(str,128,"Du hast das Telefonat mit %s beendet!",GetName((Anrufer[playerid]-1)));
SendClientMessage(playerid,Gelb,str);
printf("Hier %d",Anrufer[playerid]);
Anrufer[(Anrufer[playerid]-1)] = -1;
Anrufer[playerid] = -1;
return 1;
}
command(call, playerid, params[])
{
if(sStats[playerid][pHandy] <= 0)return SendClientMessage(playerid,Rot,"Du hast kein Handy!");
if(Anrufer[playerid] != -1)return SendClientMessage(playerid,Rot,"Du telefonierst schon!");
extract params -> new nummer;else return SendClientMessage(playerid,Weiß,"Befehl : /call [nummer]");
if(nummer == sStats[playerid][sNummer])return SendClientMessage(playerid,Rot,"Du kannst dich nicht selber anrufen!");
for(new i; i<MAX_PLAYERS; ++i){
if(sStats[i][sNummer] != nummer)continue;
if(Anrufer[i] != -1)return SendClientMessage(playerid,Rot,"Dieser Spieler telefoniert schon!");
Anrufer[i] = playerid;
Anrufer[playerid] = i;
new str[128];
format(str,128,"%s ruft dich an, /p zum annehmen /h zum auflegen!",GetName(playerid));
SendClientMessage(i,Gelb,str);
format(str,128,"Du rufst %s an warte auf eine Antwort!",GetName(i));
SendClientMessage(playerid,Gelb,str);
break;
}
return 1;
}
command(p, playerid, params[])
{
if(sStats[playerid][pHandy] <= 0)return SendClientMessage(playerid,Rot,"Du hast kein Handy!");
if(Anrufer[playerid] == -1)return SendClientMessage(playerid,Rot,"Du wurdest nicht angerufen!");
new str[128];
format(str,128,"%s hat den Hörer abgenommen!",GetName(playerid));
SendClientMessage(Anrufer[playerid],Gelb,str);
SendClientMessage(playerid,Weiß,"Angenommen!");
Anrufer[Anrufer[playerid]] = playerid+1;
Anrufer[playerid] = Anrufer[playerid]+1;
return 1;
}
public OnPlayerText(playerid,text[])
{
if(Anrufer[(Anrufer[playerid]-1)] == (playerid+1))
{
new str[128];
format(str,128,"(Handy) %s : %s",GetName(playerid),text);
SendClientMessage((Anrufer[playerid]-1),-1,str);
return 0;
}
return 1;
} -
Das ganze geht nur via Time wo du die Fahrzeuge hinterher portest
Der hier schon geposteste link ist da schon das richtige von DevdogVideos
-
Es kommt drauf an ob du ein cmd prozessor benutzt oder den Befehl unter OnPlayerCommandText hast .
Beim einen kannst die funktion direkt aufrufen oder via CallLocalFunction bei OnPlayerCommandText ist dies nicht anders entweder auch wieder über CallLocalFunction
oder das ganze normal aufrufen für den Spieler OnPlayerCommandText(playerid, "/gate"); . -
So ich wollte dir schon gestern schreiben bin jedoch dann offline gegangen hast du auch FCNPC_SetUpdateRate gesetzt
Hier mal ein ganz einfacher code
FCNPC_SetUpdateRate(30);
new npcid = FCNPC_Create("Test");
FCNPC_Spawn(npcid, 0, 815.26093, -1090.85486, 29.08000);
FCNPC_GoTo(npcid, 0.0, 0.0, 0.0, MOVE_TYPE_RUN, 0.0, 1);damit sollte ein bot mit diesem namen connecten ohne probleme und zum 0 Punkt laufen ich hoffe du hast die npc anzahl hochgeschraubt.
Ps:
Hier gibt es auch beispiel skripts zum downloaden
https://code.google.com/p/fcnpc/downloads/listdas bg filterskript und das citizen sind ganz witzig.
-
Also die Reiehnfolge ist die aus dem Enum
ja SpielerLaden wird erst abgerufen wenn er sich erfolgreich eingeloggt bzw registriert hat
aber die npcs überspringen das laden ja oder wegen dem isplayernpc so wie du es hastalso mysql ist mehr oder weniger neuland hatte schon probleme mit speichern xD
benutze ein MySQL plugin R5 das steht zumindest im log xD
MySQL plugin R5 successfully loaded.Solange ich das system nicht umschreiben muss spring ich auch auf andere xD
Man sollte sich eine basis schaffen bevor man weiter springt
Da Thread Querys und Caching was anderes ist und bevor man an sowas ran geht sollte man auch wissen was man macht um sein horizont zu erweitern und um mit neuem effizent umzugehen.
Ich weiß ja nicht ob du schonmal was von einem hermeneutischen zirkel gehört hast.
Aber ich sags mal so wenn du richtig einsteigen willst wird das noch erbärmlicher als das was du momentan schon postest.Ich zitiere
Zitaterror 017: undefined symbol "query"
mysql_query(query);Ich hatte davor noch was anderes dort stehen und hab das nicht entfernt und es sollte logisch auf der Hand liegen das dort der string mit dem SQL Befehl rein muss
mysql_query(string); -
stock SpielerLaden(playerid)
{
if(IsPlayerNPC(playerid))return 1;
new string[800],esString[MAX_PLAYER_NAME];
GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
mysql_real_escape_string(SpielerInfo[playerid][pName],esString);
format(string,100,"SELECT * FROM `SpielerKonten` WHERE `Name`= '%s' LIMIT 0,1",esString);
mysql_query(query);
mysql_store_result();
mysql_fetch_row_format(string);
sscanf(string, "p<|>e<s[24]s[128]iiis[128]s[128]iiiiiiis[24]s[128]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffiiffiiiiii>", SpielerInfo[playerid]);
return mysql_free_result();
}mysql_format und den platzhalter %e kann man auch verwenden beim formatieren jedoch bnötigt man dazu noch den verbindungshandler und das jetzt zu suchen und da einzutragen wollte ich dir ersparen.
//edit
Ahja es macht kein SInn abzuprüfen ob der Spieler verbunden ist da wenn diese funktion aufgerufen wird der Spieler zu 100% auf dem Server sein wird.
Zum Thema splitten
Die Abfolge an Variabeln im Enum muss der, der Tabelle entsprechenZum Thema Plugin , solltest du dich ein wenig damit auskennen so empfehle ich dir dan umzusteigen entweder auf die r7 r33 oder dan schon höher Version von BlueG/ maddinat0r oder auf das MySQL & PostgreSQL Plugin von Dan.. , weil diese sind die zwei besten MySQL Plugins momentan
-
Zeig mal deinen Momentanen Code
und ja er ließt nur eine Reihe
-
Brauchen die auch Recordings? Weil ich würde halt gerne das mehrer NPC so knapp (40) Durch ganz LS/SF/LV fahren aber auch ausweichen.
Ja/Nein Du kannst records benutzen brauchst es nicht am besten ladst du dir das plugin runter und die beispiel skripts und testest dich einfach durch die Funktionen des Plugin. -
Es gibt genug Plugin die das selbe bewirken das momentan aktuellste wäre FCNPC ( Fully Controllable NPC)
siehe