Zależy o co Ci dokładnie chodzi i co rozumiesz poprzez funkcję. Można napisać plugin, w którym będzie zmienna, która będzie zliczała zabicia gracza i po uzbieraniu xxx wykonywała jakąś rzecz, ale liczba będzie się resetowała po zmianie mapy, wyjściu z serwera etc. Rozwiń swoją myśl co dokładnie chcesz.
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Wolen
Rejestracja: 15.07.2013Aktualnie: Nieaktywny
Poza forum Ostatnio: 05.01.2015 22:40
Statystyki
- Grupa: Użytkownik
- Całość postów: 134
- Odwiedzin: 4 870
- Tytuł: Zaawansowany
- Wiek: 25 lat
- Urodziny: Kwiecień 20, 1999
-
Imię
Jakub
-
Płeć
Mężczyzna
-
Lokalizacja
Małopolska
Narzędzia użytkownika
Ostatnio byli
#643047 Bonusy za daną ilość zabić z danej broni.
Napisane przez Wolen w 12.06.2014 21:29
#642890 Bieganie po mapie gdy jesteśmy na SPECT
Napisane przez Wolen w 11.06.2014 19:02
Mam takie pytanie co do autora gdzie respią sie spect'y?? Znaczy czyj resp
Wolen ja bym to jednak dopracował ;D
Pisałem to raczej w ramach lekkiego przypomnienia co i jak. Dawno nic nie pisałem, a znów mnie to tego pociągło :F.
Mam takie pytanie co do autora gdzie respią sie spect'y?? Znaczy czyj resp
Wolen ja bym to jednak dopracował ;D
Ymm jeżeli dobrze pamiętam to jeżeli się było w TT i przeszło się na spect to na respie TT a jak było się w CT i przeszło się na spect to na respie CT .
Mógłbyś mi zrobić żeby nóż był jeżeli umiesz ?
W załączniku .
#642880 Jak wypełnić pole flaga w sklepie by Gh0st
Napisane przez Wolen w 11.06.2014 18:21
#642736 Jak zablokować UPS ?
Napisane przez Wolen w 10.06.2014 14:04
#565946 ConVary - SourceMod'owe odpowiedniki cvarów
Napisane przez Wolen w 22.08.2013 07:39
Wprowadzenie
-------------------------------------------------------------------------------------------------------------------------------------------------------
ConVary są dostępne poprzez uchwyty (handles). Są dwa sposoby, w jaki możemy uzyskać handle ConVar'a. Jeśli tworzysz ConVar, który już istnieje zostanie automatycznie wykorzystany ten, który był pierwszy.
Uwaga: Uchwyty ConVarów są unikalne dla danego ConVara i nie ma potrzeby ich zwalniania, bądź usuwania.
Znajdowanie ConVarów
-------------------------------------------------------------------------------------------------------------------------------------------------------
Znajdowanie ConVarów jest bardzo proste. Na przykład, powiedzmy, że chcemy użyć mp_startmoney z Counter-Strike: Source.
new Handle:g_hStartMoney public OnPluginStart() { g_hStartMoney = FindConVar("mp_startmoney") }
Uwaga: FindConVar() zwróci INVALID_HANDLE jeśli ConVar nie zostanie znaleziony. Weź to pod uwagę, jeśli będziesz próbował czytać ConVar'y z innych pluginów.
Tworzenie ConVarów
-------------------------------------------------------------------------------------------------------------------------------------------------------
Prosty ConVar zawiera dwa parametry, nazwę oraz domyślną wartość. W każdym razie, dobrym pomysłem jest dodanie opisu .
new Handle:g_hEnabled public OnPluginStart() { g_hEnabled = CreateConVar("myplugin_enabled", "1", "Sets whether my plugin is enabled") }
Możesz także określić ograniczone wartości. Na przykład, stwórzmy cvar o nazwie myplugin_ratio, którego wartość cvar'u nie może wynosić więcej niż 1.0 lub mniej niż 0.1 .
new Handle:g_hEnabled public OnPluginStart() { g_hEnabled = CreateConVar("myplugin_ratio", "0.6", "Sets a vote ratio", _, /* Flags will be discussed later */ true, /* Has a minimum */ 0.1, true, /* Has a maximum */ 1.0) }
Domyślna wartość może być dowolnego typu danych i nie ogranicza ona przyszłych typów, które mogą być stosowane. Niemniej jednak, minimalne i maksymalne ograniczenia należy zawsze interpretować jako wartości typu float. Jeśli tworzysz ConVar, który już istnieje, otrzymasz do niego uchwyt. Co więcej, sam handle będzie identyczny. Opis, domyślna wartość lub ograniczenia nie zostaną zmienione.
Używanie/Zmienianie ConVarów
-------------------------------------------------------------------------------------------------------------------------------------------------------
Zarządzanie ConVar'ami jest bardzo proste. Na przykład, powiedzmy, że chcemy zmienić mp_startmoney, ale zachowamy starą wartość i przywrócimy ją później. Ponowne wykorzystanie naszego kodu z FindConVar.
new g_oldmoney SetStartMoney(newmoney) { g_oldmoney = GetConVarInt(g_hStartMoney) SetConVarInt(g_hStartMoney, newmoney) } RestoreStartMoney() { SetConVarInt(g_hStartMoney, g_oldmoney) }
Choć istnieją różne funkcji dla typów wartości (float, string, et cetera), wewnętrzne dane są zawsze zapisywane w ten sam sposób. Na przykład ten kod działa:
public GetStartMoney() { decl String:buffer[128] GetConVarString(g_hStartMoney, buffer, sizeof(buffer)) return StringToInt(buffer) }
Choć mp_startmoney jest liczbą całkowitą, to może jeszcze zostać przywrócona jako ciąg.
Flagi
-------------------------------------------------------------------------------------------------------------------------------------------------------
ConVary mogą mieć liczbę flag do zmiany ich zachowania. Kilka ważnych flag to:
- FCVAR_PROTECTED - Poufne informacje (nie powinny być narażone na klientów oraz logi).
- FCVAR_NOTIFY - Klienci są powiadamiani o zmianach.
- FCVAR_CHEAT - Może zostać tylko użyte jeśli sv_cheat wynosi 1.
- FCVAR_REPLICATED - Ustawienia są przymusowe dla klientów <może tutaj być błąd w tłumaczeniu> (oryginał: Setting is forced to clients.)
UnsetCheatVar(Handle:hndl) { new flags = GetConVarFlags(hndl) flags &= ~FCVAR_CHEAT SetConVarFlags(hndl, flags) } SetCheatVar(Handle:hndl) { new flags = GetConVarFlags(hndl) flags |= FCVAR_CHEAT SetConVarFlags(hndl, flags) }
W oryginale była jeszcze wzmianka o zmianie callback'ów, lecz postanowił, że skoro nie do końca to pojmuję nie będę tego tykał , a więc to będzie na tyle .
Źródło: http://wiki.alliedmo...eMod_Scripting)
#565523 Simple Spawn NoBlock
Napisane przez Wolen w 21.08.2013 08:22
Po rozpoczęciu rundy plugin daje możliwość przechodzenia przez członków swojej drużyny. Czas przenikania jest regulowany cvar'em.
// Czy plugin jest włączony // - // Domyślnie: "1.0" // Minimalnie: "0.000000" // Maksymalnie: "1.000000" sm_snb "1.0" // Czy FF ma być dostępne podczas spawn'u? Jeśli masz wyłączone ff na serwerze ustaw 0 // - // Domyślnie: "1.0" // Minimalnie: "0.000000" // Maksymalnie: "1.000000" sm_snb_ff "0" // Czas spawn noblock'a (w sekundach). // - // Domyślnie: "10.0" // Minimalnie: "1.000000" sm_snb_time "10.0"
Załączone pliki
-
snb.phrases.txt 236 bajtów 744 Ilość pobrań
-
spawn_noblock_csgo.sp 3,81 KB 841 Ilość pobrań
#565384 Hookowanie eventów (wyłapywanie wydarzeń)
Napisane przez Wolen w 20.08.2013 18:56
Witam was w moim pierwszym poradniku . Temat ten będzie spolszczeniem, natomiast link do oryginału (w języku angielskim) zamieszczę na dole .
Funkcja "HookEvent"
-------------------------------------------------------------------------------------------------------------------------------------------------------
Na samym wstępie opiszę wam funkcję, którą będziemy używać do wyłapywania wydarzeń .
native HookEvent(const String:name[], EventHook:callback, EventHookMode:mode=EventHookMode_Post);
Parametry:
1. Pierwszy paramter jest to nazwa wydarzenia (Lista eventów do poszczególnych gier na silniku Source).
2. Drugi natomiast jest to nazwa wywołanej funkcji.
3. Opcjonalny tryb hook'a (o tym niżej ).
Hookowanie wydarzeń
-------------------------------------------------------------------------------------------------------------------------------------------------------
Kiedy wyłapujemy jakieś wydarzenie, mamy do wyboru trzy "tryby":
- Pre - Wyłapuje wydarzenie zanim zostanie zwolnione1.
- Post - Wyłapuje wydarzenie zaraz po tym jak zostanie zwolnione.
- Post_NoCopy - Wyłapuje wydarzenie, ale nie zapisuje o nim żadnych informacji.
Hookowanie wydarzeń używamy w jednym z następujących celów. Aby zorientować się, który tryb użyć, zobacz listę poniżej:
- Blokowanie wydarzenia (Zapobieganie jego zwolnieniu)
- Zawsze Pre
- Zmienianie wydarzenia (dokładniej jego paramterów )
- Zawsze Pre
- Działania w wydarzeniu (działania przed/pro zakończeniu wydarzenia)2
- Pre jeśli twoje działanie musi mieć miejsce (lul, nie jestem tutaj pewien w tłumaczeniu ) akcją silnika.
- Post jeśli twoje działanie musi mieć miejsce po akcji silnika.
- PostNoCopy jeśli twoje działanie jest Post i wymaga tylko nazwy wydarzenia.
UWAGA! Nigdy nie potrzebuje unhook'owania eventu, kiedy plugin przestanie z niego korzystać. Zrobi się to samoczynnie.
Blokowanie wydarzeń
-------------------------------------------------------------------------------------------------------------------------------------------------------
Blokowanie wydarzeń jest prostsze, niż myślisz ! Powiedzmy, że chcesz zablokować śmierć poprzez strzał w głowę.
public OnPluginStart() { HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre) //Rejestrujemy śmierć wraz z trybem "Pre" } public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) { if(GetEventBool(event, "Headshot")) //Nasz if zostanie wywołany, jeśli śmierć jest wywołana strzałem w głowe { return Plugin_Handled //Zwracamy Plugin_Handled, które blokuje funkcje } return Plugin_Continue //Jeśli if się nie spełni przechodzimy dalej zwracając Plugin_Continue }
Zmienianie wydarzenia
-------------------------------------------------------------------------------------------------------------------------------------------------------
Zmienianie wydarzenia również jest proste. Wydarzenia modyfikujemy w hook'u "pre". Na przykład, ustalmy, że chcemy usunąć headshot'a ze wszystkich eventów.
public OnPluginStart() { HookEvent("player_death", Event_PlayerDeath, EventHookMode_Pre) //Wyłapujemy event } public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) { SetEventBool(event, "headshot", false) //Ustawiamy zmienną typu logicznego (o ile dobrze pamiętam, tak to się nazywało xd) headshot na false, czyli blokujemy możliwość zabicia strzałem w głowę. return Plugin_Changed }
Upewnij się, że zwracasz Plugin_Changed zamiast Plugin_Continue, kiedy modyfikujemy event lub jego parametry.
Hook "post"
-------------------------------------------------------------------------------------------------------------------------------------------------------
Hooki z parametem post są domyślne i będą zwykle najczęściej używane. Na przykład, ustalmy, że chcemy "wydrukować" wiadomość do każdego gracza, że zginął:
public OnPluginStart() { HookEvent("player_death", Event_PlayerDeath) //Rejestrujemy event } public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) { decl String:weapon[64] //Deklarujemy zmienną typu string new victimId = GetEventInt(event, "userid") //Tworzymy zmienną victimID oraz przypisujemy jej pobieranie id ofiary new attackerId = GetEventInt(event, "attacker")//Tworzymy zmienną attackerID oraz przypisujemy jej pobieranie id zabójcy new bool:headshot = GetEventBool(event, "headshot") //Tworzymy zmienną typu logicznego oraz przypisujemy za zadanie pobieranie informacji o zabiciu z głowy GetEventString(event, "weapon", weapon, sizeof(weapon)) //Pobieramy nazwę broni krótko mówiąc :D decl String:name[64] //Deklarujemy zmienną typu string new victim = GetClientOfUserId(victimId) //Z tego co wyczytałem to funkcja getclientofuserid tłumaczy id user'a na prawdziwy index gracza. W tym przypadku otrzymamy id ofiary new attacker = GetClientOfUserId(attackerId) //To co wyżej, z tym, że otrzymamy id zabójcy GetClientName(attacker, name, sizeof(name)) //Pobieramy nick zabójcy PrintToConsole(victim, "You were killed by \"%s\" (weapon \"%s\") (headshot \"%d\")", name, weapon, headshot) //Tego już nie będę objaśniał. Jeśli znajdę czas znajdzie się to, w którymś z moich przyszłych poradników ^^. }
Uwaga! Zwracaną wartością dla hooków post jest ignore, więc tag "Action" nie jest wymagany.
Hook "PostNoCopy"
-------------------------------------------------------------------------------------------------------------------------------------------------------
Na końcu, istnieją pewne hook'i, którym potrzebna jest tylko nazwa wydarzenia. PostNoCopy jest specjalnie zoptymalizowany do tego zadania. Podczas przechodzenia z Pre do Post, SourceMod musi powielać wydarzenie i jego wszystkie pary klucz/wartość. PostNoCopy zapobiega tej sekwencji.
Powiedzmy, że chcemy wiedzieć kiedy pewna sekwencja wydarzeń jest wywoływana.
public OnPluginStart() { HookEvent("game_newmap", GameEvents, EventHookMode_PostNoCopy) HookEvent("game_start", GameEvents, EventHookMode_PostNoCopy) HookEvent("game_end", GameEvents, EventHookMode_PostNoCopy) HookEvent("game_message", GameEvents, EventHookMode_PostNoCopy) } public GameEvents(Handle:event, const String:name[], bool:dontBroadcast) { PrintToServer("Event has been fired (event \"%s\") (nobcast \"%d\")", name, dontBroadcast) }
Należy pamiętam, że normalnie Hook'i Post nie wymaga wartości. Jednakże, parametr event zawsze powinien być równy INVALID_HANDLE. Zatem parametr name musi być stosowany zamiast GetEventName.
UWAGA! Mogą pojawić się w pewnych momentach błędy w tłumaczeniu lub inne drobne błędy. Może to wynikać z mojego lekkiego niedouczenia oraz dziur spowodowanych ch*jowym systemem nauki w szkołach. Krytyka mile widziana (bez przesady ). Za wszystkie błędy bardzo przepraszam :<.
Oryginał: www.wiki.alliedmods.net/Events_(SourceMod_Scripting)
1O co chodzi z tym zwolnione . W oryginale było fired, czyli zwolnione. Nie mogłem znaleźć jakiejś sensownej alternatywy, więc tłumacze to w sensie, że silnik przetrzymuje wydarzenie, a następnie je zwalnia .
2Nie jestem pewien tego tłumaczenia.
#565290 Ciche chodzenie w sklepie, nie znika po zakończeniu rundy
Napisane przez Wolen w 20.08.2013 15:36
#562810 AMX...Brak komend :/
Napisane przez Wolen w 12.08.2013 17:23
#562566 Hosting na serwer 11-13 slotowy AIM
Napisane przez Wolen w 11.08.2013 18:19
#562498 Problem z kompilacją Exp Mod
Napisane przez Wolen w 11.08.2013 13:17
Nie daje sobie ręki uciąć, że to będzie w pełni funkcjonować poprawnie, lecz się kompiluje. Jak coś nie będzie działać to pisz, może mi się uda wtedy poprawić .
Załączone pliki
-
SuperMod.sma 7,6 KB 36 Ilość pobrań
SuperMod.amxx
#562490 Która to jest czesic assassina
Napisane przez Wolen w 11.08.2013 12:56
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: Wolen
- Regulamin