[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
  • Guten Tag,
    ich habe das Problem, dass mein Timer einfach nicht aufhört sich zu wiederholen, obwohl ich diesen per KillTimer ausschalte.
    Beim Tot passiert dies:(Ist übrigens kein Klammerfehler)


    SpielerInfo[playerid][pDeathtime] = 120;
    MedicalSpawn(playerid);


    stock MedicalSpawn(playerid)
    {
    SetSpawnInfo(playerid,0,SpielerInfo[playerid][pSkin],1171.4297, -1323.3737, 15.5000,90.000,0,0,0,0,0,0);
    SetPlayerVirtualWorld(playerid,0);
    SetPlayerInterior(playerid,0);
    SpawnPlayer(playerid);
    TogglePlayerControllable(playerid,0);
    SetPlayerCameraPos(playerid, 1233.3835, -1325.5378, 28.5698);
    SetPlayerCameraLookAt(playerid, 1232.3846, -1325.5327, 28.4548);
    MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",2000,true,"i",playerid);
    return 1;
    }


    Public MedicalTimer:
    public MedicalTimer(playerid)
    {
    SpielerInfo[playerid][pDeathtime] = SpielerInfo[playerid][pDeathtime]-1;//Habe es auch schon mit SpielerInfo[playerid][pDeathtime]--; Probiert.
    if(SpielerInfo[playerid][pDeathtime] <= 0)
    {
    KillTimer(MedicalTimerID[playerid]);
    if(SpielerInfo[playerid][pSpawn] == 0)
    SpawnPlayerEx(playerid);
    else
    HouseSpawn(playerid);
    ClearChatForPlayer(playerid);
    SendClientMessage(playerid,Weiß,"Spawn");
    TogglePlayerControllable(playerid,1);
    SpielerInfo[playerid][pDeathtime] = 0;
    SetCameraBehindPlayer(playerid);
    return 1;
    }
    return 1;
    }

  • 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"

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 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:


  • 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;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen