Skocz do zawartości

PrzMas

Użytkownik
  • Zawartość

    878
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    55

Aktywność reputacji

  1. Like
    PrzMas otrzymał reputację od KrzysieK_[ROZWIĄZANY]Czas, GUI i zmiana koloru w środku zdania   
    Zastąp symbole \n (LF) i \t (HT) jakimiś pojedynczymi znakami, których wiesz, że nie będziesz używał w tekście (np | i >) po czym prześlij całość do bazy danych, natomiast po pobraniu zamień z powrotem w pętli odpowiednio na \n i \t.
    stock mysql_spchrp(str[], str_sz= sizeof str) // mysql special chars replace { for(new i= 0; i < str_sz; i++) { if (str[i] == 0x00) break; // NULL, end of string else if (str[i] == '>') str[i]= 0x09; // HT else if (str[i] == '|') str[i]= 0x0a; // LF else if (str[i] == 0x09) str[i]= '>'; else if (str[i] == 0x0a) str[i]= '|'; } }  
  2. Like
    PrzMas otrzymał reputację od Jaev.ini kolejno w folderze (dfile) / losowanie   
    new fileidx= 0; // zmienna globalna public OnFilterScriptInit() { new fhandle; if (fexist("info_0.ini")) { fhandle= fopen("info_0.ini", io_read); new temp[4+1]; fread(fhandle, temp); fileidx= strval(temp); } else { fhandle= fopen("info_0.ini", io_append); fwrite(fhandle, "0"); } fclose(fhandle); } stock nowy_plik(tekst[]) { new temp[9+1]; format(temp, sizeof(temp), "info_%d.ini", ++fileidx); new fhandle= fopen(temp, io_append); fwrite(fhandle, tekst); fclose(fhandle); if (fexist("info_0.ini")) fremove("info_0.ini"); fhandle= fopen("info_0.ini", io_append); valstr(temp, fileidx); fwrite(fhandle, temp); fclose(fhandle); } Plik info_0.ini jest po to, aby po restarcie serwera nie utracić indeksu ostatniego pliku.
    new fname[9+1]; format(fname, sizeof(fname), "info_%d.ini", random(fileidx-1)+1); Zmienna fname będzie przechowywała nazwę wylosowanego pliku.
  3. Like
    PrzMas otrzymał reputację od Daniel000192.ini kolejno w folderze (dfile) / losowanie   
    W OnFilterScriptInit() sprawdź czy istnieje plik info0.ini, zawierający wartość dla ostatnio zapisanego pliku - jeśli nie istnieje to go utwórz i zapisz do niego wartość 0; Przy uruchomieniu skryptu wczytaj do zmiennej globalnej wartość z pliku info0.ini; Przy tworzeniu nowego pliku ustaw dla jego nazwy wartość zmiennej +1, następnie zapisz ją do pliku info0.ini.
  4. Like
    PrzMas otrzymał reputację od Daniel000192.ini kolejno w folderze (dfile) / losowanie   
    W OnFilterScriptInit() sprawdź czy istnieje plik info0.ini, zawierający wartość dla ostatnio zapisanego pliku - jeśli nie istnieje to go utwórz i zapisz do niego wartość 0; Przy uruchomieniu skryptu wczytaj do zmiennej globalnej wartość z pliku info0.ini; Przy tworzeniu nowego pliku ustaw dla jego nazwy wartość zmiennej +1, następnie zapisz ją do pliku info0.ini.
  5. Like
    PrzMas otrzymał reputację od Exive Group (crandom z bazy danych   
    Jeśli już to:
    if (response) { mysql_query( "SELECT * FROM `bays`;"); mysql_store_result(); new idx= random(mysql_num_rows()); // idx to indeks wylosowanego pola mysql_free_result(); } W pluginie, którego używam da się pobierać rekordy i pola po indeksie, a w StrickenKid-ie nie da się inaczej jak po nazwie pola.
    SELECT * FROM bays ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id >= (SELECT FLOOR(MAX(id)*RAND()) FROM table) ORDER BY id LIMIT 1; Powyższe dwa zapytania zwrócą tylko jeden wylosowany rekord z tabeli. Ta druga kwerenda jest dla tabeli z kluczem głównym.
  6. Like
    PrzMas otrzymał reputację od Exive Group (crandom z bazy danych   
    Jeśli już to:
    if (response) { mysql_query( "SELECT * FROM `bays`;"); mysql_store_result(); new idx= random(mysql_num_rows()); // idx to indeks wylosowanego pola mysql_free_result(); } W pluginie, którego używam da się pobierać rekordy i pola po indeksie, a w StrickenKid-ie nie da się inaczej jak po nazwie pola.
    SELECT * FROM bays ORDER BY RAND() LIMIT 1; SELECT * FROM table WHERE id >= (SELECT FLOOR(MAX(id)*RAND()) FROM table) ORDER BY id LIMIT 1; Powyższe dwa zapytania zwrócą tylko jeden wylosowany rekord z tabeli. Ta druga kwerenda jest dla tabeli z kluczem głównym.
  7. Like
    PrzMas otrzymał reputację od ourFarmWychodzenie z gry.   
    Ok, na podstawie niezałączonego kodu źródłowego, o którym mowa w niniejszym temacie, wnioskuję, że jest w nim jakiś błąd, dlatego nie wykonuje się do końca
    W celu uzyskania dogłębniejszych informacji na temat występującego problemu proszę o kontakt.
    Temat do zamknięcia.
  8. Like
    PrzMas otrzymał reputację od ourFarmPoszukuje Pawnera   
    W takim razie szukasz frajera a nie Pawnera, sam nie masz pojęcia o programowaniu to jeszcze nie szanujesz cudzych umiejętności.
    A do tego jesteś złodziejem, bo chcesz zarabiać na graczach i na umiejętnościach w/w frajera.
    W takim razie kup sobie saturator (jak masz za dużo pieniędzy) albo targaj z ulotkami, bo SA-MP to jest hobby, a nie źródło dochodu.
    Uprawnienia powinny być stosowne do roli w tworzeniu serwera i umiejętności danej osoby, a nie wedle czyjegoś życzenia na zasadzie tego lubię bardziej to dam mu admina a tego wcale nie lubię. Jeżeli programista jest od całego kodu, to musi mieć pełen dostęp do serwera.
    Nie szukaj człowieka, któremu ty będziesz zlecał a on będzie dla ciebie pisał, bo na kogoś takiego cię po prostu nie stać - ani z VIP-ów ani w ogóle z serwera nie wyciągniesz wystarczająco kasy, aby takiemu kompetentnemu programiście zapłacić za jego pracę.
  9. Like
    PrzMas otrzymał reputację od TytusProśby o skrypty   
    Działa nawet na tego nowego SobFoX'a, którego podobno nie da się wykryć wózkiem golfowym (tak słyszałem)
    Niestety, mimo wszystko da się wejść niepostrzeżenie, niektórzy mogą wiedzieć jak, ale - jak każdego - da się przecież ich zbanować
    A na zmieniarki IP dobry jest filtr polskich IP + "biała lista" (w pliku) dla zweryfikowanych graczy zza granicy. Tutaj masz bazę adresów (ta z samymi państwami) - trzeba sobie wyfiltrować polskie
  10. Like
    PrzMas otrzymał reputację od TytusWykrywanie s0beit'a (anty-s0beit 0.3.7-R2)   
    W związku z tym, że przestało mi zależeć na przetrzymywaniu tego "wykrywacza" na własny użytek, toteż postanowiłem opublikować w miarodajnej postaci to co wydedukowałem.
     
    native SendClientCheck(clientid, actionid, arg1= 0x00000000, arg2= 0x0000, bytes= 0x0004); // int32, int8, int32, int16, int16 forward OnClientCheckResponse(clientid, actionid, checksum, crc); // int32, int8, int32, int8 Deklaracja nagłówka funkcji i callback-a, należy je umieścić gdzieś w skrypcie, najlepiej w widocznym miejscu np. na górze.
     
    public OnPlayerConnect(playerid) { SendClientCheck(playerid, 0x47); return 1; } Zainicjowanie sprawdzania, które jest możliwe dopiero wtedy, gdy klasa gracza jest utworzona (oczywiście po stronie klienta) - akcja 0x47 to jest oczekiwanie na załadowanie tej klasy.
     
    public OnClientCheckResponse(clientid, actionid, checksum, crc) { switch(actionid) { case 0x47: SendClientCheck(clientid, 0x02); // klasa gracza załadowana, wysłanie zapytania o wygenerowanie checksum-u (akcja 0x02) case 0x02: if (checksum & 0x00ff0000 == 0x00300000) Kick(clientid); // mod-s0beit-sa } } Callback OnClientCheckResponse nie jest wykonywany (wywoływany) w skrypcie gamemode-a, dlatego należy go umieszczać w filtercript-ach.
    Wiadomo, że jeżeli w ciągu 1 sekundy (czas zależy m.in. od szybkości połączenia klient-serwer) od wywołania funkcji SendClientCheck dla akcji 0x47 (patrz: OnPlayerConnect) nie zostanie wywołany callback OnClientCheckResponse, to można takiego gracza wyrzucić, bo np. to może być RakSAMP albo ulepszony s0beit z pewnymi blokadami.
    W kwestii polityki proponuję nie chwalić się, że macie coś takiego w skrypcie, a jeśli już to lepiej rozpowszechnić plotkę, że to jest wózek golfowy, ponieważ z pewnego punktu widzenia powyższa metoda jest lepsza od tego wózka, choćby dlatego, że jest dyskretniejsza i prostsza w użyciu, a nawet daje kilka innych możliwości, dla których nie ma w SA-MP wbudowanych funkcji, natomiast (przy powyższej metodzie) łatwo można "zostać niewykrytym" podczas dołączania z s0beit-em na serwer.
    Co do tych kilku innych możliwości...
    Proponuję sprawdzić jakie checksum-y są generowane dla graczy znajdujących się w różnym stanie (pieszo, w powietrzu, w wodzie, w pojeździe, ...), którzy już dołączyli do gry, czyli mają już utworzoną klasę gracza (m.in. postać/skin). Do generowania tych checksum-ów wystarczy jedynie wywołanie dla akcji 0x02, natomiast do ich analizowania/porównywania będzie konieczna wiedza na temat operacji bitowych, więc jeżeli ktoś nie czuje się na siłach to może od razu sobie to odpuścić, choć na dobrą sprawę ta wiedza nie jest jakaś tajemna
    Oprócz akcji 0x47 i 0x02 są jeszcze takie akcje jak poniżej:
    0x48: czas, jaki upłynął od momentu uruchomienia systemu operacyjnego klienta/gracza, wyrażony w ilości milisekund; 0x46: ta akcja okaże się przydatna w połączeniu z parametrem 'crc', wówczas przekazany do funkcji argument 'arg1' jest zwracany (przez zmienną 'checksum') z niezmienioną wartością. Jeśli chodzi o zgodność klient/serwer dla powyższego kodu, to w/w akcje zostały dodane/odblokowane w wersji 0.3z-R4 i są dostępne do wersji 0.3.7-R2 dla serwera, natomiast dla klienta powyższy mechanizm na pewno jest efektywny od wersji 0.3z-R2 (nie sprawdzałem 0.3z-R1) do 0.3.7-R1. Tak wygląda sytuacja zgodności na chwilę obecną.
    Z uwagi na brak oficjalnej dokumentacji ze strony twórców nie napiszę nic więcej na temat przedmiotowego w temacie kodu, zresztą i tak już napisałem wystarczająco dużo.
    Pytania typu co jeszcze oprócz s0beit'a można wykryć są bezcelowe, ponieważ to zależy od pomysłowości tego, kto używa powyższego mechanizmu, no i od faktycznych jego możliwości.
  11. Like
    PrzMas otrzymał reputację od trevor3[DM]Polski Project X   
    @SLON: A ja dorzucę, że ten serwer na poprzednich wersjach (np. 0.3d-R2) był znany z czegoś jeszcze, głównie jego właściciel - z szkodzenia innym serwerom
    Główny właściciel był znany w tamtejszym środowisku z wchodzenia w różne konflikty z właścicielami konkurencyjnych serwerów, wchodził powyzywać się z kim popadło, wpuszczał boty, choć podobno ktoś podszywał się pod niego, ale nawet jeśli to nie bez powodu, bo człek z nickiem METAN i tak był znany z odgrażania się czego to komu nie zrobi albo którego to serwera nie rozwali i za co, bo ktoś coś powiedział nie tak.
    Natomiast na samym serwerze nie ma nic szczególnego - wszystko to, co na innych. Kiedyś wystarczyło mieć serwer w zakładce hosted żeby był on grywalny i na tym właśnie ten serwer wypłynął, ale pod inną nazwą - P4F (nie pamiętam rozwinięcia). Na wersję 0.3z przenieśli się, gdy grywalność zaczęła im spadać, chyba nawet do połowy.
    A na Stensin'a mówią "żona", ciekawe czemu... Chyba, że METAN'a już nie ma? - Rozwód czy separacja? Stensin, pucuj się. Jak tam wasze pożycie?
  12. Like
    PrzMas przyznał reputację dla Adrian Górski[SZUKAM] Ekipy do stworzenie serwera Role Play SA:MP   
    Cześć wam wszystkim! Jak w temacie szukam ekipy do stworzenia serwera Role Play – ludzi, którzy robią to z zamiłowania, bo jeżeli szukał bym kogoś komu chciałbym zapłacić to mój portfel w sekundę zrobił by się pusty a na głowie miałbym masę kredytów aby opłacić ekipę. Chciałbym by był to dopracowany projekt dlatego też czasowo powstawanie takiego serwera mogło by trochę potrwać. Nie chcę robić kolejnego pseudo serwera, który upadnie po miesiącu lub będzie się ciągnął latami a graczy nie będzie przybywało. Myślę, że co do uprawnień to będą one nadawane w zależności od wkładu włożonego w utworzenie serwera oraz umiejętności danej osoby. Nie szukam ludzi dla których będę zleceniodawcą a takich, z którymi można stworzyć coś fajnego i mają umiejętności by realizować swoje jak i moje pomysły wprowadzając je na serwer. Ze swojej strony mogę zaoferować opłacanie hostingu gdy serwer już powstanie, ponieważ programista, maper czy ktokolwiek ze mnie strasznie słaby. Gram na serwerach Role Play od 2009 roku i postanowiłem, że jeżeli się uda znajdę ekipę i stworzę z nią coś może nie zupełnie nowego ale spełniającego wymagania graczy na chwilę obecną. Chcę powrócić również do czasów gdy nie było masy odgrywania, masowego płaczu na forum oraz udupiania się skargami, rozbudować prace dorywcze, skupić się na tym by można było jeździć bez prawka i z nim aby LSPD mogło się pogłowić. Trzeba trafić w fajną koncepcję myśląc razem tak by przyciągnąć nią graczy – reklama nie jest tu najlepszym sposobem aczkolwiek też ważnym. Wprowadzenie zamkniętego obiegu gospodarki by w ten sposób frakcje mogły na siebie zarabiać – mandaty do LSPD, wyrabianie dokumentów do Rządu i tak dalej. Nie chciałbym też aby serwer był faworyzowany, w którąś stronę czy to organizacje porządkowe czy przestępcze - trzeba znaleźć kompromis. Jeżeli ktoś byłby zainteresowany taką współpracą to zapraszam do wypowiedzi tutaj lub na moje PW. Pozdrawiam wszystkich i czekam na wasze opinie i pytania.
  13. Like
    PrzMas przyznał reputację dla EveR[SZUKAM] Ekipy na serwer SA:MP.   
    Witam wszystkich użytkowników PAWNO.PL! Moje ogłoszenie dotyczy poszukiwania ekipy na serwer SA:MP z tematyką Truck (mała domieszka Role-Play). Mogą być nimi wszyscy, nawet gdy masz 12-13 lat możesz do nas dołączyć, lecz mamy jeden warunek - musisz coś umieć, pisanie tekstów, webmastering, pawno - wszystko, zależy nam na tym abyś nie siedział bezczynnie przed komputerem tylko pomagał w rozwijaniu serwera. Przejdźmy do kontaktu:
    GaduGadu:  56817175,
    bądź prywatna wiadomość na forum!
     
     
     
    @edit: Poszukujemy głównego programisty pawn! 
    @ref
     
    @edit: Poszukujemy mapperów!
     
    @edit Poszukujemy osoby pełnej pomysłów do zaprojektowania stylu! - sam opis.
     
    Nie zapominając o powyższym punkcie szukamy również grafików.
     
    @edit: Poszukujemy programisty PAWN, chcielibyśmy mieć zaufane osoby w Administracji, więc proszę o jakieś szczegóły (przedstawienie, informacje np. czy byłeś w innym projekcie.). O wyposażeniu opowiem tylko i wyłącznie na GG.  Zachęcam bardzo serdecznie, nie pożałujesz wstąpienia w nasze szeregi! 
     
    //Połączyłem ten spam w jeden post - Maku
  14. Like
    PrzMas otrzymał reputację od BelferOptymalny timer   
    Najpierw trzeba wiedzieć jak zorganizowane są timer-y Obciążeniem może być duża ilość timer-ów, dla których (wszystkich łącznie) callback-i wywoływane są z dużą częstotliwością, czyli te timer-y są ustawione na krótkie odstępy czasu i wywoływane wielokrotnie. Timer-y mają taki defekt, że jedno ID nie będzie wykorzystane więcej niż raz, czyli nie powinno się tworzyć timer-ów per-player, bo nie wiem co stanie się po wykorzystaniu ID 2.147.483.647 (teoretycznie).
    Najlepiej używać ich tak, jak komu wygodnie. Przykładowo, jeżeli chcesz dawać graczowi kasę co minutę (za minutę gry na serwerze), to gdy pewien gracz wejdzie w połowie cyklu globalnego timer-a (rozwiązanie nr 2) to po pół minuty dostanie kasę za minutę gry na serwerze, ale tak będzie tylko za pierwszym razem od wejścia.
  15. Like
    PrzMas otrzymał reputację od Mati_(POL)Czas uniksowy   
    Jak wiadomo SA-MP'owa funkcja gettime (wywołana bez przekazywania do niej argumentów) zwraca czas uniksowy aktualny w danym systemie operacyjnym, jednak bez uwzględnienia strefy czasowej oraz czasu letniego. W niniejszym temacie publikuję funkcje operujące na niniejszym czasie, jedna przelicza podaną datę i godzinę na znacznik (z możliwością odliczenia strefy czasowej oraz czasu letniego):

    a druga znacznik na datę, godzinę oraz dzień tygodnia (wartość 1-7) z uwzględnieniem strefy czasowej oraz czasu letniego:

    Dodatkowo prosta funkcja wyliczająca ilość dni, godzin, minut i sekund z podanej różnicy dwóch znaczników:
     
    [kompletny_kod_źródłowy]

    Najczęściej zadawane pytania (FAQ)
     
    1. Jak zorganizować prosty algorytm czasowej rangi VIP na serwerze z wykorzystaniem znacznika czasu uniksowego?
    Należy zapisać zwrócony przez funkcję gettime() znacznik zwiększony o określony czas:
    new vip_expiry= gettime() +3*86400; // 86400 = 1 [doba/dzień] do bazy danych albo systemu plików.
    Sprawdzanie czy ranga VIP jest nadal aktywna może wyglądać następująco:
    if (vip_expiry != 0) // 0 oznacza, że należy pominąć sprawdzanie rangi VIP { new timenow= gettime(); // posix timestamp if (timenow < vip_expiry) // ranga aktywna { // wyświetlenie czasu do wygaśnięcia VIP-a new d,h,m,s; timediff(vip_expiry-timenow, d,h,m,s); new msg[144]; format(msg, sizeof(msg), "Do wygaśnięcia rangi VIP pozostało: %dd, %dg, %dm, %ds.", d,h,m,s); SendClientMessage(playerid, 0xffffffff, msg); } else // ranga nieaktywna { // wyświetlenie informacji dla gracza o wygaśnięciu rangi new d,h,m,s; timediff(timenow-vip_expiry, d,h,m,s); new msg[144]; format(msg, sizeof(msg), "Ranga VIP wygasła: %dd, %dg, %dm, %ds temu.", d,h,m,s); SendClientMessage(playerid, 0xffffffff, msg); // w bazie danych dla pola 'vip_expiry' należy zapisać wartość 0, // aby pominąć przyszłą-zbędną informację o wygaśnięciu VIP-a przy następnym sprawdzaniu } } Zmienna vip_expiry reprezentuje odpowiednią wartość pobraną z bazy danych lub systemu plików.
    2. Jak wyświetlić aktualną datę, godzinę i dzień tygodnia na podstawie znacznika uniksowego?
    main() { new Y,M,D, h,m,s, w= unix2date(gettime(), Y,M,D, h,m,s, TIMEZONE, true); new const wd[][]= { {"poniedzialek"}, {"wtorek"}, {"sroda"}, {"czwartek"}, {"piatek"}, {"sobota"}, {"niedziela"} }; new buff[32]; format(buff, sizeof(buff), "%04d-%02d-%02d %02d:%02d:%02d %s", Y,M,D, h,m,s, wd[w-1]); print(buff); } 3. Jak sprawdzić czy określona data jest zgodna z kalendarzem oraz czasem uniksowym?
    Dla przykładu można utworzyć funkcję isvaliddate(), która zwróci prawdę (1) dla poprawnej daty:
    stock isvaliddate(Y,M,D, h=0,m=0,s=0) { new ts= date2unix(Y,M,D, h,m,s); if (ts < 0) return false; new Y2,M2,D2, h2,m2,s2; unix2date(ts, Y2,M2,D2, h2,m2,s2); return (s2 != s || m2 != m || h2 != h || D2 != D || M2 != M || Y2 != Y)?(false):(true); } Nieprawidłowe daty to: 30 lutego (luty ma najwyżej 29 dni, jeśli jest w roku przestępnym), 32 stycznia (miesiąc ma najwyżej 31 dni), 1 stycznia 2039 roku (limit czasu uniksowego to 19 stycznia 2038 roku o godzinie 03:14:07 dla liczb ze znakiem - signed integer).
    Uwagi ogólne
    Porównywane znaczniki powinny być względem siebie w jednakowej postaci (nie w sensie równe), czyli jeżeli jeden jest ze strefy czasowej GMT +1:00 a drugi GMT +0:00 to należy od pierwszego odjąć jedną godzinę i dopiero wówczas porównywać obydwa znaczniki. Funkcja gettime() celowo zwraca wartość/znacznik bez uwzględniania strefy czasowej i czasu letniego, bowiem w takiej postaci nie zajdą rozbieżności podczas porównań i obliczania różnic, zwłaszcza jeśli chodzi o czas letni. Strefy czasowej i czasu letniego należy używać jedynie podczas wyświetlania danego znacznika przeliczonego do postaci sformatowanej i czytelnej dla człowieka.
    Jeżeli ma być przeliczana (do późniejszych operacji) data (i godzina) podana ręcznie przez użytkownika (sczytana np sscanf-em) to dla funkcji date2unix() należy uwzględnić argumenty timezone oraz auto_dst.
  16. Like
    PrzMas przyznał reputację dla damqer[Zapowiedz] Mystic RolePlay   
    Poziom na serwerach RP jest zaniżany przez takich nosicieli idiotyzmu. Co kogo interesuje czy mają VPS czy miejsce na serwerze wykupionym u firmy czy cokolwiek innego? Ma się miło grać jeśli tak nie będzie to i graczy nie będzie. A robicie jakąś burzę bo "nawet VPS nie mają" - litości , docinki poniżej jakiegokolwiek poziomu. Mają zasób czasu i kasy to niech robią nawet i 3 projekty na raz, ich sprawa.
  17. Like
    PrzMas otrzymał reputację od DaGaXeR[Zapowiedz] Mystic RolePlay   
    @DaGaXeR No cóż... Miała być reklama, a wyszło jak wyszło
    Kto czytał, ten wie
  18. Like
    PrzMas otrzymał reputację od DaGaXeR[Zapowiedz] Mystic RolePlay   
    To skoro skrypt ma z 10 osób, a wy go tylko przerobicie, to znaczy, że na tym serwerze nie będzie nic nowego, bo co istotnego można zmienić przez miesiąc, zatem rozgrywka taka sama jak na dziesięciu innych serwerach, czyli d...y nie urywa Przez takich mało ambitnych ludzi SA-MP jest coraz mniej grywalny, także lepiej będzie jeśli nie będziecie otwierać tego serwera, bo tylko psujecie reputację tego multiplayer'a, który jest trochę słabo rozwijany przez twórców, to jednak chyba nadszedł czas żeby właściciele serwerów zaczęli przejmować inicjatywę tworząc nowe, ciekawe i grywalne serwery, a nie kopie n-tej kopii, bo wydaje im się, że skoro ktoś mógł dawno temu mieć grywalny serwer to oni powielając to przedsięwzięcie osiągną to samo, a może nawet więcej - nie, to tak nie działa, bo upodobania się zmieniają
  19. Like
    PrzMas otrzymał reputację od KreizSystemy liczbowe   
    W niniejszym temacie publikuję zestaw funkcji do przeliczania
    liczby całkowitej na dowolny system liczbowy (2-36) i
    z dowolnego systemu liczbowego (2-36) na liczbę całkowitą.

    Wymagana biblioteka (plik uint.inc) do operacji na liczbach nieujemnych (unsigned integer):
    [pastebin]

    Implementacje (i makrodefinicje) przedmiotowych w temacie funkcji:

    Sposób użycia:

    Objaśnienie:
    Potrzeba zastosowania powyższych rozwiązań bierze się stąd, że wartości liczbowe mają swoje ograniczenia, są zapisane na 32-bitach ze znakiem lub bez (signed/unsigned):
    signed integer: 0x80000000 (-2147483648) - 0x7fffffff (2147483647) unsigned integer: 0x00000000 (0) - 0xffffffff (4294967295) oraz dlatego, że nie dostarczono takich funkcji ze środowiskiem SA-MP, natomiast funkcje strval i valstr są "dziurawe" - mają ograniczone możliwości i są niezabezpieczone.
    Jeśli zależy nam na wartościach ujemnych to pozostajemy przy zwykłych liczbach Pawn, deklarowanych następująco:
    new val= 1234; // signed jednak mają one ograniczony przedział liczbowy (patrz wyżej). Natomiast jeżeli wiemy, że dla danej liczby nie chcemy wartości ujemnych i zachodzi potrzeba zastosowania większego zakresu liczbowego, to w tym celu zmienną przechowującą duże wartości, którą będziemy traktować jak nieujemną, należy oznaczyć następująco:
    new uint: val1= 1234; // unsigned new unsigned val2= 1234; // unsigned Plik uint.inc najlepiej wkleić do folderu pawno\include, a w pliku gdzie znajdują się implementacje powyższych funkcji należy dopisać:
    #include <uint> a jeśli niniejszy plik został wklejony do folderu include, znajdującym się w głównym katalogu serwera to:
    #include "..\include\uint.inc"  
  20. Like
    PrzMas otrzymał reputację od DaGaXeR[Zapowiedz] Mystic RolePlay   
    A czy zamiast klepania tony tekstu ktoś z was jest w stanie napisać w jednym krótkim zdaniu co tam się ciekawego dzieje, na czym polega rozgrywka? Jeśli nie to nawet nie ma o czym mówić. Chyba gdyby nie te intrygi to wokół waszego serwera nic szczególnego by się nie działo, jak w Modzie na sukces
    Jesteś cudzoziemcem? Pierwsze zdanie jest niespójne, ale drugie nielogiczne - ty jesteś z '97?
  21. Like
    PrzMas przyznał reputację dla DaGaXeR[Szukam]Programisty Pawn   
    Wymień 5 "innowacji" w Twoim "innowacyjnym" projekcie.
  22. Like
    PrzMas przyznał reputację dla xBBBay ☆[Szukam]Programisty Pawn   
    No to wszystkie serwery to mają nic ciekawego. 
  23. Like
    PrzMas przyznał reputację dla DaGaXeR[Szukam]Programisty Pawn   
    Wciąż czekam na wymienienie innowacji.
  24. Like
    PrzMas otrzymał reputację od Mati_(POL)Czas uniksowy   
    Jak wiadomo SA-MP'owa funkcja gettime (wywołana bez przekazywania do niej argumentów) zwraca czas uniksowy aktualny w danym systemie operacyjnym, jednak bez uwzględnienia strefy czasowej oraz czasu letniego. W niniejszym temacie publikuję funkcje operujące na niniejszym czasie, jedna przelicza podaną datę i godzinę na znacznik (z możliwością odliczenia strefy czasowej oraz czasu letniego):

    a druga znacznik na datę, godzinę oraz dzień tygodnia (wartość 1-7) z uwzględnieniem strefy czasowej oraz czasu letniego:

    Dodatkowo prosta funkcja wyliczająca ilość dni, godzin, minut i sekund z podanej różnicy dwóch znaczników:
     
    [kompletny_kod_źródłowy]

    Najczęściej zadawane pytania (FAQ)
     
    1. Jak zorganizować prosty algorytm czasowej rangi VIP na serwerze z wykorzystaniem znacznika czasu uniksowego?
    Należy zapisać zwrócony przez funkcję gettime() znacznik zwiększony o określony czas:
    new vip_expiry= gettime() +3*86400; // 86400 = 1 [doba/dzień] do bazy danych albo systemu plików.
    Sprawdzanie czy ranga VIP jest nadal aktywna może wyglądać następująco:
    if (vip_expiry != 0) // 0 oznacza, że należy pominąć sprawdzanie rangi VIP { new timenow= gettime(); // posix timestamp if (timenow < vip_expiry) // ranga aktywna { // wyświetlenie czasu do wygaśnięcia VIP-a new d,h,m,s; timediff(vip_expiry-timenow, d,h,m,s); new msg[144]; format(msg, sizeof(msg), "Do wygaśnięcia rangi VIP pozostało: %dd, %dg, %dm, %ds.", d,h,m,s); SendClientMessage(playerid, 0xffffffff, msg); } else // ranga nieaktywna { // wyświetlenie informacji dla gracza o wygaśnięciu rangi new d,h,m,s; timediff(timenow-vip_expiry, d,h,m,s); new msg[144]; format(msg, sizeof(msg), "Ranga VIP wygasła: %dd, %dg, %dm, %ds temu.", d,h,m,s); SendClientMessage(playerid, 0xffffffff, msg); // w bazie danych dla pola 'vip_expiry' należy zapisać wartość 0, // aby pominąć przyszłą-zbędną informację o wygaśnięciu VIP-a przy następnym sprawdzaniu } } Zmienna vip_expiry reprezentuje odpowiednią wartość pobraną z bazy danych lub systemu plików.
    2. Jak wyświetlić aktualną datę, godzinę i dzień tygodnia na podstawie znacznika uniksowego?
    main() { new Y,M,D, h,m,s, w= unix2date(gettime(), Y,M,D, h,m,s, TIMEZONE, true); new const wd[][]= { {"poniedzialek"}, {"wtorek"}, {"sroda"}, {"czwartek"}, {"piatek"}, {"sobota"}, {"niedziela"} }; new buff[32]; format(buff, sizeof(buff), "%04d-%02d-%02d %02d:%02d:%02d %s", Y,M,D, h,m,s, wd[w-1]); print(buff); } 3. Jak sprawdzić czy określona data jest zgodna z kalendarzem oraz czasem uniksowym?
    Dla przykładu można utworzyć funkcję isvaliddate(), która zwróci prawdę (1) dla poprawnej daty:
    stock isvaliddate(Y,M,D, h=0,m=0,s=0) { new ts= date2unix(Y,M,D, h,m,s); if (ts < 0) return false; new Y2,M2,D2, h2,m2,s2; unix2date(ts, Y2,M2,D2, h2,m2,s2); return (s2 != s || m2 != m || h2 != h || D2 != D || M2 != M || Y2 != Y)?(false):(true); } Nieprawidłowe daty to: 30 lutego (luty ma najwyżej 29 dni, jeśli jest w roku przestępnym), 32 stycznia (miesiąc ma najwyżej 31 dni), 1 stycznia 2039 roku (limit czasu uniksowego to 19 stycznia 2038 roku o godzinie 03:14:07 dla liczb ze znakiem - signed integer).
    Uwagi ogólne
    Porównywane znaczniki powinny być względem siebie w jednakowej postaci (nie w sensie równe), czyli jeżeli jeden jest ze strefy czasowej GMT +1:00 a drugi GMT +0:00 to należy od pierwszego odjąć jedną godzinę i dopiero wówczas porównywać obydwa znaczniki. Funkcja gettime() celowo zwraca wartość/znacznik bez uwzględniania strefy czasowej i czasu letniego, bowiem w takiej postaci nie zajdą rozbieżności podczas porównań i obliczania różnic, zwłaszcza jeśli chodzi o czas letni. Strefy czasowej i czasu letniego należy używać jedynie podczas wyświetlania danego znacznika przeliczonego do postaci sformatowanej i czytelnej dla człowieka.
    Jeżeli ma być przeliczana (do późniejszych operacji) data (i godzina) podana ręcznie przez użytkownika (sczytana np sscanf-em) to dla funkcji date2unix() należy uwzględnić argumenty timezone oraz auto_dst.
  25. Like
    PrzMas otrzymał reputację od KreizGeoIp (API)   
    W niniejszym temacie publikuję skrypt na pozyskiwanie geolokalizacji adresu IP
    z bazy danych serwisu ip-api.com, za pośrednictwem API.
     
    Implementacje użytych funkcji:
     
    Skrypt właściwy:
     
    Sposób użycia:
    Myślę, że choć jest trochę kodu to nie ma tu czego objaśniać, skoro sposób użycia jest dość prosty i skuteczny.
    Proszę o wspomnienie mnie jako autora niniejszego skryptu
    Skrypt alternatywny
×