Jump to content
assignment_ind Existing user? Sign In

Sign In



person_add Sign Up
Go-Code.pl - Support SourceMod i Pluginy CS:GO

Search the Community

Showing results for tags 'tutorial'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Categories

  • Errors in compiler
  • Warnings in compiler
  • Fatal errors in compiler

Forums

  • Nasze Sprawy
    • Nowości
    • Dyskusje
    • Propozycje
    • Przywitaj się!
  • Sourcemod Scripting
    • Artykuły, poradniki, tutoriale
    • Pytania na temat kodowania
    • Problem z kodem pluginu
    • Prośby o przerobienie pluginu
    • Gotowe funkcje
    • Koduj z Magnetem
  • Konfiguracja pluginów
    • Artykuły, poradniki i tutoriale
    • Szukam pluginu
    • Duże modyfikacje
    • Zbiór pluginów
    • Extensions
    • Gotowe paczki serwerowe
  • Konfiguracja serwera
    • Artykuły, poradniki, tutoriale
    • Pytania
    • Problemy
    • Ochrona
    • Metamod
  • Counter-Strike: Global Offensive
    • Nowości
    • Artykuły, poradniki, tutoriale
    • Pytania
    • Problemy
    • Pliki
    • Wasza twórczość
    • Publikacje serwerów
  • Hostingi serwerów
    • Oferty firm
    • Opinie o hostingach
    • Pytania
  • Plac zabaw
    • Luźne rozmowy
    • Szukam ekipy
    • Rynek
    • Opinie o ludziach
    • RoundSoundy
  • Archiwum
    • Przestarzałe tematy
    • Kosz

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


O mnie

Found 4 results

  1. Korzystając ze strony CSGO Models i pobierając z niej skiny zauważyłem, że składają się one z wielu pomniejszych plików, których pobieranie muszę wymuszać graczom przez AddFilesToDownloadsTable. Z racji, iż jest to strasznie upierdliwe zadanie (szukanie wszystkich ścieżek), można na serwer wgrać plugin, który będzie pobierał całą zawartość folderu. Ja jednak stwierdziłem, że napiszę prosty skrypcik, który wszystkie ścieżki będzie rekurencyjnie pobierał i wypluwał ładny wynik, który po prostu kopiuj/wklejam do OnMapStart Jest to skrypt pythonowy, który działa najzwyczajniej w świecie tak, że rekurencyjnie przeszukuje wszystkie foldery w lokalizacji w której obecnie się znajduje i wypisuje ich pełną ścieżkę, dodając potrzebne przedrostki 'AddFiles.......' Step by step: 1. Utwórz sobie na pulpicie nowy folder o dowolnej nazwie i wrzuć do niego skrypt oraz foldery 'models' i 'materials' ze strony CSGO Models, lub dowolnej innej, której modele mają mnóstwo pomniejszych plików 2. Wejdź do folderu i odpal skrypt 3. Skopiuj wynik 4. elo Przykładowo, przeprowadzając tę procedurę na tym modelu otrzymałem następujący wydruk z konsoli: run.py
  2. 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ę
  3. Witam Dzisiaj pokaże wam jak w łatwy sposób dodać rounde paintball do arenek A więc potrzebujemy plugin paintball pobieramy go stąd https://forums.alliedmods.net/showthread.php?t=287879 I instalujemy jak normalne pluginy Następnie przechodzimy do addons/sourcemod/config/paintball/weapons I robimy by wyglądało to tak "Paintball-guns" { "weapon_mp7" { "price" "300" "auto" "1" "bullet-speed" "1600.0" "bullet-gravity" "0.2" "accuracy" "40.0" "jump-accuracy" "200.0" "running-speed" "1.0" "reload-speed" "1.6" "switch-guns-speed" "0.9" "shot-delay" "0.05" } resztę usuwamy i zapisujemy Następnie przechodzimy do pliku addons/sourcemod/config/multi1v1_customrounds.cfg I tworzymy swoją rounde "Paintball" { "name" "Paintball" "ranked" "1" "ratingFieldName" "mp7Rating" "optional" "1" "enabled" "0" "armor" "1" "helmet" "1" "health" "100" "weapons" { "weapon_knife" "" "weapon_mp7" "" } } I po zmianie mapy /resetnieciu serwera wszystko będzie śmigać w razie pytań pytajcie ?
  4. 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ę

O NAS Jesteśmy społecznością łączącą ludzi, którzy dzielą pasję poznawania CS:GO od strony programistycznej. Posiadamy duże zaplecze merytoryczne i zawsze cieszymy się, gdy dołączają do nas osoby gotowe do nauki. Gwarantujemy, że z odrobiną wytrwałości i otwartym umysłem bardzo szybko napiszesz swój pierwszy plugin. Zapraszamy! 🙂
Szablon wykonany z dużą ilością przez cyberpixelz / Mesharsky / Sitefuture
Forum dumnie napędzane przez: Invision Power Services, Inc.
×
×
  • Create New...