Habs gelöst.. Hab einen Fehler im enum gehabt einen ganz dummen ^^... Trotzdem danke!
Beiträge von Simon2202
-
-
Hallo Community!
Ich habe irgendein, mir unerklärliches, Problem mit meinem Fraktions System.
Ich habe mit meiner ersten Fraktion (LSPD, FrakID: 1) begonnen und alles klappte super. Jetzt wollte ich die zweite Fraktion (Regierung,FrakID: 2) hinzufügen, aber es funktioniert kein Fraktionsbezogener Befehl mit der FrakID 2...
Als Beispiel 2 meiner Befehle:
1. /makeleader:
Code
Alles anzeigenocmd:makeleader(playerid,params[]) { new pID,frakid,str[128]; if(PI[playerid][pAdmin] < 3)return SCM(playerid,frot,"[FEHLER]: Du hast nicht den nötigen Admin Rang"); if(sscanf(params,"dd",pID,frakid))return SCM(playerid,frot,"[FEHLER]: /makeleader [PlayerID] [FrakID]"); PI[pID][pFrak] = frakid; PI[pID][pLeader] = frakid; PI[pID][pSpawn] = 1; PI[pID][pRang] = 4; SCM(playerid,agelb,"[ADMIN]: Du hast den Spieler %s zum Leader der Fraktion %s (ID:%d) gemacht!",GPlayerName(pID),GetFrakName(frakid),frakid); SCM(pID,agelb,"[ADMIN]: Der Admin %s hat dich zum Leader der Fraktion %s gemacht!",GPlayerName(playerid),GetFrakName(frakid)); format(str,sizeof(str),"[ADMN]: Der Admin %s hat den Spieler %s zum Leader der Fraktion %s (ID:%d) gemacht!",GPlayerName(playerid),GPlayerName(pID),GetFrakName(frakid),frakid); SendAdminNote(2,str); return 1; }
Wenn ich hier /makeleader 0 2 eingebe kommt die Meldung, dass der Befehl nicht existiert, mit der FrakID 1 Funktioniert alles.2. /showfkasse:
Code
Alles anzeigenocmd:showfkasse(playerid,params[]) { new frakid; if(PI[playerid][pAdmin] < 3 && PI[playerid][pFrak] < 1)return SCM(playerid,frot,"[FEHLER]: Du darfst diesen Befehl nicht ausführen!"); if(PI[playerid][pAdmin] > 3) { if(sscanf(params,"d",frakid))return SCM(playerid,frot,"[FEHLER]: /showfkasse [FrakID]"); printf("FrakNameEnum: %s",FI[frakid][f_name]); printf("FrakNameFunk: %s",GetFrakName(frakid)); SCM(playerid,iblau,"[INFO]: Fraktion: %s(ID:%d) Kasse: %d",GetFrakName(frakid),frakid,FI[frakid][f_kasse]); return 1; } SCM(playerid,iblau,"[INFO]: In deiner Fraktions Kasse befinden sich derzeit: $%d",FI[PI[playerid][pFrak]][f_kasse]); return 1; }
Auch hier, mit /showfkasse 1 funktioniert alles perfekt, bei /showfkasse 2 wieder die Meldung, dass der Befehl nicht existiert....
-
Habe dir kurz mal markiert was hier wichtig wäre:
Code
Alles anzeigenif(strcmp(cmdtext,"/nschild",true)==0) { if(isPlayerAnAdmin(playerid,3)) { if(IsPlayerInAnyVehicle(playerid)) { new vehicleid; vehicleid = GetPlayerVehicleID(playerid); SetVehicleNumberPlate(vehicleid,"Test 1"); SetVehicleToRespawn(vehicleid); PutPlayerInVehicle(playerid,vehicleid,0); return 1; //Wichtig!! } SendClientMessage(playerid,BLAU,"Du bist kein Administrator!"); return 1; } }
Du musst (fast) jedes mal, wenn der Code den du ausführen willst fertig ist, ein "return" einfügen. Meistens ist das ein "return 1;" in seltenen Fällen, vor allem selbst geschriebenen publics/stocks kann es auch ein "return 0;" sein.
Ist das return nicht da, dann wird der Code der darunter steht auch einfach ausgeführt, weil du keinen Wert zurückgibst.
Ja, du kannst auch einfach ein "else" einbauen, ich selbst finde es aber so schöner und es spart in Summe bei mehreren 10.000 - 100.000 Zeilen Code auch Schreibarbeit und Zeilen:)
Wenn du noch fragen hast kannst du mir auch ne PN schreiben, mfg
-
Trotzdem mein Rat: Lerne es gleich mit Mysql. Mysql ist einfach besser zum Scripten, vor allem später für dynamische Systeme und wenn du mal ein Control Panel erstellen wirst sowieso.
Ja, Mysql ist schwerer, glaub mir ich scripte jetzt schon länger damit und habe manchmal noch immer Fehler beim Mysql Code
aber es zahlt sich aus, für den Vorteil den Man dadurch hat. (Mysql Tutorials findest du außerdem genug, ein Beispiel wäre Mr.Monat von dem ich einiges gelernt habe am Anfang)
-
Okey. ich glaube mal du hast den Code nicht selber geschrieben?
Kurze Erklärung:
Der Erste Teil ist bei OnGameModeInit das Objekt zu erstellen, z.B:
Codetor[0] = CreateObject(971, 1588.92334, -1638.00989, 12.97296, 0.00000, 0.00000, 0.00000); //Tor LSPD tor[1] = CreateObject(968, 1544.67944, -1630.88037, 13.14428, 0.0, -269.69992, 89.67996);//Schranke LSPD
Für Jedes Tor, beziehungsweise jedes Objekt, welches du später steuern willst, musst du eine Variable vergeben, ich mache das ganze mit einem Array, du kannst aber auch einzelne Variablen nehmen.Dann haben wir den Befehl um die Schranken zu öffnen, ich nehme hier wieder das Beispiel aus meinem Code:
Code
Alles anzeigenocmd:ftor(playerid,params[]) { if(IsPlayerInRangeOfPoint(playerid,20,1588.92334, -1638.00989, 12.80731))//LSPD GaragenTor { if(PI[playerid][pFrak] != 1 && PI[playerid][pAdmin] < 3)return SCM(playerid,frot,"[FEHLER]: Du darfst dieses Tor nicht öffnen!"); if(torstat[0] == 1) { MoveObject(tor[0],1588.92334, -1638.00989, 8.0,5,0,0,0); torstat[0] = 0; SCM(playerid,iblau,"[INFO]: Tor geöffnet"); return 1; } MoveObject(tor[0],1588.92334, -1638.00989, 12.80731,5,0,0,0); torstat[0] = 1; SCM(playerid,iblau,"[INFO]: Tor geschlossen"); return 1; } else if(IsPlayerInRangeOfPoint(playerid,20,1544.67944, -1630.88037, 13.14428)) { if(PI[playerid][pFrak] != 1 && PI[playerid][pAdmin] < 3)return SCM(playerid,frot,"[FEHLER]: Du darfst dieses Tor nicht öffnen!"); if(torstat[1] == 0)return SCM(playerid,frot,"[FEHLER]: Schranke ist derzeit in Bewegung!"); MoveObject(tor[1],1544.67944, -1630.88037, 13.14429,schrankespeed, 0.0, 25, 89.67996); SCM(playerid,iblau,"[INFO]: Schranke geöffnet, Wird in 2 Sekunden geschlossen"); SetTimerEx("SchrankeClose",2000,0,"dffffff",1,1544.67944, -1630.88037, 13.14427,0.0, -269.69992, 89.67996); torstat[1] = 0; return 1; } return 1; }
Du kannst das natürlich nicht 1 zu 1 kopieren, es soll dir nur veranschaulichen wie es funktioniert.
So, du brauchst jetzt aber auch noch die Koordinaten des Objektes wo es sein soll, wenn es offen/verschoben ist, entweder du besorgst dir diese direkt beim Mappen aus dem Editor, oder wenn du es nach unten verschiebst reicht es auch die z Koordinate (die 3.) kleiner zu machen, als dort wo das Objekt ursprünglich erzeugt wird.
Hoffe es ist einigermaßen verständlich.
(Btw: Zeig uns bitte noch dein public close)
-
Ja, aber die beiden Tore sind ja nich die gleichen, du kannst nicht für 2 Objekte 1 Variable nehmen.
Beispiel von mir: -
Kommt die ClientMessage unten, dass du nicht in der Nähe eines Tores bist, oder passiert einfach garnichts?
Wenn zweiteres:
Überprüfe ob es die richtigen Koordinaten sind auf die das Tor gesetzt werden soll.
-
Code
Alles anzeigenocmd:auf(playerid,params[]) { if(SpielerInfo[playerid][Fraktion]==1) if(IsPlayerInRangeOfPoint(playerid,10.0,246.3300,71.9613,1003.6406)) { MoveObject(auf,246.58043, 72.39567, 1008.55176, 5); SetTimer("close", 5000,0); return 1; } else if(IsPlayerInRangeOfPoint(playerid,10.0, 1547.5786,-1627.8486,13.3828)) { if(SpielerInfo[playerid][Fraktion]==1) MoveObject(auf,1588.11206, -1638.19910, 14.91731, 5); SetTimer("close", 5000,0); return 1; } else { SendClientMessage(playerid,RR,"Du bist nicht in der Nähe des Tores!"); } return 1; }
Ist nicht richtig eingerückt wegen dem komischen Editor von WBB4, aber du musst das "else" immer ans ende setzen^^
-
Mach das ganze so:
Codeif(strlen(inputtext) < 4) { StopAudioStreamForPlayer(playerid); } else { ShowPlayerDialog(playerid, DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,"Register:","Dein Passwort muss mindestens 4 Zeichen lang sein!:","Register","Abbrechen"); Register(playerid,inputtext); }
Das ganze kommt jetzt zu dem Dialog wo er das Passwort das erste mal eingibt, ich schätze das ist bei dir DIALOG_REGISTER@#TroyStoy Deine Variante würde aus 2 Gründen nicht sinnvoll funktionieren:
1. Wollte er, dass das Passwort mindestens 4 Stellen haben muss, ist mit > 0 nicht erfüllt.
2. Würde der Spieler einfach nicht registriert werden, er würde nichteinmal eine Meldung angezeigt bekommen, geschweige denn es neu versuchen können.
-
Dort wo der User das ganze eingibt (Ich schätze mal in einem Dialog?) musst du abfragen wie lange das ganze ist (https://wiki.sa-mp.com/wiki/Strlen)
-
Leg die Zeile TeleportID mal neu an und dann kommt vor A_I das Auswahlfeld "Index" bei dem du "Primary" Auswählen musst
-
Du brauchst dazu ein paar Dinge.
1. Deinen Admin(?) Befehl mit dem du das Event starten willst, nennen wir ihn mal /startevent
2. Den Befehl /bereit
(ich schreibe sie dir jetzt absichtlich nicht, da du vielleicht selber drauf kommst und ich in ocmd schreibe und nicht weiß wie du das machst.)
Dann brauchst du ein paar Globale/Spieler Variablen
In deinem Admin Befehl setzt du dann "eventexists" auf 1 -> Das Event existiert
Im Befehl /bereit musst du abfragen ob "eventexists" auf 1 steht, ansonsten soll man ihn nicht ausführen können.
Und dort setzt du dann playerready[playerid] auf 1.Dann kannst du ihn entweder direkt zu dem Event teleportieren (SetPlayerPos) oder du machst das mit einem 3. Befehl "/startevent" bei dem du mit einer Schleife abfragst welche Spieler denn /bereit eingegeben haben (bei wem playerready[playerid] auf 1 steht):
Codefor(new i=0;i<MAX_PLAYERS;i++) { if(IsPlayerConnected(i))continue; if(playerready[i] == 0)continue; playerready[i] = 0; //Spieler zum Event teleportieren }
Dann kannst du noch sobald 2 Spieler dort sind (Globale Variable wieder) einen Timer für 2 Minuten starten. Wenn das Event beginnt, oder keine Spieler mehr teilnehmen dürfen musst du "eventexists" natürlich wieder auf 0 setzen.
Das ist es mal sehr grob, hoffe ich hab in der Schnelle keinen Fehler drinnen in der Erklärung
-
Hallo, ich habe diesen /givewanteds Befehl geschrieben:
Code
Alles anzeigenocmd:givewanteds(playerid,params[]) { new pID,wanteds,grund[35],str[128],ergebnis; if(PI[playerid][pFrak] != 1 || PI[playerid][pRang] < 2)return SCM(playerid,frot,"[FEHLER]: Du bist darfst diesen Befehl nicht ausführen!"); if(sscanf(params,"dds[35]",pID,wanteds,grund))return SCM(playerid,frot,"[FEHLER]: /givewanteds [SpielerID] [Wanteds] [Grund]"); if(PI[playerid][pRang] < 4 && IsPlayerOfficial(pID))return SCM(playerid,frot,"[FEHLER]: Du darfst einem Staatsbeamten keine Wanteds geben!"); if(aduty[pID] == 1)return SCM(playerid,frot,"[FEHLER]: Du darfst einem Admin OnDuty keine Wanteds geben!"); if(IsPlayerInAnyVehicle(playerid)) { if(IsCopCar(GetPlayerVehicleID(playerid))) { if(wanteds > 60 || wanteds < 1)return SCM(playerid,frot,"[FEHLER]: Du musst zwischen 1 und 60 Wanteds vergeben"); ergebnis = PI[pID][pWanteds] + wanteds; } else { if(wanteds > 5 || wanteds < 1)return SCM(playerid,frot,"[FEHLER]: Außerhalb eines Cop Cars musst du zwischen 1 und 5 Wanteds vergeben!"); ergebnis = PI[pID][pWanteds] += wanteds; } } else { if(wanteds > 5 || wanteds < 1)return SCM(playerid,frot,"[FEHLER]: Außerhalb eines Cop Cars musst du zwischen 1 und 5 Wanteds vergeben!"); ergebnis = PI[pID][pWanteds] += wanteds; } if(ergebnis >= 60) { PI[pID][pWanteds] = 60; format(str,sizeof(str),"[WANTEDS]: Der Beamte %s hat die Wanteds des Spielers %s auf 60 hochgestuft! ALARMSTUFE!",GPlayerName(playerid),GPlayerName(pID)); SendOfficialMessage(str); SCM(playerid,iblau,"[INFO]: Du hast die Wanteds des Spielers %s auf 60 hochgesetzt!",GPlayerName(pID)); SCM(playerid,wrot,"[WARNUNG]: Der Beamte %s hat deine Wanteds auf 60 hochgesetzt! Grund: %s",GPlayerName(playerid),grund); return 1; } PI[pID][pWanteds] += wanteds; format(str,sizeof(str),"[WANTEDS]: Der Beamte %s hat dem Spieler %s %d Wanteds gegeben! Wanteds: %d Grund: %s",GPlayerName(playerid),GPlayerName(pID),wanteds,PI[pID][pWanteds],grund); SendOfficialMessage(str); SCM(playerid,iblau,"[INFO]: Du hast dem Spieler %s %d Wanteds gegeben! Wanteds: %d Grund: %s",GPlayerName(pID),wanteds,PI[pID][pWanteds],grund); SCM(pID,wrot,"[WARNUNG]: Du hast von dem Beamten %s %d Wanteds bekommen! Wanteds : %d Grund: %s",GPlayerName(playerid),wanteds,PI[pID][pWanteds],grund); return 1; }
Mein Problem:Wenn ich /givewanteds 0 60 Test
Eingeben, dann wird mir das hier ausgegeben:
Code
Alles anzeigen[21:09:28] [WANTEDS]: Der Beamte [MVS]Simon hat die Wanteds des Spielers [MVS]Simon auf 60 hochgestuft! ALARMSTUFE! [21:09:28] [INFO]: Du hast die Wanteds des Spielers [MVS]Simon auf 60 hochgesetzt! [21:09:28] [WARNUNG]: Der Beamte [MVS]Simon hat deine Wanteds auf 60 hochgesetzt! Grund: Test [21:09:28] [WANTEDS]: Der Beamte [MVS]Simon hat dem Spieler [MVS]Simon 60 Wanteds gegeben! Grund: Test [21:09:28] [INFO]: Du hast dem Spieler [MVS]Simon 60 Wanteds gegeben! Grund: Test [21:09:28] [WARNUNG]: Du hast von dem Beamten [MVS]Simon 60 Wanteds bekommen! Grund: Test
Außerdem kann ich 60 Wanteds außerhalb eines Cop Cars vergeben, was ja nicht sein sollte... Habe sicher nur einen dummen Denkfehler:/
-
Funktioniert, danke!
-
-
Code
Alles anzeigenenum frakInfo { f_id, f_name[50], f_kasse, Float:f_x, Float:f_y, Float:f_z, Float:f_r, gehalt1, gehalt2, gehalt3, gehalt4, gehalt5, rname1[20], rname2[20], rname3[20], rname4[20], rname5[20], skin1, skin2, skin3, skin4, skin5, frakmsg[200], cc_1, cc_2, } new FI[MAX_PLAYER_CARS][frakInfo];
-
Hallo Community!
Ich habe meinen /fchat Befehl so geschrieben:
Code
Alles anzeigenocmd:fchat(playerid,params[]) { if(PI[playerid][pFrak] >= 1) { new msg[150],str[200],rangname[20],frakid = PI[playerid][pFrak]; if(sscanf(params,"s[150]",msg))return SCM(playerid,frot,"[FEHLER]: /fchat [MSG]"); if(PI[playerid][pRang] == 1){rangname = FI[frakid][rname1];} else if(PI[playerid][pRang] == 2){rangname = FI[frakid][rname2];} else if(PI[playerid][pRang] == 3){rangname = FI[frakid][rname3];} else if(PI[playerid][pRang] == 4){rangname = FI[frakid][rname4];} else if(PI[playerid][pRang] == 5){rangname = FI[frakid][rname5];} if(PI[playerid][pLeader] > 0){format(str,sizeof(str),"(([L]%s %s: %s))",rangname,GPlayerName(playerid),msg);} else{format(str,sizeof(str),"((%s %s: %s))",rangname,GPlayerName(playerid),msg);} SendFrakMessage(PI[playerid][pFrak],str); return 1; } SCM(playerid,frot,"[FEHLER]: Du befindest dich in keiner Fraktion!"); return 1; }
Nun kommt ingame aber das hier heraus:
Ich lasse die Rangnamen per Mysql Speichern und Laden, habe in der Tabelle auch die Rangnamen Testweise erstellt, der "rname5" wäre in der Datenbank: RName5Wenn ich nur die Daten aus der Datenbank nehme kommt das hier bei /fchat:
Durch meinen Befehl mit dem ich die Rangnamen ändern kann, kam dann das obere Beispiel zustande.Mein Befehl /changername:
Code
Alles anzeigenocmd:changername(playerid,params[]) { if(PI[playerid][pLeader] >= 1 || PI[playerid][pAdmin] >= 3) { new str[128]; if(PI[playerid][pAdmin] >= 3) { new rang,name[25],fraktion; if(sscanf(params,"dds[25]",fraktion,rang,name))return SCM(playerid,frot,"[FEHLER]: /changername [fraktion] [Rang] [Name]"); if(rang > 5 || rang < 1)return SCM(playerid,frot,"[FEHLER]: Der Rang muss zwischen 1 und 5 liegen!"); if(strlen(name) > 20)return SCM(playerid,frot,"[FEHLER]: Der Name darf maximal 20 Zeichen lang sein!"); if(rang == 1)format(FI[fraktion][rname1],25,name); else if(rang == 2)format(FI[fraktion][rname2],25,name); else if(rang == 3)format(FI[fraktion][rname3],25,name); else if(rang == 4)format(FI[fraktion][rname4],25,name); else if(rang == 5)format(FI[fraktion][rname5],25,name); format(str,sizeof(str),"Der Admin %s hat den Namen des Ranges %d auf %s geändert!",GPlayerName(playerid),rang,name); SendFrakMessage(fraktion,str); } else { new rang,name[25],frakid = PI[playerid][pLeader]; if(sscanf(params,"ds[25]",rang,name))return SCM(playerid,frot,"[FEHLER]: /changername [Rang] [Name]"); if(rang > 5 || rang < 1)return SCM(playerid,frot,"[FEHLER]: Der Rang muss zwischen 1 und 5 liegen!"); if(strlen(name) > 20)return SCM(playerid,frot,"[FEHLER]: Der Name darf maximal 20 Zeichen lang sein!"); if(rang == 1)format(FI[frakid][rname1],25,name); else if(rang == 2)format(FI[frakid][rname2],25,name); else if(rang == 3)format(FI[frakid][rname3],25,name); else if(rang == 4)format(FI[frakid][rname4],25,name); else if(rang == 5)format(FI[frakid][rname5],25,name); format(str,sizeof(str),"Der Leader %s hat den Namen des Ranges %d auf %s geändert!",GPlayerName(playerid),rang,name); SendFrakMessage(frakid,str); } return 1; } SCM(playerid,frot,"[FEHLER]: Du hast nicht den nötigen Fraktions/Admin Rang"); return 1; }
Und mein Public in dem Ich die Fraktionen laden lasse:
Code
Alles anzeigenforward LoadFraksTimer(); public LoadFraksTimer() { for(new i=0;i<sizeof(FI);i++) { cache_get_field_content(i,"name",FI[i][f_name],db_handle,30); FI[i][f_id] = cache_get_field_content_int(i,"frakid",db_handle); FI[i][f_kasse] = cache_get_field_content_int(i,"kasse",db_handle); FI[i][f_x] = cache_get_field_content_float(i,"spawnx",db_handle); FI[i][f_y] = cache_get_field_content_float(i,"spawny",db_handle); FI[i][f_z] = cache_get_field_content_float(i,"spawnz",db_handle); FI[i][f_r] = cache_get_field_content_float(i,"spawnr",db_handle); FI[i][gehalt1] = cache_get_field_content_int(i,"gehalt1",db_handle); FI[i][gehalt2] = cache_get_field_content_int(i,"gehalt2",db_handle); FI[i][gehalt3] = cache_get_field_content_int(i,"gehalt3",db_handle); FI[i][gehalt4] = cache_get_field_content_int(i,"gehalt4",db_handle); FI[i][gehalt5] = cache_get_field_content_int(i,"gehalt5",db_handle); cache_get_field_content(i,"rname1",FI[i][rname1],db_handle,20); cache_get_field_content(i,"rname2",FI[i][rname2],db_handle,20); cache_get_field_content(i,"rname3",FI[i][rname3],db_handle,20); cache_get_field_content(i,"rname4",FI[i][rname4],db_handle,20); cache_get_field_content(i,"rname5",FI[i][rname5],db_handle,20); cache_get_field_content(i,"frakmsg",FI[i][frakmsg],db_handle,200); FI[i][skin1] = cache_get_field_content_int(i,"skin1",db_handle); FI[i][skin2] = cache_get_field_content_int(i,"skin2",db_handle); FI[i][skin3] = cache_get_field_content_int(i,"skin3",db_handle); FI[i][skin4] = cache_get_field_content_int(i,"skin4",db_handle); FI[i][skin5] = cache_get_field_content_int(i,"skin5",db_handle); FI[i][cc_1] = cache_get_field_content_int(i,"cc_1",db_handle); FI[i][cc_2] = cache_get_field_content_int(i,"cc_2",db_handle); } return 1; }
Ich weiß es ist sehr viel Code, das tut mir auch leid ich weiß nur nicht mehr weiter :/, danke!
-
Ich möchte für mein Fraktionsauto System, dass jede Fraktion nur 25 Autos haben darf.
Ich habe jetzt oben eine Globale Variable erstellt:
und mir eine schleife geschrieben die überprüfen soll welcher der 15 Slots frei ist:Codestock GetEmptyFrakCarSlot(fid) { for(new i=0;i<MAX_FRAK_CARS;i++) { if(!frakcars[fid][i])return i; } return 1; }
Ich bin mir nur nicht sicher ob das so funktioniert? Ich frage weil ich mein Script jetzt auf nichts aufbauen will, was nicht klappt.
Freue mich auch über Vorschläge wie ich es denn anders machen kann, wenn es so nicht geht.
-
//gelöst durch Jeffrey Tut, gute arbeit
-
Du musst, wenn du VARCHAR auswählst eine Länge angeben.
Eigene Frage:
Ich würde mein Fraktionsauto System gerne Dynamisch mit mysql schreiben. nur wie kann ich die Vehicle IDS dann den Fahrzeugen zuweisen? z.B Es wird ein neues gekauft, das wird dann einfach in die Tabelle eingefügt.
Sagen wir es gibt schon 3 Fahrzeuge mit den carid variablen lspd[0],lspd[1],lspd[2].
Wie stelle ich jetzt beim Kauf des 4 fest, dass es schon 3 Gibt?
Die eigentliche Frage:
Wie fragt man ab ob ein Array leer ist?