Skocz do zawartości

.silent

Użytkownik
  • Zawartość

    193
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    8

Ostatnia wygrana .silent w dniu 1 Maj 2016

Użytkownicy przyznają .silent punkty reputacji!

O .silent

  • Tytuł
    #define true false

Informacje profilowe

  • Płeć
    Mężczyzna

Informacje o serwerze

  • Typ serwera
    Nie wybrano

Ostatnie wizyty

1471 wyświetleń profilu
  1. .silent

    random z bazy danych

    Masz tu przykład kodu którego sam używam do ładowania losowej areny derby z bazy, na StrickenKidzie: Ważne jest LIMIT 1, jeśli chcesz pobrać tylko jeden wiersz żeby nie marnować transferu i nie obciążać serwera zbędną alokacją dużej ilości pamięci. format(fmt1, STRSIZ, "SELECT id, vehmodel, minZ FROM `" MYSQL_TAB_DERBY "` WHERE `spawnpointsCount` >= %d AND `enabled` = 1 ORDER BY RAND() LIMIT 1;", fgData[FG_DERBY][fgPlayersCount]); mysql_query(fmt1); mysql_store_result(); if(mysql_num_rows() <= 0) { print("[funGames] Couldn't load any Derby arena"); SCMAL(DOTSE_FG " /Derby " C_GREY "nie wystartowały (brak areny) " DOTSE_FG, DOTS_FG "/Derby " C_GREY "didn't start (couldn't load arena) " DOTSE_FG); mysql_free_result(); Derby_Stop(.clean_queue = true); return false; } ddArenaID = mysql_fetch_field_int("id"); ddVehModel = mysql_fetch_field_int("vehmodel"); ddMinZ = mysql_fetch_field_float("minZ"); mysql_free_result(); ddTotalPlayers = fgData[FG_DERBY][fgPlayersCount];
  2. .silent

    random z bazy danych

    W StrickenKidzie jest funkcja mysql_fetch_field_num() aczkolwiek nigdy jej nie używałem, najpewniej każde pobrane pole w wierszu ma swoje ID zaczynające się od 0 które możemy użyć w tej funkcji. Rozwiązanie z SELECT * nie jest zbyt dobre bo pobiera całą zawartość tabeli, ogromna ilość pamięci musi zostać zaalokowana w pluginie oraz duża ilość danych musi być wysłana. Rozwiązanie z ORDER BY RAND() jest dobre dla mniejszych tabel (kilka, kilkanaście tysięcy) jednak w większych tabelach jest ogromnie nieoptymalne gdyż tworzy ono tymczasową kopię tabeli, przy naprawdę ogromnych tabelach zapytanie potrafi wykonywać się po kilka/kilkanaście sekund. Na necie jest o tym mnóstwo tematów, z lepszymi rozwiązaniami zależnymi od sytuacji np. tu http://blog.vokiel.com/mysql-rand-jak-pobrac-losowe-wiersze/ jednak polecałbym kierować się tematami anglo-języcznymi gdyż polska to trochę tadżykistan w takich sprawach. Oczywiście jeśli nie zamierzasz robić jakiejś ogromnej tabeli to sam użyłbym na Twoim miejscu ORDER BY RAND().
  3. .silent

    Failed to exeute query

    Może troche off-top ale poradzę Ci, zarówno jak i każdemu innemu porzucić pomysł używania Whirlpoola czy innych algorytmów, które może są dobre ale są zbyt skomplikowane i "cięzkie". Whirlpool zajmuje aż 512 bitów, czyli 128 znaków co w pawn przekłada się na 4*128 bajtów by przechować sam tekst, w bazie danych trzymasz kolejne 128 lub więcej bajtów, samo hashowanie na pewno jest bardziej czasochłonne. Przynajmniej w sampie, takie "bezpieczeństwo" nie jest wcale potrzebne, bo zwykłe MD5+Sól poradzi sobie z tzw. rainbow tables itd. a oszczędzi ci znaczną ilość miejsca w bazie danych i w samym skrypcie oraz uprości przetwarzanie. Najlepiej moim zdaniem wykorzystać algorytn SHA256 który Kalcor zaimplementował w którejś tam wersji 0.3.7, jest bardzo bezpieczny i o połowę mniejszy od Whirlpoola. Sam z niego korzystam, na początku też próbowałem jakoś super zabezpieczać hasła stosując wiele algorytmów naraz (w tym WP), jednak po nabraniu trochę doświadczenia można stwierdzić że równie dobrze mogłem wykorzystać proste MD5 lub inny algorytm z losową solą i bezpieczeństwo byłoby takie samo, a wszystko byłoby dużo optymalniejsze. http://wiki.sa-mp.com/wroot/index.php?title=SHA256_PassHash&redirect=no jako parametr salt podajesz sól, czyli np. UID gracza zamienione na tekst (funkcja valstr) lub jakiś losowy tekst zapisany w gmie/bazie danych, lub oba naraz. Przy sprawdzaniu po prostu dodajesz (strcat) do wpisanego przez gracza hasła tą sól/jego UID (nie polecam używać nicku, kiedyś możesz dodać komendę do zmiany nicków i ktoś nie wbije już na konto bo hash będzie zawierał jego stary nick)
  4. .silent

    Dodanie na nick

    Wywoływanie strcmp "zdalnie" (funkcja strcmp w pawn wywołuje odpowiedni native który dopiero wywołuje realny odpowiednik strcmp i zwraca jego wartość) za każdym razem gdy ktoś wpisze komendę, i prawdopodobnie wywoływanie tego po kilkaset razy gdy ktoś nie używa if else tylko samo if jest dużo gorsze niż tak jak robi to ZCMD przekazanie komendy jako nazwy funkcji publicznej którą serwer sobie znajdzie i wywoła sam.
  5. .silent

    [PRYWATNE POJAZDY] Przypisanie ID auta.

    Nie patrzyłem jako tako na kod tylko na zapytania i co z nimi robisz, więc tak: Zakładam że kolumna "privid" jest AUTO_INCREMENT (bo powinna w tym przypadku, usprawnia to wszystko ponieważ będzie unikalne, odciąży również bazę danych, od razu przy CREATE TABLE można na niego ustawić primary key) Pobierasz kolumnę "privid" z wszystkich wierszy w bazie, co już samo w sobie jest złe bo jeżeli usuwasz pojazdy to nie koniecznie ostatni privid będzie się zgadzał z AUTO_INCREMENT. Tak czy siak ty tego nie robisz, tylko używasz mysql_num_rows które zwraca liczbę pobranych wierszy, a więc liczbę pojazdów. Niepotrzebnie pobierasz (możliwie) dużą ilość danych (wszystkie wiersze) a i tak nic z tego nie masz. Poprawnie powinno być to zrobione tak: 1. Insert danych do tabeli, privid to AUTO_INCREMENT więc w ogóle go nie ustawiasz bo robi się to samo. 2. Przypisanie graczu ID pojazdu poprzez funkcję mysql_insert_id() która zwraca ostatni AUTO_INCREMENT z wykonanej kwerendy INSERT. Dodam, że zamiast trzymać nicku gracza w tabeli z pojazdami, najlepszym sposobem jest również używanie AUTO_INCREMENT w tabeli z graczami (UID) i trzymanie tylko UID w pojazdach. Nick właściciela pojazdu można wtedy pobrać przy ładowaniu pojazdów używając joina. Co do samego tworzenia pojazdów to dam Ci kod z mojego GM żebyś sobie go przeanalizował: http://pastebin.com/mYeUrLfm (Ja mam to trochę inaczej rozwiązane, ty przypisywałeś dane pojazdu do tablicy używając tego pobranego "uid" pojazdu. Ja oprócz UID pojazdu mam jeszcze pID (ja to lubię nazywac SID, Server ID czyli ID na którym zapisany jest pojazd w tablicy, graczom przypisuje tylko własnie to SID by móc od razu operować na pojeździe a nie bawić się z UID. Gdybym do tego używał samego UID to musiałbym je dodatkowo jakoś resetować po usuwaniu pojazdów bo w końcu przekroczyłoby wielkość tablicy i narobiło problemów) Gdybyś pokusił się o użycie UID gracza zamiast nicku a nie wiedział jak skonstruować zapytanie z JOINem: mysql_query("SELECT vehs.*, IFNULL(players.name, '-') ownerName FROM `" MYSQL_TAB_PVEHS "` AS `vehs` LEFT JOIN `" MYSQL_TAB_PLAYERS "` \ AS `players` ON players.uid = vehs.ownerid");
  6. .silent

    [ROZWIĄZANY]Przypisywanie do zmiennej

    Ja tylko dodam, żeby nie sprawdzać czy gracz jest podłączony w ten sposób: Sprawdzi się to tylko gdy zmienna player będzie wynosiła 65535 (bo INVALID_PLAYER_ID to nic innego jak definicja 0xFFFF) Oczywiście używa się tego w wielu przypadkach, gdy wykonujemy funkcję np. funkcja GetPlayerTargetPlayer zwraca INVALID_PLAYER_ID gdy gracz na nikogo nie celuje, ale w tym przypadku należy użyć IsPlayerConnected(playerid) które sprawdza czy podany playerid jest podłączony do serwera.
  7. .silent

    [ROZWIĄZANY]Statystyki typu TOP 5-10...

    Ale top z mysql/innego sposobu zapisu czy top graczy aktualnie przebywających na serwerze? Jeśli mysql to użyj ORDER BY aby posortować dane, LIMIT by pobrać tylko np. 5 rekordów. Przykład: SELECT `uid`, `name`, `score` FROM `players` ORDER BY `score` DESC LIMIT 5; Pobierze uid, name oraz score i posortuje przez score malejąco, ograniczając się do 5 graczy (i tak będzie musiało posortować całą tabelę) Jeśli chodzi Ci o score graczy na serwerze, musisz zapętlać przez wszystkich graczy i posiadać jakąś zmienną na najwyższy score domyślnie ustawioną na 0, if(GetPlayerScore() > maxScore) zapisujesz GetPlayerScore() do maxScore i lecisz dalej, takie coś wykonać 5 razy (jeśli chce się 5 graczy w top) uwzględniając to że każdy kolejny najwyższy wynik musi być mniejszy od poprzedniego. Może udałoby się jakoś to zrobić na jednej pętli i tablicy ale nie chce mi się teraz o tym myśleć. Może ktoś znajdzie lepsze rozwiązanie, ale bez pętli się nie obejdzie. Jeśli chodzi o klikanie w dialogu, musiałbyś w jakiś sprytny sposób przypisać ID gracza do danego listitemu, np. tworząc tablicę odpowiadającą każdemu listitemowi która trzymać będzie ID gracza. Innym sprytnym sposobem jest umieszczenie tego ID w samym tekście listitema (po wybraniu, gracz wysyła także do OnDialogResponse tekst itemu który wybrał (inputtext)) i później użyć strval (np. umieścić ID na samym początku i odczytać je zwykłym strval) lub w inny sposób. Jeśli chodzi o klikanie na liście graczy pod TABem to OnPlayerClickPlayer.
  8. http://forum.sa-mp.com/showthread.php?t=435525 Sam od zawsze korzystam z tego pluginu, wykorzystuje sampowe ProcessTick do wywoływania funkcji po określonym czasie. Nie pamiętam już, ale kiedyś robiłem test i rozbieżności w czasie timera i czasie wykonania były raczej minimalne. Średnia różnicy czasu z 300 wywołań timera 200 milisekundowego gdy grałem na serwerze wyniosła 200.0, za drugim razem 200.00994, trzecim 199.99673. Pasowałoby sprawdzić to jeszcze na serwerze z większą ilością graczy. Nie testowałem na czystym serwerze tylko normalnym gamemodzie (około 7 tys linii), pluginach typu streamer itd, wraz z timerem 250ms na licznik prędkości i driftu.
  9. .silent

    SAMP - co dalej?

    Nie chodzi mi wcale o dodawanie jakiś wymarzonych nowych rzeczy do GTA, lecz o naprawienie starych bugów które zgłaszane były już lata temu a istnieją po dziś dzień. Dużo rzeczy nie jest też "synchronizowane" czy jakby to nazwać z serwerem, przykładowo tzw. "projectiles" czyli informacje o płonących/wybuchających obiektach itd. o ile dobrze pamiętam jeszcze do niedawna właściciel serwera nie miał praktycznie żadnych informacji o pociskach, teraz niby coś jest ale według mnie o wiele za późno i nie jest to nadal idealne. Swego czasu zacząłem pisać gamemod zombie, chciałem tam dać możliwość strzelania z bazooki czy z hydry do zombie, ale serwer niestety nie ma o tym zielonego pojęcia. Wybuchy itd. są tak naprawdę "widzimisię" gry po stronie gracza która sama je tworzy tam gdzie chce, dlatego np. często my widzimy ogień a ktoś w nim stoi i nie ubywa mu hp bo u niego ogień wybuchł w inny sposób. Jednak jakieś tam informacje dotyczące pozycji wybuchu itd są przesyłane, lecz z poziomu pawn nie mamy o tym żadnego pojęcia. Nie jest to pewnie najłatwiejsza rzecz do dodania z racji na to jak działa GTA, ale na pewno możliwa. Jest to tylko przykład, brakuje wielu pożytecznych funkcjonalności które usprawniłyby np. wyścigi autami itd. ostatnimi czasy pisałem system prywatnych pojazdów w którym ręcznie naprawiłem niedociągnięcia sampa związane z modami, np. to że niektóre mody (np. bullbary i bumpery) zapisywane są na tych samych slotach, co między innymi skutkuje tym, że przy synchronizacji pojazdu który miał dodane modyfikacje (AddVehicleComponent) przed zsynchronizowaniem, gracz nie będzie widział modu który był dodany pierwszy (bo miejsce w slocie zajął bullbar, a wcześniej dodany był też bumper). Również to że niektóre rzeczy się np. nie synchronizują za pierwszym razem (sideskirty i coś tam chyba jeszcze). Naprawiłem to wszystko przez rozpoznawanie dodawanych modyfikacji (OnVehicleMod) i stworzenie dodatkowych slotów, oraz aplikowanie poszczególnych modyfikacji ponownie w OnVehicleStreamIn by gracz widział wszystkie. Przy okazji natknąłem się na to, że gdy pojazd jest bez kierowcy nie da się mu zmienić kąta Z, w ogóle w sampie ubogo z rotacjami pojazdów itd. Brakuje wielu fundamentalnych funkcji i uproszczeń, przez co by zrobić wiele rzeczy należy kombinować jak koń pod górę i pisać samemu to co powinno być już dawno w sampie i byłoby rozwiązane lepiej i tak jak to ma być. Ale kalcor jak i cała leniwa dupo liżąca drużyna SAMP uważa że jeśli coś można rozwiązać w pawn to po co to dodawać, ale jakoś wcześniej byli na tyle głupi by dodawać prywatne wiadomości po stronie sampa choć przecież można było to zrobić w pawn. SAMP jest źle napisany, źle wykorzystuje wiele funkcji GTA lub w ogóle ich nie wykorzystuje. Gdyby inicjatywę przejął ktoś kto ma chęci i zdolności, tak jak ludzie typu kurta którzy tworzą pluginy bardziej zaawansowane niż Kalcor pewnie kiedykolwiek byłby w stanie napisać, samp zyskałby nowe życie.
  10. .silent

    [ROZWIĄZANY]Włączone, wyłączone - jak to zrobić?

    Dodam tylko że można bardzo fajnie i prosto zrobić to gdy formatujemy już tekst na dialog, bez zbędnych warunków itd (co prawdopodobnie skutkowałoby podwójnym formatem żeby uwzględnić włączenie itd) Używa się do tego operatora trójargumentowego: format(str, size, "Jakiś tekst: %s [%s]", tekst, (PlayerSettings[playerid][nazwa]) ? ("Włączone") : ("Wyłączone")); Gdyby ktoś nie wiedział to operator wygląda tak: warunek ? true : false, przy czym tekst należy podawać w nawiasach tak jak wyżej. Mało ludzi go używa a potrafi on naprawdę ułatwić wiele spraw, sam używam go dosyć często, prosty przykład: (ownername[0] == '\0') ? ("Brak") : (ownername) oczywiście jest to w formacie, gdy nick właściciela domku jest pusty (pierwszy znak == NULL) podajemy do formata "Brak" ponieważ dom niema właściciela, w przeciwnym wypadku podajemy nick właściciela ze zmeinnej.
  11. .silent

    SAMP - co dalej?

    Najgorsze w Kalcorze jest to że on nikogo się nie słucha, samp jest taki jak jemu się podoba i ma gdzieś wszystkich graczy dzięki którym ten projekt nadal się trzyma. On doda tylko to co mu się spodoba i co jemu się zachce, było tysiące próśb żeby dodał jakieś rzeczy ale wątpię żeby chociaż 5% z nich spełnił. Dobry był początek sampa, gdy była drużyna i nad kodem pracowało kilka osób, ale potem wszystko się posypało (wyciek kodu itd) i seria 0.3 już "zeszła na psy" gdzie aktualizacje były raz na ruski rok a wprowadzone zmiany nie były warte tego czasu. Wtedy Kalcor nawet udzielał się z ludźmi, potem stał się jakimś pustelnikiem żyjącym w jaskini któremu zależy bardziej na ukrywaniu swojej tożsamości niż na sampie.
  12. .silent

    SAMP - co dalej?

    Może i nie upada, ale na pewno nie jest dobrze zarządzany (w sumie to nie był odkąd Kalcor postanowił zabawić się w dyktatora) Od dłuższego już czasu lista internet pokazuje to samo co hosted - zgłaszane to bylo wiele razy na forum SAMPa a po dziś dzień nikt z "Teamu" sampa tego nie skomentował. Najprawdopodobniej jest to celowe działanie mające na celu przyciągnięcie zdesperowanych ludzi którzy wykupią hosted by być widocznym na liście, za czym idzie profit dla Kalcorzyny. Gdy sam skomentowałem sprawę na forum sampa dostałem bana (oczywiście bez żadnego wpisanego powodu, po prostu ban) a posty zostały usunięte. Kalcorowi po prostu nie zależy już od dawna na sampie, zależy mu tylko na darmowych pieniądzach które z niego czerpie. Powiedzmy sobie szczerze, trzeba być głupim żeby zapłacić 80zl za widoczność na jakiejś bezużytecznej liście niczym nie różniącej się od listy internet, rozumiem gdyby to była mała opłata, ale 80zł nie zapłaciłbym nawet gdyby trzeba było wykupić konto do gry w SAMPa bo po prostu nie jest tyle wart. Aktualizacje nie wnoszące praktycznie nic ciekawego, za to wnoszące więcej bugów niż zmian w changelogu wytaczane są raz do roku co jest śmiechu warte, rozumiem że Kalcor swoje lata ma i życie prywatne, dzieci itd, ale gdyby chciał to nawet w czasie wolnym zrobiłby więcej za miesiąc niż za ten rok, tyle że jemu na tym nie zależy. Powinien wreszcie zrozumieć że już się do tego nie nadaje (o ile kiedykolwiek się nadawał) i dopuścić kogoś wreszcie do projektu kto tchnąłby w niego nowe życie, bo naprawdę jest wiele ludzi którym nadal zależy i próbują wycisnąć z sampa co się da nie mając żadnego dostępu do kodu. Ja osobiście nie twierdzę by cokolwiek upadało, nadal dużo ludzi gra, dużo ludzi się udziela. Ja sam osobiście nie gram już od dawna, ewentualnie raz na jakiś czas wejdę na jakiś serwer gdy widzę jakieś znajome twarze ale zdarza się to sporadycznie, mimo to ciągle w ramach swojego hobby pracuję w wolnym czasie i chęciach nad gamemodem oraz pluginami do niego. Bo po prostu lubię, zacząłem grać w sampa lata temu i nigdy nie przestałem się nim interesować, takich ludzi jak ja podejrzewam że jest wielu, nie grają ale są aktywni.
  13. .silent

    [ROZWIĄZANY]Samp i jego (nie)zabezpieczenia

    Zabezpieczenia na to wyglądają przykładowo tak: obiekt tworzony jest w jakiejś losowej pozycji np { 0.0, 0.0, 0.0} i info o obiekcie wysyłane jest do gracza, następnie ustawiana jest poprawna pozycja obiektu przez SetObjectPos, wtedy takie typowe MapRecordery z neta zapiszą tylko samo stworzenie obiektu, zmiany pozycji natomiast nie uwzględnią. Gdy ktoś uprze się by skopiować obiekty to nie będzie to żadną przeszkodą.
  14. .silent

    [ROZWIĄZANY]Samp i jego (nie)zabezpieczenia

    Nie da się przed tym zabezpieczyć na 100%, w żadnej grze. W końcu informacje o nowym obiekcie muszą tak czy siak zostać wysłane do gracza żeby on ten obiekt utworzył, to już wystarczy żeby go sobie zapisać do jakiegoś pliku i potem go sobie wrzucić na swój serwer. Streamer może jedynie utrudnić o tyle że obiekty będą wysyłane do gracza jedynie gdy znajdzie się on w ich obszarze, ale to tylko utrudnienie a nie żadna blokada.
×