Dann muss ich das ja global machen, oder? Auf lokale Variablen hab ich im nächsten Dialog keinen Zugriff mehr.
Beiträge von Manyula
-
-
Wie fasse ich die Eingaben verschiedener Dialoge in einem zusammen?
Beispiel:
Dialog 1 (Inputtext) - "Baum"
Dialog 2 (List) - listitem 0 (Farbcode für Blau)
Dialog 3 (Msg) - "Baum" (=der String dann in Blau)=> 3 fässt die Eingaben aus 1 und 2 zusammen.
-
public OnPlayerConnect(playerid)
{
if(fexist(Path(playerid))) //Überprüfen, ob der Account existiert
{
INI_ParseFile(Path(playerid), "loadaccount_%s", .bExtra = true, .extra = playerid); //Userfile laden
new pName_[MAX_PLAYER_NAME],
stringDE_[128],
stringEN_[128];
GetPlayerName(playerid, pName_, sizeof(pName_));
format(stringDE_, sizeof(stringDE_), "Willkommen zurück, "#C_LIGHT_BLUE_E"%s"#C_DIALOG_E"! Dieser Account ist registriert!\nBitte gib das Passwort für diesen Account ein!", pName_);
format(stringEN_, sizeof(stringEN_), "Welcome back, "#C_LIGHT_BLUE_E"%s"#C_DIALOG_E"! This account is registered!\nPlease type in the password for this account!", pName_);
ShowLanguageDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Login", stringDE_, stringEN_, "Einloggen", "Log in", "Abbrechen", "Cancel");
}
else //Wenn nicht, dann zeige die Sprachauswahl
{
ShowPlayerDialog(playerid, DIALOG_LANGUAGES, DIALOG_STYLE_LIST, "Sprachauswahl | Language Selection", "Deutsch [DE] | German [GER]\nEnglisch [ENG] | English [ENG]", "OK", "");
return 1;
}
return SAVE_OnPlayerConnect(playerid);
}
Das Ding ist, dass ist 2x OnPlayerConnect habe. Im "Mutterscript" steht das, was ich bereits oben gepostet habe. Das jetzt ist die gehookte Version.EDIT: Dummer Leichtsinnsfehler von mir. Gelöst.
-
Um den Spawnbutton zu togglen, solange der Spieler nicht eingeloggt oder registriert ist.
-
if(dialogid == DIALOG_REGISTER)
{
if(!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowLanguageDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registrieren", "Register", "Willkommen auf San Andreas Arena! Dieser Account ist noch nicht registriert!\nBitte gib ein Passwort ein, um dich zu registrieren!", "Welcome to San Andreas Arena! This account is not registered yet!\nPlease type in a password to register!", "Registrieren", "Register", "Verlassen", "Leave"); //Zeige erneut den Registrierungsdialog
if(strlen(inputtext))
{
new hashpass[129];
WP_Hash(hashpass, sizeof(hashpass), inputtext); //Whirlpool-Plugin-Funktion zum Verschlüsseln des Passworts
GetPlayerIp(playerid, pInfo[playerid][IP], 16);
new INI:file = INI_Open(Path(playerid));
INI_SetTag(file, "User Data");
INI_WriteString(file, "Password", hashpass);
INI_WriteString(file, "IP", pInfo[playerid][IP]);
INI_WriteInt(file, "AdminLevel", 0);
INI_WriteInt(file, "Money", 0);
INI_WriteInt(file, "Score", 0);
INI_WriteInt(file, "Kills", 0);
INI_WriteInt(file, "Deaths", 0);
INI_WriteInt(file, "Language", pInfo[playerid][Language]);
INI_Close(file);
new stringDE[128],
stringEN[128],
pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
format(stringDE, sizeof(stringDE), "»SPIELERINFO« Herzlichen Glückwunsch! Du hast dich erfolgreich mit dem Namen "#C_GOLD_E"%s "#C_TURQUOISE_E"registriert!", pName);
format(stringEN, sizeof(stringEN), "»SPIELERINFO« Congratulations! You have successfully registered with the name "#C_GOLD_E"%s "#C_TURQUOISE_E"!", pName);
SendLanguageMessage(playerid, C_TURQUOISE, stringDE, stringEN);
TogglePlayerSpectating(playerid, 0);
pInfo[playerid][JustRegistered] = true;
LoggedIn[playerid] = true;
}
return 1;
}
}public OnPlayerConnect(playerid)
{
TogglePlayerSpectating(playerid, 1);
return 1;
}public OnPlayerSpawn(playerid)
{
SetPlayerColor(playerid, C_BLUE);new VirtualWorld = GetPlayerVirtualWorld(playerid);
switch(VirtualWorld)
{
case 0:
{
UseTeleports[playerid] = true;
if(pInfo[playerid][JustLoggedIn] == true)
{
GivePlayerMoneyEx(playerid, pInfo[playerid][Money]);
SetPlayerScore(playerid, pInfo[playerid][Score]);
pInfo[playerid][JustLoggedIn] = false;
return 1;
}
if(pInfo[playerid][JustRegistered] == true)
{
cmd_rules(playerid, "");
pInfo[playerid][JustRegistered] = false;
return 1;
}
if(pInfo[playerid][JustLoggedIn] == false) return GivePlayerMoneyEx(playerid, 5000);
SetSpawnProtection(playerid);
}
case 1..7:
{
UseTeleports[playerid] = false;
if(pInfo[playerid][Money] == 0) GivePlayerMoneyEx(playerid, 5000);
SetSpawnProtection(playerid);
}
}
return 1;
}Obwohl ich bei OnPlayerConnect den Spectating Modus anmache, ist er an, wenn ein Spieler sich registriert. Beim Login klappt das alles wunderbar, nur beim Registrieren nicht. Es ist so, dass man zunächst einen Sprachendialog kriegt. In der gewählten Sprache, wird der Registrierungsdialog dann angezeigt. Wenn dieser aber angezeigt wird, ist der Spectating Modus plötzlich wieder an.
-
Haben noch einige kleine Abfragen gefehlt, aber ich glaub ich habs jetzt hingekriegt.
Danke! -
Ich hätte mal eine kleine Frage. Wie verhindert man, dass ein Dialog mit ESC geschlossen werden kann?
-
Also SetTimerEx anstatt einfach einen globalen Timer? Ist es nicht besser SetTimer zu nutzen, anstatt für jeden einzelnen Spieler extra einen Timer zu starten?
-
#define AUTO_AFK_CHECK_INTERVAL 5000
new AutoAFK_Detected[MAX_PLAYERS],
PlayerPos_Before[MAX_PLAYERS],
PlayerPos_Now[MAX_PLAYERS];new AutoAFK_Timer[MAX_PLAYERS];
//=============================================================================================================================================================================================================================================================
public OnGameModeInit()
{
SetTimer("AutoAFK_Check", AUTO_AFK_CHECK_INTERVAL, true);
return AA_OnGameModeInit();
}forward AA_OnGameModeInit();
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit AA_OnGameModeInit//=============================================================================================================================================================================================================================================================
public OnPlayerSpawn(playerid)
{
new Float:X, Float:Y, Float:Z;
PlayerPos_Before[playerid] = GetPlayerPos(playerid, X, Y, Z); //Für den ersten Spawn, damit es einen Vergleichswert hat.
return AA_OnPlayerSpawn(playerid);
}forward AA_OnPlayerSpawn(playerid);
#if defined _ALS_OnPlayerSpawn
#undef OnPlayerSpawn
#else
#define _ALS_OnPlayerSpawn
#endif
#define OnPlayerSpawn AA_OnPlayerSpawn//=============================================================================================================================================================================================================================================================
forward AutoAFK_Processed(playerid);
public AutoAFK_Processed(playerid)
{
CallLocalFunction("StartAFK", "i", playerid); //Wenn 15min vorbei sind, dann setze den Spieler in den AFK Modus.
return 1;
}//=============================================================================================================================================================================================================================================================
forward AutoAFK_Check();
public AutoAFK_Check()
{
new Float:X, Float:Y, Float:Z;
for(new i; i < MAX_PLAYERS; i++)
{
PlayerPos_Now[i] = GetPlayerPos(i, X, Y, Z); //Finde die jetzige Position des Spielers raus.
if(IsPlayerAFK[i]) return 1; //Wenn der Spieler schon AFK ist, Funktion beenden.
if(PlayerPos_Now[i] == PlayerPos_Before[i]) //Wenn die Position vorher mit der jetzigen Position übereinstimmt...
{
AutoAFK_Detected[i] = true; //Variable setzen: Stillstand des Spielers entdeckt.
AutoAFK_Timer[i] = SetTimerEx("AutoAFK_Processed", 15*60000, false, "i", i); //Starte einen 15min Timer.
PlayerPos_Now[i] = PlayerPos_Before[i]; //Setze die jetzige Position auf die Variable, mit der die später neu ermittelte Position verglichen werden soll.
SendClientMessage(i, -1, "AutoAFK detected. Initiating Timer of 15min.");
}
else //Wenn die vorige und jetzige Position nicht übereinstimmen...
{
if(AutoAFK_Detected[i]) //Wenn der Spieler schon entdeckt wurde, bzw. der Timer schon läuft...
{
KillTimer(AutoAFK_Timer[i]); //Zerstöre den Timer
}
AutoAFK_Detected[i] = false; //Variable setzen: Spieler unentdeckt.
PlayerPos_Now[i] = PlayerPos_Before[i]; //Setze die jetzige Position auf die Variable, mit der die später neu ermittelte Position verglichen werden soll.
}
}
return 1;
}Das System will nicht so recht. Errors krieg ich zwar keine, aber funktionieren tut es auch nicht, wie es soll. In den Kommentaren steht, was ich mir dabei gedacht habe. Wäre euch dankbar für eure Hilfe!
-
Das ganze zielt nicht auf einen besonderen Genre ab (RP, bäh), sondern ist eine allgemeine Frage.
An sich hört man ja ständig "Verwendet so wenige Timer, wie möglich", deswegen frage ich. -
Hi,
ich sitze gerade an einem AutoAFK System, und bin mir nicht ganz sicher, wie ich optimal vorgehen soll.
Variante 1
Alle 5 Sekunden wird gecheckt, ob der Spieler eine Bewegung getätigt hat. Wenn dies einmal der Fall ist, wird ein Timer von 15min gestartet, der in dann nach 15min in den AFK Modus setzt.Variante 2
Wenn der Spieler mal keine Bewegung tätigt, wird eine Variable solange hochgezählt, bis sie einen bestimmten Wert erreicht hat.
Um im 5s Intervall auf 15min (15000ms) zu kommen, müsste eine Variable auf den Wert 3000 hochgezählt werden.Welche Variante ist schonender?
-
-
Dann krieg ich auf der Zeile einen "tag mismatch" angezeigt. Das scheint nicht zu klappen.
EDIT: mit dem Präfix "Text3D:" kompiliert es. Das Problem ist aber noch nicht gelöst. Die IDs sind immer noch falsch.
EDIT 2: Ich zeig nochmal auf, was ich bislang habe...
new GangZoneLabel[MAX_GANG_ZONES];new GW_Name_ID[][] =
{
{"Zone1", 0},
{"Zone2", 1}
//und so weiter
};public OnGameModeInit()
{
for(new i=0; i < MAX_GANG_ZONES; i++)
{
new string[80];
format(string, sizeof(string), "» GANG ZONE «\nID: %d\nName: %s", GW_Name_ID[i][1], GW_Name_ID[i][0]);
GangZoneLabel[i] = CreateDynamic3DTextLabel(string, C_WHITE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 100.0);
GangZone[i] = GangZoneCreate(GW_ZoneCoordinates[i][0], GW_ZoneCoordinates[i][1], GW_ZoneCoordinates[i][2], GW_ZoneCoordinates[i][3]);
}
return 1;
}Ich sehe darin wirklich keinen Fehler...
-
new GW_Name_ID[][] =
{
{"Zone1", 0},
{"Zone2", 1}
//und so weiter
};public OnGameModeInit()
{
for(new i=0; i < MAX_GANG_ZONES; i++)
{
new string[80];
format(string, sizeof(string), "» GANG ZONE «\nID: %d\nName: %s", GW_Name_ID[i][1], GW_Name_ID[i][0]);
CreateDynamic3DTextLabel(string, C_WHITE, GW_CaptureCPs[i][0], GW_CaptureCPs[i][1], GW_CaptureCPs[i][2], 100.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 100.0);
GangZone[i] = GangZoneCreate(GW_ZoneCoordinates[i][0], GW_ZoneCoordinates[i][1], GW_ZoneCoordinates[i][2], GW_ZoneCoordinates[i][3]);
}
return 1;
}Es geht um die 3DTextLabel. Sie sollen nacheinander numeriert werden. Die erste GangZone soll also, die ID 0 kriegen, die zweite die ID 1, und so weiter. Nun bekommt meine erste GangZone die ID 114, und der Rest geht abwärts in 2er Schritten weiter.
-
----------
Loaded log file: "server_log.txt".
----------SA-MP Dedicated Server
----------------------
v0.3z-R2, (C)2005-2014 SA-MP Team[17:49:06]
[17:49:06] Server Plugins
[17:49:06] --------------
[17:49:06] Loading plugin: fixes2
[17:49:06][17:49:06] ===============================
[17:49:06] fixes plugin loaded.
[17:49:06] (c) 2012 Alex "Y_Less" Cole
[17:49:06] ===============================
[17:49:06] Loaded.
[17:49:06] Loading plugin: sscanf
[17:49:06][17:49:06] ===============================
[17:49:06] sscanf plugin loaded.
[17:49:06] Version: 2.8.1
[17:49:06] (c) 2012 Alex "Y_Less" Cole
[17:49:06] ===============================
[17:49:06] Loaded.
[17:49:06] Loading plugin: streamer
[17:49:06]*** Streamer Plugin v2.6.1 by Incognito loaded ***
[17:49:06] Loaded.
[17:49:06] Loading plugin: Whirlpool
[17:49:06]
[17:49:06] ==================
[17:49:06]
[17:49:06] Whirlpool loaded
[17:49:06]
[17:49:06] ==================
[17:49:06]
[17:49:06] Loaded.
[17:49:06] Loading plugin: iTD
[17:49:06]
* iTD Plugin loaded. (Support for textdraw editor mouse/keyboard)[17:49:06] Loaded.
[17:49:06] Loaded 5 plugins.[17:49:06]
[17:49:06] Filterscripts
[17:49:06] ---------------
[17:49:06] Loading filterscript 'iTD.amx'...
[17:49:06]
iPLEOMAX's TextDraw Editor loaded successfully!
Version: 1.16 Stable (13/10/2012)[17:49:06] Loaded 1 filterscripts.
[17:49:06]
[17:49:06]
[17:49:06]
[17:49:06] =======================================
[17:49:06] | |
[17:49:06] | YSI version 3.09.0684 |
[17:49:06] | By Alex "Y_Less" Cole |
[17:49:06] | |
[17:49:06] =======================================
[17:49:06]
[17:49:06]
[17:49:06]
[17:49:06] +-------------------+
[17:49:06] | SAN ANDREAS ARENA |
[17:49:06] | (c) by Manyula |
[17:49:06] +-------------------+
[17:49:06] Number of vehicle models: 0EDIT: Also, in der Serverlog finde ich nichts.
Wie dir/euch bestimmt schon aufgefallen ist, hab ich die Label in eine extra include gepackt und OnGameModeInit() gehooked. Jetzt hab ich mal versucht sie direkt in das Script zu implementieren. Dann wird mir zwar kein Unknown Gamemode mehr angezeigt, aber die Label erschienen ingame nicht. -
Vielen Dank für die Erklärung, Reese! Ich denk mal spätestens jetzt hab ich was dazu gelernt, insbesondere im Bezug darauf, was ich bei der genannten Errormeldung zu tun habe.
Ich hab meinen vorigen Post schon editiert, bzgl des neuen Problems: alles kompiliert ohne Probleme. Wenn ich jedoch den Server starte, wird mir im Client "Gamemode: Unknown" angezeigt. Wenn ich die Label exkludiere, funktioniert alles wieder.
Weißt du oder igendjemand da weiter?
-
So, erstmal ein Danke für eure (erneute) Mühe.
Ja, das Problem hatte ich schon mal. Da habe ich die Funktion schon verbessert, kompiliert hat alles. Ich hab nur außer Acht gelassen, dass eh keine Errors angezeigt werden, wenn man eine stock Funktion nicht benutzt.
Desweiteren hab ich gedacht, dass es sich bloß um den string handelt, also text[], bzw die eckigen Klammern darin.
Ich hätte allerdings noch eine Frage:
stock CreateLanguage3DTextLabel(const textDE[], const textEN[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0)
{
if(pInfo[playerid][Language] == LANGUAGE_DE) CreateDynamic3DTextLabel(textDE, color, x, y, z, drawdistance, attachedplayer, attachedvehicle, testlos, worldid, interiorid, playerid, streamdistance);
else if(pInfo[playerid][Language] == LANGUAGE_EN) CreateDynamic3DTextLabel(textEN, color, x, y, z, drawdistance, attachedplayer, attachedvehicle, testlos, worldid, interiorid, playerid, streamdistance);
return 1;
}
Wieso lässt sich innerhalb der Funktion den Datentyp "Float:" weglassen, während man "[]" weglassen muss?
Und zusätzlich könntet ihr mich bitte über den Unterschied, zwischen Parametern und Datentypen aufklären, bzw. wo man sie jeweils gebraucht.EDIT: Es kompiliert zwar, aber es zerschießt mir den Gamemode (Gamemode: Unknown).
-
stock CreateLanguage3DTextLabel(const textDE[], const textEN[], color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0)
{
if(pInfo[playerid][Language] == LANGUAGE_DE) CreateDynamic3DTextLabel(const textDE, color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0); //ERROR LINE
if(pInfo[playerid][Language] == LANGUAGE_EN) CreateDynamic3DTextLabel(const textEN, color, Float:x, Float:y, Float:z, Float:drawdistance, attachedplayer = INVALID_PLAYER_ID, attachedvehicle = INVALID_VEHICLE_ID, testlos = 0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = 100.0);
return 1;
}public OnGameModeInit()
{
CreateLanguage3DTextLabel("Teleport/LS", "Teleport/LS", C_GREEN, 2492.7268, -1668.3849, 13.3438, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/bank1", "Teleport/bank1", C_GREEN, 1829.2714, -1857.4872, 13.5781, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/bank2", "Teleport/bank2", C_GREEN, 1337.5677, -877.6535, 39.2728, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/LSA", "Teleport/LSA", C_GREEN, 1970.4192, -2191.8933, 13.5469, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/AmmuLS", "Teleport/AmmuLS", C_GREEN, 1361.9564, -1271.2209, 13.3828, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/beach", "Teleport/beach", C_GREEN, 490.5515, -1792.1855, 6.0625, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/SF", "Teleport/SF", C_GREEN, -1966.7802, 102.6690, 27.6875, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/LV", "Teleport/LV", C_GREEN, 2116.2957, 1233.1813, 10.8203, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
CreateLanguage3DTextLabel("Teleport/Chilliad", "Teleport/Chilliad", C_GREEN, -2238.9377, -1748.1625, 480.8718, 20.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 0, -1, -1, 20.0);
return LABEL_OnGameModeInit();
}forward LABEL_OnGameModeInit();
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit LABEL_OnGameModeIniterror 029: invalid expression, assumed zero
warning 215: expression has no effect
warning 215: expression has no effect
warning 215: expression has no effect
warning 215: expression has no effect
warning 215: expression has no effect
warning 215: expression has no effect
error 001: expected token: ";", but found ")"
error 029: invalid expression, assumed zero
fatal error 107: too many error messages on one lineDie Errors treten alle in der Zeile der ersten if Abfrage der stock Funktion auf.
-
Nein, ich spiele nur über einen Monitor, daran liegt es nicht.
EDIT: /push
Hat jmd eine Lösung parat? -
stock IsPlayerNameOnline(playerid, pName[])
{
new YourOwnName[MAX_PLAYER_NAME],
pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, YourOwnName, sizeof(YourOwnName));
for(new i=0; i < MAX_PLAYERS; i++)
{
GetPlayerName(i, pName, sizeof(pName));
if(strcmp, playerid, pName, true) return SencClientMessage(playerid, -1, "Name gefunden."); break; //returnt 0
else continue; //returnt 1
}
return 1;
}Kompiliert einwandfrei, schaut mal, ob's klappt.