Prymex 1 Napisano 5 Kwietnia 2020 (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; } Edytowane 5 Kwietnia 2020 przez Prymex Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 5 Kwietnia 2020 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
Prymex Napisano 5 Kwietnia 2020 (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 5 Kwietnia 2020 przez Prymex Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Gość Napisano 6 Kwietnia 2020 (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 6 Kwietnia 2020 przez Gość Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 6 Kwietnia 2020 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
MAGNET Napisano 6 Kwietnia 2020 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
Prymex Napisano 6 Kwietnia 2020 @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
MAGNET 1 Napisano 6 Kwietnia 2020 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