playerid => i und fertig
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
-
C
Alles anzeigenocmd:create(playerid, params[]) { new str[32]; if(sscanf(params, "s[32]", str))return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [ Pickup]"); if(strcmp(str, "Pickup", true) == 0) { new weaponid, ammo; if(sscanf(params,"{s[32]}ii",weaponid, ammo))return SendClientMessage(playerid, COLOR_GREY,"Benutze: /create pickup [WaffenID / ID] [Ammo / Wert]"); SendClientMessage(playerid,COLOR_GREY,"Klappt"); } return 1; }
Funktioniert nicht.
Was mache ich falsch?Mache es einfach so:
C
Alles anzeigen//Das Makro für isnull #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1])))) ocmd:create(playerid, params[]) { if(isnull(params)) return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [ Pickup]"); if(!strcmp(params,"Pickup",true)) { //Hier hat er Pickup eingegeben } return 1; }
Funktioniert nicht.
Ich will es halt so machen, dass ich /create eingebe, dann stehen mir auswahlmöglichkeiten zur verfügung (Haus, Pickup, etc.)
Wenn ich dann Pickup eingegeben hab, sollte eine neue Message kommen, für die entsprechenden Parameter -
C
Alles anzeigenocmd:create(playerid, params[]) { new str[32], tmp[16]; if(sscanf(params, "s[32]S(-)[16]", str, tmp))return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [Pickup]"); if(strcmp(str, "Pickup", true) == 0) { new weaponid, ammo; if(sscanf(params,"s[32]ii",str, weaponid, ammo))return SendClientMessage(playerid, COLOR_GREY,"Benutze: /create pickup [WaffenID / ID] [Ammo / Wert]"); SendClientMessage(playerid,COLOR_GREY,"Klappt"); } return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [Pickup]");; }
-
Danke an euch beiden
Habe noch ein Countdown Befehl hier rumliegen, der benutzt aber selbsterstelle Textdraws, möchte lieber einen haben der mit GameTextStyles arbeitet.
Sieht zurzeit so aus:
CCMD:ecountdown(playerid,params[]) //Starts a countdown, after the countdown the Doors will be locked. { if(countTimer != -1) return SendClientMessage(playerid, RED, "ERROR: Countdown is already enabled."); if(!params[0]) return SendClientMessage(playerid, 0xFF0055FF, "Type in a time."); new time = strval(params); if(time < 10 || time > 500) return SendClientMessage(playerid, RED, "Type in a time from 10 to 500.."); countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, time); return 1; }
C
Alles anzeigenforward CountDownObjekte(playerid, count); public CountDownObjekte(playerid, count) { count--; if(count <= 0) { KillTimer(countTimer); countTimer = -1; for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0); //GO - Sound gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000); SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000); SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); TextDrawHideForAll(Textdraw0); return 1; } new str[16]; format(str, sizeof(str), "%d", count); TextDrawSetString(Textdraw0, str); for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0); //Timer - Sound TextDrawShowForAll(Textdraw0); countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, count); return 1; }
-
C
Alles anzeigenforward CountDownObjekte(playerid, count); public CountDownObjekte(playerid, count) { count--; if(count <= 0) { KillTimer(countTimer); countTimer = -1; for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0); //GO - Sound gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000); SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000); SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); GameTextForAll( "Go!" , 1000, 3 ); return 1; } new str[16]; format(str, sizeof(str), "%d", count); GameTextForAll( str, 5000, 3 ); for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0); //Timer - Sound countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, count); return 1; }
[wiki]GameTextForAll[/wiki]
-
C
Alles anzeigenocmd:create(playerid, params[]) { new str[32], tmp[16]; if(sscanf(params, "s[32]{s}", str, tmp))return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [Pickup]"); if(strcmp(str, "Pickup", true) == 0) { new weaponid, ammo; if(sscanf(params,"s[32]ii",str, weaponid, ammo))return SendClientMessage(playerid, COLOR_GREY,"Benutze: /create pickup [WaffenID / ID] [Ammo / Wert]"); SendClientMessage(playerid,COLOR_GREY,"Klappt"); } return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [Pickup]");; }
Wenn ich nur "/create pickup" eingebe, dann zeigt der mir trotzdem noch "Benutze: /create [Pickup]" an.
-
Ah, stimmt, sorry. Optionale Parameter sind ja groß.
C
Alles anzeigenocmd:create(playerid, params[]) { new str[32], tmp[16]; if(sscanf(params, "s[32]S(-)[16]", str, tmp))return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [Pickup]"); if(strcmp(str, "Pickup", true) == 0) { new weaponid, ammo; if(sscanf(params,"s[32]ii",str, weaponid, ammo))return SendClientMessage(playerid, COLOR_GREY,"Benutze: /create pickup [WaffenID / ID] [Ammo / Wert]"); SendClientMessage(playerid,COLOR_GREY,"Klappt"); } return SendClientMessage(playerid, COLOR_GREY, "Benutze: /create [Pickup]");; }
Versuche es so.
-
Kann mir jemand sagen wieso der Sound immer nur bei jedem zweiten mal ertönt?
C
Alles anzeigenCMD:enextround(playerid,params[]) { SendClientMessageToAll(RED,"Rooms unlocked, next round will start soon!"); static bool:status; if(!status) { for(new i=0; i<sizeof(gObj); i++) { if(gObj[i] != -1) DestroyObject(gObj[i]); gObj[i] = -1; PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0); } } status = !status; return 1; }
-
Weil du es so gemacht hast.
So würde es immer kommen: -
-
Yo @Jeffry
Ich habe ja beim Countdown die Funktion dass wenn der Countdown vorbei ist, sich 2 Objekte erstellen welche die Türen schließen. Wenn ich aber danach den Befehl nochmal benutze, kann ich die nicht mehr entfernen.
Also benötige ich Hilfe in entweder A) Eine Funktion erstellen welche mir nicht erlaubt den Befehl zu benutzen bis ich die nächste Runde gestartet habe, oder B) ein Befehl womit ich notfalls die Objekte löschen kann.
Der Befehl womit ich den Countdown starte sieht immer noch so aus:
CCMD:ecountdown(playerid,params[]) //Starts a countdown, after the countdown the Doors will be locked. (There is no command yet to unlock the doors). { if(countTimer != -1) return SendClientMessage(playerid, RED, "ERROR: Countdown is already enabled."); if(!params[0]) return SendClientMessage(playerid, 0xFF0055FF, "Type in a time."); new time = strval(params); if(time < 10 || time > 500) return SendClientMessage(playerid, RED, "Type in a time from 10 to 500.."); countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, time); return 1; }
Die Funktionen die dazu gehören
C
Alles anzeigenforward CountDownObjekte(playerid, count); public CountDownObjekte(playerid, count) { count--; if(count <= 0) { KillTimer(countTimer); countTimer = -1; for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0); //GO - Sound gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000); SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000); SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); GameTextForAll( "Go!" , 1000, 3 ); return 1; } new str[16]; format(str, sizeof(str), "%d", count); GameTextForAll( str, 5000, 4 ); for(new i=0; i<MAX_PLAYERS; i++) PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0); //Timer - Sound countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, count); return 1; }
Und den Befehl womit ich die Objekte manuell erstellen und löschen kann, aber wenn ich die Objekte mit dem Countdown erstelle, kann ich sie nicht mit /elock löschen..
C
Alles anzeigenCMD:elock(playerid,params[]) //Test command with which you can lock and unlock the doors. { static bool:status; if(!status) { gObj[0] = CreateObject(1498,1866.485,-2496.830,5047.411,0.000,0.000,36.199,300.000); SetObjectMaterial( gObj[0], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[0], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); gObj[1] = CreateObject(1498,1841.824,-2495.508,5047.339,0.000,0.000,335.900,300.000); SetObjectMaterial( gObj[1], 0, 5150, "wiresetc_las2", "ganggraf01_LA_m", 0); SetObjectMaterialText(gObj[1], "LOCKED", 0, 50, "Calibri", 15, 1, -65536, 0, 1); SendClientMessage(playerid,0xFF0055FF,"Rooms locked"); } else { SendClientMessage(playerid,0xFF0055FF,"Rooms unlocked"); for(new i=0; i<sizeof(gObj); i++) { if(gObj[i] != -1) DestroyObject(gObj[i]); gObj[i] = -1; } } status = !status; return 1; }
Edit: Vergessen die Funktion zu posten für die nächste Runde.
-
Nimm das hier aus dem elock Befehl raus:
static bool:status;
und schreibe es unter die Includes als:
new bool:status;Dann kannst du in dem countdown Befehl abfragen:
PS: Es wäre wesentlich sinnvoller, wenn du einen eigenen Thread erstellst, weil das keine kleinen Fragen mehr sind, mit so viel Code. -
Ich habe das jetzt so gemacht wie du gesagt hast, nun treten 2 Fehler auf:
1) Die Türen sind von Anfang an schon geschlossen.
2) /ecountdown funktioniert nicht, sagt mir immer: ERROR: Nicht unlocked.CCMD:ecountdown(playerid,params[]) //Starts a countdown, after the countdown the Doors will be locked. (There is no command yet to unlock the doors). { if(countTimer != -1) return SendClientMessage(playerid, RED, "ERROR: Countdown is already enabled."); if(!params[0]) return SendClientMessage(playerid, 0xFF0055FF, "Type in a time."); if(!status) return SendClientMessage(playerid, 0xFF0000FF, "Error: Nicht unlocked."); new time = strval(params); if(time < 10 || time > 500) return SendClientMessage(playerid, RED, "Type in a time from 10 to 500.."); countTimer = SetTimerEx("CountDownObjekte", 1000, false, "dd", playerid, time); return 1; }
-
Mache bitte einen separaten Thread auf und poste dort nochmal den aktualisierten Code und erkläre, wie es dazu kommt, dass die Tore von Anfang an geschlossen sind.
-
-
-
Die Fahrzeuge der Spieler werden nach dem Disconnect nicht gespeichert.
Es wird nur Step 1 & 2 geprintet.Falls die Frage kommt: VehicleInfo[i][v_XID] = CreateVehicle(...
OnPlayerDisconnect
C
Alles anzeigenprint("Step 1"); for(new i=0; i < sizeof(VehicleInfo); i++) { print("Step 2"); if(VehicleInfo[i][v_XID] == 0)continue; print("Step 3"); if(VehicleInfo[i][v_ID] != PlayerInfo[playerid][p_ID])continue; print("Step 4"); new Float:health; GetVehiclePos(VehicleInfo[i][v_XID], VehicleInfo[i][v_X], VehicleInfo[i][v_Y], VehicleInfo[i][v_Z]); GetVehicleZAngle(VehicleInfo[i][v_XID], VehicleInfo[i][v_R]); GetVehicleHealth(VehicleInfo[i][v_XID], health); DestroyVehicle(VehicleInfo[i][v_XID]); VehicleInfo[i][v_XID] = 0; print("Step 5"); new query[256]; mysql_format(handle, query, sizeof(query), "UPDATE vehicles SET x='%f', y='%f', z='%f', r='%f', health='%f' WHERE id='%d'", VehicleInfo[i][v_X], VehicleInfo[i][v_Y], VehicleInfo[i][v_Z], VehicleInfo[i][v_R], health, i); mysql_pquery(handle, query); print("Step 6"); printf("[USERVEH] Fahrzeug (ID: %i) vom Spieler (ID: %d) wurde entfernt.", VehicleInfo[i][v_XID], PlayerInfo[playerid][p_ID]); }
-
Würde mal sagen. dass kein VehicleInfo[i][v_XID] existiert.
-
Das kein nicht sein, denn ich habe 2 Fahrzeuge z.B die mir gehören.
Habe auch schon einmal die Abfrage ausgeklammert, dann wurde Step 1 bis 3 geprintet.
--
Wenn ich die beiden Abfragen ausklammere, wird die Speicherung ausgeführt. -> Ergo: Es muss irgendetwas an den Abfragen falsch sein?
Dabei taucht aber das Problem auf das, dass selbe Fahrzeug mehrmals entfernt wird, was nicht gewollt ist.
Und es wird auch nur das erste Spieler-Fahrzeug gespeichert. -
Was ist die beste Methode um ShowPlayerDialog Msgstylebox so übersichtlich wie Möglich zu gestalten? Möchte viel reinschreiben doch in eine Ganze Zeile passt das nicht. Wenn ich das alles in eine Zeile reinpacke sieht das nicht schön aus und ist unübersichtlich..