Skocz do zawartości

Znajdź zawartość

Wyświetlanie wyników dla tagów 'timer' .



Więcej opcji wyszukiwania

  • Wyszukaj za pomocą tagów

    Wpisz tagi, oddzielając je przecinkami.
  • Wyszukaj przy użyciu nazwy użytkownika

Typ zawartości


Kategorie

  • Error'y w kompilatorze
  • Warning'i w kompilatorze
  • Fatal error'y w kompilatorze

Forum

  • Go-Code.pl - Ogólne
    • Informacje
    • O serwisie
  • Sourcemod Scripting
    • Baza wiedzy
    • Masz problem?
    • Pytania na temat kodowania
  • Pluginy Sourcemod
    • Wszystko o pluginach
    • Duże modyfikacje
    • Dodatki
  • Konfiguracja serwera
    • Baza wiedzy
    • Pytania
    • Problemy
  • Counter-Strike: Global Offensive
    • Nowości
    • Artykuły, poradniki, tutoriale
    • Pytania
    • Problemy
  • Hostingi serwerów & WWW
    • Oferty firm
    • Opinie o hostingach
    • Pytania
  • Poza tematyką forum, OFF-TOPIC
    • Życie społeczności
    • Biznes
    • Zareklamuj swoją sieć/serwer
    • RoundSoundy
  • Archiwum
    • Przestarzałe tematy
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Od tej daty

    Do tej daty


Ostatnia aktualizacja

  • Od tej daty

    Do tej daty


Filtruj po ilości...

Dołączył

  • Od tej daty

    Do tej daty


Grupa podstawowa


Imię


Lokalizacja


Zawód


O mnie


Strona WWW

