Jump to content
assignment_ind Existing user? Sign In

Sign In



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

Recommended Posts

jak dobrze wiemy każdy, kto nauczył się dobrze wykonywać jakąś czynność (czy to gra na gitarze, żonglowanie, czy gotowanie) musiał przejść przez długą drogę w celu osiągnięcia wysokiego poziomu. Nie inaczej sprawa ma się z programowaniem - każdy musi popełniać masę błędów, aby się na nich uczyć i wyciągać odpowiednie wnioski.

Okazuje się jednak, że są pewne rzeczy, które wydaje nam się, że robimy poprawnie, jednak rzeczywistość potrafi być zgoła inna - mowa tutaj o błędach, które popełniamy, mimo iż myślimy, że wszystko tworzone jest zgodnie ze sztuką.

 

W tym temacie chciałbym, abyśmy podzielili się swoimi spostrzeżeniami - jakie są najczęstsze błędy, które popełniamy, pisząc programy ?(oczywiście mowa o SourcePawnie ? ). Będzie to doskonałe źródło wiedzy i zarazem miejsce, do którego będzie można wracać za każdym razem, gdy napotkamy problem, lub będziemy chcieli eliminować po kolei popełniane błędy.

Wypadałoby, żebym od czegoś zaczął, więc oto błąd, który moim zdaniem pojawia się dość często:

Kiedy tworzymy operacje, które mają się wykonać za jakiś czas w przyszłości (np. Timer, naciśnięcie przycisku w menu przez gracza, callback z zapytania SQL), które wymagają przekazania identyfikatora gracza (dobrze nam znane "client"), zazwyczaj popełniamy w tym miejscu błąd, ponieważ podczas tego interwału player może wyjść z serwera, a na jego miejsce wskoczyć nowy... więcej o tym zjawisku (i jak z nim walczyć), mówię tutaj:

 

 

A jakie są Wasze spostrzeżenia? Sprawmy, aby to forum było wszystkim, czego potrzebuje osoba, która chce zacząć przygodę z SM!

 

Pozdrowionka!

  • Lubię to! 3

Share this post


Link to post
Share on other sites

Najważniejszym błędem jest brak analizy swojego kodu tylko robienie na pośpiech, kopiowanie podobnego kodu ze swoich innych pluginów, lub z neta oraz jak napisałeś

3 godziny temu, MAGNET napisał:

(np. Timer, naciśnięcie przycisku w menu przez gracza, callback z zapytania SQL), które wymagają przekazania identyfikatora gracza (dobrze nam znane "client"), zazwyczaj popełniamy w tym miejscu błąd, ponieważ podczas tego interwału player może wyjść z serwera, a na jego miejsce wskoczyć nowy...

 

Wszystko to powoduje coś takiego jak:

  • Niepoprawne działanie pluginu.
  • Większość czasu spędzimy nad naprawą błędu a mogliśmy to napisać sami bez problemów z umysłem.
  • Możliwość SQL_Injection poprzez kopiowanie tej samej metody bazy danych do każdego pluginu.

 

Taka rada na przyszłość, nie liczy się szybkość zlecenia ale jego jakość, nigdy nie róbcie wszystkiego na szybko, analizujcie kod i spędźcie nad nim tyle czasu ile on wymaga.

  • Lubię to! 4

Share this post


Link to post
Share on other sites

Jednym z częstszych popełnianych błędów jest łączenie starej i nowej składni. Nie spotkałem się jeszcze z polskim objaśnieniem różnić pomiędzy starą, a nową składnią.

  • Lubię to! 2

Share this post


Link to post
Share on other sites

Indeksy. Za duży bufor, za mały bufor. Bufory powinny być odpowiednie, czyli minimum ile dana zmienna powinna być zmieścić, ani bita więcej bo w drastycznych przypadkach to i skutkuje skokami varu, a za mały bufor spowoduje błąd i niepoprawne działanie pluginu. 

  • Lubię to! 2

Share this post


Link to post
Share on other sites
1 godzinę temu, supertimor napisał:

