Skocz do zawartości
Prymex

[Rozwiązane] Jeden Timer kila drugi

Rekomendowane odpowiedzi

Mam taki kod i wyskakuje error w konsoli serwera:


L 04/05/2020 - 19:34:43: [SM] Call stack trace:
L 04/05/2020 - 19:34:43: [SM]   [0] KillTimer
L 04/05/2020 - 19:34:43: [SM]   [1] Line 51, C:\Users\Prymex\Desktop\scripting\health.sp::TmerDeath
L 04/05/2020 - 19:34:43: [SM] Exception reported: Invalid timer handle 217b0095 (error 3)
L 04/05/2020 - 19:34:43: [SM] Blaming: health.smx


 

#include <sourcemod>
#include <sdktools>

#pragma semicolon 1

Handle tajmer;

Handle tajmer2;

public void OnPluginStart(){
    HookEvent("player_spawn", RandomHP, EventHookMode_Post);
}

public void OnMapEnd(){
    KillTimer(tajmer);
    KillTimer(tajmer2);
}

public Action RandomHP(Event event, char[] name, bool dontBroadcast){

    if (GameRules_GetProp("m_bWarmupPeriod") == 1)
        return;


    int client = GetClientOfUserId(event.GetInt("userid"));

    int rand = GetRandomInt(0, 100);

    SetEntityHealth(client, rand);

    DataPack dp = new DataPack();
    dp.WriteCell(client);
    dp.WriteCell(rand);

    tajmer = CreateTimer(1.0, PokazHind, dp, TIMER_REPEAT);
    tajmer2 = CreateTimer(15.0, TmerDeath, _, TIMER_FLAG_NO_MAPCHANGE);

    PrintToChat(client, "Twoje HP wynosi: %i", rand);

}

public Action PokazHind(Handle timer, DataPack data){
    data.Reset();
    int client = data.ReadCell();
    int rand = data.ReadCell();

    PrintHintText(client, "Twoje HP wynosi: %i", rand);
}

public Action TmerDeath(Handle timer, any data){
    KillTimer(tajmer);
}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Spoiler

#include <sourcemod>
#include <sdktools>

#pragma semicolon 1

Handle tajmer;

Handle tajmer2;

public void OnPluginStart(){
    HookEvent("player_spawn", RandomHP, EventHookMode_Post);
}

public void OnMapEnd(){
    KillTimer(tajmer);
    KillTimer(tajmer2);
}

public Action RandomHP(Event event, char[] name, bool dontBroadcast){

    if (GameRules_GetProp("m_bWarmupPeriod") == 1)
        return;


    int client = GetClientOfUserId(event.GetInt("userid"));

    int rand = GetRandomInt(0, 100);

    SetEntityHealth(client, rand);

    DataPack dp = new DataPack();
    dp.WriteCell(client);
    dp.WriteCell(rand);

    tajmer = CreateTimer(1.0, PokazHind, dp, TIMER_REPEAT);
    tajmer2 = CreateTimer(15.0, TmerDeath, _, TIMER_FLAG_NO_MAPCHANGE);

    PrintToChat(client, "Twoje HP wynosi: %i", rand);

}

public Action PokazHind(Handle timer, DataPack data){
    data.Reset();
    int client = data.ReadCell();
    int rand = data.ReadCell();

    PrintHintText(client, "Twoje HP wynosi: %i", rand);
}

public Action TmerDeath(Handle timer, any data){
    KillTimer(tajmer, false);
    tajmer = INVALID_HANDLE;
}

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wiem, co Wy tu próbujecie zrobić, ale ten plugin będzie nadpisywał wielokrotnie Handle tajmer i tajmer2.

 

Wyjaśnienie:

Gracz 1 się rodzi: tajmer = adres1, tajmer2 = adres2

Gracz 2 się rodzi 1 sek później: tajmer = adres3, tajmer2 = adres4

---

Dalej wielokrotne nadpisania w zależności od ilości rodzących się graczy

---

15 sekund później zabijany jest adresN, gdzie N to numer timera, który jako ostatni został uruchomiony.

N-1 timerów lata sobie wolno w dalszym ciągu

 

// edit

Zapomniałem dodać, że po zamknięciu Timera następuje wyciek pamięci. DataPack nie jest zamykany.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiadomość wygenerowana automatycznie

 

Problem został rozwiązany

Jeżeli się z tym nie zgadzasz, raportuj ten post

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

×
×
  • Dodaj nową pozycję...