Beiträge von Manyula

    Hi,


    Ich bin gerade dabei ein kleines Banksystem zu scripten und habe eine Frage bzgl. der Buttons in einem Dialog.


    Folgendes hab ich vor:
    Der Spieler kann z.B. einzahlen. Im Einzahlungsdialog kann der Spieler den Betrag eingeben, den er einzahlen möchte (Inputtext), wobei er den Button "OK" und "Zurück" zur Verfügung hat. Wenn keinen Betrag eingegeben wird (strlen vom inputtext also 0), soll der gesamte Betrag, den er dabei hat auf das Bankkonto eingezahlt werden. Jetzt würde ich das gerne mit dem Button visualisieren, dass, wenn kein Inputtext eingegeben wurde der Bestätigungsbutton "Alles" heißt, und sobald etwas eingegeben wird der Buttontext auf "OK" umspringt. Ist das möglich?

    Guten Abend,


    ZCMD ermöglicht es ja denselben CMD mit mehreren verschiedenen Befehlseingaben zu aktiviren.


    COMMAND:bla(playerid, params[])
    {
    Code...
    return 1;
    }


    COMMAND:blubb(playerid, params[])
    {
    return cmd_bla(playerid, params);
    }


    Wie stelle ich das unter einem Callback an? Jetzt speziell im Bezug auf "OnPlayerClickPlayer".
    Ich habe einen Spielerstatistikenbefehl erstellt, und würde gerne haben, dass der bei dem Callback einfach nur aufgerufen wird.


    public OnPlayerClickPlayer(playerid, clickedplayerid, source)
    {
    return cmd_stats(???);
    }


    Danke!

    Das hier steht unter meinem public OnPlayerConnect.


    if(fexist(Path(playerid)) //Überprüfen, ob der Account existiert
    {
    if(gettime() <= INI_Int("LastDisconnect", pInfo[playerid][LastDisconnect]) + (15*60)) //Sind 15min seit dem letzten Disconnect vergangen? ERROR!
    {
    new PlayerIP[16];
    GetPlayerIp(playerid, PlayerIP, sizeof(PlayerIP));
    if(!strcmp(PlayerIP, pInfo[playerid][IP]) //Wenn die gerade verbundene IP und die IP des letzten Users, der disconnected ist, nicht übereinstimmen
    {
    INI_ParseFile(Path(playerid), "LoadAccount_%s", .bExtra = true, .extra = playerid); //Userfile laden
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Willkommen zurueck! Dieser Account ist registriert!\nBitte gib das Passwort fuer diesen Account ein!", "Einloggen", "Abbrechen"); //Login-Dialog zeigen
    }
    }
    else
    {
    INI_ParseFile(Path(playerid), "LoadAccount_%s", .bExtra = true, .extra = playerid); //Userfile laden
    SpawnPlayer(playerid); //Spieler spawnen
    }
    }
    else //Wenn der Account nicht existiert
    {
    ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registrieren", "Willkommen auf San Andreas Arena! Dieser Account ist noch nicht registriert!\nBitte gib ein Passwort ein, um dich zu registrieren!\nDas Passwort muss mindestens 5 Zeichen lang sein!", "Registrieren", "Verlassen"); //Registrierungs-Dialog zeigen
    return 1;
    }
    return 1;


    Also, mein Ziel ist es, dass wenn ein Spieler disconnectet, und innerhalb der nächsten 15min ab Disconnect wieder den Server betritt, dass er dann automatisch eingeloggt wird.
    Nun scheitere ich aber irgendwie bei der Abfrage, ob gettime() kleiner/gleich der Zeit in LastDisconnect ist, also 15min.


    Ich hoffe, jemand ist in Y_INI genug bewandert, um mir helfen zu können.


    Danke!

    Ich bin noch am Lernen. Ich hab mir über Minate und Jahre hinweg, in denen ich aktiv gespielt habe, langsam das Verständnis angeeignet, Binärsystem und so weiter. Ich finde Videotutorials jetzt nicht so toll, ich hatte das Glück, dass ich einen umfangreichen Gamemode von 40k Zeilen bekommen habe, der der Gamemode meines ehemaligen Clans war. Ich hab mich daran oft gut orientieren können, hab dann angefangen Commands mit ZCMD zu schreiben, von leicht zu schwer, dann an der Skinselection rumprobiert, Jobs, Register- und Loginsystem und jetzt bin ich dran y_ini bzw Filespeicherung richtig zu vertehen. Es kommt spontan immer eine neue Idee, die ich umsetzen möchte, und daran setze ich mich solange, bis es hinhaut. Viel Erfolg! ;)

    Ok, so würde ichs machen.


    SpielerHealth abfragen. (z.B. 30HP)
    -SpielerHealth + 100 (Differenz ergibt, wie viel du hinzugefügt hast) in einer Variable abspeichern (new Differenz).
    GivePlayerMoney (Differenz * 15), wäre in dem Fall (70 * 15)


    Denkanstoß genug?

    Bei einem RolePlay Gamemode spielt es, meiner Meinung nach, fast keine Rolle mehr, ob du Godfather editierst oder alles from scratch machst.
    Setz dich lieber vor einen Freeroam Gamemode, davon hat es zu wenige. ;)

    Ich weiß, ich habs bewusst untereinander gemacht, damit ich praktisch einen visuellen "Block" im Script habe.^^
    Macht das einen gravierenden Unterschied, wenn der Compiler hier durch 2 statt durch eine Zeile parsen muss?

    COMMAND:ls(playerid, params[])
    {
    if(!UseTeleports[playerid])
    return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Da kannst im Moment keine Teleports nutzen!");

    if(IsPlayerAFK[playerid])
    return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Du bist AFK. Du kannst keine Aktion durchführen. Melde dich mit /back zurueck!");


    if(GetPlayerMoney(playerid) >= 3000)
    {
    new string[128],
    pName[MAX_PLAYER_NAME],
    pVehicle = GetPlayerVehicleID(playerid),
    Float:VehicleAngle;
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "[TELEPORTINFO] {%06x}%s "#COLOR_GOLD_EMBED"hat sich nach Los Santos teleportiert! (/LS)", GetPlayerColor(playerid) >>> 8, pName);
    SendClientMessageToAll(COLOR_GOLD, string);
    SetPlayerPos(playerid, 2492.7268, -1668.3849, 13.3438);
    SetPlayerFacingAngle(playerid, 0);
    SetVehiclePos(pVehicle, 2492.7268, -1668.3849, 13.3438);
    GetVehicleZAngle(playerid, VehicleAngle);
    SetVehicleZAngle(playerid, VehicleAngle);
    PutPlayerInVehicle(playerid, pVehicle, 0);
    GivePlayerMoney(playerid,-3000);
    }
    else SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Du hast nicht genug Geld!");
    return 1;
    }


    Hab die Abfragen jetzt in einzelne Blöcke unterteilt. So müssts klappen.
    Noch Verbesserungsvorschläge?

    COMMAND:ls(playerid, params[])
    {
    if(UseTeleports[playerid] == false && IsPlayerAFK[playerid] == false) return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Da kannst im Moment keine Teleports nutzen!");
    if(UseTeleports[playerid] == true && IsPlayerAFK[playerid] == false)
    {
    if(GetPlayerMoney(playerid) >= 3000)
    {
    new string[128],
    pName[MAX_PLAYER_NAME],
    pVehicle = GetPlayerVehicleID(playerid),
    Float:VehicleAngle;
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "[TELEPORTINFO] {%06x}%s "#COLOR_GOLD_EMBED"hat sich nach Los Santos teleportiert! (/LS)", GetPlayerColor(playerid) >>> 8, pName);
    SendClientMessageToAll(COLOR_GOLD, string);
    SetPlayerPos(playerid, 2492.7268, -1668.3849, 13.3438);
    SetPlayerFacingAngle(playerid, 0);
    SetVehiclePos(pVehicle, 2492.7268, -1668.3849, 13.3438);
    GetVehicleZAngle(playerid, VehicleAngle);
    SetVehicleZAngle(playerid, VehicleAngle);
    PutPlayerInVehicle(playerid, pVehicle, 0);
    GivePlayerMoney(playerid,-3000);
    }
    else SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Du hast nicht genug Geld!");
    }
    else if(IsPlayerAFK[playerid] == true) SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Du bist AFK. Du kannst keine Aktion durchführen. Melde dich mit /back zurueck!");
    return 1;
    }


    Ich finde diese Verschachtelung von "UseTeleports" und "IsPlayerAFK" ein wenig unübersichtlich. Lässt es sich irgendwie geschickter überprüfen, ob Teleports erlaubt sind und der Spieler nicht AFK ist?


    Danke!

    Hast recht. Habs jetzt hingekriegt, hat bisschen mehr nicht gestimmt. Der richtige Code sieht jetzt so aus, nur für die SuFu, falls mal jemand danach suchen sollte...


    COMMAND:setlevel(playerid, params[])
    {
    new ID,
    Level,
    string1[128],
    string2[128],
    pName[MAX_PLAYER_NAME],
    AdminWhoExecutesTheCommand[MAX_PLAYER_NAME];
    if(pInfo[playerid][AdminLevel] == 0) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist kein Admin.");
    if(pInfo[playerid][AdminLevel] > 0 && pInfo[playerid][AdminLevel] < 5) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du hast einen zu niedrigen Adminlevel, um diese Aktion auszuführen!");
    if(sscanf(params, "ui", ID, Level)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Gebrauch: /setlevel [ID] [Level]");
    if(!IsPlayerConnected(ID)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Dieser Spieler ist nicht online!");
    if(Level < 0 || Level > 5) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Ungueltiges Level.");
    if(ID == playerid) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du kannst nicht deinen eigenen Adminlevel setzen!");


    GetPlayerName(playerid, AdminWhoExecutesTheCommand, sizeof(AdminWhoExecutesTheCommand));
    GetPlayerName(ID, pName, sizeof(pName));

    if(pInfo[ID][AdminLevel] < Level)
    {
    format(string1, sizeof(string1), "[ADMININFO] Admin {%06x}%s "#COLOR_TURQUOISE_EMBED"hat {%06x}%s "#COLOR_TURQUOISE_EMBED"auf "#COLOR_GOLD_EMBED"Level %i "#COLOR_GREEN_EMBED"heraufgestuft!", GetPlayerColor(playerid) >>> 8, AdminWhoExecutesTheCommand, GetPlayerColor(ID) >>> 8, pName, Level);
    SendClientMessageToAll(COLOR_TURQUOISE, string1);
    pInfo[ID][AdminLevel] = Level;
    return 1;
    }
    if(pInfo[ID][AdminLevel] > Level)
    {
    format(string2, sizeof(string2), "[ADMININFO] Admin {%06x}%s "#COLOR_TURQUOISE_EMBED"hat {%06x}%s "#COLOR_TURQUOISE_EMBED"auf "#COLOR_GOLD_EMBED"Level %i "#COLOR_RED_EMBED"herabgestuft!", GetPlayerColor(playerid) >>> 8, AdminWhoExecutesTheCommand, GetPlayerColor(ID) >>> 8, pName, Level);
    SendClientMessageToAll(COLOR_TURQUOISE, string2);
    pInfo[ID][AdminLevel] = Level;
    return 1;
    }
    new INI:file = INI_Open(Path(playerid));
    INI_WriteInt(file, "AdminLevel", pInfo[playerid][AdminLevel]);
    INI_Close(file);
    return 1;
    }


    Den file-Part hab ich ganz nach unten, unter beide if-Abfragen gemacht, da er davor, als der Part noch darüber war, den AdminLevel doppelt in die Userfile geschrieben hat. Und das, worauf du mich hingewiesen hast, war auch ausschlaggebend. ;)
    Vielen Dank!


    EDIT: "PlayerWhoseLevelGetsSet"-Variable war dasselbe, wie "ID", also doppelt gemoppelt. Habs aus dem Code entfernt und angepasst.

    Hallo!


    COMMAND:setlevel(playerid, params[])
    {
    new ID,
    Level,
    string1[128],
    string2[128],
    pName[MAX_PLAYER_NAME],
    PlayerWhoseLevelGetsSet,
    AdminWhoExecutesTheCommand[MAX_PLAYER_NAME];
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist kein Admin");
    if(sscanf(params, "ui", ID, Level)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Gebrauch: /setlevel [ID] [Level]");
    if(!IsPlayerConnected(ID)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Dieser Spieler ist nicht online!");
    if(Level < 0 || Level > 5) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Ungueltiges Level.");


    GetPlayerName(playerid, AdminWhoExecutesTheCommand, sizeof(AdminWhoExecutesTheCommand));
    GetPlayerName(PlayerWhoseLevelGetsSet, pName, sizeof(pName));

    new INI:file = INI_Open(Path(playerid));
    INI_WriteInt(file, "AdminLevel", Level);
    INI_Close(file);


    if(pInfo[PlayerWhoseLevelGetsSet][AdminLevel] < Level)
    {
    format(string1, sizeof(string1), "[ADMININFO] Admin {%06x}%s "#COLOR_TURQUOISE_EMBED"hat {%06x}%s "#COLOR_TURQUOISE_EMBED"auf "#COLOR_GOLD_EMBED"Level %i "#COLOR_GREEN_EMBED"heraufgestuft!", GetPlayerColor(playerid) >>> 8, AdminWhoExecutesTheCommand, GetPlayerColor(PlayerWhoseLevelGetsSet) >>> 8, pName, Level);
    SendClientMessageToAll(COLOR_TURQUOISE, string1);
    pInfo[PlayerWhoseLevelGetsSet][AdminLevel] = Level;
    return 1;
    }
    if(pInfo[PlayerWhoseLevelGetsSet][AdminLevel] > Level)
    {
    format(string2, sizeof(string2), "[ADMININFO] Admin {%06x}%s "#COLOR_TURQUOISE_EMBED"hat {%06x}%s "#COLOR_TURQUOISE_EMBED"auf "#COLOR_GOLD_EMBED"Level %i "#COLOR_RED_EMBED"herabgestuft!", GetPlayerColor(playerid) >>> 8, AdminWhoExecutesTheCommand, GetPlayerColor(PlayerWhoseLevelGetsSet) >>> 8, pName, Level);
    SendClientMessageToAll(COLOR_TURQUOISE, string2);
    Level = pInfo[PlayerWhoseLevelGetsSet][AdminLevel];
    return 1;
    }
    return 1;
    }


    Problem: Ich habe nun einen Account auf Level 5 gestuft. Er lässt sich allerdings nicht mehr herabstufen. Die ClientMessage wird zwar ausgegeben, aber in der user datei bleibt immer die 5 stehen.
    Hier noch die stock Funktion für Path.
    stock Path(playerid)
    {
    new string[128],
    name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(string,sizeof(string),UserPath,name);
    return string;
    }


    Danke!

    Danke, klappt! ;)


    Nächstes Problem.


    COMMAND:akill(playerid, params[])
    {
    new PlayerWhoGetsKilled,
    string[128],
    pName[MAX_PLAYER_NAME],
    AdminWhoExecutesTheCommand[MAX_PLAYER_NAME];
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist kein Admin!");
    if(sscanf(params, "u", PlayerWhoGetsKilled)) return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Gebrauch: /pkill [ID]!");
    if(!IsPlayerConnected(PlayerWhoGetsKilled)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Dieser Spieler ist nicht online!");
    SetPlayerHealth(PlayerWhoGetsKilled, 0);


    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "[ADMININFO] Admin {%06x}%s "#COLOR_TURQUOISE_EMBED"hat {%06x}%s "#COLOR_TURQUOISE_EMBED"gekillt!", GetPlayerColor(playerid) >>> 8, AdminWhoExecutesTheCommand, GetPlayerColor(PlayerWhoGetsKilled) >>> 8, pName);
    return SendClientMessageToAll(COLOR_TURQUOISE, string);
    }


    Keine Errors.


    Jetzt möchte ich, dass die Spielernamen in ihrer jeweiligen Spielerfarbe ausgegeben werden.


    Beispiel: "[ADMININFO] Admin Manyula hat Justin_Bieber gekillt!"


    Als ich nur die Spielerfarbe des Admins gefetcht hab, ging alles, jetzt, wo ich zwei Spielerfarbe fetchen will, komm ich ein bisschen in die Bredouille.
    Danke!

    Mein erster Gedanke war: "Endlich wieder ein selbstgeschriebenes Freeroam Script unter all den elenden GF Edits, Roleplay- und Reallifeservern!"


    Bei genauerer Betrachtung muss ich meinen Vorpostern eigentlich zustimmen. Alles, was man auf dem Server machen kann, ist sich Waffen oder Vehicles zu spawnen, bisschen auf mäßig bis schlecht gemappten Maps stunten, und das wars auch schon. Es ist nur zu eindeutig, dass ihr absolut keinen Plan habt, was ihr macht. Von konzeptorientierter Arbeit keine Spur. Ich übernehme das Zitat von Blackbook, da ich es nicht treffender formulieren kann: "Das Projekt ist noch nicht mal geboren."
    Ich find es super, dass sich mal jemand eines Freeroamprojektes annimmt, und ich möchte jeden dazu bestärken endlich vom RP und RL Überfluss abzukommen, aber das ist wirklich gequirlte Scheiße.


    MfG Manyula


    Edit: Rechtschreibung (bin am Handy)

    COMMAND:ls(playerid, params[])
    {
    if(GetPlayerMoney(playerid)>=3000)
    {
    new string[128],
    pName[MAX_PLAYER_NAME],
    pVehicle = GetPlayerVehicleID(playerid),
    Float:VehicleAngle;
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "[TELEPORTINFO] {%06x}%s "COLOR_GOLD_EMBED"hat sich nach Los Santos teleportiert! (/LS)", GetPlayerColor(playerid) >>> 8, pName);
    SendClientMessageToAll(COLOR_GOLD, string);
    SetPlayerPos(playerid, 2492.7268, -1668.3849, 13.3438);
    SetPlayerFacingAngle(playerid, 0);
    SetVehiclePos(pVehicle, 2492.7268, -1668.3849, 13.3438);
    GetVehicleZAngle(playerid, VehicleAngle);
    SetVehicleZAngle(playerid, VehicleAngle);
    PutPlayerInVehicle(playerid, pVehicle, 0);
    GivePlayerMoney(playerid,-3000);
    }
    else SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Du hast nicht genug Geld!");
    return 1;
    }


    //EMBED COLORS
    #define COLOR_RED_EMBED "{FF0000FF}"
    #define COLOR_ORANGE_EMBED "{FF8900FF}"
    #define COLOR_GOLD_EMBED "{FFB700FF}"
    #define COLOR_GREY_EMBED "{B4B4B4FF}"
    #define COLOR_YELLOW_EMBED "{FFFF00FF}"
    #define COLOR_BLUE_EMBED "{0000FFFF}"
    #define COLOR_LIGHT_BLUE_EMBED "{00FFFFFF}"
    #define COLOR_GREEN_EMBED "{00FF00FF}"
    #define COLOR_PINK_EMBED "{FF00FFFF}"
    #define COLOR_PURPLE_EMBED "{7A00FFFF}"
    #define COLOR_TURQUOISE_EMBED "{00D9ADFF}"


    Irgendwie will das Color Embedding nicht so richtig, wie es soll.
    In der ClientMessage des Teleports soll der Spielername in seiner PlayerColor ausgegeben werden. der Rest in COLOR_GOLD(_EMBED).
    Allerdings wird alles, was nach dem Spielernamen kommt, auch in seiner Farbe ausgegeben, statt in Gold.


    Beispiel, wie ist ist: [TELEPORTINFO] Manyula hat sich nach Los Santos teleportiert! (/LS)
    Beispiel, wie es sein soll: [TELEPORTINFO] Manyula hat sich nach Los Santos teleportiert! (/LS)


    Danke im Voraus!


    MfG Manyula

    Hallo!


    COMMAND:slap(playerid, params[])
    {
    new PlayerWhoGetsSlapped,
    Float:X,
    Float:Y,
    Float:Z,
    string[128],
    pName[MAX_PLAYER_NAME],
    AdminWhoExecutesTheCommand[MAX_PLAYER_NAME];
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Du bist kein Admin!");
    if(!IsPlayerConnected(PlayerWhoGetsSlapped)) return SendClientMessage(playerid, COLOR_RED, "[ERROR] Dieser Spieler ist nicht online!");
    if(sscanf(params, "u", PlayerWhoGetsSlapped)) return SendClientMessage(playerid, COLOR_RED, "[WARNUNG] Gebrauch: /slap [ID]!");

    GetPlayerPos(PlayerWhoGetsSlapped, X, Y, Z);
    SetPlayerPos(PlayerWhoGetsSlapped, X, Y, Z+10.0);

    GetPlayerName(playerid, pName, sizeof(pName));
    GetPlayerName(playerid, AdminWhoExecutesTheCommand, sizeof(AdminWhoExecutesTheCommand));
    format(string, sizeof(string), "[SPIELERINFO] %s wurde vom Admin %s geslappt!", pName, AdminWhoExecutesTheCommand);
    SendClientMessageToAll(COLOR_TURQUOISE, string);
    return 1;
    }


    Vorab: Ich bin Anfänger.


    Also, ich schildere mal kurz, was ich mir beim Scripten gedacht habe:


    1. Variable für den Spieler, der geslappt werden soll, für die X, Y und Z Koordinaten des Spielers, der geslappt werden soll, den String für die ClientMessage, den Spielernamen des Spielers, der geslappt wird, und den Spielernamen des Admins.
    2. Überprüfen, ob der Spieler, der den Befehl ausführt, RCON Admin ist.
    3. Überprüfen, ob der Spieler, der geslappt werden soll, online ist.
    4. Parameter überprüfen.
    5. Position des Spielers, der geslappt werden soll in X, Y, Z Variablen speichern.
    6. Spieler um 10.0 nach oben setzen.
    7. Spielernamen des Spielers, der geslappt wird, und des Admins, der den befehl ausführt fetchen.
    8. Beides in den String formatieren.
    9. ClientMessage an alle Spieler ausgeben.


    Errors kriege ich bei der Geschichte keine.


    Nun ist es aber so, dass ich eine x beliebige ID eingeben kann, die überhaupt nicht online ist, und trotzdem die Clientmessage "[ADMININFO] Manyula wurde vom Admin Manyula geslappt!" kommt.


    Danke im Voraus!


    /e: Einrückung.