Skocz do zawartości

PrzMas

Użytkownik
  • Zawartość

    878
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    55

Aktywność reputacji

  1. Like
    PrzMas otrzymał reputację od Dejv[ROZWIĄZANY]Dla tych ogarniający język - szybkość/optymalność.   
    Każdy timer to osobny wątek a OnPlayerUpdate jest tak czy inaczej wywoływane dla gracza, który jest synchronizowany na serwerze.
    To czy kod tam umieszczony jest optymalny czy nie to już inna sprawa. Na pewno nie można tam nadużywać (bo przecież używać można) funkcji operujących na plikach, bo wiąże się to z czasem dostępu do dysku, który może być zmienny albo funkcji operujących na bazie danych, ponieważ od momentu wysłania zapytania do uzyskania danych zwrotnych zapytania nie mija < 1 ms, a co za tym idzie wynik zapytania nie jest zwracany momentalnie tylko "kod musi sobie na niego poczekać" - Pawn jest strukturalnym językiem skryptowym, czyli kod jest wykonywany w jednym wątku albo w tylu wątkach ile zakodowano dla serwera SA-MP przez twórców - chodzi o callback-i.
  2. Like
    PrzMas otrzymał reputację od .vexus[ROZWIĄZANY]InputTooLong   
    Co??? xD Nie, nie, to nie wypali xD
    new str[]= "1)Świeżak(9mm | Tec9 | BaseBall)\n2)Młody Gangster(9mm | Obrzyn)(150 Score)\n3)Prawdziwy Czarnuch(Silenced | Uzi)(300 Score)\n4)Pogromca Ulic(Shotgun | Mp5)(500 Score)\n5)Orginal Gangster(Kałach | Shotgun | Deagle)(700 Score)\n6)Weteran Ulic(Kałach | Silenced | Spaz 12)(900 Score)\n7)Stary Wyga(Kałach | Obrzyn | Uzi)(1100exp)\n8)Snajper(Snajperka | Deagle | Granat)(5000 Score) \n9)Heavy Gunner(RPG | Deagle | C4)(10000 Score)"; ShowPlayerDialog(playerid, 1, DIALOG_STYLE_LIST, "Jaką wybierasz klasę?", str, "Wybieram", "Wybieram"); Chodzi o to, że limit znaków w jednej linii kodu wynosi chyba 512 albo coś koło tego (twoja linijka ma 530 znaków).
    Jeśli to nie zadziała to poczytaj o funkcji strcat.
  3. Like
    PrzMas otrzymał reputację od Mati_(POL)[ROZWIĄZANY]OVD i magia synchronizacji   
    Nie masz na to wpływu, skrypt nie decyduje o tym w tym callback-u.
    Może się pomyliłem co do tego niewywoływania się callback-a; gdy pojazd jest rozwalany bez jakiegokolwiek gracza w pobliżu to ten callback się wywołuje, ale killerid jest nieprawidłowe (65535) - trzeba by to sprawdzić, ale pewnie tak właśnie jest jak teraz napisałem.
  4. Like
    PrzMas otrzymał reputację od Mati_(POL)[ROZWIĄZANY]OVD i magia synchronizacji   
    Zasada jest taka, że jak jest kierowca w pojeździe to callback zostanie wywołany, a 'killerid' to będzie id kierowcy, a jeśli nie ma kierowcy to pasażera, a jeśli nie pasażera to najbliżej znajdującego się gracza, dla którego dany pojazd ze-stream-owany, a jeśli w pobliżu rozwalonego pojazdu nie ma żadnego  ze-stream-owanego gracza to callback nie zostanie wywołany w ogóle.
    Chyba właśnie na to wskazuje logika tego w sumie jednego zdania z wiki sa-mp'a.
  5. Like
    PrzMas otrzymał reputację od Mati_(POL)[ROZWIĄZANY]OVD i magia synchronizacji   
    Z informacji nt. OnVehicleDeath zawartych na wiki.sa-mp.com wynika, że ten callback z założenia jest po to, aby ustalić przez którego gracza (liczba pojedyncza) dany pojazd został zniszczony, zatem jeżeli jest on niszczony przez skrypt to ten callback nie znajdzie swojego zastosowania. Możesz zadeklarować swój callback i wywoływać go samodzielnie po zniszczeniu pojazdu przez skrypt, a jeśli zależy ci na precyzji to możesz zmierzyć czas od momentu ustawienia stanu zniszczenia pojazdu do momentu jego zniszczenia i wywoływać to swoje dopisane zdarzenie z odpowiednim opóźnieniem w czasie.
    Przecież to jest wyłącznie twój wybór na jakiej platformie piszesz
  6. Like
    PrzMas otrzymał reputację od Shady.[ROZWIĄZANY]Komenda, która posiada dwa człony   
    Otóż nic się nie dzieje ze zmienną 'str1' od momentu jej deklaracji aż do odczytywania jej przez funkcję strcmp, zatem gdy wykonywany jest warunek to ta zmienna jest pusta, a skoro tak to funkcja strcmp zawsze zwróci wynik 0, ponieważ gdy co najmniej jeden z jej dwóch argumentów (ciągów tekstowych) 'string1' i 'string2' jest pusty to ta funkcja zwróci 0.
    Na dobrą sprawę możesz wykosić zmienną 'str1' i zastąpić odpowiednie fragmenty kodu jak poniżej:
    CMD: tp(playerid, params[]) { new str2[32]; if (PlayerInfo[playerid][LevelAdmin] >= 3) { if (strfind(params, "to", true) == 0) // 'strcmp' na 'strfind' { // [...] } else if (strfind(params, "here", true) == 0) // 'strcmp' na 'strfind' { // [...] } } SCM(playerid, COLOR_RED, "Nie możesz użyć tej komendy lub nie istnieje."); return 1; } Funkcja strfind zwraca indeks (argumentu 1), od którego zaczyna się szukany ciąg (argument 2), a jeśli szukanego ciągu nie ma w ciągu źródłowym, to funkcja zwraca -1.
    Argument 'params' zawiera parametry przekazane z komendą w postaci tekstowej (ciąg tekstowy), a skoro ciąg "to" albo "here" ma być pierwszym argumentem komendy "/tp" to można dokonać jego wyszukiwania bezpośrednio w zmiennej 'params' (bez pośrednictwa zmiennej 'str1').
  7. Like
    PrzMas otrzymał reputację od Mati_(POL)[ROZWIĄZANY]F4   
    To w takim razie masz dwa wyjścia: zainwestować znacznie więcej czasu i wysiłku w swoją edukację albo odpuścić to w cholerę i więcej się za to nie brać.
  8. Like
    PrzMas otrzymał reputację od Nortal[ROZWIĄZANY]Funkcja działająca raz na tydzień   
    Dokładnie tak, bezpośrednio po użycia przez gracza owej komendy.
    Dodam jeszcze, że po wartości zwracanej przez funkcję gettime można ustalić dzień tygodnia:
    new wd= (((gettime()/86400)-4)%7)+1; // 1970-01-01 00:00:00 to jest czwartek, dlatego -4, a +1 żeby wartości zaczynały się od 1 a nie od 0 wówczas powyższa wartość zmiennej 'wd' będzie odpowiadała dniu tygodnia od poniedziałku (1) do niedzieli (7).
  9. Like
    PrzMas otrzymał reputację od Nortal[ROZWIĄZANY]Funkcja działająca raz na tydzień   
    if (gettime() >= czas_pobrany + (7*86400)) { // minął albo jest (>=) dokładnie tydzień, można ponownie użyć funkcji }  
  10. Like
    PrzMas otrzymał reputację od Shady.[ROZWIĄZANY]Zagadka z formatem   
    Tak jak napisał @Nortal ilość znaków dla tekstów wyświetlanych na czacie jest ograniczona do 144, a gdy tekst jest dłuższy to nie zostanie wyświetlony.
    Musisz ograniczyć kolorowanie, biorąc pod uwagę, że długość wstawianych do ciągu tekstów może być różna (chodzi np o nick gracza albo o "powód").
    Na pewno zyskasz 8 znaków jeżeli zrobisz coś takiego:
    new string[144], // konsekwentnie dla ciągu tekstowego w linijce czatu limit znaków wynosi 144 id = 1, ilosc = 2, powod = 32; format(string, sizeof(string), "Gracz {960000}%s {ff0000}został zbanowany na {960000}%d dni {ff0000}przez administratora {960000}%s{ff0000} z powodem {960000}%s{ff0000}.", PlayerName(id), ilosc, PlayerName(playerid), powod); SCMA(0xFF0000FF, string); Chodzi o początek ciągu tekstowego i pierwszy argument funkcji SCMA.
    Dodam jeszcze, że nie można używać specyfikatora "%s" dla podstawiania wartości zmiennych liczbowych.
  11. Like
    PrzMas otrzymał reputację od 7days7[ROZWIĄZANY]Znajdowanie znaku w stringu.   
    stock fdbqt(str[]) // find double quotes { for(new i= 0, len= strlen(str); i < len; i++) { if (str[i] == '\"') return true; } return false; } lub
    printf("idx: %d", strfind("Ciąg tekstowy zawierający podwójny cudzysłów '\"'.", "\""));  
  12. Like
    PrzMas otrzymał reputację od Nortal[ROZWIĄZANY]Interiory   
    Właśnie zdałem sobie sprawę, że niedopomyślałem o tym samym, ale mam na to rozwiązanie, bo rozumiem, że nie chcesz się spotykać z kolegą?
    Jeśli tak to musisz zapisywać do zmiennej per-player do którego domku gracz wszedł, aby przy wyjściu ustawić gracza w pozycji tego domku, do którego faktycznie wchodził, a żeby nie spotykać się z graczami z innych domków w tym samym interiorze to można ustawić inny VirtualWorld dla każdego domku, do którego gracz wchodzi, np 789 + [ID domku].
  13. Like
    PrzMas otrzymał reputację od 7days7[ROZWIĄZANY]Znajdowanie znaku w stringu.   
    Jeżeli chodzi ci o podwójny cudzysłów to da się go umieścić w tekście w następujący sposób:
    new string[128]; format(string, sizeof(string), "Zmienna 'string' wbrew pozorom może zawierać podwójny cudzysłów '\"'."); print(string);  
  14. Like
    PrzMas otrzymał reputację od Bartcislaw[ROZWIĄZANY]Nie zlicza sumy.   
    Jeżeli w ogóle to do logu zostanie zwrócona wartość 25 po czym pętla zostanie przerwana ("return 1") i nie zostanie wywołana funkcja:
    DisablePlayerCheckpoint(playerid); Ogólnie w załączonym fragmencie kodu słowo "continue" jest niekonieczne.
  15. Like
    PrzMas otrzymał reputację od WalWer96bany czasowe   
    Funkcja gettime zwraca aktualny czas wyrażony w ilości sekund jaka upłynęła od 1970-01-01 00:00:00 do momentu wywołania funkcji w kodzie (w chwili wystawienia bana).
    Zatem suma aktualnego czasu z okresem obowiązywania bana da moment (data i godzina wyrażona w sekundach), w którym ban przestanie obowiązywać.
    %f - liczba rzeczywista
    %s - ciąg tekstowy
    %d - liczba całkowita
    Funkcja gettime zwraca liczbę całkowitą.
  16. Like
    PrzMas otrzymał reputację od WalWer96bany czasowe   
    To obok bana (IP, gracz, powód, ...) możesz zapisywać taką wartość:
    gettime() + DNI*86400 + GODZINY*3600 + MINUTY*60 + SEKUNDY; // czas graniczny i przy wejściu gracza na serwer sprawdzasz czy aktualny czas (gettime) jest mniejszy lub równy od powyższego, jeśli tak to wyrzucasz, jeśli nie to wpuszczasz na serwer.
    Proponuję nie robić tego sprawdzania w OnPlayerConnect tylko w OnIncomingConnection, ponieważ do samego sprawdzania jest potrzebny jedynie adres IP, a zdarzenie OnIncomingConnection wywoływane jest wcześniej niż OnPlayerConnect. Chyba, że chcesz zrobić jakąś informacje przy wyrzucaniu gracza to wtedy OnPlayerConnect.
    Jeszcze lepiej jest użyć funkcji BlockIpAddres oraz UnBlockIpAddress, przy czym dla tej pierwszej należy w drugim argumencie podać okres blokowania w milisekundach, tzn na ile milisekund dany adres IP ma być zablokowany. Przy takim rozwiązaniu odpada wyświetlanie jakichkolwiek informacji, ponieważ gracza w ogóle nie łączy z serwerem.
    Dodatkowa wada, wynikająca z faktu, że czas jest określany w milisekundach, a typ liczbowy używany w Pawn uwzględnia znak (signed integer), jest taka, że można blokować adres na ograniczony wymiar czasowy, tj maksymalnie na 2147483647 ms (24d, 20g, 31m, 23s, 647ms), a jeżeli wewnętrznie dla tej funkcji jest używany typ danych bez znaku (unsigned integer), to wcześniej wspomniany czas będzie dwukrotnie większy, tj 4294967295 (49d, 17g, 2m, 47s, 295ms) - po prostu nigdy tego nie sprawdzałem, więc podaję dwa scenariusze. Jeżeli podasz 0 jako czas to adres będzie blokowany do momentu odblokowania (UnBlockIpAddress) lub restartu serwera.
    Opcja ma tą zaletę, że można banować używając maski, np "192.168.*.*", czyli zostaną zablokowane wszystkie adresy zaczynające się od oktetów 192.168. Gwiazdki mogą występować w dowolnych miejscach, ale trzeba ich używać z głową. Nie da się zablokować adresu 127.0.0.1.
  17. Like
    PrzMas otrzymał reputację od O Jezu Jakie Fajne[ROZWIĄZANY]Domyślne wartości w publicu   
    Po "new" występuje nazwa zmiennej, czyli w tym przypadku "var"
  18. Like
    PrzMas otrzymał reputację od Dejv[DLA NOWICJUSZY] Jak zrobić teleport.   
    Najszybszym i nie wymagającym dodatkowego skryptu sposobem jest posłużenie się wbudowaną funkcją /save, chyba nawet można dopisać opis podczas zapisywania lokalizacji.
    Więcej informacji tutaj.
  19. Like
    PrzMas otrzymał reputację od WalWer96[ROZWIĄZANY]spawn kill   
    Pasażer zostanie tam gdzie był ostatnio - nie zostanie teleportowany. Zostanie bez dachu nad głową
  20. Like
    PrzMas otrzymał reputację od WalWer96[ROZWIĄZANY]spawn kill   
    To na wstępie masz logiczny nieład, ponieważ w sytuacji gdy do /lv teleportuje się więcej niż 1 gracz i na chwilę ustawisz im "jakiś tam" virtual world to przez tą chwilę i tak będą się widzieli i mogli do siebie strzelać, chyba że o to ci właśnie chodzi.
    Co do części szczególnej twojego problemu to musisz:
    sprawdzać czy w momencie teleportu gracz jest w pojeździe przenieść gracza (razem z pojazdem) do wybranego virtual world'a zapisać id tego jego pojazdu do jakiejś zmiennej per-player, jeżeli gracz jest w pojeździe po upływie czasu "spawn-kill" przenieść gracza (i zapisany pojazd) do virtual world'a 0.  
  21. Like
    PrzMas otrzymał reputację od O Jezu Jakie FajneProblem z drukarka   
    A drukujesz po kablu czy po Wi-Fi (drukarka udostępniona w sieci, drukowanie z innego komputera)?
    Mam inną drukarkę, ale też czasem bywają problemy podczas drukowania za pośrednictwem sieci Wi-Fi, a wówczas najszybszym i najskuteczniejszym rozwiązaniem jest rozłączenie i ponowne połączenie z siecią Wi-Fi komputera, z którego jest wydruk.
    Ogólnie to możesz przywrócić fabryczne ustawienia drukarki [strona 20], a potem poustawiać co trzeba.
  22. Like
    PrzMas otrzymał reputację od John563[ROZWIĄZANY]SetDynamicObjectMaterialText - Nowa Linia.   
    To zamiast "\n" użyj innego znaku, np "|", a potem (po przechwyceniu tekstu sscanf-em) zamieniaj ten znak na "\n".
  23. Like
    PrzMas otrzymał reputację od John563[ROZWIĄZANY]SetDynamicObjectMaterialText - Nowa Linia.   
    Tu mam taką najprostszą funkcję, która zamienia w ciągu 'str' wyraz 'sub' na wyraz 'ins' zaczynając od indeksu 'pos':
    stock strplc(str[], sub[], ins[], pos= 0, bool: ignorecase= false, str_sz= sizeof str) // string replace { new len= strlen(str), sln= strlen(sub), iln= strlen(ins); if ( (isnull(str)) || (isnull(sub)) || (isnull(ins)) || (pos >= str_sz) ) return 0; if (!strcmp(sub, ins, ignorecase)) return 0; new count= 0; for(new idx= pos; 0 <= idx < len; idx++) { idx= strfind(str, sub, ignorecase, idx); if (idx >= 0) { strdel(str, idx, idx+sln); strins(str, ins, idx, str_sz); len -= sln-iln; idx += sln-1; count++; } else break; } return count; } Funkcja zwraca ilość dokonanych podmianek. 'ignorecase' oznacza ignorowanie wielkości liter (domyślnie wielkość liter ma znaczenie, wartość 'false').
  24. Like
    PrzMas otrzymał reputację od Bags[ROZWIĄZANY]pomocy z dwoma tematami   
    strfind - opis argumentów funkcji:
    string - zmienna, która zawiera ciąg źródłowy, na którym zostanie dokonane wyszukiwanie sub - ciąg tekstowy do wyszukania w ciągu źródłowym ignorecase - ignoruj wielkość liter true/false (tak/nie) Position - indeks początkowy, od którego nastąpi wyszukiwanie Funkcja strfind zwraca indeks ciągu źródłowego (licząc od 0, nie od 1), od którego rozpoczyna się wyszukiwany tekst lub -1 jeżeli ciąg nie zostanie znaleziony.
  25. Like
    PrzMas otrzymał reputację od Shady.[ROZWIĄZANY]Problem ze zbyt długim formatem   
    Nie chodzi o to, że tekst do sformatowania jest zbyt długi, ale o linijkę kodu - to ona jest zbyt długa i wystarczy postawić enter w jakimś miejscu.
    new query[1000]; format(query, sizeof query, "UPDATE users SET warn='%d',score='%d',money='%d',bank='%d',team='%d',vip='%d',leveladmin='%d',skin='%d',poziom='%d',autologin='%d',ADR='%d',PrawkoA='%d',PrawkoB='%d',PrawkoC='%d',PrawkoCE='%d',punktyk='%d' WHERE nick='%s';", PlayerInfo[playerid][PrawkoA],PlayerInfo[playerid][PrawkoB],PlayerInfo[playerid][PrawkoC],PlayerInfo[playerid][PrawkoCE],PlayerInfo[playerid][Punktyk],PlayerName(playerid),PlayerInfo[playerid][Warn],GetScoreEx(playerid),GetMoneyEx(playerid),PlayerInfo[playerid][Bank],PlayerInfo[playerid][Team],PlayerInfo[playerid][VIP],PlayerInfo[playerid][LevelAdmin],PlayerInfo[playerid][Skin],PlayerInfo[playerid][Poziom],PlayerInfo[playerid][AutoLogin],PlayerInfo[playerid][ADR]);  
×