Znaleziono 8 wyników

  1. Witam! Potrzebuję zrobić komendę, którą można wpisać tylko przez 15 sekund na początku rundy. Czy mógłby mi ktoś pomóc? 😄
  2. 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); }
  3. Niestety nie wiem jak ten plugin, ale napisze w skrócie mam serwer DeathRun, który potrzebuje timera czyli wyliczania szybkości w skakaniu, jak i wyliczaniu rekordów "!wr", jeszcze żeby te wr działały to trzeba !strefa, nie wiem jak się ten plugin nazywa... znajdę go za darmo?
  4. Witajcie Poszukuje sposobu w jaki mogę wykryć co powoduje losowe resety serwera z wpisem w konsoli , WARNING: Watchdog timer exceeded, aborting! ERROR niestety moje metody okazują się nie skuteczne sm plugins list sourcemod/metamod sm exts list
  5. Szukam przerobionego/skonfigurowanego pluginu shavit timer stricte pod Deathrun.
  6. Hej, wgrałem sobie cały zestaw shavita i nie działa mi hud/timer - dokładniej wygląda tak A drugim problemem jest nie wyświetlanie się zone'ów. Ktoś wie jak to naprawić?
  7. Ok, uznajmy że mam problem z logicznym myśleniem i proszę o pomoc. Log mówi mi L 08/09/2019 - 21:58:23: [SM] Exception reported: Invalid timer handle c5dc10fd (error 1) L 08/09/2019 - 21:58:23: [SM] Call stack trace: L 08/09/2019 - 21:58:23: [SM] [0] KillTimer L 08/09/2019 - 21:58:23: [SM] [1] Line 1295, plugin.sp::ClearTimer L 08/09/2019 - 21:58:23: [SM] [2] Line 292, plugin.sp::KoniecRundy Kiedy ja mówię mu } public Action KoniecRundy(Event event, const char[] name, bool dontBroadcast) { nuke_koniec = true; for(int i = 1; i <= MaxClients; i++) { if(!IsClientInGame(i) || !IsValidClient(i)) continue; if(timer[i] != INVALID_HANDLE) ClearTimer(timer[i]); } } stock void ClearTimer(Handle timer) { if (timer != INVALID_HANDLE) { KillTimer(timer); timer = INVALID_HANDLE; } } ? 😞 // sprawdzam podwójnie invalid handle, bo bez tego i tak ten błąd był, stąd taka akcja
  8. Zadania czasowe w Sourcemod 1. Wprowadzenie SourceMod oferuje nam bardzo wygodny system Timerów. Te zadania czasowe obsługują uruchomienie danej funkcji z konkretnymi parametrami w odpowiednim czasie. Takie działania mogą być przydatne gdy na przykład odblokowujemy użycie granatów jakiś czas po rozpoczęciu rundy lub wyświetlamy HUD (wiadomość na ekranie gracza) która ma się stale wyświetlać lecz jego zawartość musimy ciągle odświeżać. 2. CreateTimer - Teoria Jest to funkcja tworząca Timer i ustalająca jaka funkcja ma być uruchomiona po jakim czasie. Jej opis znajduje się tutaj https://go-code.pl/dokumentacja-sourcemod/timers/CreateTimer Składnia: native Handle CreateTimer(float interval, Timer func, any data=INVALID_HANDLE, int flags=0); Handle - w tym przypadku oznacza, że funkcja zwróci nam jakiś uchwyt (uchwyt = Handle). Konkretniej, CreateTimer zwraca uchwyt do właśnie stworzonego Timera. float interval - czas w sekundach do wywołania (uruchomienia) danej funkcji. Są to wartości float, czyli wartości zmiennoprzecinkowe. O ile dobrze kojarzę, minimalną wartość jaką można tu wpisać jest 0.1. Timer func - nazwa funkcji która ma zostać uruchomiona (wywołana) po podanym czasie. any data - jakikolwiek parametr jaki chcemy przekazać funkcji którą wywołamy, by mogła z niej korzystać. Nie musimy ustawiać tego parametru i domyślnie będzie on ustawiony na INVALID_HANDLE, czyli brak przekazywanego parametru. int flags - opcjonalne flagi które możemy nadać naszemu Timerowi które zmienią domyślne działanie Timera. Domyślnie ustawione na 0, czyli TImer działa domyślnie, tak jak jest to opisane w dokumentacji. 2.1. CreateTimer - Napisanie tego w pluginie Załóżmy, że mamy przykładowy plugin: Stworzony Timer pod komendą "sm_stworz" wykona się dokładnie sekundę po wpisaniu jej w konsolę. Zauważmy, że jako trzeci parametr w CreateTimer przekazujemy ID gracza (client). Dzięki temu FunkcjaKtoraSieWywola może go dowolnie używać. Co z flagami? (int flags) Aktualnie dokumentacja opisuje trzy działające flagi, które zmieniają / modyfikują działanie Timera. TIMER_REPEAT - Sprawia, że stworzony Timer działa w pętli. (po wywołaniu Timerowej funkcji, Timer od początku odlicza sekundy i powtarza cały proces) TIMER_FLAG_NO_MAPCHANGE - Sprawia, że Timer nie będzie działać po zmianie mapy. Tak, jeśli plugin utworzy CreateTimer bez tej flagi i z takim czasem że Timer nie zdąży się wykonać przed zmianą mapy, to wykona się po jej zmianie zgodnie ze swoim odliczaniem! TIMER_DATA_HNDL_CLOSE - Sprawia, że uchwyt (Handle) wpisany jako trzeci parametr jest automatycznie zamykany po zakończeniu wykonywania funkcji. O tym trochę dokładniej w dalszej części poradnika Dlatego możemy teraz stworzyć inną wersję naszego pluginu, który będzie co sekundę pisał na czacie kto użył komendy: Aby połączyć flagi dla danego CreateTimer, należy wstawić między nie znak |. Przykład: CreateTimer(1.0, FunkcjaKtoraSieWywola, GetClientUserId(client), TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); 3. TriggerTimer - Teoria Jest to funkcja, która przedwcześnie wywołuje Timer, czyli wymusza aktywację Timera. Opis znajduje się tutaj: https://go-code.pl/dokumentacja-sourcemod/timers/TriggerTimer Składnia: native void TriggerTimer(Handle timer, bool reset=false); void - Oznacza, że ta funkcja nic nie zwraca Handle timer - Uchwyt danego Timera który chcemy uruchomić bool reset - Jeśli true, to czas Timera zostanie zresetowany i będzie musiał odczekać pełny czas (ustawiony w CreateTimer) by ponownie się samodzielnie uruchomić. Ten parametr jest opcjonalny. 3.1. TriggerTimer - Napisanie tego w pluginie Możemy napisać sobie przykładowy plugin Zauważmy, że do skorzystania z funkcji TriggerTimer potrzebowaliśmy uchwytu naszego Timeru. Dlatego została stworzona zmienna typu Handle o nazwie UchwytNaszegoTimeru. Co więcej, przy opisywaniu CreateTimer napisałem, że funkcja zwraca uchwyt do stworzonego Timera, dlatego można ten uchwyt przypisać jakiejś zmiennej 4. KillTimer - Teoria Usuwa Timer bez jego wywołania. Przydatne jeśli pojawił się jakiś warunek (na przykład jeśli gracz zginął i nie potrzeba mu już wyświetlać wiadomości na HUD), który sprawia, że Timer nie jest już potrzebny. Pełny opis tutaj https://go-code.pl/dokumentacja-sourcemod/timers/KillTimer Składnia: native void KillTimer(Handle timer, bool autoClose=false); void - Oznacza, że ta funkcja nic nie zwraca Handle timer - Uchwyt danego Timera który chcemy usunąć bool autoClose - Jeśli ustawione na true, to dane przekazane do Timera zostaną zamknięte jeśli w CreateTimer nie dodało się flagi TIMER_DATA_HNDL_CLOSE 4.1. KillTimer - Napisanie tego w pluginie Mamy przykładowy plugin Zauważmy ciekawą rzecz, jeśli użyjemy komendy sm_usun dwukrotnie to drugie jej użycie spowoduje błąd ponieważ UchwytNaszegoTimeru wynosi INVALID_HANDLE. Dzieje się tak ponieważ funkcja KillTimer usuwa dany Timer kompletnie i ustawia wartość zmiennej przetrzymującej właśnie na INVALID_HANDLE. Co za tym idzie, zgodnie z dokumentacją, funkcja KillTimer nie radzi sobie w przypadku, gdy podawany do funkcji uchwyt nie jest prawidłowy i po prostu wyrzuca nam błąd do konsoli / logów serwera. 5. Ale tato, co jeśli bym chciał przekazać do Timer'a więcej niż jedną zmienną? Możemy to zrobić na dwa sposoby. Prymitywny i nieładny lub elegancki i zgodny z zasadami dobrego programowania. Ten pierwszy osiąga się za pomocą tworzenia zmiennych globalnych (takich które działają w każdym kawałku kodu pluginu). Przed CreateTimer przypisujemy do zmiennych globalnych jakieś wartości potrzebne nam do użycia w Timerze. A gdy Timer się wywoła, używamy właśnie tych zmiennych globalnych. Barbarzyńsko wręcz. Natomiast drugi sposób omówię trochę dokładniej. Będziemy musieli zagłębić się w plik datapack.inc. Datapack to uporządkowany zestaw obiektów, który jest przekształcony do postaci szeregowej, czyli jednego strumienia bajtów. Dzięki temu zmienne które chcemy przekazać Timerowi możemy umieścić w jednym Datapacku i umieścić jako trzeci parametr funkcji CreateTimer, przekazując tym samym ten Datapack do funkcji którą ten Timer wywoła. Brzmi prosto, natomiast trzeba się zapoznać z kodem żeby w pełni zrozumieć działanie Datapacków. Oto przykładowy kod: Trzeba zaznaczyć, że odczytywanie danych z Datapacku MUSI się odbywać w kolejności w jakiej zostały do tego Datapacku zapisane. Co do CloseHandle lub TIMER_DATA_HNDL_CLOSE, nie ma różnicy jaka metoda zostanie użyta by usunąć uchwyt nazwany w kodzie 'data'. Ważne jest natomiast by ten uchwyt został usunięty. Nie sprzątanie po sobie utworzonych uchwytów może skutkować nieoczekiwanymi crashami serwera. Bibliografia Głównie wiedzę czerpałem z własnego doświadczenia (jak również pluginów które napisałem), ale nie omieszkałem zajrzeć na strony https://wiki.alliedmods.net/SourcePawn_Basics_-_Handles,_DataPacks,_and_Timers oraz https://pl.wikipedia.org/wiki/Serializacja by przypomnieć sobie niektóre rzeczy. Nie zapominajmy też o naszej dokumentacji https://go-code.pl/dokumentacja-sourcemod/ *Uprasza się o nie kopiowanie poradnika bez wcześniejszego zapytania autora o zgodę
×
×
  • Dodaj nową pozycję...