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

Tablica liderów


Popularna zawartość

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

  1. 5 punktów
    https://www.youtube.com/watch?v=42BcZh6brDE If - funkcja warunkowa; kod znajdujący się w jej środku wykona się tylko wtedy, jeżeli podany przez nas warunek jest prawdziwy if (tutaj podajemy nasz warunek) { // ciało warunku } if (true) { // wykona się zawsze, ponieważ powiedzieliśmy bezpośrednio programowi że warunek jest "prawdziwy" } Operacje: 1. Znak równości (==) - zwróci prawdę, jeśli wyrażenia stojące po jego lewej i prawej stronie są identyczne Przykład: int a = 5; // tworzymy zmienną o wartości 5 if (a == 5) { // warunek jest prawdziwy, ponieważ a jest równe 5... } 2. Negacja (!) - zaprzecza warunkowi, który postawiliśmy: int a = 8; if (a != 5) { // zmienna a nie wynosi 5, więc warunek jest prawdziwy :) } Hint: Jeśli chcielibyśmy sprawdzić, czy wartość danej zmiennej wynosi zero, możemy to zrobić na dwa sposoby: // 1. zwyczajnie przyrównujemy wartość a do zera... if (a == 0) { } // 2. Negujemy a. Można to sobie tłumaczyć dosłownie "jeśli nie ma 'a'", a więc jeśli jej wartość wynosi równo 0 if (!a) { } // metoda numer 2 każe nam wnioskować, że zastosowanie takiego zapisu: if (a) { } // spowoduje, że warunek wykona się, jeśli a ma wartość RÓŻNĄ od zera. Słownie: "jeśli w 'a' coś jest". Może to być wartość 1, -1, 1024, -214124...chyba zrozumiałe :) 3. Koniunkcja (operacja AND ) - wykona się, jeśli wartości po jej lewej i prawej stronie są prawdziwe: int a = 10; int b = 5; // jeśli zmienna 'a' wynosi 10 I JEDNOCZEŚNIE zmienna 'b' wynosi 5, warunek jest spełniony. Wymagane są obydwa if (a == 10 && b == 5) { } 4. Alternatywa (operacja OR [lub]) - wykona się, jeśli przynajmniej jedna z wartości jest prawdziwa: int a = 10; int b = 5; // wykona się, ponieważ pomimo że a nie wynosi 31, b już ma wartość zgodną z założeniem if (a == 31 || b == 5) { } else, else if - używamy ich, kiedy chcemy wykonać inną akcję, w momencie, gdy nasz if nie zostanie spełniony. W takiej konstrukcji na samym początku zawsze jest JEDEN if, następnie używamy tyle else ifów ile tylko chcemy, a następnie na samym końcu możemy opcjonalnie (nie jest to wymagane) postawić else, który spowoduje, że jeśli żadna z przedstawionych powyżej alternatyw się nie wykona, funkcja wejdzie do ciała 'else' if (pierwszy warunek) { } else if (drugi warunek) { } ... else { // tutaj wchodzi, jeśli żaden z powyższych if'ów się nie wykona } Jest jeszcze jedna ważna rzecz, której nie zaakcentowałem wystarczająco mocno w filmie: jeżeli funkcja wejdzie do któregoś ciała w naszej "choince" 'if'---'else if'---'else', na pewno nie wejdzie do pozostałych. Przykład: int a = 10; // tworzymy sobie zmienną // oczywiście wejdzie do środka... if (a == 10) { } else if (a > 5) { // pomimo że ten warunek również jest prawdziwy, funkcja weszła już do ciała warunku powyżej. Oznacza to, że dalsze alternatywy nie będą już rozpatrywane } GetClientHealth - pobiera zdrowie gracza SetEntityHealth - ustawia nową wartość zdrowia (niekoniecznie graczowi - może to zrobić jakiemukolwiek innemy bytowi, który jest do tego "zdolny") GetUserFlagBits - pobiera wszystkie flagi danego gracza w formie bitowej (nie masz zielonego pojęcia o co chodzi? Ten temat Ci wszystko rozjaśni 🙂)
  2. 2 punkty
    KOMPEDIUM WIEDZY O BITACH, OPERACJACH BITOWYCH I ZASTOSOWANIU W PRAKTYCE Jeśli masz już jakieś doświadczenie z programowaniem, niezależnie czy jest to pawn, C czy inny język, na pewno na trafiłeś na takie pojęcie, jak "flaga" w pluginie/skrypcie etc. Masz też zapewne świadomość do czego taka flaga służy Przykładowo, w poradniku Vasto o timerach mamy do czynienia z flagami timera, np. UchwytNaszegoTimeru = CreateTimer(99999.9, FunkcjaKtoraSieWywola, INVALID_HANDLE, TIMER_REPEAT); czwarty argument funkcji CreateTimer mówi nam, że timer będzie cyklicznie wywoływał podaną funkcję dopóki go nie 'zabijemy' (KillTimer). Idea wydaje się być prosta - funkcja działa tak, jak jej rozkażemy. Nieco wyżej pojawia się jednak takie wywołanie: CreateTimer(1.0, FunkcjaKtoraSieWywola, GetClientUserId(client), TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE); Czy potrafisz wyjaśnić, co tutaj się dzieje? Na pewno domyślasz się, że timer wykona się wraz ze wszystkimi trzema flagami, jednak rozłożenie tego na czynniki pierwsze wydaje się być dosyć enigmatyczne. Okazuje się jednak, że nie jest to wcale takie straszne. Wymaga to dobrego zrozumienia, jednak na pewno zapunktuje w przyszłości. Postaram się wyjaśnić to tak dobrze, na ile tylko będę w stanie. Przygotuj sobie jakieś jedzenie i do roboty! Część I - jak zapisujemy liczby? Podstawą tutaj jest dwubitowa architektura komputerów. Oznacza to, że dane w pamięci reprezentowane są w postaci logicznej prawdy (1 - jedynka logiczna), lub fałszu (0 - zero logiczne). Kiedyś nieodzownym było operowanie właśnie na pamięci w takiej formie, jednak z czasem zaczęły powstawać języki programowania, które pozwalały na bardziej abstrakcyjne podejście do tematu kodowania. Jednak pomimo tego, programowanie cały czas sprowadza się do tych samych operacji, co wiele lat temu, jednak w ładniejszym wydaniu (co niekonieczne oznacza, że lepszym). Pod tym, co widzi współczesny programista kodując w C++, w dalszym ciągu kryją się skomplikowane operacje bitowe. I tutaj mamy całe clue sprawy - flagi są reprezentowane bitowo! Od razu nasuwa się pytanie - dlaczego? Po co ktoś miałby używać takiego podejścia? Odpowiedź nasunie się sama w dalszej części poradnika W komputerach najmniejszą adresowalną jednostką jest bajt, który składa się z ośmiu bitów, gdzie każdy bit może zawierać 1 lub 0 (jak wspominałem wyżej). My nie posługujemy się "bajtami" - my działamy ma zmiennych, jak int, float, czy char. Otóż każda zmienna składa się ze stałej ilości bajtów (char 1 bajt, int i float 4 bajty w pawnie). Współczesne języki są jednak na tyle elastyczne, że możemy bez problemu posługiwać się znanymi nam dobrze operacjami dodawania, odejmowania, mnożenia, potęgowania itd bez potrzeby działania na bitach Nie oznacza to jednak, że jesteśmy od tych operacji odcięci ? programiści bardzo dobrze wykorzystują je do optymalizacji działania programów, w tym znanych nam już flag. Dzisiaj również nauczymy się, jak pisać takie flagi samemu. Skoro wiemy już, że pod takim "prostym" integerem(int) kryje się zlepek bitów, zajrzyjmy sobie do niego: Jak widzimy w powyższej jakże profesjonalnie wykonanej, tabeli pokazana jest tylko połowa integera - 2 bajty. Tyle jednak w zupełności wystarczy, żeby pokazać o co tutaj chodzi... Dowolną liczbę zapisaną w jednym systemie można zapisać w innym (np. z dziesiętnego na szesnastkowy). W tym przypadku interesuje nas zamiana liczby dziesiętnej na binarną(ciąg zer i jedynek). Ktoś kiedyś słusznie zauważył, że: i tak 1 to 2^0, 2 to 2^1 i tak dalej.... można zauważyć tutaj jeszcze jedną ciekawą zależność - wartość dziesiętna każdego bitu jest równa wartości wszystkich poprzednich bitów plus jeden, np. 2^6 = 64 = 32+16+8+4+2+1+1 Płynący z tego wniosek jest taki, że każda liczba dziesiętna ma swoją unikalną reprezentację w systemie dwójkowym. Jak zapisujemy liczby dwójkowo? Oto przykłady: 15 = 1111 (2^0 + 2^1 + 2^2 + 2^3) | 20 = 10100 (2^4 + 2^2) | 1024 = 10000000000 (2^10) Działanie odwrotne (liczba binarna na dziesiętną) prezentuje się następująco: 101 = 2^0*1 + 2^1*0 + 2^2*1 = 5 | 1000 = 2^0*0 + 2^1*0 + 2^2*0 + 2^3*1 = 8 Po więcej informacji odnośnie przeliczeń zapraszam tutaj. Skoro więc wiemy, że pod każdą zmienną kryją się bity, oraz że jest ich skończona ilość dla danej zmiennej, możemy również znaleźć największą wartość, jaką dany typ zmiennej może przechowywać. Dla uproszczenia nie będę się zagłębiał w liczby zmiennoprzecinkowe - dziś skupimy się tylko na liczbach całkowitym i na integerze. Przydatnym narzędziem systemowym jest kalkulator, który oferuje tryb programisty. Po wprowadzeniu do niego 32 jedynek binarnie (bo tyle bitów posiada integer), otrzymałem nastepujący wynik: Sporo, ale...nie jest to faktyczna wartość maksymalna integera. Musimy także pamiętać o tym, że liczba może być także ujemna! Jak określić tutaj ujemność liczby? W tej sytuacji poświęca się ostatni bit, którego wartośc określa, czy liczba jest dodatnia, czy ujemna. Skoro straciliśmy jeden bit, nasza liczba "skurczyła się" do 31 miejsc, a więc teraz jest to... 2 147 483 647, a konkretniej przedział < -2 147 483 647 ; 2 147 483 647 > Na tym etapie rozumiemy jak zapisywane są liczby w komputerze, co to bit, bajt i jak przechodzimy z systemu dziesiętnego do binarnego i odwrotnie. Teraz możemy zająć się operacjami bitowymi. Część II - operacje bitowe W systemie dziesiętnym wykonujemy operacje dodawania, odejmowania, mnożenia, dzielenia, potęgowania, pierwiastkowania i tak dalej. System binarny charakteryzuje się swoim własnym zestawem operacji. Każdą operację wykonujemy parami - pierwszy bit liczby numer 1 z pierwszym bitem numer 2 - czynność powtarzamy na wszystkich bitach. Omówię teraz po kolei wszystkie operacje. 1. AND (mnożenie - koniunkcja) -> Znak & Wynik operacji AND daje 1, jeśli obydwie liczby są jedynką Przykład: 1010 & 1001 = 1000 | 1100 & 0101 = 0100 2. OR (dodawanie - alternatywa) -> Znak | Wynik operacji daje 1, jeśli przynajmniej jedna z liczb jest jedynką Przykład: 1010 | 1001 = 1011 | 1100 | 0101 = 1101 3. XOR (alternatywa wykluczająca) | Znak ^ Wynik operacji daje 1, jeśli dwie liczby różnią się, a 0, jeśli są takie same Przykład: 1010 ^ 1001 = 0011 | 1100 ^ 0101 = 1001 4. NOT (negacja) | Znak ~ (tylda) Operacja odwraca wartość bitu Przykład: ~1010 = 0101 | ~1100 = 0011 Są to cztery podstawowe operacje logiczne. Do omówienia pozostały jeszcze przesunięcia bitowe: 5. Przesunięcie bitowe w lewo | Znak << Operacja powoduje, że wszystkie bity w liczbie zostają przesunięte w lewo. Wszystkie bity, które na skutek przesunięcia 'wypadły' poza liczbę zostają utracone. Bity, które 'pojawiają się z prawej strony są zapisywane zawsze jako zera. Po lewej stronie operandu zapisujemy liczbę, natomiast po prawej o ile miejsc przesuwamy. Przykład: 1010 << 1 = 0100 | 1100 << 1 = 1000 5. Przesunięcie bitowe w prawo | Znak >> Operacja powoduje, że wszystkie bity w liczbie zostają przesunięte w prawo. Wszystkie bity, które na skutek przesunięcia 'wypadły' poza liczbę zostają utracone. Bity, które 'pojawiają się z lewej strony są zapisywane zawsze jako zera. Po lewej stronie operandu zapisujemy liczbę, natomiast po prawej o ile miejsc przesuwamy. Przykład: 1010 >> 1 = 0101 | 1100 >> 1 = 0110 Wszystko wydaje się być dziwne i bezsensowne, jednak o tym jak potężne jest to narzędzie przekonasz się w części trzeciej ? Omówiliśmy już wszystkie operacje. Teraz, kiedy jesteśmy już gruntowo przygotowani pod względem teoretycznym, możemy wreszcie przejść do praktyki. Część III - flagi Rozpatrzmy teoretyczną sytuację, w której chcemy monitorować, czy gracz (dla uproszczenia jeden) posiada w nicku frazę "[GO-Code]", aby nagradzać go dodatkową ilością złota co rundę. Aby tego dokonać, musimy wykonać szereg operacji: znaleźć id gracza, na jego podstawie pobrać nick i umieścić w tablicy, sprawdzić, czy nazwa posiada szukaną frazę za pomocą StrContains, a następnie zwrócić rezultat. Mimo, że wszystkie te operacje trwają dość szybko (dla człowieka), to komputer nie ma świadomości tego, że już raz sprawdziliśmy nick gracza - dlatego w każdej kolejnej rundzie musi mieć jasną informację, czy ma przydzielać złoto z tytułu posiadanej frazy... Co byś w tej sytuacji zrobił? Najsensowniejszym rozwiązaniem wydaje się być zastosowanie zwykłej zmiennej, która domyślnie przyjmuje wartość 0 i zmienia się na 1, jeśli powyższe warunki zostaną spełnione. Teraz wystarczy, że serwer będzie na początku rundy sprawdzał zawartość zmiennej, zamiast każdorazowo wykonywać szereg kosztownych operacji - a nie zapominajmy, że przeważnie jest dużo więcej graczy do sprawdzenia ? Załóżmy teraz, że poza sprawdzeniem frazy [GO-Code] chcielibyśmy, by serwer dodatkowo sprawdzał, czy SteamID gracza to STEAM_0:1:1234567, gdyż jest to streamer, które gra na naszym serwerze i chcemy zapewnić mu dodatkowe przywileje. Aby to sprawdzać zapewne ponownie zastosujemy dodatkową zmienną, jednak musimy być świadomi, że teraz mamy już dwie zmienne, zamiast jednej. A co, jeżeli nasze dwie zmienne są lokalne i chcielibyśmy je przekazać do innej funkcji? Sprawa wygląda w miarę prosto, gdy mamy dwie zmienne, ale co w sytuacji, gdzie potrzebujemy takich zmiennych np. dziesięć? PrzekazStatystyki(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) Pomyślmy, jak wyglądałaby deklaracja flag regexa? Co w sytuacji, gdybyśmy chcieli skorzystać tylko z jednej opcji? Mimo wszystko musielibyśmy wysyłać wszystkie zmienne (bez wyraźnej potrzeby) Dopiero teraz na wierzch wychodzi to, jak użyteczne są operacje bitowe Pamiętamy, że każdy int to zestaw 32 bitów. Każdy bit przyjmuje wartość 1 lub 0.... czyli właśnie to, czego potrzebujemy! 1 i 0 to właśnie nasza prawda i fałsz! daje nam to niesamowicie szeroki wachlarz odogodnień. Zamiast tworzyć dziesięć zmiennych: int x1, x2, x3, x4, x5, x6, x7, x8, x9; tworzymy jedną: int flags; Zamiast przekazywać do funkcji dziesięć zmiennych: PrzekazStatystyki(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) przekazujemy jedną: PrzekazStatystyki(flags) Teraz pozostaje nam nauczenie się, jak z tego korzystać, gdyż wszystkie operacje będą przeprowadzane na bitach. Powróćmy do naszego przykładu dwóch flag gracza. Gdybyśmy realizowali to standardową metodą, robilibyśmy to w taki sposób: Oraz funkcja przydzielająca atrybuty graczowi: Teraz napiszmy to samo z wykorzystaniem bitów  W naszym przykładzie posiadanie frazy w nicku będzie równoznaczne z ustawieniem pierwszego bitu (od prawej) w zmiennej na 1, natomiast streamer - drugiego bitu. Zauważmy tutaj ciekawą rzecz - pierwszy bit oznacza jedynkę (2^0), natomiast drugi bit dwójkę (2^1). Jeśli więc streamer będzie miał w nicku frazę "GO-Code" (obydwa przypadki spełnione), nasza flaga przyjmie wartość...3! Dlaczego? Oto wyjaśnienie (przypominam, że int ma 32 bity): int flags = 0000 0000 0000 0000 0000 0000 0000 0011 + 2^0 + 2^1 = 3 Prawda, że intuicyjne? Podobnie, gdybyśmy mieli dziesięć flag i chcielibyśmy sprawdzić, czy WSZYSTKIE są ustawione na true(1) wystarczyłoby porównanie wartości zmiennej flags do 1023 (ponieważ każdy bit to suma poprzedników plus jeden, a pod jedenastym bitem siedzi 2^10, czyli 1024. Oznacza to, że wartość 1024 to 00...100 0000 0000, a 1023 to 00...011 1111 1111) Dodatkowo, jeśli wykonujemy operacje arytmetyczne na liczbie dziesiętnej, i tak można ją przedstawić w postaci binarnej. Jeśli więc do zmiennej, która ma wartość 0, dodamy 2 (zmienna += 2) drugi bit tej zmiennej stanie się jedynką, a pozostałe będą zerami. My jednak nie będziemy wykonywać operacji arytmetycznych, gdyż operacja na np. dziesięciu zmiennych mogłaby przyprawić o zawrót głowy nawet największego wymiatacza  Aby dodać flagę do zmiennej (zmienić wartość bitu), będziemy posługiwać się logiczną operacją OR. Wiemy z części drugiej, że OR zwraca 1, jeśli przynajmniej jedna ze zmiennych jest prawdziwa. Jeśli więc wykonamy taką operację: flags |= 1 ( to samo, co flags = flags|1 ) spowodujemy, że pierwszy bit naszej zmiennej stanie się jedynką, natomiast pozostałe pozostaną bez zmian: ...101010 | ...000001(jedynka binarnie) = ...101011 prawda, że fajne? jedynym problemem jest dobre zrozumienie co tutaj się dzieje  podobnie, ustawienie drugiej flagi wiąże się z operacją OR, jednak tutaj posłużymy się już dwójką: ...010101 | ...000010(dwójka binarnie) = ...010111 Ale to jeszcze nie wszystko! Aby nie musieć poruszać się cały czas po potęgach dwójki, możemy również użyć przesunięć bitowych. Jak to działa? Zauważmy, że przesunięcie bitowe w lewo jest równoznaczne z pomnożeniem naszej liczby przez 2. Tak więc 2<<1 = 4. Widzimy też, że działa to dokładnie tak, jak nasza identyfikacja numeru bitu. Jeśli więc zrobimy coś takiego: flags |= (1<<1) efekt będzie taki sam, jak: flags |= 2 Sytuacja robi się jeszcze przyjemniejsza, gdy zdefiniujemy sobie takie makra: #define FRAZA (1<<0) #define STREAMER (1<<1) a później już tylko sama bajka: flags |= STREAMER; flags |= FRAZA; lub flags |= (STREAMER|FRAZA); I WŁAŚNIE TAKICH MAKR UŻYWA SIĘ WSZĘDZIE! Nie ważne, czy będzie to ADMIN_IMMUNITY z flag admina, czy PCRE_UTF8 z regexa - wszędzie odbywa się to w dokładnie ten sam sposób! Ostatnią rzeczą jest sprawdzenie, czy dana flaga jest aktywna, Tutaj posługujemy się logiczną operacją AND. Daje ona jedynkę tylko w sytuacji, gdy obydwie zmienne są prawdziwe. Możemy to obrócić na naszą korzyść. Aby sprawdzić, czy dany bit (tj nasza flaga) jest "włączona", robimy coś takiego: if(flags & FRAZA) jak wiemy, if "przepuszcza dalej", jeśli wartość wyrażenia jest różna od zera. A więc jeśli if otrzymał przykładowo: ...010101 & ...000001 = ...000001 = 1 (binarnie) ...musiał on przepuścić warunek sprawdzenia możemy łączyć: if(flags & FRAZA && flags & STREAMER) { // uprawnienia i kasiora prosze } pamiętajmy też o kolejności wykonywania działań! Z tego właśnie powodu stosuję nawiasy zarówno w warunku jak i przy deklaracji makr #define Tak oto przerobiliśmy cały materiał. Po zastosowaniu zdobytej wiedzy w praktyce, nasz poprzedni kod możemy napisać w następujący sposób: Oczywiście nie należy popadać w paranoję i stosować tych flag wszędzie, gdzie się tylko da xD. W małych pluginach możemy spokojnie korzystać ze zwykłych zmiennych, gdyż narzut pamięciowy jest i tak znikomy. Wierzę, że będziesz w stanie znaleźć do tego wiele zastosowań. Wooah.. ale poleciałem. Poradnik wyszedł strasznie długi, ale chciałem to zrobić w sposób rzetelny i w takiej formie, jaką sam bym chciał otrzymać lata temu, ponieważ nikt nie wytłumaczył tego w należyty sposób. Niech Wam dobrze służy Jeśli macie jeszcze jakieś pytania, czy wątpliwości, śmiało zadawajcie pytania, a jeśli okaże się to potrzebne, zaktualizuję poradnik. Oczywiście zachęcam do przeglądania innych poradników i ciągłego samodoskonalenia. Dzięki za uwagę i powodzenia w lekturze
  3. 1 punkt
    Witam, jestem w trakcie tworzenie dość sporego projektu. Projekt będzie składał się z kilku części (aplikacji), na tę chwilę jest: Servers Core - lista serwerów gier (na podobie mojej aplikacji (GS) Server List) z podstronami na np. newsy, które może dodawać dana grupa na forum oraz grupy serwerowe (tylko dla serwerów sourcemod). Na stronie z listą serwerów znajduje się również wykres graczy do 365 dni wstecz, a na stonie serwera znajdują się informacje o serwerze w tym przekazane dotacje na rzecz tego serwera. Demo: Our Servers - GS Dev Server Donations - system dotacji, na tę chwilę obsługiwana tylko bramka PayPal. Podczas przekazywania darowizny należy wybrać Perk (grupę przywilejów) który chcemy otrzymać. Cenę per dzień/miesiąc/rok ustala się w ACP i podczas podawania przekazywanej kwoty automatycznie oblicza czas trwania tego Perku. Po przekazaniu darowizny Perk jest przyznawany automatycznie i również wygasa automatycznie po określonym czasie. Perki mogą dotyczyć serwerów sourcemod jak i forum (przyznawanie grupy na forum). Każdy Perk ma swój opis korzyści, na tę chwilę można ustawić maksymalnie 5 opcji. Cały system dotacji wymaga konta Steam. Na forum może być zainstalowana aplikacja Steam Integration w celu automatycznego wykrywania konta Steam, ale nie jest to wymagane. Jeśli tej aplikacji nie ma to jest możliwość ręcznego podania swojego ID w kilku formach. Demo: Donate - GS Dev To na razie tyle. W planach są jeszcze inne 'rozszerzenia'. Co o tym sądzicie? Byłaby osoba chętna do kupna takich aplikacji? Nie są wymagane dwie, wystarczy jedna, drugą i [...] można będzie dokupić w późniejszym terminie.
  4. 1 punkt
    Opis Paczki: W paczce znajdują się pluginy: Cena: Do ustalenia. Kontakt: https://steamcommunity.com/id/yamakashisteam Inne: Oferuję autorską paczkę Only AWP, support oraz edycję pluginów pod wymagania klienta.
  5. 1 punkt
    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.
  6. 1 punkt
    Tu masz spis eventów CS:GO -> https://wiki.alliedmods.net/Counter-Strike:_Global_Offensive_Events Masz tam napisane wszystko co możesz z tego eventu wziąć. np. W player_death możesz wyciągnąć ID osoby, która umarła oraz osoby, która zabiła. int victim = GetClientUserId(event.GetInt("userid")); // Osoba, która została zabita int attacker = GetClientUserId(event.GetInt("attacker")); // Osoba, która zabiła
  7. 1 punkt
    [Opis] Plugin przyznaje bonusy za nazwę strony w nicku , dzięki niemu można uzyskać darmowe tagi, kevlar lub darmowe kredyty w sklepach takich jak Zephyrus Store lub Shop Core [Cvary] sm_goldmember_credits - ilość kredytów co x czasu sm_goldmember_credits_time - Co ile ma się otrzymywać x kredytów sm_nospec - Wyklucza graczy na spekt aby otrzymywać x kredytów co x czasu [Komendy] sm_goldtag - Otwiera menu z dostępnymi tagami [Download] https://github.com/Cruze03/csgo_goldmember Darmowe kredyty dla shop core ( usunięto tagi itp)
  8. 1 punkt
    Sprawdź - https://www34.zippyshare.com/v/tWSkC71f/file.html komenda w pluginie już jest domyślnie
  9. 1 punkt
    Hej wszystkim Chciałbym zaprezentować wam mały prywatny projekt JBMode pod fivem Projekt będzie opensourcowy 😛 by każdy mógł sobie postawić swój własny serwerek z tym modem (jeśli się przyjmie :P) aktualnie serwer discorda jest w języku polskim, w trakcie pierwszej publicznej wersji wprowadzony zostanie język angielski 😄 Link: https://discord.gg/ESEkgX8 a teraz pytania do was. Czy taki gamemode pod gta ma sens? Czy jako właściciele sieci chcielibyście założyć taki serwer dla swojej sieci? pozdrawiam i pytania proszę kierować tu lub discord (na discordzie odpowiadam o wiele sprawniej :D) pozdrawiam :3 P.s MASHA: pozwolenie na post jest od @MAGNET
  10. 1 punkt
    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.
  11. 1 punkt
    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ą.
  12. 1 punkt
    OPIS: Dodaje na serwer komendę !kpn w której można włączyć/wyłączyć zaproszenia do gry. Aby kogoś wyzwać do gry wystarczy napisać !kpn nick ilość. KPN jest przystosowane pod store by zephyrus. Nie pamiętam czy są tutaj jeszcze jakieś błędy, ale w razie napotkaniu błędu w pluginie proszę o zgłoszenie tego błędu tutaj w komentarzu 😉 ADEPT_KPN.sp
  13. 1 punkt
    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ś 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.
  14. 1 punkt
    https://forums.alliedmods.net/showthread.php?t=270882 https://forums.alliedmods.net/showthread.php?p=1871412
  15. 1 punkt
    return Plugin_Handled; //usuwa komunikat Unknown command
  16. 1 punkt
  17. 1 punkt
  18. 1 punkt
    void MenusOnCommandsCreate(/*void*/) { // Hook commands RegConsoleCmd("zmainmenu", MenusCommandCatched, "Open the main menu."); // Hook listeners AddCommandListener(MenusOnOpen); } /** * Handles the <!zmainmenu> command. Open the main menu. * * @param clientIndex The client index. * @param iArguments The number of arguments that were in the argument string. **/ public Action MenusCommandCatched(const int clientIndex, const int iArguments) { // Open the main menu MenuMain(clientIndex); return Plugin_Handled; } /** * Callback for command listener to open the main menu. * * @param clientIndex The client index. * @param commandMsg Command name, lower case. To get name as typed, use GetCmdArg() and specify argument 0. * @param iArguments Argument count. **/ public Action MenusOnOpen(const int clientIndex, const char[] commandMsg, const int iArguments) { // Gets command alias static char sCommand[SMALL_LINE_LENGTH]; gCvarList[CVAR_GAME_CUSTOM_MENU_BUTTON].GetString(sCommand, sizeof(sCommand)); // Validate command if(!strcmp(sCommand, commandMsg)) { // Open the main menu MenuMain(clientIndex); return Plugin_Handled; } // Allow command return Plugin_Continue; } gCvarList[CVAR_GAME_CUSTOM_MENU_BUTTON] = CreateConVar("zp_game_custom_menu_button", "autobuy", "Bind of the button for the menu open. Look here: https://www.reddit.com/r/GlobalOffensive/comments/36cjph/default_binds/"); gCvarList[CVAR_GAME_CUSTOM_SKILL_BUTTON] = CreateConVar("zp_game_custom_skill_button", "rebuy", "Bind of the button for the skill usage. Look here: https://www.reddit.com/r/GlobalOffensive/comments/36cjph/default_binds/"); gCvarList[CVAR_GAME_CUSTOM_LIGHT_BUTTON] = CreateConVar("zp_game_custom_light_button", "+lookatweapon", "Bind of the button for the flashlight trigger. Look here: https://www.reddit.com/r/GlobalOffensive/comments/36cjph/default_binds/"); Kod pochodzi z https://forums.alliedmods.net/showthread.php?t=290657. Przeanalizuj go i już łatwo dostosujesz do własnego pluginu.
  19. 1 punkt
    Cześć wszystkim, wielkimi krokami zbliża się moment, w którym na kanale zaczną się pojawiać poradniki dotyczące już stricte pisania programów. Z tego powodu chciałbym zrobić małe podsumowanie i zebrać od Was feedback dotyczący mojej dotychczasowej twórczości. jeżeli macie jakieś przemyślenia dotyczące mojego kanału - co Wam się podoba, co zdecydowanie byście zmienili/poprawili, co chcielibyście zobaczyć a także wszelkie sugestie - proszę o napisanie każdej opinii poniżej Od razu poruszę temat regularności - nie jestem w stanie wypuszczać filmów co tydzień, jednak pojawiają się one za rzadko... muszę się tutaj poprawić 😉 Z góry dziękuję i pozdrawiam!
  20. 1 punkt
    Jak cie to interesuje tak wyglada w nowej public void OnPluginStart() { RegConsoleCmd("sm_losuj", cmd_losuj); } public Action cmd_losuj(int client, int args) { int monety_gracza = GetMoney(client); if(monety_gracza < 20) { PrintToChat(client, "[COD:MW] Masz za malo monet, potrzeba 20!"); } else { char item[64]; cod_set_user_item(client, -1, -1, -1); cod_get_item_name(cod_get_user_item(client), item, sizeof(item)); SetMoney(client, GetMoney(client)-20); PrintToChat(client, "[COD:MW] Wylosowales %s za 20 monet.", item); } }
  21. 1 punkt
    Wkradła się literówka. stock void GiveCredits(int client, bool FirstDay) { if(FirstDay) { Shop_GiveClientCredits(client, g_hDailyCredits.IntValue, CREDITS_BY_NATIVE); CPrintToChatEx(client, client, "%t", "CreditsRecieved", g_hDailyCredits.IntValue); SetClientCookie(client, g_hDailyBonusCookie, "1"); strcopy(SavedBonus[client], sizeof(SavedBonus[]), "1"); SetClientCookie(client, g_hDailyCookie, CurrentDate); Format(SavedDate[client], sizeof(SavedDate[]), CurrentDate); } else { int resetDaysSetting = g_hDailyReset.IntValue; int TotalCredits = g_hDailyCredits.IntValue + ReturnDailyBonus(client); if(TotalCredits > g_hDailyMax.IntValue) TotalCredits = g_hDailyMax.IntValue; int streakDays = ReturnStreakDays(client); if(streakDays > 0) { streakDays--; } Shop_GiveClientCredits(client, TotalCredits, CREDITS_BY_NATIVE); if(streakDays != 0) { if(streakDays >= resetDaysSetting) { CPrintToChatEx(client, client, "%t", "LastCreditsRecieved", TotalCredits); CPrintToChatEx(client, client, "%t", "ResetDays", resetDaysSetting); SetClientCookie(client, g_hDailyCookie, CurrentDate); Format(SavedDate[client], sizeof(SavedDate[]), CurrentDate); int cookievalue = 0; IntToString(cookievalue, SavedBonus[client], sizeof(SavedBonus[])); SetClientCookie(client, g_hDailyBonusCookie, SavedBonus[client]); } else { CPrintToChatEx(client, client, "%t", "CreditsRecieved", TotalCredits); SetClientCookie(client, g_hDailyCookie, CurrentDate); Format(SavedDate[client], sizeof(SavedDate[]), CurrentDate); int cookievalue = StringToInt(SavedBonus[client]); CPrintToChatEx(client, client, "%t", "CurrentDay", cookievalue + 1); cookievalue++; IntToString(cookievalue, SavedBonus[client], sizeof(SavedBonus[])); SetClientCookie(client, g_hDailyBonusCookie, SavedBonus[client]); } } else { CPrintToChatEx(client, client, "%t", "CreditsRecieved", TotalCredits); SetClientCookie(client, g_hDailyCookie, CurrentDate); Format(SavedDate[client], sizeof(SavedDate[]), CurrentDate); int cookievalue = StringToInt(SavedBonus[client]); CPrintToChatEx(client, client, "%t", "CurrentDay", cookievalue + 1); cookievalue++; IntToString(cookievalue, SavedBonus[client], sizeof(SavedBonus[])); SetClientCookie(client, g_hDailyBonusCookie, SavedBonus[client]); } } }
  22. 1 punkt
    #pragma semicolon 1 #include <sdktools> #pragma newdecls required public void OnPluginStart() { RegConsoleCmd("sm_addvip", Cmd_AddVip); LoadTranslations("common.phrases"); } public Action Cmd_AddVip(int client, int args) { if(!(GetUserFlagBits(client) & ADMFLAG_ROOT)) { PrintToChat(client, "Nie posiadasz uprawnień do tej komendy!"); return Plugin_Handled; } char sArg[32]; GetCmdArg(1, sArg, sizeof(sArg)); if(args < 1) { PrintToChat(client, " \x06Użycie: sm_addvip <#userid|Nick>"); return Plugin_Handled; } char strTargetName[MAX_TARGET_LENGTH]; int TargetList[MAXPLAYERS], TargetCount; bool TargetTranslate; if((TargetCount = ProcessTargetString(sArg, client, TargetList, MAXPLAYERS, COMMAND_FILTER_CONNECTED|COMMAND_FILTER_NO_MULTI|COMMAND_FILTER_NO_IMMUNITY, strTargetName, sizeof(strTargetName), TargetTranslate)) <= 0) { ReplyToTargetError(client, TargetCount); return Plugin_Handled; } for(int i = 0; i < TargetCount; i++) { int iTarget = TargetList[i]; if(IsClientInGame(iTarget) && !IsFakeClient(iTarget) && !IsClientSourceTV(iTarget)) { char sAdminName[64], sPlayerName[64]; GetClientName(client, sAdminName, sizeof(sAdminName)); GetClientName(iTarget, sPlayerName, sizeof(sPlayerName)); AddUserFlags(iTarget, Admin_Custom1); PrintToChatAll(" Admin \x10%s \x01dał graczowi \x06%s \x01vipa!", sAdminName, sPlayerName); } } return Plugin_Handled; } Proszę, dodałem jeszcze flagę Z dla komendy !addvip.
  23. 1 punkt
    Nie masz najnowszego kodu ktory rozsylalem. Bylo pare fixow od tamtej pory, problem polega na tym ze zmienne statyczne nie sa resetowane po zmianach mapy a wiec ten czas dluzy sie w nieskonczonosc powodujac bug. Musisz utworzyc zmienna globalna i najlepiej resetowac przy polaczeniu gracza.
  24. 1 punkt
    [opis] Wrzucam dodatkową paczkę, 21 itemów do nowego cod moda. Paczka zawiera: buty komandosa, buty ninji, fart strzelca, furmana kaplana, kamizelka nasa, ksiega expa, luneta wojskowego, mozg einsteina, naboje kapitana, palace rekawiczki, pancerny helm, pancerny tulow, platynowe naboje, plonace naboje, portfel turysty, rozblysk sloneczny, tajemnica zabojcy, taktyczne naboje, wallhack czitera,zacmienie ksiezyca, zestaw predatora [instalacja] Standardowa. [inne] Item "Wallhack Czitera" wymaga dodatkowego pluginu do działania: [download] coditem.rar
  25. 1 punkt
Tablica liderów jest ustawiona na Warszawa/GMT+02:00
×