[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
  • Exakt, dass hängt mit dem Befehl hier zusammen:
    ocmd:hospital(playerid,params[])
    {
    if(!IsPlayerOnline(playerid))return SendClientMessage(playerid,Rot,NotOnlineMSG);
    if(!SpielerInfo[playerid][pDeathtime])return SendClientMessage(playerid,Rot,"Error"#cWeiß": You aren't in the hospital.");
    new str[25];
    format(str,sizeof(str),"%i Seconds remaining",SpielerInfo[playerid][pDeathtime]);
    GameTextForPlayer(playerid,str,3000,5);
    return 1;
    }
    //EDIT::
    Und wenn man den Server disconnected muss die Zeit ja irgendwie gespeichert und wieder richtig wiedergegeben werden.

  • Beitrag von YaBroo ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: trash ().
  • Ja dein Aufbau sieht aber auch recht komisch aus :D


    //Edit Ich weiß nicht ganz was es mit dem Spawn auf sich hat, wie du es wo setzt aber probier mal dies.



    public MedicalTimer(playerid)
    {
    if(SpielerInfo[playerid][pDeathtime] > 0) return SpielerInfo[playerid][pDeathtime]--;
    KillTimer(MedicalTimerID[playerid]);
    if(SpielerInfo[playerid][pSpawn] == 0) return SpawnPlayerEx(playerid);
    HouseSpawn(playerid);
    ClearChatForPlayer(playerid);
    SendClientMessage(playerid,Weiß,"Spawn");
    TogglePlayerControllable(playerid,1);
    SpielerInfo[playerid][pDeathtime] = 0;
    SetCameraBehindPlayer(playerid);
    return 1;
    }

    KleineHilfe 2.0

    6 Mal editiert, zuletzt von YaBroo ()

  • Welche Abfragen sehen in diesem Public denn "komisch" aus?

  • SpielerInfo[playerid][pSpawn] Hat nichts mit dem Death System zu tun, da dies lediglich dazu dient an welchen Spawn der Spieler Spawnt. (Haus oder Zivilspawn)
    Es funktioniert alles, und es wird alles ausgegeben/ausgeführt, der Timer wird lediglich nicht "gekillt"

  • SpielerInfo[playerid][pSpawn] Hat nichts mit dem Death System zu tun, da dies lediglich dazu dient an welchen Spawn der Spieler Spawnt. (Haus oder Zivilspawn)
    Es funktioniert alles, und es wird alles ausgegeben/ausgeführt, der Timer wird lediglich nicht "gekillt"

    Es war nur auf SpielerInfo[playerid][pDeathtime] = 0; bezogen.

    KleineHilfe 2.0

  • Jeffry:
    MedicalTimerID kommt hier überall vor:
    Deklarierung:
    new MedicalTimerID[MAX_PLAYERS];
    OnPlayerConnect:
    MedicalTimerID[playerid] = -1;
    OnPlayerDisconnect:
    KillTimer(MedicalTimerID[playerid]);
    stock MedicalSpawn(playerid)
    MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",2000,true,"i",playerid);
    Public MedicalTimer(playerid)
    KillTimer(MedicalTimerID[playerid]);


    Nochmal alles was mit dem Death System zu tun hat:
    OnPlayerDeath:

    Code
    public OnPlayerDeath(playerid, killerid, reason)
    {
    	SpielerInfo[playerid][pTode]++;
    	if(killerid != INVALID_PLAYER_ID)
    		SpielerInfo[killerid][pMorde]++;
    	SpielerInfo[playerid][pDeathtime] = 120;
    	MedicalSpawn(playerid);
    	return 1;
    }


    stock MedicalSpawn:


    Public MedicalTimer:


  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Ok, dann ändere folgendes mal ab:
    Beide
    KillTimer(MedicalTimerID[playerid]);
    zu:
    if(MedicalTimerID[playerid] != -1) KillTimer(MedicalTimerID[playerid]);
    MedicalTimerID[playerid] = -1;


    Und:
    MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",2000,true,"i",playerid);
    zu:
    if(MedicalTimerID[playerid] != -1) KillTimer(MedicalTimerID[playerid]);
    MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",2000,true,"i",playerid);


    Meine Vermutung wäre, dass der Timer doppelt gestartet wird und somit einer davon nicht mehr beendet wird.
    Falls das nichts hilft, woran erkennst du, dass der Timer weiterhin läuft, bzw. nicht beendet wird?

  • @Jeffry Wie kann es kommen das bei OnPlayerDeath ein Timer mehrfach aufgerufen wird?

    Zum Teil kommt es vor, dass Callbacks doppelt aufgerufen werden, auf Grund von Funktionen die darin oder oder kurz danach aufgerufen werden. Ich könnte mir vorstellen, dass es hier mit dem SpawnPlayer irgendwie zusammenhängt, könnte aber auch an was anderem liegen, das ist schwer zu sagen, das müsste man ganz genau ausprobieren und mit prints debuggen.
    Grade OnPlayerSpawn und OnPlayerDeath sind da ganz anfällig.

  • Hallo,


    habe ein Problem mit meinem Business System, besser gesagt mit dieser Abfrage.
    Die Abfrage soll bewirken, dass nur der Business Besitzer & Inteilhaber "durchgelassen" werden ( wusste nicht wie ich es anders beschreiben sollte ).
    Im meinem Befehl frage ich dann ab ob der Spieler Business Member ist, bzw Besitzer oder Inteilhaber.
    Aber die Abfrage funktioniert anscheint wohl nicht, denn auch wenn ich kein Inteilhaber & Besitzer bin kann ich den Befehl benutzen.

    stock IsPlayerBizMember(playerid)
    {
    for(new i=0; i < MAX_BUSINESS; i++)
    {
    if(Business[i][b_x] == 0.0 && Business[i][b_y] == 0.0 && Business[i][b_z] == 0.0)continue;
    if(!strlen(Business[i][b_besitzer]))continue;
    if(!strcmp(GetName(playerid), Business[i][b_besitzer], true) || !strcmp(GetName(playerid), Business[i][b_inteilhaber], true))return 1;
    }
    return 0;
    }



    ocmd:business(playerid, params[])
    {
    if(!IsPlayerBizMember(playerid))return 1;
    ShowPlayerDialogEx(playerid, DIALOG_BUSINESS);
    return 1;
    }

  • Versuche es so:
    stock IsPlayerBizMember(playerid)
    {
    for(new i=0; i < MAX_BUSINESS; i++)
    {
    if(Business[i][b_x] == 0.0 && Business[i][b_y] == 0.0 && Business[i][b_z] == 0.0)continue;
    if(!strlen(Business[i][b_besitzer]))continue;
    if(!strcmp(GetName(playerid), Business[i][b_besitzer], true))return 1;
    if(!strlen(Business[i][b_inteilhaber]))continue;
    if(!strcmp(GetName(playerid), Business[i][b_inteilhaber], true))return 1;
    }
    return 0;
    }

  • Der Meinung bin ich auch.
    In jeglicher Variable, steht nirgendswo mein Name als Inteilhaber / Besitzer.
    GetName zeigt nur meinem Namen an.
    #define GetName(%0) PlayerInfo[%0][p_Name]
    Bild meiner aktuellen Tabelle

    Bild der Business Informationen


    Edit:
    Komischer Weise, als ich die GetName() Funktion durch PlayerInfo[playerid][p_Name] ersetzt habe, wird mir der Dialog nicht mehr angezeigt, also es scheint nun zu funktionieren.
    Vielen Dank Jeffry, dass du mich indirekt auf die Idee gebracht hast. ^^

    Einmal editiert, zuletzt von malE ()

  • Tag liebe leuts,
    ich habe mal wieder bzw. immer noch ein Problem mit meinem Death-System. Diesmal liegt es nicht am Timer sondern an dem TextLabel und dem Pickup.
    Das Problem hierbei ist: Dass wenn ich sterbe, soll ein Pickup sowie TextLabel erstellt werden, dies erfolgt auch nur leider werden diese beiden Sachen an der Position vom Krankenhaus gespawnt hier der code:
    Wird übrigens unter OnPlayerDeath aufgerufen.