[SAMMELTHREAD] Kleine Scripting Fragen

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
  • Das müsste dann so aussehen:
    forward IsPlayerNearObject();
    public IsPlayerNearObject()
    {
    new Float:X, Float:Y, Float:Z;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    for(new o=0; o<50; o++)
    {
    if(treeObj[o] == -1) continue;
    GetObjectPos(treeObj[o], X, Y, Z);
    if(IsPlayerInRangeOfPoint(i, 3.0, X, Y, Z))
    {
    DestroyObject(treeObj[o]);
    treeObj[o] = -1;
    }
    }
    }
    return false;
    }

  • forward IsPlayerNearObject();
    public IsPlayerNearObject()
    {
    new Float:X, Float:Y, Float:Z;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    for(new o=0; o<50; o++)
    {
    if(689[o] == -1) continue; // Fehler
    GetObjectPos(689[o], X, Y, Z);
    if(IsPlayerInRangeOfPoint(i, 3.0, X, Y, Z))
    {
    DestroyObject(689[o]);
    689[o] = -1;
    }
    }
    }
    return false;
    }


    Fehler:
    error 029: invalid expression, assumed zero
    error 029: invalid expression, assumed zero
    warning 215: expression has no effect
    error 001: expected token: ";", but found "]"
    fatal error 107: too many error messages on one line

  • Danke, ich hab jetzt noch eine abfrage vorm einloggen gemacht. Das wenn die 60 sek noch nicht um sind das man sich nicht einloggen kannst. Nur steht das jetzt bei jedem Spieler der sich einloggen möchte, das er sich nicht einloggen kann weil die 60 sek noch nicht um sind obwohl sie sich davor nicht ausgeloggt haben.


    public Logout(playerid)
    {
    SpielerInfo[playerid][sLogout] = 0;
    DestroyPickup(logpickup[playerid]);
    Delete3DTextLabel(logoutlabel[playerid]);
    SavePlayer(playerid);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    new Float:x, Float:y, Float:z, string[80], hour, mins, sec;
    SetTimerEx("Logout", 60000, 0, "d", playerid);
    SpielerInfo[playerid][sLogout] = 1;
    GetPlayerPos(playerid, x, y, z);
    gettime(hour, mins, sec);
    logpickup[playerid] = CreatePickup(1272, 2, x, y, z, -1);
    format(string, sizeof(string), "*%s*\n**%d.%d.%d", SpielerInfo[playerid][sName], hour, mins, sec);
    logoutlabel[playerid] = Create3DTextLabel(string, COLOR_WHITE, x, y, z, 40.0, 0, 0);
    SavePlayer(playerid);
    return 1;
    }


    if(SpielerInfo[playerid][sLogout] == 1) return SendClientMessage(playerid, COLOR_WHITE, "Dein Logout Pickup ist noch nicht verschwunden!");

  • Das was du da vor hast klappt so nicht, weil die playerid nach OnPlayerDisconnect ja nicht mehr online ist, sprich nach den 60 Sekunden SavePlayer aufzurufen klappt nicht.
    Wie genau willst du es denn haben?


    Spieler geht offline -> Pickup wird erstellt (wird nach 60 Sekunden entfernt) -> Spieler kommt online -> Falls 60 Sekunden rum kann er spawnen, ansonsten muss er warten. Ist das richtig so?

  • Ok, dann musst du mit dem Timestamp den gettime zurück gibt arbeiten.


    public Logout(label, pickup)
    {
    DestroyPickup(pickup);
    Delete3DTextLabel(Text3D:label);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    new Float:x, Float:y, Float:z, string[80], hour, mins, sec;
    SpielerInfo[playerid][sLogout] = gettime()+60;
    GetPlayerPos(playerid, x, y, z);
    gettime(hour, mins, sec);
    new pickup = CreatePickup(1272, 2, x, y, z, -1);
    format(string, sizeof(string), "*%s*\n**%d.%d.%d", SpielerInfo[playerid][sName], hour, mins, sec);
    new Text3D:label = Create3DTextLabel(string, COLOR_WHITE, x, y, z, 40.0, 0, 0);
    SetTimerEx("Logout", 60000, 0, "dd", _:label, pickup);
    SavePlayer(playerid);
    return 1;
    }


    if(SpielerInfo[playerid][sLogout] > gettime()) return SendClientMessage(playerid, COLOR_WHITE, "Dein Logout Pickup ist noch nicht verschwunden!");

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • C:\Users\Eddy\Desktop\GTA\GTA - Selfmade\gamemodes\NLG.pwn(390) : warning 213: tag mismatch
    C:\Users\Eddy\Desktop\GTA\GTA - Selfmade\gamemodes\NLG.pwn(1171) : error 017: undefined symbol "pickup"
    C:\Users\Eddy\Desktop\GTA\GTA - Selfmade\gamemodes\NLG.pwn(1172) : error 017: undefined symbol "label"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    2 Errors.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • was hat _: das zu bedeuten?


    damit kannst du den Tag einer Variable entfernen


    bsp:
    new Text3D:Label;


    SendClientMessage(Label,...);
    würde einen warning ausspucken.


    entfernst du den Tag mit _:
    SendClientMessage(_:Label,...);
    gibt es keinen Warning


    Die Tags sind dafür da, das sowas, wie es jetzt getan habe, nicht passiert.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • @[LnD]JustMe.77: Das ist dann relativ kompliziert. Du benötigst eine Datei in die du alle deine Admins rein schreibst und darüber dann ausgeben lässt. Kommt jemand dazu, musst du ihn der Datei hinzufügen (fwrite) und wenn jemand das Team verlässt musst du ihn entfernen (alle Zeilen auslesen, wieder in die Datei schreiben, außer die Zeile mit entsprechendem Name).


    Grapefruit:
    Du setzt das wahrscheinlich nicht auf 0 zurück.
    Schreibe es dann einfach so:
    public OnPlayerDisconnect(playerid, reason)
    {
    new Float:x, Float:y, Float:z, string[80], hour, mins, sec;
    SpielerInfo[playerid][sLogout] = gettime()+60;
    GetPlayerPos(playerid, x, y, z);
    gettime(hour, mins, sec);
    new pickup = CreatePickup(1272, 2, x, y, z, -1);
    format(string, sizeof(string), "*%s*\n**%d.%d.%d", SpielerInfo[playerid][sName], hour, mins, sec);
    new Text3D:label = Create3DTextLabel(string, COLOR_WHITE, x, y, z, 40.0, 0, 0);
    SetTimerEx("Logout", 60000, 0, "dd", _:label, pickup);
    SavePlayer(playerid);
    SpielerInfo[playerid][sLogout] = 0;
    return 1;
    }


    Außerdem musst du das sLogout beim Login natürlich auch aus der Datenbank laden lassen, sonst bringt es ja nichts.

  • Generelle Frage: Ich arbeite an nem Waffensystem, habe Animationen beim Waffenwechseln als Ausweg reingepackt, aber hatte eigentlich was anderes vor: Ich habe bei Mauzen gesehen, dass er es ohne Texdraws geschafft hat, die geladene Munitio / Ammo auf einen bestimmten Wert zu setzen... Wie kann ich das realisieren? Es gibt keine Funktion / Möglichkeit nach meinem Wissen, die geladene Munition / Ammo zu setzen ??
    Damit meine ich nicht die gesamte Munition, sondern halt wie gesagt, die geladene, bei der es, wenn diese alle ist, automatisch eine Nachladeanimation gibt -> zB: 200 / 30 -> 30 geladene Muni von 230 (200 vorrätige Muni).


    Hoffe ich konnte mich richtig ausdrücken ;) (Brauche das, um die alte Muni wieder zu setzen, sobald ich auf die alte Waffe wechsle).


    MfG Alf21

  • Beitrag von Edgar ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • do.de - Domain-Offensive - Domains für alle und zu super Preisen