Skocz do zawartości
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek

Najbardziej pomocni


Popularna zawartość

Pokazuje zawartość z najwyższą reputacją od 23.12.2018 we wszystkich miejscach

  1. 9 punktów
    Jak zauważyliście, na forum została dodana nowa ranga - Little Hero Będą ją otrzymywały osoby, które aktywnie udzielają się na forum i pomagają innym użytkownikom i są na dobrej drodze do zostania Supportem 🙂 W odróżnieniu od zwykłego użytkownika, Little Hero posiada następujące przywileje: Możliwość edytowania swoich postów Możliwość dania 20 reakcji (użytkownicy mają 10 reakcji) Możliwość blokowania swoich tematów wgląd do ukrytego działu dla supportów z możliwością komentowania (ale nie zakładania tematów) Rangę otrzymało 3 userów: @Master @Yamakashi @szogun Gratuluję i życzę dalszych sukcesów w naszej społeczności 🙂
  2. 9 punktów
    Melee: weapon_knife weapon_knife_t weapon_knifegg weapon_bayonet weapon_knife_butterfly weapon_knife_falchion weapon_knife_flip weapon_knife_gut weapon_knife_tactical weapon_knife_karambit weapon_knife_m9_bayonet weapon_knife_push weapon_knife_survival_bowie weapon_knife_ursus weapon_knife_gypsy_jackknife weapon_knife_stiletto weapon_knife_widowmaker weapon_axe weapon_spanner weapon_hammer weapon_fists Pistolety: weapon_glock weapon_usp_silencer weapon_p250 weapon_fiveseven weapon_cz75a weapon_deagle weapon_revolver Shotgun: weapon_nova weapon_xm1014 weapon_mag7 weapon_sawedoff SMG: weapon_mac10 weapon_mp7 weapon_mp9 weapon_ump45 weapon_mp5sd weapon_p90 weapon_bizon Karabiny: weapon_ak47 weapon_m4a1 weapon_m4a1_silencer weapon_sg556 weapon_aug weapon_ssg08 weapon_awp weapon_g3sg1 weapon_scar20 Karabiny maszynowe: weapon_m249 weapon_negev Granaty: weapon_molotov weapon_incgrenade weapon_decoy weapon_flashbang weapon_hegrenade weapon_smokegrenade weapon_tagrenade weapon_diversion weapon_firebomb weapon_frag_grenade weapon_snowball Medi-Shot: weapon_healthshot Item: item_kevlar item_assaultsuit item_heavyassaultsuit item_defuser item_nvg Eksplodujące: weapon_c4 weapon_breachcharge
  3. 8 punktów
    W tym poradniku chciałbym możliwie jak najkrócej przedstawić sposób, w jaki można tworzyć menu, a także pokazać mały trik jak przekazywać przez nie informacje. Wykonuję go w oparciu o moje doświadczenie, a więc nie ma w nim zawartych Paneli, czy obsługi blokowania poszczególnych pozycji. Całość przedstawiam w oparciu o nową składnię (1.7+). Menu w SourcePawnie ma swój własny typ danych (methodmapę) - i nazywa się on Menu. Na samym początku musimy utworzyć sobie do niego uchwyt: Menu menu = new Menu(Nazwa_Naszego_Handlera); Od teraz, kiedy będziemy chcieli budować nasze menu, posłużymy się utworzoną zmienną menu. Jak widzimy, w kodzie powyżej widnieje Nazwa_Naszego_Handlera. Otóż kiedy player widzi menu w grze (np. głosowanie na następną mapę), po zapoznaniu się z nim wybiera interesującą go opcję (może wybrać dusta, assaulta...może też zwyczajnie menu zignorować i nie nacisnąć nic). Program musi taką informację odpowiednio przetworzyć i dowiedzieć się, co tak właściwie nacisnął gracz. Cały ten proces odbywa się w tak zwanym Handlerze (pojęcie to będzie jeszcze wykorzystywane w miejscach, gdzie odpowiedź nie pojawia się natychmiastowo, a jest przetwarzana asynchronicznie, jak to ma miejsce w T_SQL). Kolejną rzeczą jest oczywiście nadanie tytułu - gracz musi wiedzieć, dlaczego dane menu widzi :). Służy do tego polecenie: menu.SetTitle("Tutaj wpisujemy nasz tytuł"); Gdybyśmy chcieli sformatować nagłówek (np. pokazać w nim imię danego gracza), musimy zastosować sformatowanego stringa, gdyż SetTitle nie obsługuje tej funkcji: char menuTitleBuffer[128]; Format(menuTitleBuffer, sizeof(menuTitleBuffer), "Witaj %N! Wybierz opcję:", client); menu.SetTitle(menuTitleBuffer); Przy okazji, jeżeli chcemy pobrać imię gracza, nie ma potrzeby korzystania z GetClientName - robi to za nas reguła formatująca %N - w jej miejscu pojawi się nick gracza 🙂 Aby dodać do menu pozycję, korzystamy z polecenia AddItem: menu.AddIitem("id pozycji", "To, co widzi gracz"); Pierwszy parametr to ciąg znaków, służący do identyfikacji itemu Drugi parametr to widoczna dla gracza pozycja w menu. Identyfikator nie musi być unikalny i można wykorzystać go na masę sposobów. Przykład jego zastosowania pokażę na końcu poradnika. Możemy również określić, czy menu będzie posiadało możliwość wyjścia z niego: menu.ExitButton = false; Domyślnie wartość ta jest ustawiona na true. Po przygotowaniu menu musimy je jeszcze wyświetlić (ponieważ nigdzie tego nie zrobiliśmy - to trochę jak przygotowywanie posiłku i podanie go na końcu gościom). Polecenie: menu.Display(client, 120); Pierwszy parametr to id gracza. Drugi parametr to czas, po jakim menu zniknie w razie bezczynności. Istnieje także makrodefinicja, która sprawia, że menu nigdy nie zniknie, jednak nie pamiętam go teraz. Jeśli ktoś je ma, proszę o podesłanie w komentarzu. EDIT: MENU_TIME_FOREVER (dzięki @Qesik i @Brum Brum) W tym momencie menu pokazało się graczowi. Aby przechwycić jego akcję, tworzymy handler, będący funkcją, która w 90% przypadków wygląda następująco: public int Menu_Handler(Menu menu, MenuAction action, int client, int item) { if (action == MenuAction_Select) { char InfoBuffer[32]; menu.GetItem(item, InfoBuffer, sizeof(InfoBuffer)); if (StrEqual(InfoBuffer, "id pozycji 1")) FunkcjaZPozycji1(client); else if (StrEqual(InfoBuffer, "id pozycji 2")) FunkcjaZPozycji2(client); } return 0; } Parametry handlera: menu - identyfikator naszego menu action - określa jaki rodzaj operacji został wykonany (można wybrać pozycję, wyjść z menu etc. Pełna lista: https://sm.alliedmods.net/new-api/menus/MenuAction) client - id gracza, któremu menu wywołaliśmy item - pozycja w menu, którą nacisnęliśmy (numerowane od 0). Można jej użyć zamiast identyfikatora z menu,AddItem (ja dzisiaj jednak będę się posługiwał wspomnianym stringiem). Pierwszą rzeczą, którą robimy, jest sprawdzenie, czy gracz wybrał którąś opcję z menu. W przeciwnym razie nie interesuje nas co dalej się stanie (choć może oczywiście - wyjście z menu może kierować do innego menu itp.) Później identyfikujemy którą opcja została naciśnięta (przez porównanie ciagu znaków). Natrafienie na właściwą opcję przekierowuje nas do odpowiedniej funkcji. Stworzymy teraz prostą funkcję, której zadaniem będzie wyświetlenie wszystkich żywych graczy, a po wybraniu ich z listy - wysłanie do nich powiadomienia na czacie. Aby tego dokonać, musimy wiedzieć, który gracz został wybrany. Może nam do tego celu posłużyć identyfikator z AddItem. Wystarczy, że przekonwertujemy ID gracza na stringa i przekażemy go wraz z pozycją w menu, aby odwrócić proces i odczytać integera i wykonać na wybranym graczu daną operację. Zwróćmy uwagę na bardzo ważną rzecz - nie wiemy, w jakim czasie w przyszłości gracz wybierze pozycję w menu - może to trwać sekundę, może dziesięć minut... . Gdybyśmy przekazali jaki ID identyfikator gracza (client), wybraniec może w czasie, od wywołania menu do wybrania opcji, zwyczajnie wyjść z serwera. Na jego miejsce może wskoczyć inny gracz, co doprowadza do wysłania informacji do niewłaściwej osoby. W naszym przykładzie nie sprawiłoby to większego kłopotu, jednak w pluginach, gdzie precyzja się liczy (np. zapis informacji o graczu w bazie danych) takie działanie może doprowadzić do bardzo niepożądanych skutków. Aby temu zapobiec, będziemy stosować tzw. UserID - unikalny identyfikator gracza na okres trwania serwera. Po starcie pierwszy gracz otrzyma UserID = 1 (lub 0, nieistotne). Kolejny gracz - oczywiście 2. Gdyby jednak gracz nr 1 wyszedł z serwera i połączył się jeszcze raz, otrzyma UserID = 3 (pod warunkiem, że nikt inny nie wszedł na serwer w międzyczasie). Ten właśnie identyfikator będziemy używali, by określić właściwego gracza - i zareagować, jeśli player opuścił już serwer. Do pobierania UserID na podstawie client'a, a także operacja odwrotna - pobranie client'a w oparciu o UserID, służą operacje GetClientUserId oraz GetClientOfUserId. Po wstępie teoretycznym, zajrzyjmy na rezultat końcowy: void MenuPowitalne(int client) { // tworzymy buffery na nick gracza i jego UserID char menuBuffer[MAX_NAME_LENGTH]; char menuOptionBuffer[8]; // tworzymy menu Menu menu = new Menu(MenuPowitalne_Handler); // nadajemy tytuł menu.SetTitle("Kogo chcesz pozdrowić:"); // lecimy pętlą po wszystkich graczach... for (int i = 1; i < MAXPLAYERS; i++) { // odfiltrowujemy niepołączonych graczy i boty... if (!IsValidClient(i) || !IsClientConnected(i) || IsFakeClient(i)) continue; // formatujemy nick... Format(menuBuffer, sizeof(menuBuffer), "%N", i); // userID jako string... Format(menuOptionBuffer, sizeof(menuOptionBuffer), "%d", GetClientUserId(i)); // i dodajemy do menu :) menu.AddItem(menuOptionBuffer, menuBuffer); } // na końcu wyświetlamy menu.Display(client, 120); } // uchwyt do menu public int MenuPowitalne_Handler(Menu menu, MenuAction action, int client, int item) { // jeżeli gracz wybrał pozycję z menu... if (action == MenuAction_Select) { // pobieramy identyfikator z AddItem... char InfoBuffer[8]; menu.GetItem(item, InfoBuffer, sizeof(InfoBuffer)); // zamieniamy go na integera i sprawdzamy poleceniem GetClientOfUserId, czy gracz jest ciagle w grze... int target = GetClientOfUserId(StringToInt(InfoBuffer)); // jeśli gracza nie ma, GetClientOfUserId zwraca zero... if (!target) { PrintToChat(client, "Gracz wyszedł z gry..."); MenuPowitalne(client); return 0; } // od tego miejsca wiemy, że gracz jest dostępny w grze. Możemy go pozdrowić PrintToChat(target, "Pozdrowienia od gracza %N! :)", client); } // na końcu zwracamy 0. return 0; } // Koniec :) Cały proces został wyjaśniony w komentarzach. To by było na tyle. Gdyby pojawiły się pytania i potrzeba rozszerzenia poradnika, z chęcią to zrobię. Zapraszam do dyskusji poniżej. Pozdrowionka! 🙂 @EDIT Po pełny poradnik zapraszam tutaj (angielski): https://wiki.alliedmods.net/Menus_Step_By_Step_(SourceMod_Scripting)
  4. 5 punktów
    Opis Plugin dodaje nową zakładkę w menu admina, która umożliwia przeniesienie gracza do wybranej drużyny. Plugin Master_Admin_Change_Team.sp
  5. 4 punkty
    Aktualizacja -Poprawa Kodu -Tworzenie własnych pojedynków -rożne dodatki do pojedynków Download 1vs1duel.sp 1vs1duel.txt
  6. 3 punkty
  7. 3 punkty
    Opis Plugin pozwala adminowi (flaga BAN oraz ROOT) na oznaczanie graczy, którzy nie posiadają mutacji, bądź zachowują sie niestosownie. Takie osoby będą mutowane każdemu graczowi, który sobie tego zażyczy - służy do tego dedykowane menu Komenda: !mg Preferencje zapisywane jako ciasteczka, natomiast informacje o niegrzecznych graczach trafiają do bazy SQLite 0.2 - dodane informacje o pluginie oraz poprawiono drobny błąd 0.3 - poprawiona nazwa ciasteczka (dzieki plx 😄 ) Download GitHub lub MuteGO.zip
  8. 3 punkty
    Opis: Dodaje rangi csowe pod tabelę od danej ilości pkt. Kod: Download: kento_rankme_ranks.sp
  9. 3 punkty
    całego sp nie dam bo system bansów na 4f posiada jeszcze inne "feature'y" public VerifyInsert(Handle:owner, Handle:hndl, const String:error[], any:dataPack) { if (dataPack == INVALID_HANDLE) { LogToFile(logFile, "Ban Failed: %s", error); return; } if (hndl == INVALID_HANDLE || error[0]) { LogToFile(logFile, "Verify Insert Query Failed: %s", error); new admin = ReadPackCell(dataPack); ReadPackCell(dataPack); // target ReadPackCell(dataPack); // admin userid ReadPackCell(dataPack); // target userid new time = ReadPackCell(dataPack); new Handle:reasonPack = Handle:ReadPackCell(dataPack); new String:reason[128]; ReadPackString(reasonPack, reason, sizeof(reason)); decl String:name[50]; ReadPackString(dataPack, name, sizeof(name)); decl String:auth[30]; ReadPackString(dataPack, auth, sizeof(auth)); decl String:ip[20]; ReadPackString(dataPack, ip, sizeof(ip)); decl String:adminAuth[30]; ReadPackString(dataPack, adminAuth, sizeof(adminAuth)); decl String:adminIp[20]; ReadPackString(dataPack, adminIp, sizeof(adminIp)); ResetPack(dataPack); ResetPack(reasonPack); PlayerDataPack[admin] = INVALID_HANDLE; UTIL_InsertTempBan(time, name, auth, ip, reason, adminAuth, adminIp, Handle:dataPack); return; } new admin = ReadPackCell(dataPack); new client = ReadPackCell(dataPack); if (!IsClientConnected(client) || IsFakeClient(client)) return; ReadPackCell(dataPack); // admin userid new UserId = ReadPackCell(dataPack); new time = ReadPackCell(dataPack); new Handle:ReasonPack = Handle:ReadPackCell(dataPack); decl String:Name[64]; new String:Reason[128]; ReadPackString(dataPack, Name, sizeof(Name)); ReadPackString(ReasonPack, Reason, sizeof(Reason)); if (!time) { if (Reason[0] == '\0') { CPrintToChatAll("%s %N: Permanetnie {darkred}zbanowano{default} gracza {orange}%s{default}.", Prefix, admin, Name); //ShowActivityEx(admin, Prefix, "%t", "Permabanned player", Name); } else { CPrintToChatAll("%s %N: Permanetnie {darkred}zbanowano{default} gracza {orange}%s{default}. (Powód: {purple}%s{default})", Prefix, admin, Name, Reason); } } else { if (Reason[0] == '\0') { CPrintToChatAll("%s %N: {darkred}Zbanowano{default} gracza {orange}%s{default} na {blue}%i minut{default}.", Prefix, admin, Name, time); } else { CPrintToChatAll("%s %N: {darkred}Zbanowano{default} gracza {orange}%s{default} na {blue}%i minut{default}. (Powód: {purple}%s{default})", Prefix, admin, Name, time, Reason); } } LogAction(admin, client, "\"%L\" banned \"%L\" (minutes \"%d\") (reason \"%s\")", admin, client, time, Reason); if (PlayerDataPack[admin] != INVALID_HANDLE) { CloseHandle(PlayerDataPack[admin]); CloseHandle(ReasonPack); PlayerDataPack[admin] = INVALID_HANDLE; } // Kick player if (GetClientUserId(client) == UserId) { if (!time) { if (Reason[0] == '\0')KickClient(client, "<font color='#007bff'>CS-4Frags.pl</font><br /><font color='#ff8300'>Zostałeś permanentnie zbanowany na tym serwerze.</font><br />Admin: <b><u>%N</u></b>", admin); else KickClient(client, "<font color='#007bff'>CS-4Frags.pl</font><br /><font color='#ff8300'>Zostałeś permanentnie zbanowany na tym serwerze.</font><br />Admin: <b><u>%N</u></b><br />Powód: <b><u>%s</u></b>", admin, Reason); } else { if (Reason[0] == '\0')KickClient(client, "<font color='#007bff'>CS-4Frags.pl</font><br /><font color='#ff8300'>Zostałeś zbanowany na tym serwerze.</font><br />Czas: <b><u>%i minut</u></b><br />Admin: <b><u>%N</u></b>", time, admin); else KickClient(client, "<font color='#007bff'>CS-4Frags.pl</font><br /><font color='#ff8300'>Zostałeś zbanowany na tym serwerze.</font><br />Czas: <b><u>%i minut</u></b><br />Admin: <b><u>%N</u></b><br />Powód: <b><u>%s</u></b>", time, admin, Reason); } } //KickClient(client, "%t", "Banned Check Site", WebsiteAddress); } tutaj masz całą funkcję verifyinsert
  10. 3 punkty
    [Opis] Jak nazwa mówi ograniczenie BS'A gdy w CT jest mniej niż 4 osoby grany jest tylko jeden BS. Plugin jest przerobiony na PL. [Instalacja] Standardowa [Download] BSLimiter.sp
  11. 3 punkty
    Opis Plugin pozwala w łatwy sposób dostosować procentową ilość otrzymywanych obrażeń od upadku gracza. Convar Plik: cfg/sourcemod/Reduce_Fall_Damage sm_reduce_fall_damage "0.50" - Ile procent obrażeń ma zadać Plugin Reduce_Fall_Damage.sp
  12. 3 punkty
    public void Hook_OnThinkPost(int iEnt) jak już robisz taką ścianę ifów to proszę zamień to na fora z makrodefinicją. myśl o sobie i osobach to edytujących. rangę aktualizujesz już w tym swoim checkRanks czy jakoś tak więc nie musisz w innych miejscach tego robić 😕 staraj się nie pisać cyferek w kodzie - napisz sobie #define MAX_RANKS 19 i używaj tego 😄 (sam tak kiedyś nie robiłem i teraz jak zaglądam do kodu to cyfra nic nie znaczy, a w słowach jest wszystko pięknie opisane xD) (chyba że robisz jako zlecenie to pisz jak Ci wygodnie 😄) a co do hooków (nie chce mi się analizować całego kodu) możesz wszystko w jednym robić jako checkowanie a najpiękniej by było jakbyś do rankme dodał forward wysyłający info że punkty się zmieniły xd
  13. 3 punkty
    Nauczył się młody ode mnie i od sztangi robić jail cora i do tego osobne dodatkowe pluginy
  14. 3 punkty
    Dziś na alliedmods ktoś poprosił o Knife mod`a na dr stwierdziłem, że mogę to mniej więcej przepisać i zrobić po swojemu. Myślę, że komuś stąd może się kiedyś przydać więc udostępniam też tutaj. Opis: po wpisaniu !knife wyświetla nam się menu z nożami, każdy z nim ma swoje "umiejętności" np. Maczeta ma większy dmg, ale mniejszy speed. Kod: DR_KnifeMod.sp
  15. 3 punkty
    #pragma semicolon 1 #pragma newdecls required #define F3_BUTTON "autobuy" #define F4_BUTTON "rebuy" public void OnPluginStart() { AddCommandListener(MenuOpen); } public Action MenuOpen(int client, const char[] command, int args) { if(!strcmp(F3_BUTTON, command)) { //Funkcję, którą chcesz wywołać return Plugin_Handled; } return Plugin_Continue; } Pamiętaj, że zadziała to tylko, jeśli gracze nie zmieni domyślnych przycisków od sprawdzanych komend.
  16. 2 punkty
  17. 2 punkty
    1. https://forums.alliedmods.net/showthread.php?t=292183 2. 3. 4. https://github.com/Bara/BlockSMPlugins Raczej wszystko dobrze działa
  18. 2 punkty
    //zmienna globalna bool is_used[65]; //po użyciu is_used[client] = true; //przy starcie rundy for(int i = 0; i < 65; i++) is_udes[i] = false;
  19. 2 punkty
    Polecam ten kanał: https://www.youtube.com/channel/UCSqIhkQrzh_QNnALNRpPd1g 😁 (nie odpowie na Twoje pytanie, ale to dobry start)
  20. 2 punkty
    Jak już chcesz hookować wszystkie eventy to wystarczy zrobić tak: public void OnPluginStart() { HookEventEx("player_death", Rank_Hooks); HookEventEx("bomb_planted", Rank_Hooks); HookEventEx("bomb_defused", Rank_Hooks); HookEventEx("bomb_exploded", Rank_Hooks); HookEventEx("bomb_dropped", Rank_Hooks); HookEventEx("bomb_pickup", Rank_Hooks); HookEventEx("hostage_rescued", Rank_Hooks); HookEventEx("vip_killed", Rank_Hooks); HookEventEx("vip_escaped", Rank_Hooks); HookEventEx("round_end", Rank_Hooks); HookEventEx("round_start", Rank_Hooks); HookEventEx("round_mvp", Rank_Hooks); } public Action Rank_Hooks(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); CheckRanks(client); }
  21. 2 punkty
    Ja np robie tak ze konventuje muzyke z yt np https://www.onlinevideoconverter.com/pl/mp3-converter i wrzucam na https://mp3cut.net/ I ucinam momenty kiedy chce i zawsze dziala 🙂
  22. 2 punkty
    Co do rozrzutu to tutaj masz w OnClientThink swego rodzaju eliminator https://github.com/Franc1sco/aimbot/blob/master/scripting/aimbot.sp albo tutaj https://github.com/qubka/Zombie-Plague/search?q=m_aimPunchAngle&amp;unscoped_q=m_aimPunchAngle
  23. 2 punkty
  24. 2 punkty
    Opis Prosty plugin, który umożliwia sprawdzenie przez konsole lub w grze informacji takich jak: IP, kraj, Steam ID. Komenda sm_playerinfo Plugin Master_Player_IP.sp
  25. 2 punkty
    Opis Plugin tworzy logi czatu w folderze sourcemod/logs/ChatLogAS o różnych nazwach w zależności od daty "przedrostek_yyyy-mm-dd". Logi są rozróżniane na następujące kategorie: Dodatkowo jeżeli wiadomość została wysłana z konsoli, a nie przez gracza, to zostaje to odpowiednio oznaczone. Download https://github.com/Avgariat/sourcemod/blob/master/AS_Chat_Log.sp
Tablica liderów jest ustawiona na Warszawa/GMT+01:00
×