Skocz do zawartości
Prymex

[Rozwiązane] Iterator ++;

Rekomendowane odpowiedzi

  • WOW! 1
Napisano (edytowane)

Witajcie ponownie, mam kod widoczny poniżej. Chciałbym aby zmienna RemTim pokazywała na czacie o 1 do 25 jak jest w kodzie, niestety po wejściu wyświetlają się losowe liczby. Nie wiem skąd to jest spowodowane. 

PS. lub inna możliwość zrobienia takie skryptu który po 25 sekundach od wywołania Timera go wyłącza.

 

Dodam tylko że nie raz nie wiadomo czemu, ten 

if(!IsGood(client)) return Plugin_Stop;

Nie zatrzymuje odliczania i dalej kontynuje Timer.

#include <sourcemod>
#include <sdktools>

#pragma semicolon 1

int RemTim = 0;

Handle tajmer;

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

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

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);

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

}

public Action PokazHind(Handle timer, DataPack data){

    data.Reset();
    int client = data.ReadCell();
    int rand = data.ReadCell();

    if(!IsGood(client)) return Plugin_Stop;

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

    AddTimerr(client);

    return Plugin_Continue;
}

public Action AddTimerr(int client){
    RemTim += 1;
    PrintToChat(client, "Ilosc %u", RemTim);
}

public bool IsGood(int client){
    if(RemTim>=25){
    return false;
    RemTim = 0;
    }

    return true;
}

 

go-code.png

Edytowane przez Prymex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wytłumacz nam jak ma działać dokładnie Twój plugin?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Napisano (edytowane)

Musi być jeden timer który utrzymuje PrintHindText ale chciałbym po 25 sekundach aby ten timer przestał działać i PrintHindText się wyłączył. Mówiąc inaczej chcę aby PrintHindText pokazywał się przez 25 sekund od spawnu gracza. 

Edytowane przez Prymex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość
Napisano (edytowane)
Spoiler
#include <sourcemod>

int g_iClientHudSecondsCounter[MAXPLAYERS + 1];
public Plugin myinfo = {
    name = "",
    author = "SUPER TIMOR",
    description = "",
    version = "1.0.0",
    url = "https://steamcommunity.com/id/bonkwszlaufrocku"
}
 
public void OnPluginStart() {  
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action Event_PlayerSpawn(Event event, char[] name, bool dontBroadcast) {
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(!IsValidClient(client) || !IsClientInGame(client))
        return Plugin_Continue;
        
    g_iClientHudSecondsCounter[client] = 25;
    CreateTimer(0.1, Timer_ShowHintText, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    CreateTimer(1.0, Timer_CountTheSecond, client, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);

    
    return Plugin_Continue;   
}

public Action Timer_CountTheSecond(Handle timer, any client) {
    if(!IsValidClient(client) || !IsClientInGame(client))
        return Plugin_Stop;

    if(g_iClientHudSecondsCounter[client] == 0)
        return Plugin_Stop;
        
    g_iClientHudSecondsCounter[client] --;
    
    return Plugin_Continue;   
}

public Action Timer_ShowHintText(Handle timer, any client) {
    if(!IsValidClient(client) || !IsClientInGame(client))
        return Plugin_Stop;

    if(g_iClientHudSecondsCounter[client] == 0)
        return Plugin_Stop;
        
    PrintHintText(client, "");
    
    return Plugin_Continue;   
}

public bool IsValidClient(int client) {
    if(client >= 1 && client <= MaxClients && IsClientInGame(client))
        return true;

    return false;
}

 

Może i jestem zdziadziały na swój sposób, ale ja bym zrobił to tak w 3 minuty 😛

Edytowane przez Gość

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak rozumiem nie jest to żaden DM, tylko zwykły tryb z rundami. W takiej sytuacji rozsądniejsze będzie używanie funkcji wychwytującej nową rundę i wyświetlanie komunikatom wszystkim graczom w pętli. Pętla od 1 do max. ilości graczy i sprawdzamy IsClientInGame oraz IsPlayerAlive

Ponadto nie widze sensu w wyprowadzaniu zwiększania zmiennej RemTim poza timer - rób to w jednym miejscu

No i troche musisz nad nazewnictwem zmiennych/funkcji popracować, bo ciężko rozszyfrować że RemTim to tak naprawde remaining timer etc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Z drugiej strony, skoro każdy gracz indywidualnie otrzymuje losowe zdrowie, rozsądniejsze bedzie jednak robienie tego przy spawnie gracza. Obczaj kod timura 😄

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@SUPER TIMOR Bardzo dziękuję za odpowiedź, działa jak chciałem. Temat do zamknięcia.

 

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ę...