Indeksy. Za duży bufor, za mały bufor. Bufory powinny być odpowiednie, czyli minimum ile dana zmienna powinna być zmieścić, ani bita więcej bo w drastycznych przypadkach to i skutkuje skokami varu, a za mały bufor spowoduje błąd i niepoprawne działanie pluginu. 

Umiejętność poprawnego doboru rozmiaru buffera wymaga lekkiej wprawy, ale nie jest to aż takie trudne. O ile konsekwencje zastosowanie zbyt małego "schowka" jest dość oczywiste, o tyle nie wiem co masz na myśli mówiąc o "skokach varu". Mógłbyś doprecyzować?

Share this post


Link to post
Share on other sites

Przy dużej ilości pluginów np w codmodzie, gdy pluginy używają dużo więcej pamięci niż potrzeba - wiadomo, pamięć ucieka, czego skutkiem mogą być skoki varu, o czym przekonałem się kiedyś na początku mojej przygody z kodowaniem, tj. gdy powstawał surf+klasy

/ Ofc dzisiaj problemu z tym nie mam, jednak wspominam o przeszłości dla potomnych ? 

Edited by supertimor

Share this post


Link to post
Share on other sites

1. Jak trzeba podać rozmiar tablicy, podają o jeden punkcik mniej, przykład:

char name[64];

Format(name, 63, "mójNick");

Gdzie prawidłowa forma to:

char name[64];

Format(name, 64, "mójNick");

A najlepszym nawykiem jest:

char name[64];

Format(name, sizeof(name), "mójNick");

2. Plugin niedostosowany do załadowania/wyładowania w trakcie gry. Warto w OnPluginStart wywoływać takie wydarzenia jak OnClientAuthorized, OnClientPutInServer itd., a w OnPluginEnd wywoływać OnClientDisconnect. Mega mało ludzi tak robi, bo nauczeni są restartować serwer przy wgraniu pluginu, źleeee. Co za tym idzie drugi błąd, ale pozwolę sobię go opisać, czyli pośrednie zapytanie SQL (threaded query) w OnPluginEnd. Niestety ale wtedy do zapisu może nie dojść.

3. Na siłę używanie bezpośrednich zapytań SQL (non-threaded query) bądź korzystanie ze SQLite, bo działają natychmiastowo. Niestety ale zapytania bezpośrednie potrafią nieźle zamulić serwer. Dopuszcza się używanie ich wtedy, kiedy np. dane zapisywane są przy wyładowaniu pluginu o czym napisałem wyżej, jednak kiedy jest okazja warto zawsze korzystać z "SQL_TQuery". SQLite jest dobre o ile jest tam dość mało danych, nie opłaca się używać SQLite kiedy dane są przypisane do np. graczy, wtedy przepełnienie bazy następuje dosyć szybko, a co za tym idzie serwer doznaje pojedynczych ścinek które trwają nawet po 0.5s, czyli jest to bardzo dokuczliwe.

 

  • Lubię to! 3
  • Dobry pomysł! 1

Share this post


Link to post
Share on other sites
Dnia 19.04.2019 o 00:14, Master napisał:

Jednym z częstszych popełnianych błędów jest łączenie starej i nowej składni. Nie spotkałem się jeszcze z polskim objaśnieniem różnić pomiędzy starą, a nową składnią.

halo?

 

 

Czysty kod:
1. Za mało/za dużo komentarzy

2. Niepoprawne nazewnictwo zmiennych/funkcji

3. Boby takie jak:

1. if ( true ) {}
2. if (cos) { cos; } else { cosinnego; }

4. Nieumiejętne wcięcia / entery (czytelność kodu)

5. Brak metodologii Don't Repeat Yourself

6. Rozsądne używanie klamer { }

7. Łączenie if'ów, pamiętając, że warunki sprawdza się od lewej do prawej czyli jeśli jest coś w stylu if (war1 && war2 && war3) to możemy zoptymalizować if'a dając na sam początek warunki odrzucające jak najwięcej przypadków lub te zabierające jak najmniej czasu

  • Lubię to! 2
  • Dobry pomysł! 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.


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...