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

Najbardziej pomocni


Popularna zawartość

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

  1. 4 punkty
    Jak działają wektory i punkty w przestrzeni 3D? 1. Wprowadzenie - Co to w ogóle jest punkt lub wektor? I. Punkt w przestrzeni trójwymiarowej (3D) posiada trzy liczby określające jego pozycję w przestrzeni. Liczba X określa odległość punktu od środka przestrzeni na osi X (oś ox). Liczba Y określa odległość punktu od środka przestrzeni na osi Y (oś oy). Liczba Z określa odległość punktu od środka przestrzeni na osi Z (oś oz). Taki układ przedstawia nam obraz: Jak widzimy, każda oś odpowiednio x, y oraz z odpowiada za przesunięcie punktu u . Działając na osi x przesuwamy punkt u od przodu do tyłu, oś y pozwala nam na przesunięcie punktu na prawo lub na lewo, natomiast oś z w górę lub w dół. Załóżmy, że chcemy napisać gdzie dokładnie znajduje się nasz punkt u w przestrzeni. Zapisujemy to w następujący sposób: Teraz żeby określić dokładną odległość, za literki x, y, z podstawiamy liczby II. Wektor jest to matematyczny obiekt posiadający własności takie jak: długość, zwrot. Podobnie jak punkt, wektor określa się za pomocą trzech wartości, które również można zapisać jako: W tym przypadku taki zapis nie oznacza punktu w przestrzeni 3D ale wektor przeniesienia w jakim kierunku i z jaką siłą coś zostało przeniesione. Także zapis może być identyczny, lecz to w jaki sposób go pobierzemy/wykorzystamy w kodzie programu definiuje jego zawartość. Kilka wzorów : - Aby obliczyć długość wektora musimy skorzystać ze wzoru √(a2^+b^2+c^2) [słownie: pierwiastek z a do kwadratu dodać b do kwadratu dodać c do kwadratu] - Wektor możemy określić również przez dwa punkty w przestrzeni. Jego początek i jego koniec. Spójrzmy jeszcze raz na obrazek W takim przypadku gdy punkt wyjściowy układu (0,0,0) jest równy początkowi wektora, łatwo możemy obliczyć czarny wektor na rysunku ponieważ wzór wynosi: (x2 - x1, y2 - y1, z2 - z1), gdzie odpowiednio (x1, y1, z1) oraz (x2, y2, z2) to punkt początkowy i punkt końcowy wektora. Musimy jednak pamiętać, że wektor w przestrzeni 3D nie zawsze ma swój początek w (0,0,0). 2. Po co nam taka wiedza w sourcemodzie? Każdy obiekt w CS:GO ma swój origin, czyli punkt w przestrzeni który określa gdzie się on znajduje. A takowymi przestrzeniami są mapy w CS:GO. Każda mapa jest osadzona w jakiejś przestrzeni 3D i każdy obiekt na tej mapie posiada origin, tablicę z trzema wartościami (x, y, z) by określić w jakim miejscu się znajduje. Jeśli chodzi o wektory, to każdy obiekt ma dwa wektory określające jego "zachowanie" w grze. Pierwszy to velocity(dosłownie prędkość) i określa on z jaką mocą poruszamy się w jakim kierunku czy to chodząc klawiszami WSAD czy spadając z wysokości czy skacząc (to samo tyczy się zwykłych obiektów takich jak bronie na ziemi). Drugi wektor to angle czyli wektor kąta/obrotu obiektu. Nie jest to typowy wektor opisany powyżej, po prostu to w którą stronę obrócony jest obiekt określają te trzy wartości (x, y, z). 3. Praktyczne zastosowanie GetClientAbsOrigin / GetClientAbsAngles / GetClientEyeAngles Zgodnie z dokumentacją dzięki tym funkcjom możemy pobrać podstawowe wartości dotyczące wektorów graczy. Wszystkie trzy wyglądają mniej więcej tak: W każdym przypadku potrzebujemy indeksu klienta oraz tablicy zawierającej trzy miejsca. Do tablicy podanej w funkcji zostaje przekazana dana wartość, wektor zawierający trzy liczby z przecinkiem. Co możemy zrobić z tymi wartościami? Pluginy na teleportacje, zatrzymywanie graczy na respawnie, efekty odurzenia, aimbota i dużo innych. Przykład praktyczny: Pamiętajmy jednak, że nie da się tak łatwo przeteleportować gracza po osiach Ox i Oy, ponieważ miejsce i zwrot środka układu jest zawsze takie samo i nie obraca się ono zgodnie z graczem. Więc jeśli od pobranej wartości origin odejmiemy -5 z [0] (oś Ox) to nie przeniesie gracza w lewo względem jego pozycji, tylko względem ustawienia środka układu! Bibliografia Tutorial powstał z pomocą https://pl.wikipedia.org/wiki/Wektor oraz moją szczątkową wiedzą i doświadczeniem w tym zakresie *Uprasza się o nie kopiowanie poradnika bez wcześniejszego zapytania autora o zgodę
  2. 3 punkty
    Łatwy sposób na testowanie pluginów 1. Przechodzimy do folderu gdzie mamy zainstalowany steam 2. Przechodzimy steamapps/sourcemods/ 3. Wrzucamy zawartość załącznika CSGO + SM.7z do /sourcemods/ 4. Wgrywamy tam najpierw Metamoda potem Sourcemoda (tutaj tutorial na ten temat) 5. Uruchamiamy ponownie Steam 6. Wchodzimy do biblioteki gier 7. Ustawiamy dla gry "CSGO + SM" w parametrach startowych -insecure 8. Końcowy układ folderów powinien wyglądać tak: Dzięki temu mamy "osobną" grę CS:GO gdzie możemy testować pluginy LOKALNIE UWAGA Byłoby miło całej ekipie GO-Code.pl jeśli skorzystasz z CSGO + SM by GO-Code.pl.7z zamiast podanego wyżej CSGO + SM. Ta paczka zawiera reklamę naszego forum i za każdym razem gdy będziesz testował pluginy dasz znać znajomym o naszym forum 🙂 (ponieważ gra nazywa się "CSGO + SM by GO-Code.pl" zamiast samego "CSGO + SM") UWAGA2 Ten poradnik jest skopiowany słowo w słowo z tego postu napisanego przez @mastah7991 za jego pozwoleniem. Uznałem że jest to na tyle wygodny sposób że zasługuje on na osobny temat
  3. 2 punkty
    Tyle w temacie #teamWęgielek
  4. 2 punkty
    Opis Plugin umożliwia wpisanie na czacie komend !pomoc / !help / !komendy która otwiera menu z wyborem Linki / VIP / Ranking / Sklep / Menu rang / Opcje i inne. Download H2K_MenuPomocy.sp UWAGA Plugin skopiowałem z tematu o prośbę o znalezienie pluginu w razie gdyby temat się gdzieś zagubił no i dla łatwiejszego wyszukania
  5. 2 punkty
    Wybaczcie mu, w jego stronach nie wiedzą, co to znaczy professional. Mamy stamtąd domenę i codziennie o 1 w nocy widać jak ładnie wszystko chodzi. Dedukcyjność też nie jest mocną stroną naszego hostingu. 😉 BTW
  6. 2 punkty
    Na dniach dam nową wersję ;) I podmienię SP w tym temacie.
  7. 2 punkty
    😠 Angry boi Proszę zajmować się poważnymi sprawami pozdrawiam cieplutko XD Poczekam jeszcze może się jakieś błędy znajdą i poprawię o ile znajdę .psd 😄
  8. 1 punkt
    Opis: Dodaje sklep pod komendy !shop !sklep !drshop !drsklep Co posiada sklep? To co na ss Sklep jest pod MySQL, aby sklep działał należy dodać to do databases.cfg "DRShopDB" { "driver" "default" "host" "IP do bazy danych" "database" "nazwa bazy danych" "user" "użytkownik bazy danych" "pass" "Hasło do waszej bazy" //"timeout" "0" //"port" "0" } Sklep jest przygotowany pod -> KOD: Przykład modułu Dodatkowe info: Jak ktoś chce mieć 2 sklepy np. Ten i Zephrus wystarczy z tego usunąć RegConsoleCmd("sm_shop"); oraz RegConsoleCmd("sm_sklep); Dziękuje Magnetowi za pomoc przy MySQL 😉 dr_shop.inc ADEPT_Deathrun_Shop_Module.sp ADEPT_Flashbang.sp ADEPT_Health.sp ADEPT_Invisible.sp ADEPT_LowGravity.sp ADEPT_Respawn.sp ADEPT_Smoke.sp
  9. 1 punkt
    😠 Nie pozwala dodać bez treści edit: ten moment kiedy chcesz zapytać jakiego koloru forum używasz:
  10. 1 punkt
    Jak coś znalazłem coś takiego działa tak w połowie być może się wam przyda https://forums.alliedmods.net/showthread.php?p=1260669#post1280741
  11. 1 punkt
    Opis: Dodaje autorespawn dla ct przez pierwsze X sekund od startu rundy. Jak to mniej więcej wygląda KOD: ADEPT_AutoSpawnCT.sp
  12. 1 punkt
    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
  13. 1 punkt
    Hi 😄 Oto mały kodzik do tworzenia kolorowych latarek float playerPos[3]; float playerAng[3]; GetEntPropVector(client, Prop_Send, "m_vecOrigin", playerPos); GetEntPropVector(client, Prop_Send, "m_angRotation", playerAng); entlight = CreateEntityByName("light_dynamic"); if (entlight != -1) { DispatchKeyValue(entlight, "_light", "0 132 255"); DispatchKeyValue(entlight, "brightness", "5"); DispatchKeyValueFloat(entlight, "distance", 2400.0); DispatchKeyValueFloat(entlight, "spotlight_radius", 200.0); DispatchKeyValueFloat(entlight, "_inner_cone", 0.0); DispatchKeyValueFloat(entlight, "_cone", 360.0); DispatchSpawn(entlight); TeleportEntity(entlight , playerPos, playerAng,NULL_VECTOR); SetVariantString("!activator"); AcceptEntityInput(entlight, "SetParent", GetEntPropEnt(client,Prop_Send,"m_hViewModel"), entlight, 0); } Inputs: https://developer.valvesoftware.com/wiki/Light_dynamic wyłączanie/włączanie światła: AcceptEntityInput(entlight, "Toggle"); udostępniacie takie fajne rzeczy to też chciałem coś udostępnić xD z mojej krainy zabawek @edit Limit dynamicznych świateł na mapie to 17
  14. 1 punkt
    [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
  15. 1 punkt
    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
  16. 1 punkt
    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)
  17. 1 punkt
    Najprościej używają Audacity, stosująć częstotliwość 44100: potem tylko wyeksportuj jako mp3 (wymagane rozszerzenie, chyba nazywało się LAMP czy jakoś tak. Wujek google poprowadzi) Ponadto, jeśli nie wiesz, czy dany dźwięk zadziała w grze, można użyć polecenia konsolowego play
  18. 1 punkt
    Aktualizacja -Poprawa Kodu -Tworzenie własnych pojedynków -rożne dodatki do pojedynków Download 1vs1duel.sp 1vs1duel.txt
  19. 1 punkt
    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
  20. 1 punkt
    Opis: Jak zostanie dwóch ostatnich graczy 1 TT oraz 1 CT pojawia się głosowanie czy ma się odbyć pojedynek na noże. Kod: ADEPT_KnifeDuel.sp
  21. 1 punkt
    Na aktualnej wersji nie ma możliwości korzystania z MP5-SD. Wystarczy jednak mała poprawka - w funkcji WeaponCanUse dodajemy: switch(weaponindex) { case 23: strcopy(weapons, sizeof(weapons), "weapon_mp5sd"); // <--- dodajemy tą linijkę do switcha case 60: strcopy(weapons, sizeof(weapons), "weapon_m4a1_silencer"); ...... i śmiga 🙂
  22. 1 punkt
    Jeżeli spędziłeś już trochę czasu na programowaniu w pawnie, na pewno natknąłeś się na funkcje, które pobierają dane z innych pluginów, np. cod_get_user_class, które zwróci ID postaci, na której aktualnie gramy. Warto zauważyć, że owe informacje wychodzą bezpośrednio z silnika cod moda - następuje więc tutaj bezpośrednia wymiana informacji pomiędzy pluginami. W tym poradniku zajmiemy się po krótce tym zagadnieniem. 1. Funkcje natywne Działanie "natywów" sprowadza się do zdalnego wywołania funkcji i ewentualnego zwrócenia rezultatu: 0 - Nasz plugin posiada funkcję natywną szarego pluginu I - zlecamy wykonanie funkcji II - szary plugin wykonuje polecenie III - szary plugin zwraca otrzymany rezultat IV - rezultat trafia do naszego pluginu Teraz pokażę jak takiego natywa z szarego pluginu stworzyć. Przede wszystkim natywy dodajemy w takiej funkcji: public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) Daje nam to pewność, że załadują się one w odpowiedniej chwili. Warto wspomnieć, że natywy możemy wczytywać pojedynczo, bądź jako biblioteka - tworzyć nasze własne pliki #include. W tym poradniku skupię się tylko na tej drugiej metodzie. Musimy więc najpierw zarejestrować naszą bibliotekę: RegPluginLibrary("NaszaNazwa"); następnie dodajemy natywy w następujący sposób: CreateNative("nazwa_natywu", Funkcja_Ktora_Ma_Sie_Wywolac); na samym końcu zwracamy: return APLRes_Success; Teraz pora na Funkcja_Ktora_Ma_Sie_Wywolac. Natywy pozwalają nam również na bezproblemowe przekazywanie argumentów, jednak funkcja, o której przed chwilą wspomniałem, nie może po prostu tych argumentów przyjmować w nawiasach () - działa to w trochę inny sposób: public int Funkcja_Ktora_Ma_Sie_Wykonac(Handle plugin, int numParams) { int liczba = GetNativeCell(1); return liczba * 2; } po pierwsze, argumenty muszą być takie, jak wyżej - Handle plugin (uchwyt to NASZEGO pluginu), a także numParams (ilość parametrów, które przekazaliśmy) Pobieranie argumentów odbywa się poprzez specjalne funkcje GetNative___ (polecam po prostu wpisać sobie "getnative" a także "setnative" w dokumentacji). Każdorazowo pierwszy argument GetNative__ to numer argumentu z naszego wywołania (wyjątkowo numerujemy tutaj od 1!) W przykładzie powyżej założyłem, że przekazany zostanie jedynie int, który zostanie przemnożony przez 2 i zwrócony. Przykładowe zastosowanie: Pamiętajmy jednak, że ciągle nie stworzyliśmy biblioteki GoCode! Będzie ona wyglądać mniej więcej tak: Tak przygotowany plik możemy zapisać jako GoCode.inc i wrzucić do naszego folderu include w kompilatorze. Koniec 🙂 2. Forwardy (coming soon)
  23. 1 punkt
    Opis Plugin dodaje kontakt na serwer Konfiguracja Kontakt możemy edytować w addons/sourcemod/configs/kontakt.txt Komendy sm_kontakt Instalacja Standardowa Download addons.7z kontakt.sp
  24. 1 punkt
    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
  25. 1 punkt
    Wstęp Poradnik pisany na podstawie https://wiki.alliedmods.net/Building_SourceMod Ładnie jest tam to opisane, ale korzystając tylko z tamtego artykułu nie udało mi się skompilować, musiałem szukać rozwiązań w internecie, z stąd ten poradnik 🙂 Dla tych co chcą kompilować na Windowsie zostaje jedynie powyższy artykuł. Cały proces przeprowadziłem na Antergosie x64 (Arch) Instalacja bibliotek oraz kompilatora Arch: sudo pacman -S git python clang gcc-multilib lib32-glibc lib32-libstdc++5 lib32-zlib Debian/Ubuntu: sudo apt-get install clang sudo apt-get install lib32stdc++-4.8-dev sudo apt-get install lib32z1 lib32z1-dev sudo apt-get install libc6-dev-i386 libc6-i386 Przygotowanie AMBuild Wpierw pobieramy najnowszy ambuild z repozytorium: git clone --recursive https://github.com/alliedmodders/ambuild.git Następnie przechodzimy do folderu z kodem: cd ambuild Instalujemy sudo python setup.py install Wracamy do katalogu wyżej: cd .. Kompilacja Tak samo jak w przypadku ambuild najpierw pobieramy najnowszy kod z repozytorium (--recursive jest tutaj bardzo ważne aby zassało nam biblioteki zależne takie jak amtl): git clone --recursive https://github.com/alliedmodders/sourcemod.git Pobieramy SDK które potrzebne są do interakcji sourcemod'a z srcds danego moda: source sourcemod/tools/checkout-deps.sh Przechodzimy do katalogu z kodem: cd sourcemod Tworzymy nowy folder do zbudowania sourcemod'a oraz przechodzimy do niego: mkdir build cd build Teraz konfigurujemy proces budowania: CC=clang CXX=clang++ python ../configure.py Wreszcie odpalamy kompilacje 🙂 : ambuild Skompilowany sourcemod pojawi się w folderze package w naszym folderze do budowania Dodatkowe informacje configure.py posiada wiele przydatnych parametrów, pełną listę wraz z opisem uzyskamy wpisując: python configure.py --help Jeśli chcemy skompilować kod przy pomocy innego kompilatora wystarczy że w procesie konfiguracji ustawimy go, np. dla g++: CC=gcc CXX=g++ python ../configure.py Istnieje jednak możliwość że będziemy musieli wtedy edytować kod, bądź dodać dodatkowe flagi kompilacji, sourcemod oficjalnie jest kompilowany na clang'u
Tablica liderów jest ustawiona na Warszawa/GMT+01:00
×