Lags kommen normalerweise zustande, dass Funktionen länger brauchen um zu executen. Das kann halt auch passieren, wenn du viele Sachen aufrufst, da der Server immer eins nach dem anderen abarbeitet
[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
-
-
Wie hide ich Textdraws wenn man die Taste Escape drückt?
Frage Nummer 2:
Wie benutze ich mehrere Koordinaten bei IsPlayerInRangeOf?
So scheints nicht zu funktionieren:
-
So weit ich weiß kann man von SAMP aus Escape nicht abrufen.
Edit:
IsPlayerInRangeOfPoint(playerid, 1.0,1415.0088,-1463.3322,106.6032);
Sollte so schon richtig gewesen sein. Vorne tränt man Range ein und dann x,y,z. Evtl hast du die Koordinaten falsch. -
C
public OnPlayerClickTextDraw(playerid, Text:clickedid) { if(_:clickedid == INVALID_TEXT_DRAW) { /* -- dein Hide Code hier -- */ CancelSelectTextDraw(playerid); } }
//Edit:
C
Alles anzeigen//Zu Frage 2, entweder odern: if(IsPlayerInRangeOfPoint(...) || IsPlayerInRangeOfPoint(...)) { } //Oder, coords in ein Array schreiben: stock const Float:pos[][3] = { {1415.0088,-1463.3322,106.6032}, {1417.3494,-1462.0212,106.6032}, {1419.8616,-1460.6096,106.6029} }; //Und dann schleife: for(new i; i<sizeof(pos); i++) { if(IsPlayerInRangeOfPoint(playerid,2.0,pos[i][0],pos[i][1],pos[i][2])) { //Hier dann dein Code break; } }
-
Kaliber: Danke, werde ich austesten
Edit:
Das mit den Koordinaten funktioniert gut, danke. Nur mit den Textdraws nicht so gewollt:
C
Alles anzeigenpublic OnPlayerClickTextDraw(playerid, Text:clickedid) { if(_:clickedid == INVALID_TEXT_DRAW) { Showing[playerid] =0; TextDrawHideForPlayer(playerid, Textdraw0); TextDrawHideForPlayer(playerid, Textdraw1); TextDrawHideForPlayer(playerid, Textdraw2); TextDrawHideForPlayer(playerid, Textdraw3); TextDrawHideForPlayer(playerid, Textdraw4); TextDrawHideForPlayer(playerid, Textdraw5); TextDrawHideForPlayer(playerid, Textdraw6); CancelSelectTextDraw(playerid); }
Ist if(_:clickedid == INVALID_TEXT_DRAW) eine Art Standart Definierung oder muss ich da meine Definition angeben, sprich alle Textdraws von 0-6? -
Das ist schon so definiert...
Ehhh wirds nicht aufgerufen..oder was passiert nicht?
-
-
Dann printe dir das doch mal und schau..wieso es nicht aufgerufen wird und welchen Wert die clickedid hat..
-
Beitrag von Syno ()
Dieser Beitrag wurde vom Autor gelöscht (). -
Problem gelöst. Lösung hier: KLICK
Arbeite jetzt mit Dialogen und wollte fragen wie ich abfrage was ich ins Dialog eingetippt habe.
Befehl:
C
Alles anzeigenCMD:lotto(playerid,params[]) { //Automat 1, Automat 2 & Automat 3 if(IsPlayerInRangeOfPoint(playerid, 1.0,1415.0088,-1463.3322,106.6032) || IsPlayerInRangeOfPoint(playerid, 1.0, 1417.3494,-1462.0212,106.6032) || IsPlayerInRangeOfPoint(playerid, 1.0, 1419.8616,-1460.6096,106.6029)) { { ShowPlayerDialog(playerid,DIALOG_GAME, DIALOG_STYLE_INPUT, "Set a bet", "Type in for how much money you want to buy a ticket.", "Buy", "Cancel"); Showing[playerid] = 1; TextDrawShowForPlayer(playerid, Textdraw0); TextDrawShowForPlayer(playerid, Textdraw1); TextDrawShowForPlayer(playerid, Textdraw2); TextDrawShowForPlayer(playerid, Textdraw3); TextDrawShowForPlayer(playerid, Textdraw4); TextDrawShowForPlayer(playerid, Textdraw5); TextDrawShowForPlayer(playerid, Textdraw6); SelectTextDraw(playerid, 0xFFFF0000); } } return 1; }
OnDialogResponse
C
Alles anzeigenpublic OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == DIALOG_GAME) { if(response) // If they clicked 'Yes' or pressed enter { SendClientMessage(playerid,0x00FF00FF, "You have bought a ticket for %i $.!"); } else // Pressed ESC or clicked cancel { } return 1; // We handled a dialog, so return 1. Just like OnPlayerCommandText. } return 0; // You MUST return 0 here! Just like OnPlayerCommandText. }
Benötige das damit ich den Spieler anzeigen kann für wie viel $ er sich ein Ticket gekauft hat. -
-
Inputtext
-
-
Funktioniert super :)! @Jeffry
Wollte ein Limit einfügen, habe es so gemacht bekomme aber Errors. (Ist glaube ich komplett falsch)
C
Alles anzeigenpublic OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == DIALOG_GAME) { if(response) // If they clicked 'Yes' or pressed enter { new str[145]; format(str, sizeof(str), "You have bought a ticket for %i $!", strval(inputtext)); if(inputtext < 2500 ||inputtext >10000) return SendClientMessage(playerid,0x00FF00FF, "{FF1717}ERROR:{FFFFFF} You must set a bet from 2.500$ to 10.000$ ."); SendClientMessage(playerid,0x00FF00FF, str); } else // Pressed ESC or clicked cancel { } return 1; // We handled a dialog, so return 1. Just like OnPlayerCommandText. } return 0; // You MUST return 0 here! Just like OnPlayerCommandText. }
-
-
Setz ein strval vor den Inputtext wie in der Ausgabe
-
-
Zeige dem Spieler den Dialog vor dem return SendClientMessage wieder an (musst dann die geschweiften Klammern nutzen, unter der if Abfrage, dort rein dann SendClientMessage und ShowPlayerDialog).
-
Bisschen schwer xD Hab's so versucht bekomme aber unreachable Code Error.
C
Alles anzeigenpublic OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(dialogid == DIALOG_GAME) { if(response) // If they clicked 'Yes' or pressed enter { new str[145]; format(str, sizeof(str), "You have bought a ticket for %i $!", strval(inputtext)); if(strval(inputtext) < 2500 || strval(inputtext) > 10000) { ShowPlayerDialog(playerid,DIALOG_GAME, DIALOG_STYLE_INPUT, "Set a bet", "Type in for how much money you want to buy a ticket.", "Buy", "Cancel"); } return SendClientMessage(playerid,0x00FF00FF, "{FF1717}ERROR:{FFFFFF} You must set a bet from 2.500$ to 10.000$ at least."); SendClientMessage(playerid,0x00FF00FF, str); } else // Pressed ESC or clicked cancel { } return 1; // We handled a dialog, so return 1. Just like OnPlayerCommandText. } return 0; // You MUST return 0 here! Just like OnPlayerCommandText. }
-
Due return SendClientMessage Zeile muss direkt unter die sShowPlayerDialog Zeile.
-
Danke
So eine Nebenfrage:
Ich habe einen PickUp erstellt und lasse per Dialog MSGBox Style immer eine Nachicht anzeigen. Das Problem nur ist das wenn man auf dem PickUp steht der Dialog die Ganze Zeit erscheint.
Ich weiß selbst das ich das lösen könnte wenn ich ein anderen PickUpStyle verwende, z.B. jede 15 Sekunden Respawnen lassen aber das möchte ich nicht wirklich. Kann ich eine Art "Sperre" einfügen die das nur 1 mal anzeigt bei jedem betreten?
Schaut so aus:
Unter OnFilterScriptInit
//Info PickUp InfoPickUp = CreatePickup(1239,1,1412.7090,-1464.9568,106.6032, -1); //Info PickUp
Und der Public (Habe mal die restlichen Nachichten entfernt weils zu lang ist)
C
Alles anzeigenpublic OnPlayerPickUpPickup(playerid, pickupid) { if(pickupid ==InfoPickUp) { new string[500]; //Increase if you add more things. strcat(string,"{00FFFF}Win or Lose {FFFFFF}Tutorial\n\n"); //etc ShowPlayerDialog(playerid, DIALOG_INFOTEXT, DIALOG_STYLE_MSGBOX, "Win or Lose Game", string, "Okay", ""); return 1; } return 1; }
-