Jump to content
Aktualny szablon jest tymczasowy, pracujemy nad nowym. ×

Leaderboard


Popular Content

Showing content with the highest reputation since 03/01/2020 in all areas

  1. 52 points
    Pobieranie: Putty WinSCP Pliki Serwerowe Liby Client Konfiguracja maszyny: Synchronizacja czasu: ntpdate -s time.nist.gov Pobieranie i aktualizacja portów: portsnap fetch extract portsnap fetch update Instalacja MySQL: pkg install mysql56-server Konfiguracja MySQL: pwd_mkdb -p /etc/master.passwd chown -R mysql /var/db/mysql && chgrp -R mysql /var/db/mysql && chmod -R 777 /var/db/mysql Łączymy się z WinSCP, przechodzimy do /etc/ szukamy i edytujemy plik rc.conf, dopisując na końcu tego pliku: mysql_enable="YES" Dodanie kont do MySQL: service mysql-server start chmod -R 777 /var/db/mysql /usr/local/bin/mysqladmin -u root password HASLO mysql -p CREATE USER 'root'@'%' IDENTIFIED BY 'HASLO'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; flush privileges; CREATE USER 'mt2'@'localhost' IDENTIFIED BY '[email protected]#'; GRANT ALL PRIVILEGES ON *.* TO 'mt2'@'localhost' WITH GRANT OPTION; flush privileges; quit Ponownie łączymy się z WinSCP i pobraną paczkę libów wrzucamy do głównego katalogu, następnie wpisujemy: cd / && tar zxvf Liby.tar.gz Następnie wrzucamy pobrane pliki serwerowe również, do głównego katalogu, a następnie wpisujemy: cd / && tar zxfv mt2full.tgz chown -R mysql /var/db/mysql && chgrp -R mysql /var/db/mysql && chmod -R 777 /var/db/mysql
  2. 42 points
    VirtualBox: [Pobierz] Hamachi: [Pobierz] Hamachi dla użytkowników Windowsa XP/VISTA/7/8/8.1 polecam instalować [Pobierz] Maszyna: [Pobierz] Client: [Pobierz] Login do Maszyny: root Hasło do Maszyny: 123456 Login do Konta: terenzo Hasło do Konta: 123456 Komendy użyte w filmie: sysinstall /etc/rc.d/netif restart Komenda do wystartowania serwera: /start Komenda do zatrzymania serwera: /stop Komenda do restartu całej maszyny: reboot Launcher: [Pobierz] PortMap: [Pobierz] Aby wszystko przeszło pomyślnie upewnij się że: Zapora Systemu Windows została wyłączona na każdym komputerze Że mamy uruchomionego portmapa Uruchamiamy launcher z prawami admina Nasz znajomy musi mieć normalne IP z hamachi bez .100
  3. 37 points
    Cześć, Udostępniam Wam gotową maszynę stworzoną w oparciu o ten poradnik, maszyna po uruchomieniu jest gotowa do pracy. Znajdziecie na niej czyste pliki Terenza i czyste source, skonfigurowane pod FreeBSD 12.1. Dane logowania Login mysql: root / Port: 3306 Login ssh/ftp: root / Port: 22 Hasło: password Komendy /c - menu kompilacji source /clear - czyszczenie logów /pack - prosty backup plików serwerowych /qc - rekompilacja questów /setup - generowanie symlinków i configów /start - uruchamiamy serwer /stop - zatrzymujemy serwer Source znajduje się w /usr/src/ Pliki serwerowe znajdują się w /usr/home/ Informacje o maszynie Jako, że to zrzut maszyny możemy ją zaimportować w Virtualbox lub VMware - otwórz ją którymś z tych programów, cała reszta i konfiguracja tego pod hamachi taka jak wszędzie. Zamiast sysinstall wpisujemy bsdconfig. aalib-1.4.r5_13 ASCII art library boost-all-1.72.0 The "meta-port" for boost libraries boost-docs-1.72.0 Documentation for libraries from boost.org boost-jam-1.72.0 Build tool from the boost.org boost-libs-1.72.0 Free portable C++ libraries (without Boost.Python) cryptopp-8.2.0 Free C++ class library of Cryptographic Primitives devil-1.7.8_25,1 Full featured cross-platform image library expat-2.2.8 XML 1.0 parser written in C freeglut-3.0.0_2 open source implementation of the GLUT library gdb-8.3.1 GNU GDB of newer version than comes with the system gettext-runtime-0.20.1 GNU gettext runtime libraries and programs gmake-4.2.1_3 GNU version of 'make' utility gmp-6.1.2_1 Free library for arbitrary precision arithmetic icu-65.1,1 International Components for Unicode (from IBM) ilmbase-2.3.0_4 ILM Base libraries a.k.a. Half, IlmThread, Imath, and Iex indexinfo-0.3.1 Utility to regenerate the GNU info page index jasper-2.0.16_1 Implementation of the codec specified in the JPEG-2000 standard jbigkit-2.1_1 Lossless compression for bi-level images such as scanned pages, faxes jpeg-turbo-2.0.3 SIMD-accelerated JPEG codec which replaces libjpeg lcms-1.19_6,1 Light Color Management System -- a color management library libGLU-9.0.1 OpenGL utility library libICE-1.0.10,1 Inter Client Exchange library for X11 libSM-1.2.3,1 Session Management library for X11 libX11-1.6.9,1 X11 library libXau-1.0.9 Authentication Protocol library for X11 libXdamage-1.1.5 X Damage extension library libXdmcp-1.1.3 X Display Manager Control Protocol library libXext-1.3.4,1 X11 Extension library libXfixes-5.0.3_2 X Fixes extension library libXi-1.7.10,1 X Input extension library libXmu-1.1.3,1 X Miscellaneous Utilities libraries libXrandr-1.5.2 X Resize and Rotate extension library libXrender-0.9.10_2 X Render extension library libXt-1.2.0,1 X Toolkit library libXxf86vm-1.1.4_3 X Vidmode Extension libdrm-2.4.99,1 Userspace interface to kernel Direct Rendering Module services libedit-3.1.20191211,1 Command line editor library libepoll-shim-0.0.20190311 epoll shim implemented using kevent libevent-2.1.11 API for executing callback functions on events or timeouts libffi-3.2.1_3 Foreign Function Interface libiconv-1.14_11 Character set conversion library liblz4-1.9.2,1 LZ4 compression library, lossless and very fast libmng-1.0.10_3 Multiple-image Network Graphics (MNG) reference library libpciaccess-0.16 Generic PCI access library libpthread-stubs-0.4 This library provides weak aliases for pthread functions libunwind-20170615 Generic stack unwinding library libxcb-1.13.1 The X protocol C-language Binding (XCB) library libxml2-2.9.10 XML parser library for GNOME libxshmfence-1.3 Shared memory 'SyncFence' synchronization primitive llvm-devel-11.0.d20200117 LLVM and Clang lua52-5.2.4 Small, compilable scripting language providing easy access to C code makedepend-1.0.6,1 Dependency generator for makefiles mesa-libs-18.3.2_3 OpenGL libraries that support GLX and EGL clients mpfr-4.0.2 Library for multiple-precision floating-point computations mysql56-client-5.6.47_1 Multithreaded SQL database (client) mysql56-server-5.6.47_1 Multithreaded SQL database (server) nvidia-texture-tools-2.0.8.1_13 Texture Tools with support for DirectX 10 texture formats openexr-2.3.0_3 High dynamic-range (HDR) image file format pciids-20191223 Database of all known IDs used in PCI devices perl5-5.30.1 Practical Extraction and Report Language pkg-1.12.0_1 Package manager png-1.6.37 Library for manipulating PNG images python-3.7_3,2 "meta-port" for the default version of Python interpreter python3-3_3 The "meta-port" for version 3 of the Python interpreter python37-3.7.6 Interpreted object-oriented programming language readline-8.0.1 Library for editing command lines as they are typed sdl-1.2.15_14,2 Cross-platform multimedia development API source-highlight-3.1.9_1 C/C++ and Java sources to HTML converter tiff-4.1.0 Tools and library routines for working with TIFF images wayland-1.16.0_1 Wayland composite "server" xorgproto-2019.2 xorg protocol headers (do kompilacji source używany jest clang) Pobieralnia - Maszyna z plikami i source - FreeBSD 12.1 (M2Zone.tech).ova - Source clienta - source_client.7z - Client - client.7z
  4. 30 points
    1. Otwórz char_item.cpp i znajdź: if (inv_item->GetSocket(0) == item->GetSocket(0) && inv_item->GetSocket(1) == item->GetSocket(1) && inv_item->GetSocket(2) == item->GetSocket(2) && inv_item->GetCount() < ITEM_MAX_COUNT) 2. Zamień na: if (inv_item->GetSocket(0) == item->GetSocket(0) && inv_item->GetSocket(1) == item->GetSocket(1) && inv_item->GetSocket(2) == item->GetSocket(2) && inv_item->GetCount() + item->GetCount() <= ITEM_MAX_COUNT)
  5. 29 points
    ⬇ Następne Poradniki w Spoilerze ⬇ Okno z Bonami: [Pobierz] Bonus Switcher i Szybka Zmiana Ekwipunku: [Pobierz] Kosz i Mapa Teleportacji: [Pobierz] AntyExp i Magazyn: [Pobierz] Zapis Teleportacji i Usuwanie Polimorfi: [Pobierz] Sklep z Marmurami i Tobół: [Pobierz] Wikipedia Dropu i Automatyczne Dopalacze: [Pobierz] Sortowanie Ekwipunku i Otwieracz Przedmiotów: [Pobierz] Ikony do Panelu Bocznego: [Pobierz] Aby dodać panel boczny wchodzimy do ..\locale\pl\ui: Szukamy i edytujemy plik inventorywindow.py: Szukamy w nim: "children" : ( Pod dodajemy: Następnie szukamy: ## Inventory, Equipment Slots { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, Zamieniamy na: ## Inventory, Equipment Slots { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 37, Następnie szukamy: "x" : SCREEN_WIDTH - 176, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 176, "height" : 565, Zamieniamy na: "x" : SCREEN_WIDTH - 210, "y" : SCREEN_HEIGHT - 600, "style" : ("movable", "float",), "width" : 263, "height" : 566,
  6. 28 points
    Zmodyfikowana funkcja mob ReadMonsterDropItem uwzględniająca index mapy w mob_drop_item.txt - przykład: Group Jotun { Type index mob 6192 map_index 41 1 50266 1 0.05 2 72726 1 25 } mob_drop_item.zip
  7. 27 points
    [video=youtube] Visual Studio Ultimate 2013: [Pobierz] Spolszczenie do Visual Studio: [Pobierz] Client: [Pobierz] Source do Clienta: [Pobierz] [align=center] [/align] [video=youtube] Source na Serwer: [Pobierz] Dragon_soul_table: [Pobierz] M2ToolUP: [Pobierz] Komendy: cd /usr tar -zxvf Source_game.tar.gz ln -s /usr/src/mainline/Srcs/Extern /usr/src/mainline_released/mainline_sg/Srcs Ścieżki: /usr/src/mainline_released/mainline_sg/Srcs/Server/db ▷ /usr/home/mt2/db /usr/src/mainline_released/mainline_sg/Srcs/Server/game ▷ /usr/home/mt2/share Plik tekstowy: /usr/home/mt2/share/locale/poland [video=youtube] Wchodzimy do: [align=left] /usr/src/mainline_released/mainline_sg/Srcs/Server/game/src Szukamy i otwieramy plik:[/align] [align=center][align=left] desc_client.cpp Szukamy linijki:[/align] [align=left] memcpy(p.szIP, g_szPublicIP, 16); Zamieniamy na: memcpy(p.szIP, "TWOJE_IP_Z_HAMACHI", 16); Następnie szukamy: strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP)); Zmieniamy na:[/align] [/align] strlcpy(p.szPublicIP, "TWOJE_IP_Z_HAMACHI", sizeof(p.szPublicIP)); [video=youtube] Dump_Proto: [Pobierz] Komendy na Hamachi: portsnap extract cd /usr/ports/databases/py-MySQLdb/ && make install clean Komendy na VPS: pkg install py27-MySQLdb pkg install python
  8. 27 points
    Siemanko Znam bardzo dużo osób, które dopiero zaczynają tworzenie serwerów itp., lecz nie wiedzą od czego zacząć znudziło mi się już odpowiadanie na każdą wiadomość, więc oto i ja w swej osobie daję wam pliki dla początkujących wraz z poradnikiem jak wgrać Download: Pliki - [Hidden Content] Client - Link wygasł i nie będzie aktualny (Użyjcie Klienta np : Lajka)
  9. 27 points
    Pobieranie: Source FreeBSD 9.3 32bit Source FreeBSD 12 32bit dragon_soul_table.txt Konfiguracja: FreeBSD 9.3 32bit Instalujemy wymagane porty: pkg install gmake makedepend subversion devil gcc48 python Pobrane source wrzucamy do głównego katalogu następnie wpisujemy: cd / && tar zxvf Source_game_db_dedyk.tgz Pobrany plik dragon_soul_table.txt wrzucamy do usr/home/mt2/share/locale/poland i ustawiamy na nim prawa 777 FreeBSD 12 32bit Wchodzimy do /etc/pkg edytujemy tam plik FreeBSD.conf i szukamy w nim: url: "pkg+[Hidden Content]}", Zamieniamy powyższą linijkę na: url: "pkg+[Hidden Content]}/release_1", Zapisujemy plik i wpisujemy: pkg update Instalujemy wymagane porty: pkg install gmake makedepend boost-all googletest devil llvm-devel Następnie wpisujemy: cd /usr/ports/security/cryptopp/ && make install clean Gdy wyskoczy takie okno to możemy w nim odznaczyć opcję DOCS i TOOLS gdy już to zrobimy klikamy w OK: Gdy już się zainstalowało łączymy się z WinSCP i przechodzimy do /usr/local/include/cryptopp/ szukamy i edytujemy plik config.h, szukając w nim: #define CRYPTOPP_BOOL_ALIGN16 1 Zamieniamy powyższą linijkę na: #define CRYPTOPP_BOOL_ALIGN16 0 Przebudowujemy Cryptopp wpisując: cd /usr/ports/security/cryptopp/ && make clean Następnie: cd /usr/ports/security/cryptopp/ && make Pobrane source wrzucamy do głównego katalogu następnie wpisujemy: cd / && tar zxvf Source_12.gz Pobrany plik dragon_soul_table.txt wrzucamy do usr/home/mt2/share/locale/poland i ustawiamy na nim prawa 777
  10. 26 points
    Przeglądając forum zauważyłem, że posiadam bardzo podobny interface do tego, który znajduje się poniżej. Pogląd: [Hidden Content] Pobieranie: [Hidden Content] Posiadam również inne psd z tego zestawu jeśli byłby ktoś zainteresowany: [Hidden Content]
  11. 25 points
    Cześć, Dziś pokażę Wam jak przygotować własne środowisko pracy. Jak stworzyć własną wirtualną maszynę zdatną do uruchomienia plików serwerowych i kompilacji source na FreeBSD 12.1. Jeśli chcesz postawić swój serwer na VPSie zainstaluj na nim FreeBSD 12.0 lub 12.1 i przejdź od razu do kroku pt. "Przygotowanie systemu pod uruchomienie plików Terenza i kompilacje source Kraizy". Informacje - Przed instalacją systemu wybierz czy chcesz zainstalować go na VMware czy VirtualBox (osobiście polecam VMware). - Cały proces za wyjątkiem instalacji systemu (bo tam konfigurujemy inaczej sieć) możemy wykonać również na serwerach vps czy dedykach. - Postarałem się uprościć cały proces do minimum, wszystko robi się praktycznie samo. Wam pozostawiam wpisywanie komend. - Source, które udostępniam w poradniku jest przystosowane do kompilatora i bibliotek z poradnika - inne source mogą wymagać aktualizacji. - W source poza w/w wprowadzone zostały 3 zmiany: usunięto licencję (timebombe), usunięto googletest (Dzięki za sugestię @intern) i naprawiono problem uniemożliwiający uruchomienie game na niepublicznym adresie IP. - W plikach serwerowych wprowadzone zostały 2 zmiany: dodano dragon_soul_table.txt i usunięto domyślnie wgrane game/db 34k - pliki i tak by się nie uruchomiły. Przed pierwszym uruchomieniem serwera musicie na nowo skompilować source. - Jeśli chcecie poradniki do innych ogólnodostępnych plików serwerowych i source, dajcie znać w komentarzu! - Poradnik dotyczący aktualizacji source pod bsd 12 w drodze... Pobieralnia - FreeBSD 12.1 i386 - FreeBSD-12.1-RELEASE-i386-dvd1.iso - VirtualBox - VirtualBox-6.1.4-136177-Win.zip - VMware Workstation Player - VMware-player-15.5.2-15785246.zip - WinSCP - WinSCP-5.17.2-Setup.zip - Client Source - Gdyby ktoś postanowił pracować na source i plikach z tego poradnika (Kompilujemy Visual Studio 2013) - source_client.7z - Client - Gdyby ktoś postanowił pracować na source i plikach z tego poradnika - client.7z Instalacja i konfiguracja systemu na VMware Workstation Player 1. Po uruchomieniu programu wyświetli nam się takie okno, w którym wybieramy Create a New Virtual Machine. (w zależności od wersji narzędzia interfejs może wyglądać inaczej) 2. Zaznaczamy Installer disc image file (iso) i wybieramy wcześniej pobrany plik ISO. 3. Ustalamy dowolną nazwę i lokalizację wirtualnej maszyny na naszym dysku. 4. Ustawiamy parametry dysku. Minimalny rozmiar to 20 GB, ja ustawiam 50 GB. Dodatkowo zaznaczamy opcje Split. 5. W podsumowaniu wybieramy opcję Customize Hardware i zaznaczamy opcje Power on this virtual machine after creation. 6. Wybieramy tam ilość ramu i rdzeni jaką chcemy przeznaczyć na maszynę - ja zalecam 4GB (4096MB). 7. Klikamy Close, a następnie Finish. Po kliknięciu Finish maszyna uruchomi nam się sama (jeśli zaznaczyliśmy opcje Power on this virtual machine after creation) lub uruchamiamy ją sami. Po uruchomieniu czekamy do momentu pojawienia się opcji uruchomienia. (Wybieramy oczywiście install). 8. Wybieramy polskie ustawienia klawiatury. 9. Wpisujemy dowolną nazwę hosta (możesz wymyślić). 10. Zaznaczamy spacją kernel-dbg (jeśli nie jest zaznaczone) i przechodzimy dalej. 11. Wybieramy Auto (UFS). 12. Wybieramy Entire Disk. 13. Wybieramy GPT. 14. Wybieramy Finish. 15. Wybieramy Commit i nasz system zacznie się instalować (trochę to potrwa). 16. Teraz system poprosi nas o ustalenie hasła do roota (maszyny), hasło podczas wpisywania jest niewidoczne. Zatwierdzamy enterem. 17. Wybieramy naszą kartę sieciową. (prawdopodobnie będziecie mieli tutaj coś innego) 18. Konfigurację karty przeklikujemy w kolejności YES -> YES -> NO -> ENTER. 19. Następnie system poprosi nas o ustawienie strefy czasowej, tutaj chyba nie trzeba niczego tłumaczyć. 20. W następnym oknie zaznaczamy spacją sshd, dumpdev i opcjonalnie ntpd. 21. Następne okno pomijamy wybierając OK. 22. Jeśli nie chcemy dodawać kolejnych użytkowników systemu, wybieramy NO. 23. Wybieramy opcję Exit. 24. W kolejnym oknie wybieramy Yes i wpisujemy exit zatwierdzając go enterem. 25. Wybieramy opcję Reboot. 26. Po restarcie maszyny logujemy się do ssh i wpisujemy: ee /etc/ssh/sshd_config Szukamy tam linijek: #PermitRootLogin no #PasswordAuthentication no (będą od siebie troszkę oddalone) Usuwamy z nich # i no zamieniamy na yes, zapisujemy plik. 27. Na końcu wpisujemy: service sshd restart Gotowe. *28. Film przedstawiający powyższy proces: Instalacja systemu.mp4 Instalacja i konfiguracja systemu na VirtualBox W trakcie tworzenia. Przygotowanie systemu pod uruchomienie plików Terenza i kompilacje source Kraizy (Poradnik sprawdzony na czystym FreeBSD 12.0 i FreeBSD 12.1 - KONIECZNIE 32 BITY!) 1. Po zalogowaniu się do ssh wpisujemy i zatwierdzamy enterem: pkg install -y mysql56-server gmake makedepend boost-all cryptopp python devil llvm-devel gdb (najpierw możemy zaktualizować pkg komendą pkg -y update, natomiast aktualizacja powinna wykonać się sama przy pierwszym użyciu) 2. Gdy proces pobierania i instalacji pkg zakończy się pomyślnie wpisujemy i zatwierdzamy enterem: sysrc mysql_enable="YES" && service mysql-server start (komenda doda nam serwer bazy danych do "autostartu" i uruchomi go za pierwszym razem) 3. Gdy serwer mysql się uruchomi musimy go jeszcze skonfigurować: mysql_secure_installation (ENTER -> Y -> ustalamy i wpisujemy hasło -> potwierdzamy hasło -> Y -> N -> Y -> Y) 4. Gdy zainstalujemy i skonfigurujemy mysql musimy dodać nowych użytkowników: mysql -p (potwierdzamy hasłem, które ustaliliśmy w 3 punkcie) 5. Wpisujemy po jednej linijce i każdą z nich zatwierdzamy enterem: CREATE USER 'root'@'%' IDENTIFIED BY 'password'; CREATE USER 'mt2'@'localhost' IDENTIFIED BY '[email protected]#'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; GRANT ALL PRIVILEGES ON *.* TO 'mt2'@'localhost'; FLUSH PRIVILEGES; quit (w 1 linijce w miejscu password wpisujemy znów hasło z punktu 3 - w 1 i 3 linijce możemy zamienić root na dowolny login, nim będziemy logować się do bazy danych) 6. Teraz pora na pobranie i wypakowanie paczki z plikami serwerowymi i source. Przechodzimy do ścieżki / komendą: cd / 7. Pobieramy paczkę z plikami i source, wypakowywujemy je: fetch --no-verify-peer [Hidden Content] && tar zxvf mt2full.tar 8. Edytuj plik config.h (linia 838), który znajduje się w /usr/local/include/cryptopp/ i zamień w nim: #if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64) && !defined(CRYPTOPP_DISABLE_ASM) #define CRYPTOPP_BOOL_ALIGN16 1 #else #define CRYPTOPP_BOOL_ALIGN16 0 #endif na #define CRYPTOPP_BOOL_ALIGN16 0 9. Gotowe. Serwer obsługujemy komendami: /c - menu kompilacji source /clear - czyszczenie logów /pack - prosty backup plików serwerowych /qc - rekompilacja questów /setup - generowanie symlinków i configów /start - uruchamiamy serwer - PRZED PIERWSZYM URUCHOMIENIEM SKOMPILUJ GAME I DB! /stop - zatrzymujemy serwer Komenda ifconfig umożliwi nam sprawdzenie IP z jakim musimy się łączyć (inet xxx.xxx.xxx.xxx) Source znajduje się w /usr/src/ Pliki serwerowe znajdują się w /usr/home/ *9. Film przedstawiający powyższy proces: FreeBSD 12.1 - Source & SF.mp4
  12. 24 points
    Quest losuje potwora, na którego będzie polowanie, oraz według algorytmów sam dobiera nagrodę w postaci expa oraz złota + ustanawia ilość potworów do zabicia wg. poziomu potwora ((level potwora / 10) * 15) quest hunt_table begin state start begin when 25001.click begin say_title("Tajemniczy Myśliwy ") say("Kto znowuż czegoś ode mnie chce? Kim Ty jesteś? ") say("Kolejny za robotą się rozgląda? ") local s = select("Yy.. no.. ja jestem "..pc.get_name()..", a Ty? ", "Tak, szukam roboty. ", "Tylko się rozglądam. Ale nie za robotą. ") if s == 1 then say_title("Tajemniczy Myśliwy ") say("Nie Twój zasrany interes jak się nazywam! ") say("Idź szukać przyjaciół gdzie indziej. ") elseif s == 2 then say_title("Tajemniczy Myśliwy ") say("Eh.. niech Ci będzie. ") say("Niech no pomyślę.. ") wait() -- Tu wpisujemy wszystkie ID mobów, na które chcemy mieć polowania. local hunt_table_data = {101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 301, 302, 303, 304, 331, 332, 333, 334, 351, 352, 353, 354, 401, 402, 403, 404, 405, 406, 431, 432, 433, 434, 435, 436, 451, 452, 453, 454, 455, 456, 501, 502, 503, 504, 551, 552, 553, 554, 601, 602, 603, 604, 631, 632, 633, 634, 635, 636, 637, 651, 652, 653, 654, 655, 656, 657, 701, 702, 703, 704, 705, 706, 707, 731, 732, 733, 734, 735, 736, 737, 751, 752, 753, 754, 755, 756, 757, 771, 772, 773, 774, 775, 776, 777, 901, 902, 903, 904, 905, 906, 907, 931, 932, 933, 934, 935, 936, 937, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1301, 1302, 1303, 1305, 1401, 1402, 1403, 1501, 1502, 1503, 1601, 1602, 1603, 2001, 2002, 2003, 2004, 2005, 2031, 2032, 2033, 2034, 2035, 2036, 2051, 2052, 2053, 2054, 2055, 2061, 2062, 2063, 2064, 2065, 2071, 2072, 2073, 2074, 2075, 2076, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2131, 2132, 2133, 2134, 2135, 2153, 2154, 2155, 2156, 2157, 2158, 2201, 2202, 2203, 2204, 2205, 2231, 2232, 2233, 2234, 2235, 2301, 2302, 2303, 2304, 2305, 2311, 2312, 2313, 2314, 2315, 2401, 2402, 2403, 2404, 2411, 2412, 2413, 2414} local hunt_table_pc = {} for i = 1, table.getn(hunt_table_data) do local hunt_q_lvl = query("SELECT level FROM player.mob_proto WHERE vnum='"..hunt_table_data[i].."' LIMIT 1;") local level_diff = pc.get_level() - hunt_q_lvl -- Tu się ustala maksymalną różnicę leveli pomiędzy mobami a graczem if level_diff <= 3 and level_diff >= -3 then table.insert(hunt_table_pc, hunt_table_data[i]) end end if table.getn(hunt_table_pc) == 0 then say_title("Tajemniczy Myśliwy ") say("Nie mam dla Ciebie aktualnie żadnych zleceń.") say("Wróć jak zdobędziesz większy poziom.") return end local hunt_table_idx = number(1, table.getn(hunt_table_pc)) local hunt_q_level = query("SELECT level FROM player.mob_proto WHERE vnum='"..hunt_table_pc[hunt_table_idx].."' LIMIT 1;") local hunt_q_exp = query("SELECT exp FROM player.mob_proto WHERE vnum='"..hunt_table_pc[hunt_table_idx].."' LIMIT 1;") pc.setqf("huntdata_mob_vnum", hunt_table_pc[hunt_table_idx]) pc.setqf("huntdata_mob_count", (math.ceil(hunt_q_level/10) * 15)) -- zaokrąglenie(Level potwora / 10) * 15 = Ilość mobów do zabicia pc.setqf("huntdata_mob_reward_xp", (hunt_q_exp * (math.ceil(hunt_q_level/10) * 15)) * 2) -- Algorytm dla nagrody EXP pc.setqf("huntdata_mob_reward_money", (hunt_q_level * 15000)) -- Algorytm dla nagrody YANG say_title("Tajemniczy Myśliwy ") say("Twoim celem jest "..mob_name(hunt_table_pc[hunt_table_idx])..". ") say("Upoluj "..(math.ceil(hunt_q_level/10) * 15).." sztuk i zgłoś się do mnie. ") set_state(hunt) end end end state hunt begin when letter begin send_letter("Polowanie - "..mob_name(pc.getqf("huntdata_mob_vnum"))) end when button or info begin say_title("Polowanie - "..mob_name(pc.getqf("huntdata_mob_vnum"))) say("Trwa aktualnie polowanie na potwora: "..mob_name(pc.getqf("huntdata_mob_vnum"))) say("Do zabicia pozostało "..pc.getqf("huntdata_mob_count").." potworów. ") end when kill with npc.get_race() == pc.getqf("huntdata_mob_vnum") begin pc.setqf("huntdata_mob_count", pc.getqf("huntdata_mob_count") - 1) if pc.getqf("huntdata_mob_count") == 0 then say_title("Polowanie - "..mob_name(pc.getqf("huntdata_mob_vnum"))) say("Udało Ci się ukończyć polowanie! ") say("Zgłoś się do myśliwego, po odebranie nagrody! ") set_state(goback) end end when 25001.click begin say_title("Tajemniczy Myśliwy ") say("A Ty jeszcze tutaj? Nie miałeś mi przypadkiem ") say("czegoś załatwić? Ruchy! Nie za lenistwo płacę! ") end end state goback begin when letter begin send_letter("Polowanie - "..mob_name(pc.getqf("huntdata_mob_vnum"))) local v = find_npc_by_vnum(25001) if v != 0 then target.vid("__TARGET__", v, "Tajemniczy Myśliwy ") end end when button or info begin say_title("Polowanie - "..mob_name(pc.getqf("huntdata_mob_vnum"))) say("Udało Ci się pomyślnie zakończyć polowanie. ") say("Zgłoś się do myśliwego, w celu odebrania nagrody. ") end when __TARGET__.click or 25001.click begin say_title("Tajemniczy Myśliwy ") say("No cóż.. jestem pod wrażeniem. ") say("Udało Ci się ukończyć polowanie.. ") say("Należy Ci się solidna nagroda. Jeżeli jednak ") say("najdzie Cię ochota, żeby ponownie zapolować ") say("możesz się do mnie zgłosić. Myślę, że coś się ") say("znajdzie w sam raz dla Ciebie. ") say("") say_red("Otrzymano "..pc.getqf("huntdata_mob_reward_xp").." punktów doświadczenia ") say_red("Otrzymano "..pc.getqf("huntdata_mob_reward_money").." yang ") pc.give_exp(pc.getqf("huntdata_mob_reward_xp")) pc.change_gold(pc.getqf("huntdata_mob_reward_money")) pc.setqf("huntdata_mob_vnum", 0) pc.setqf("huntdata_mob_count", 0) pc.setqf("huntdata_mob_reward_xp", 0) pc.setqf("huntdata_mob_reward_money", 0) clear_letter() set_state(start) end end end
  13. 23 points
    Siemka łapcie tu pliki Cortium by Lajk dostałem pozwolenie na udostępnienie osobiście od Lajka Link: nowy link [Hidden Content] Sorka ale skanu plików nie posiadam bo od 2k17 nie mam już ich na kompie tylko na dysku mega.nz po przejściu przez link na mega w katalogu Cortium macie od plików po grafikę do prezentacji Cortiuma Aaaa zapomniałem dodać musicie zrobić sobie pod nie src bo na game i db w paczce czasem lubi tak o wypierdolić channele lub ktoś się może to tego przyczynić INFO JAK ROZPAKOWAĆ TEGO DZIADA Katalog bin wrzucamy na Dysk D POPRAWIONY PACKER Cortium Packer.zip Rozpakowanie tego jest bardzo proste więc nie piszcie do mnie jak to rozpakować heh
  14. 23 points
    Elo, to macie w paczce: paczka: [Hidden Content] koronavirus_scan: [Hidden Content] hasło do paczki: metin2zone W komentarzu w archiwum macie wszystko wyjaśnione, buźki @edit i macie to co misie lubią najbardziej download: [Hidden Content] scan: [Hidden Content] @edit2 a żebyście nie mówili że tylko taki syf kradnę to macie jeszcze trochu inny kostium yt&szmaragdowy_secik x) yt: szmaragdowy_secior
  15. 23 points
    Cześć. Jeżeli ktoś już wrzucał je, to usuńcie temat. (wrzucam zdjęcia tylko łuków, ale są tam całe sety.) Link: [Hidden Content] Skan: [Hidden Content]
  16. 22 points
    Siema udostępniam wam pliki serwerowe nad którymi pracowałem w 2016 roku. W paczce znajdują się pliki . source , client i paker do clienta. Dlaczego udostępniam ? Bo projekt upadł po rozpadzie ekipy i braku chęci do roboty. Pliki trzeba dokończyć i ogarnąć na standardy 2019 roku Dodaje je tutaj bo MPC dla mnie nie żyje a wracam do zabawy i chciałbym zrobić coś o. Wszystkie znane błędy 1. Problem z KD nie chcą się wkładać - syser 2. System Zgłoszeń nie działają - syser 3. Szarfy nie działają? 4. Spolszczyć bonusy w interface pod C 5. Ogarnąć zbroje Bronie na Lykana (DMG , NAZWY ) Typ Plików: Medium/Easy Max z Lykanem level 200 System ulepszeń Skończony mapy drop exp skończony praktycznie pliki w 80% skończone Nie pamiętam dokładnie co tam było ale było tego dużo Pliczki zalegają mi na dysku i się marnują udostępniam je wam może ktoś wyciągnie z tego potencjał. Jeśli ktoś będzie zainteresowany postawieniem servera na tych plikach udostępnię wszystko co od tego mam włącznie z systemami płatnymi od Keyto , Shanga itp Wrzucam pare ssów które znalazłem bo nie chce mi się robić maszyny żeby je odpalić Jak będzie zainteresowanie mogę zrobić gotową maszynę. Mogę także pomóc przy problemach związanych z plikami Screeny z Gry: SS1 SS2 SS3 SS4 SS5 SS6 SS7 SS8 SS9 SS10 SS11 - więcej nie znalazłem tylko tyle na fanpage miałem Download Paczka: [Hidden Content] Hasło do Paczki: serverfilesbysasori Skan: AKTUALIZACJA Wiele osób prosiło na PW żebym ogarnął gotową maszynę do kompilacji source game i clienta Także prośba spełniona i dzisiaj udostępniam kompilator wraz z plikami gotowymi do uruchomienia na maszynie Uruchamianie Serwera Po uruchomieniu i skonfigurowaniu maszyny Uruchomienie serwera: cd /home/sasori/sf i uruchamiamy sh panel.sh Kompilacja Source: cd /usr/src/vertia_src/metin uruchamiamy sh compile.sh Ręczna kompilacja: GAME: cd /usr/src/vertia_src/metin/game/src [ENTER] i wpisujemy gmake -rj4 DB: cd /usr/src/vertia_src/metin/db/src [ENTER[ i wpisujemy gmake -rj4 przy ręcznej kompilacji wypadało by po edycji kodu wyczyścić gdy już przeszliśmy do owych ścieżek wpisujemy komendę gmake clean Logi operacji po edycji zapsują się w : /usr/src/vertia_src/metin/game GAME_BUILD_LOG.txt GAME_ERROR_LOG.txt /usr/src/vertia_src/metin/db DB_BUILD_LOG.txt DB_ERROR_LOG.txt SSH login: root Pass: kamil95 Navicat Login: root Pass: sasorinavicat SSH (MYSQL) - mysql-p - superhaslo Download Kompilator+Serwer gotowy do uruchomienia [Hidden Content] Hasło do Paczki sasoriserverfiles Na dniach wrzucę tuta kompilacji sourca clienta i konfigurowania Visual Studio pod owego sourca
  17. 21 points
    Poprzez prosty skrypt w pythonie możemy używać umiejętności gildijnych na npc/mobach, co w większości przypadków spowoduje crash ch. 1. Otwórz input_main.cpp i znajdź w case GUILD_SUBHEADER_CG_ADD_MEMBER: if (!ch->IsPC()) 2. Zamień na: if (!ch->IsPC() || !newmember->IsPC()) 3. Znajdź w CInputMain::PartyUseSkill: if (pch) ch->GetParty()->SummonToLeader(pch->GetPlayerID()); 4. Zamień na: if (pch) { if (pch->IsPC()) ch->GetParty()->SummonToLeader(pch->GetPlayerID()); } 5. Dodaj na początku w CInputMain::PartyInvite: if (!ch) return; 7. W tej samej funkcji znajdź: if (!pInvitee || !ch->GetDesc() || !pInvitee->GetDesc()) 8. Zamień na: if (!pInvitee || !ch->GetDesc() || !pInvitee->GetDesc() || !pInvitee->IsPC() || !ch->IsPC()) 9. Dodaj na początku w CInputMain::PartyInviteAnswer: if (!ch) return; 10. W tej samej funkcji znajdź: if (!pInviter) 11. Zamień na: if (!pInviter || !pInviter->IsPC())
  18. 21 points
    Bry, nwm dlaczego tego u nas jeszcze nie ma. Podstawa tych plików to nowsza wersja martysama niż była dostępna tu na forum. Można z nich zrobić fajne pliki dla m2zone. Jeżeli jest ktoś chętny do pracy nad tymi plikami zapraszam na pw. Co potrzebujesz żeby uruchomić serwer? FreeBSD 12 MariaDB103 python2.7 Co potrzebujesz do kompilacji src serwer/client? GCC8 VisualStudio (widziałem u turasów że pisali vs2k17) ja używam 2019 POBIERZ: Jeżeli chcesz pracować na tych plikach polecam usunąć system biologa (jest w nim nawalowne w chuy questflagów) Drugi problem to sklepy offline głównie problem jest z odświeżaniem ich w kliencie: Opis problemu: Wystawiając przedmiot na X postaci, logujesz się na Y postać (ten sam kleint) widzisz sklep otworzony na X postaci. Trzeci problem występuje w rendertarget w sumie to nie błąd rendertarget nie wczytuje plików MDE nie wyświetla skinów czy też szarf w MDE. Ci co nie chcą pracować na tych plikach możecie sb wyciągnąć np. shining effect jest tu dostępny kod na broń/zbroje/skin/kostium/szarfy + poprawki. README-SERVER.txt
  19. 21 points
    W paczce znajdują się 3 zestawy kostiumów(broń, kostium, szarfa, świecenia + ikonki) Autorem tych kostiumów jest Ridack PODGLĄD: #1 Kostium diabla < -- KLIK #2 Niebieski kostium <-- KLIK #3 Toksyczny strój <-- KLIK (Oczywiście w paczce nie znajduje się model dla likana, jak to wygląda w podglądzie) DL: [Hidden Content] [Hidden Content] Mam nadzieję, że ktoś z tego skorzysta, bo według mnie te kostiumy są piękne.
  20. 20 points
    Siemanko. Client jest odchudzony, poprawiony i ogólnie myślę, że dużo lepiej wygląda Jeśli chodzi o jego zawartość.. to jest to gdzieś miedzy 2010 a 2012. Kostiumy, nowe mapy czy EQ 105+ będziecie musieli dodać sobie sami Dzięki tym zabiegom waga clienta wygląda tak: [Hidden Content] Poprawki względem tego clienta: Poprawiona mgła w pierwszych miastach Usunięte zbędne kostiumy, mapy, tekstury Poprawiona mapa Góra Sohan Poprawiona pustynia Yongbi Poprawione loga gildii Poprawione ładowanie o którym wspominał tatsumaru TUTAJ Ogólne poprawki: Przeczyszczone archiwum Season Delikatnie wyczyszczone archiwum ETC, włączyłem do nich effect Dodałem nowe ikony z patcha 18.x.x, połączyłem je z archiwum item 2x Sound połączyłem w jedno Usunięte zbędne pliki z uiscript, locale, root Przeczyszczone niektóre pliki w root Przeniesione zostały pliki msm do specjalnego folderu Poprawa niewidzialnego interfejsu Mniejsze poprawki: tutaj, tutaj i tutaj Aktualizacja v.1.1: !WAŻNE! - Od tej aktualizacji client traci kompatybilność z pythonem 2.2 Poprawione opisy postaci przy tworzeniu Dodane szarfy - KLIK Dodane limitowanie affectów w jednej linii - KLIK Dodane rosy wyświetlane w affectach - KLIK Dodany powiększony handel - KLIK Dodane powiększone sklepy - KLIK Usunięte wsparcie dla serwerów arabskich, chińskich Dodany dynamiczny pasek hp - KLIK Poprawiony plik index (Usunięte niepotrzebne archiwa) Dodany nowy notice bar (dostępny jest również stary) - KLIK Poprawa wyświetlania kolorowych wiadomości na notice - KLIK Poprawa modelu npc Seon-Pyeong Usunięta opcja 'Powiększ okno' w taskbarze, przywrócono przycisk 'Okno Czatu' Usunięta klasa 'ExpandedTaskBar' z uitaskbar Dodano wyświetlanie vnum przedmiotu w tooltipie Poprawiono nowe podświetlanie bonusów przedmiotów Usunięto zbędne funkcje z localeinfo Usunięto zbędną funkcje NumberToSecondaryCoinString(localeinfo), zastąpiono NumberToMoneyString, może teraz obsłużyć wszystkie waluty - KLIK Poprawione archiwum Monster (błędy przy próbie wypakowania) Poprawa okienka przy 4 stronach ekwipunku Aktualizacja v.1.1.1: Kolorowe zwoje questów - KLIK Przeniesione skryptowe pliki z locale/xx/ui do locale/ui Przeniesiony folder effect z locale/xx do locale Dodany poprawioną zbroje hwang dla szamanki - KLIK Możliwość wyświetlania nazwy mapy w tytule Dodano nowe ikonki postaci - KLIK Dodano nowy efekt ogniska - KLIK Dodano poprawiony efekt lamp Dodano poprawiony budynek - KLIK Dodano poprawiony most - KLIK Usunięta część chińskich komentarzy !WAŻNE! - Jeśli chodzi o szarfy czy inne dodatki, plik costumewindow w uiscript musicie sobie skonfigurować sami, każdy dodaje systemy inaczej więc jego się nie czepiałem. Screeny z gry: [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] [Hidden Content] Dodatki: Dorzuciłem cosik od siebie, mianowicie plik config.py, znajduje on się w rootach, oto jego zawartość małe info; W razie problemów apropos 4 stron w ekwipunku, w locale znajduje się plik inventorywindowex, który owe 4 strony obsługuje (Nie dotyczy aktualizacji 1.1.1) Pobieranie v 1.0 [Hidden Content] v 1.1 (Aktualizacja) [Hidden Content] v 1.1.1 (Aktualizacja) [Hidden Content] (Pełen Client) [Hidden Content] FIX do 1.1.1 - poprawa okna szeptu whisperdialog.py
  21. 19 points
    Maszynka: [Hidden Content] Client: BRAK Passy: Maszynka: Login: root Hasło: takiniesmialy MySQL: 1) Login: root Hasło: niesmialy 2) Login: strona Hasło: strona Porty: - 80 - strona - 3306 - mysql - 11002 - logowanie - 13000 - ch1 - 13001 - ch2 - 13099 - ch99 Pong: by1takiniesmialy UWAGA! Na plikach czasami może wystąpić błąd /bin/sh więc wpisujemy: fsck -y && exit
  22. 18 points
    Nie widziałem tego nigdzie, więc wrzucę. (Jeśli gdzieś było to proszę usunąć) /game/src/dungeon.cpp Szukamy: struct FCountMonster { int n; FCountMonster() : n(0) {}; void operator()(LPENTITY ent) { if (ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER ch = (LPCHARACTER) ent; if (!ch->IsPC()) n++; } } }; Zamieniamy if (!ch->IsPC()) na: if (!ch->IsPC() && ch->GetHP() > 0) Dla tych co nie wiedzą o co chodzi... Funkcja d.count_monster domyślnie zwraca ilość potworów, które są w dungeonie, a ta poprawka zwraca ilość żywych potworów, więc ułatwia to pisanie dungeonów. Dzięki temu nie musimy robić d.setf("zabite_potwory") bla bla... Czekam na hejt ;)
  23. 18 points
    Witam i łapcie sety od Bombwork'a BOMBWORK_New.rar Skan: [Hidden Content]
  24. 18 points
    [video=youtube] Paczka (v0.1): [Hidden Content] Znane błędy: Aktualnie brak Aktualizacje: Pierwsze Wydanie - v0.1
  25. 17 points
    Cześć, Ostatnio skupiłem się na zarządzaniu serwerem od strony administracyjnej i to bardzo, przez co straciłem jakiegokolwiek "skilla" i chęć do robienia czegokolwiek, serio, straszny leń mnie złapał, ale trzeba z tym skończyć, bo tak być nie może. Chcę wrócić do formy, wziąłem się znów do tego, obiecałem również @Paszka, więc słowa chcę dotrzymać, a zazwyczaj jestem słowny. Do rzeczy. Wrzucam Wam odbugowaną zmianę królestwa, poprawioną, więc nie powinno być problemów. Jak działał dany Bug? - Czasami przy zmianie mogłeś mieć empire większe niż 3, bądź mniejsze niż 1, przez co serwer mógł dostać crasha, baza nie mogła odczytać tych danych, a Wy mogliście przez taki fakt serwis zamykać. Mam nadzieję, że dzięki temu tematowi nikt takiej czynności robić nie będzie musiał quest change_empire begin state start begin when 71054.use begin say_title(" Olejek Wygnania:") say("") if get_time() < pc.getqf("next_use_time") then say("Niestety nie możesz dokonać zmiany Królestwa.") say("Ponowna zmiana kraju, będzie możliwa dopiero,") say("po upływie 7 dni.") say("") if pc.is_gm() then say_title("Opcja widoczna tylko dla Administracji:") say_title("Czy chcesz usunać ramę czasową i mieć ") say_title("możliwość dokonania zmiany Królestwa,") say_title("przed upływem wyznaczonego terminu?") say("") local s = select("Tak, chcę! ", "Rozmysliłem się... ") if s == 1 then say_title(" Olejek Wygnania:") say("") say("Pomyślnie usunięto limit oczekiwania, na") say("zamianę Królestwa. Możesz teraz ponownie") say("dokonać wyboru kraju, do którego chcesz") say("się przenieść. ") say("") pc.setqf("next_use_time", 0) end if s == 2 then say_title(" Olejek Wygnania:") say("") say("Okej. Wróć kiedy indziej. ") say("") end end end if change_empire.move_pc() == true then pc.setqf("next_use_time", get_time() + 86400 * 7) end end function move_pc() if pc.is_engaged() then say("Niestety jesteś w związku małżeńskim, dlatego") say("nie możesz dokonać zmiany Królestwa.") say("Musisz wziąć rozwód, zanim będziesz mógł ") say("zmienić swój kraj.") say("") return false end if pc.is_married() then say("Niestety jesteś w związku małżeńskim, dlatego") say("nie możesz dokonać zmiany Królestwa.") say("Musisz wziąć rozwód, zanim będziesz mógł ") say("zmienić swój kraj.") say("") return false end if pc.is_polymorphed() then say("Niestety nie możesz dokonać zmiany kraju,") say("ponieważ jesteś przemieniony w potwora, przy") say("użyciu Polimorfii. Wróć do pierwotnego stanu,") say("abyś miał możliwość zmiany Królestwa.") say("") return false end if pc.has_guild() then say("Niestety nie możesz zmienić Królestwa, ponieważ ") say("należysz do gildii. Udaj się do Strażnika Wsi") say("i opuść swoją gildię, aby mieć możliwość dokonania") say("zmiany swego kraju.") say("") return false end if pc.money < 100000000 then say("Niestety nie masz wystarczającej ilości Yang,") say("aby dokonać zmiany Królestwa.") say("") say_title("Koszt zmiany kraju, wynosi:") say_title("Yang: 100.000.000") say("") return end say("") say("Korzystasz z niezwykle magicznego przedmiotu,") say("który pozwala na zmianę Królestwa! Przemyśl dobrze") say("swą decyzję, zanim dokonasz wyboru, ponieważ ") say("z chwilą przeniesienia, staniesz się wrogiem, dla") say("swego rodzinnego kraju!") say("") say_title("Jeżeli chcesz dokonać zmiany Królestwa,") say_title("powinieneś opuścić gildię, każdą postacią, ") say_title("która znajduje się na Twoim koncie.") say_title("Ponadto żadna z postaci znajdujących się na") say_title("Twoim koncie, nie może być w związku małżeńskim.") say("") say_title("Wybierz dla siebie nowe Królestwo, do którego") say_title("chcesz się przenieść: ") local s = select("Shinsoo", "Chunjo", "Jinno", "Anuluj") if s == 4 then say_title(" Olejek Wygnania: ") say("") say("Okej. Wróć kiedy indziej. ") return end say_title(" Olejek Wygnania:") say("") say("Królestwo możesz zmienić tylko raz, na 7 dni,") say("dlatego decyzja ta powinna być dobrze przemyślana.") say("") say_title("Czy na pewno chcesz dokonać zmiany Królestwa?") say("") local a = select("Tak, chcę!", "Jednak nie...") if a == 2 then say_title(" Olejek Wygnania: ") say("") say("Okej. Wróć kiedy indziej. ") return end local ret = pc.change_empire(s) local oldempire = pc.get_empire() if ret == 999 then say_title(" Olejek Wygnania:") say("") say("Królestwo zostało pomyślnie zmienione.") say("Od tej chwili jesteś wrogiem swego rodzinnego") say("kraju, więc miej się na baczności!") say("") say_title("Proszę się wylogować, w celu uaktualnienia") say_title("dokonanej zmiany.") say("") pc.change_gold(-100000000) pc.remove_item(71054) char_log(0, "CHANGE_EMPIRE", string.format("%d -> %d", oldempire, s)) return else if ret == 1 then say_title(" Olejek Wygnania:") say("") say("Niestety nie możesz wybrać Królestwa, z którego") say("pochodzisz. Dokonaj wyboru ponownie.") say("") elseif ret == 2 then say_title(" Olejek Wygnania:") say("") say("Zdaje się, że któraś z postaci na Twoim koncie,") say("należy do Gildii, dlatego nie możesz dokonać ") say("zmiany Królestwa.") say("") elseif ret == 3 then say_title(" Olejek Wygnania:") say("") say("Zdaje się, że któraś z postaci na Twoim koncie,") say("jest w związku małżeńskim, dlatego nie możesz") say("dokonać zmiany Królestwa.") say("") end end return false end end end @Fredek Ty przy 100 online również.
  26. 17 points
    Umiejętność potrafi nie zadać dmg mimo trafienia. 187830323bb0cea016e5816b218b03f0.mp4 1. Otwórz char_battle.cpp, znajdź w class CFuncShoot i usuń: case SKILL_YONGBI: { m_me->OnMove(true); } break; 2. W tej samej klasie znajdź: case SKILL_TUSOK: case SKILL_BIPABU: case SKILL_NOEJEON: case SKILL_GEOMPUNG: case SKILL_SANGONG: case SKILL_MAHWAN: case SKILL_PABEOB: 3. Dodaj pod: case SKILL_YONGBI:
  27. 17 points
    affect.h AFFECT_ALIGNMENT_BONUS_0, AFFECT_ALIGNMENT_BONUS_1, AFFECT_ALIGNMENT_BONUS_2, AFFECT_ALIGNMENT_BONUS_3, char_battle.cpp podmieńcie sobie UpdateAlignment na to BYTE CHARACTER::GetAlignmentGrade() { int iAlignment = m_iRealAlignment / 10; if (iAlignment >= 100000000) return 0; else if (iAlignment >= 80000000) return 1; else if (iAlignment >= 70000000) return 2; else if (iAlignment >= 60000000) return 3; else if (iAlignment >= 50000000) return 4; else if (iAlignment >= 40000000) return 5; else if (iAlignment >= 30000000) return 6; else if (iAlignment >= 20000000) return 7; else if (iAlignment >= 10000000) return 8; else if (iAlignment >= 0) return 9; else if (iAlignment > -4000) return 10; else if (iAlignment > -8000) return 11; else if (iAlignment > -12000) return 12; return 13; } void CHARACTER::UpdateAlignmentBonus() { BYTE bGrade = GetAlignmentGrade(); typedef struct { BYTE bType0; long lValue0; BYTE bType1; long lValue1; BYTE bType2; long lValue2; BYTE bType3; long lValue3; } TAlignmentBonusInfo; const static TAlignmentBonusInfo szAlignmentBonuses[] = { { POINT_MAX_HP, 15000, POINT_ATT_GRADE, 50, POINT_ATTBONUS_MONSTER, 20, POINT_ATTBONUS_HUMAN, 10 }, // Legendarny { POINT_MAX_HP, 10000, POINT_ATT_GRADE, 40, POINT_ATTBONUS_MONSTER, 15, POINT_ATTBONUS_HUMAN, 5 }, { POINT_MAX_HP, 5000, POINT_ATT_GRADE, 30, POINT_ATTBONUS_MONSTER, 10, POINT_NONE, 0 }, { POINT_MAX_HP, 3500, POINT_ATT_GRADE, 30, POINT_ATTBONUS_MONSTER, 8, POINT_NONE, 0 }, { POINT_MAX_HP, 3000, POINT_ATT_GRADE, 25, POINT_ATTBONUS_MONSTER, 5, POINT_NONE, 0 }, { POINT_MAX_HP, 2500, POINT_ATT_GRADE, 25, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_MAX_HP, 2000, POINT_ATT_GRADE, 20, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_MAX_HP, 1500, POINT_ATT_GRADE, 15, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_MAX_HP, 1000, POINT_ATT_GRADE, 10, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, // Neutralny { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, { POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0, POINT_NONE, 0 }, }; const TAlignmentBonusInfo * pBonusFound = NULL; if (bGrade >= (sizeof(szAlignmentBonuses) / sizeof(szAlignmentBonuses[0]))) goto no_alignment_bonus; if (szAlignmentBonuses[bGrade].bType0 > 0) pBonusFound = &(szAlignmentBonuses[bGrade]); no_alignment_bonus: if (!pBonusFound) { RemoveAffect(AFFECT_ALIGNMENT_BONUS_0); RemoveAffect(AFFECT_ALIGNMENT_BONUS_1); RemoveAffect(AFFECT_ALIGNMENT_BONUS_2); RemoveAffect(AFFECT_ALIGNMENT_BONUS_3); return; } if (pBonusFound->bType0 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_0, pBonusFound->bType0, pBonusFound->lValue0, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_0); if (pBonusFound->bType1 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_1, pBonusFound->bType1, pBonusFound->lValue1, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_1); if (pBonusFound->bType2 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_2, pBonusFound->bType2, pBonusFound->lValue2, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_2); if (pBonusFound->bType3 != POINT_NONE) { AddAffect(AFFECT_ALIGNMENT_BONUS_3, pBonusFound->bType3, pBonusFound->lValue3, AFF_NONE, 24 * 60 * 60, 0, true, false); } else RemoveAffect(AFFECT_ALIGNMENT_BONUS_3); } void CHARACTER::UpdateAlignment(int iAmount) { bool bShow = false; if (m_iAlignment == m_iRealAlignment) bShow = true; int i = m_iAlignment / 10; m_iRealAlignment = MINMAX(-200000, m_iRealAlignment + iAmount, 1000000000); UpdateAlignmentBonus(); if (bShow) { m_iAlignment = m_iRealAlignment; if (i != m_iAlignment / 10) UpdatePacket(); } } char.h pod void RemoveFire(); BYTE GetAlignmentGrade(); void UpdateAlignmentBonus(); protected: BYTE m_bAlignmentBonusType; long m_bAlignmentBonusValue; public: BYTE GetAlignmentBonusType() { return m_bAlignmentBonusType; }; long GetAlignmentBonusValue() { return m_bAlignmentBonusValue; }; constinfo.py tAligment = { "name" : ( "Legendarny", "Mistyczny", "Magiczny", "Heroiczny", "Bohaterski", "Rycerski", "Szlachetny", "Dobry", "Przyjazny", "Neutralny", ), "colors": { 9: ( 255, 228, 225 ), 8: ( 244, 164, 96 ), 7: ( 205, 133, 63 ), 6: ( 165, 42, 42 ), 5: ( 135, 206, 235 ), 4: ( 0, 191, 255 ), 3: ( 30, 144, 255 ), 2: ( 144, 238, 144 ), 1: ( 46, 139, 87 ), 0: ( 0, 128, 0 ), }, "bonusValue" : ( ( 15000, 50, 20, 10), ( 10000, 40, 15, 5), ( 5000, 30, 10, 0), ( 3500, 30, 8, 0), ( 3000, 25, 5, 0), ( 2500, 25, 0, 0), ( 2000, 20, 0, 0), ( 1500, 15, 0, 0), ( 1000, 10, 0, 0), ( 0, 0, 0, 0), ), } uicharacter.py na górze import grp def RefreshAlignment(self): point, grade = player.GetAlignmentData() colorList = constInfo.tAligment["colors"].get(grade, (255, 255, 255)) gradeColor = ui.GenerateColor(colorList[0], colorList[1], colorList[2]) bonColor = grp.GenerateColor(0.5411, 0.7254, 0.5568, 1.0) self.toolTipAlignment.ClearToolTip() try: self.toolTipAlignment.AutoAppendTextLine(constInfo.tAligment["name"][grade], gradeColor) except: self.toolTipAlignment.AutoAppendTextLine("", gradeColor) self.toolTipAlignment.AutoAppendTextLine(localeInfo.ALIGNMENT_NAME +" "+ str(point)) self.toolTipAlignment.AutoAppendTextLine("Bonusy:", bonColor) for i in xrange(0,4): aVal = constInfo.tAligment["bonusValue"][grade][i] if aVal > 0: applyName = "" if i == 0: applyName = localeInfo.TOOLTIP_MAX_HP(aVal) elif i == 1: applyName = localeInfo.TOOLTIP_ATT_GRADE(aVal) elif i == 2: applyName = localeInfo.TOOLTIP_APPLY_ATTBONUS_MONSTER(aVal) elif i == 3: applyName = localeInfo.TOOLTIP_APPLY_ATTBONUS_HUMAN(aVal) self.toolTipAlignment.AutoAppendTextLine(applyName, bonColor) self.toolTipAlignment.AlignHorizonalCenter()
  28. 17 points
    Witam. Dziś pokażę wam jak edytować pasek życia na taki jak poniżej. [Hidden Content] 1.1. W pliku "ui.py" szukamy: class Board(Window) 1.2. Pod tą całą funkcją dodajemy: class DynamicGauge(Gauge): dynamicGaugePerc = None newGaugePerc = 0 def __init__(self): Gauge.__init__(self) def __del__(self): Gauge.__del__(self) def MakeGauge (self, width, color1, color2): Gauge.MakeGauge(self, width, color2) imgGauge2 = ExpandedImageBox() imgGauge2.SetParent(self) imgGauge2.LoadImage("d:/ymir work/ui/pattern/gauge_" + color1 + ".tga") imgGauge2.Show() imgGauge2.SetRenderingRect(0.0, 0.0, 0.0, 0.0) imgGauge2.SetPosition (self.GAUGE_TEMPORARY_PLACE, 0) self.imgGauge2 = imgGauge2 def SetPercentage(self, curValue, maxValue): # PERCENTAGE_MAX_VALUE_ZERO_DIVISION_ERROR if maxValue> 0.0: percentage = min(1.0, float(curValue)/float(maxValue)) else: percentage = 0.0 # END_OF_PERCENTAGE_MAX_VALUE_ZERO_DIVISION_ERROR gaugeSize = -1.0 + float(self.width - self.GAUGE_TEMPORARY_PLACE*2) * percentage/ self.GAUGE_WIDTH if self.dynamicGaugePerc == None: self.imgGauge.SetRenderingRect(0.0, 0.0, (-1.0 + float(self.width - self.GAUGE_TEMPORARY_PLACE*2) * percentage/ self.GAUGE_WIDTH), 0.0) self.dynamicGaugePerc = percentage elif self.dynamicGaugePerc + 0.2 < self.newGaugePerc: self.imgGauge.SetRenderingRect(0.0, 0.0, (-1.0 + float(self.width - self.GAUGE_TEMPORARY_PLACE*2) * self.newGaugePerc/ self .GAUGE_WIDTH), 0.0) self.dynamicGaugePerc = self.newGaugePerc self.newGaugePerc = percentage self.imgGauge2.SetRenderingRect(0.0, 0.0, gaugeSize, 0.0) if percentage == 0: self.imgGauge.Hide() else: self.imgGauge.Show() def OnUpdate(self): if self.dynamicGaugePerc > self.newGaugePerc: self.dynamicGaugePerc = self.dynamicGaugePerc -0.005 self.imgGauge.SetRenderingRect (0.0, 0.0, (-1.0 + float(self.width - self.GAUGE_TEMPORARY_PLACE*2) * self.dynamicGaugePerc/ self.GAUGE_WIDTH), 0.0) elif self.dynamicGaugePerc < self.newGaugePerc: self.dynamicGaugePerc = self.newGaugePerc self.imgGauge.SetRenderingRect (0.0, 0.0, (-1.0 + float(self.width - self.GAUGE_TEMPORARY_PLACE*2) * self.dynamicGaugePerc/ self .GAUGE_WIDTH), 0.0) 2.1. W pliku "uitarget.py" szukamy: hpGauge.MakeGauge(130, "red") 2.2. Zmieniamy na: hpGauge.MakeGauge(130, "red", "blue") 2.3. Dalej w tym samym pliku szukamy: ui.Gauge 2.4. Zmieniamy na: ui.DynamicGauge Teraz wystarczy spakować root i cieszyć się urozmaiconym target hp.
  29. 16 points
    Cześć, mam dla was wrzutkę 12 kompletów ekwipunku. Komplet składa się z zbroi, fryzury, broni, peta i mounta+spersonalizowanej ikonki do mounta/peta Tak wygląda selekcja kompletów: Przykładowo pokażę wam 10 set: download: [Hidden Content] skan: [Hidden Content] hasło do paczki: m2zone.tech
  30. 16 points
    Witajcie Mordki! Macie tutaj taki mały poradnik dotyczący zniesienia limitu rang, jak i dodanie całkowicie nowej rangi. Jeżeli chcemy dodać nową rangę powyżej 32k, a nie mamy ustawionego (Typu) zmiennej na int to nie będzie to możliwe. Oczywiście możemy zrobić sobie rangi do 32k, bo Rycerski włącza się nam jak mamy 12k więc mamy jeszcze 18k to zagospodarowania. Dobra To pierwsze co zrobimy, to znieśmy sobie ten limit, a więc - Wbijamy sobie w nasz kod źródłowy i otwieramy plik : Packet.h (SRC/GAME) Następnie w kilku miejscach, a dokładnie 2 razy będzie kod o treści : short sAlignment; Czyli (Typ) zmiennej : Short zmieniamy na Int _____________________________________________________________________________________________________________________________ Może kogoś to interesuje, więc wytłumaczę dlaczego. Short posiada wartość : od -32.768 do 32.767, a Int posiada wartość : od -2.147.483.648 do 2.147.483.647 Więc Teoretycznie jak ustawimy na int to możemy sobie ustawić na serwerze tyle Punktów Rangi ile widać powyżej. _____________________________________________________________________________________________________________________________ Dobra, więc : Wyszukaj sobie tą funkcję : (Packet.h) typedef struct packet_update_char W niej : short sAlignment; i Zmień sobie na : int sAlignment; Następnie wyszukaj sobie tą funkcję : typedef struct packet_char_additional_info W niej : short sAlignment; i Zmień sobie na : int sAlignment; _____________________________________________________________________________________________________________________________ Teraz musimy jeszcze edytować to samo, ale w naszym kodzie od Binki. _____________________________________________________________________________________________________________________________ Więc teraz wbij do : Source_Client/Client/UserInterface/ i wyszukaj Pliku InstanceBase.cpp Następnie wyszukaj sobie tego kodu : void CInstanceBase::SetAlignment(short sAlignment) No i tak samo jak wyżej zmieniasz sobie zmienną z : (short na int) Następnie wbij do : Source_Client/Client/UserInterface/ i wyszukaj Pliku InstanceBase.h WYSZUKAJ - short m_sAlignment; I zmień z (short na int) ( To występuje 2 razy.) WYSZUKAJ - void SetAlignment(short sAlignment); I zmień z (short na int) Teraz wbij do : Source_Client/Client/UserInterface/NetworkActorManager.h Wyszukaj sobie tego : short m_sAlignment; i zmieniasz z (short na int) ---- 2 Razy! Wbij do : Source_Client/Client/UserInterface/Packet.h Wyszukaj : short sAlignment; i zmieniasz z (short na int) (Występuje 3 razy) _____________________________________________________________________________________________________________________________ Teraz dodamy sobie nową Rangę, więc : Przechodzimy do naszego kodu źródłowego /Src/Game/ i otwieramy Plik Char_Battle.cpp Teraz Wyszukujemy : int iAlignIndex; Widzimy tutaj coś takiego : if (GetRealAlignment() >= 120000) // Rycerski iAlignIndex = 0; else if (GetRealAlignment() >= 80000) // Szlachetny iAlignIndex = 1; else if (GetRealAlignment() >= 40000) // Dobry iAlignIndex = 2; else if (GetRealAlignment() >= 10000) // Przyjazny iAlignIndex = 3; else if (GetRealAlignment() >= 0) // Ranga Neutralna (Czyli na 0) iAlignIndex = 4; else if (GetRealAlignment() > -40000) // iAlignIndex = 5; else if (GetRealAlignment() > -80000) // iAlignIndex = 6; else if (GetRealAlignment() > -120000) // iAlignIndex = 7; else iAlignIndex = 8; // (Ta dochodzi do zamknięcia limitu, czyli w tym przypadku 20k) I edytujemy pod siebie. W Moim przykładzie edytuje sobie to tak : if (GetRealAlignment() >= 1000000) // Metin2Zone (Moja Nowa Ranga Druga) iAlignIndex = 0; else if (GetRealAlignment() >= 500000) // Metin2Zone (Moja Nowa Ranga Pierwsza) iAlignIndex = 1; else if (GetRealAlignment() >= 120000) // Rycerski iAlignIndex = 2; else if (GetRealAlignment() >= 80000) // Szlachetny iAlignIndex = 3; else if (GetRealAlignment() >= 40000) // Dobry iAlignIndex = 4; else if (GetRealAlignment() >= 10000) // Przyjazny iAlignIndex = 5; else if (GetRealAlignment() >= 0) iAlignIndex = 6; else if (GetRealAlignment() > -40000) iAlignIndex = 7; else if (GetRealAlignment() > -80000) iAlignIndex = 8; else if (GetRealAlignment() > -120000) iAlignIndex = 9; else if (GetRealAlignment() > -820000) // Metin2Zone (Moja Nowa Negatywna Ranga Pierwsza) iAlignIndex = 10; else iAlignIndex = 11; Jeżeli już edytowałeś/aś pod siebie no to jedziemy dalej! (Oczywiście w tym samym pliku, czyli (Char_Battle.cpp) Szukamy sobie takiego kodu : if (g_iUseLocale && pkKiller->GetParty()) { FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY()); pkKiller->GetParty()->ForEachOnlineMember(f); if (f.m_iCount == 0) pkKiller->UpdateAlignment(-20000); else { sys_log(0, "ALIGNMENT PARTY count %d amount %d", f.m_iCount, f.m_iAmount); f.m_iStep = 1; pkKiller->GetParty()->ForEachOnlineMember(f); } } else pkKiller->UpdateAlignment(-20000); } } I tutaj gdzie mamy nasz limit na - wpisujemy swój czyli w moim wypadku : if (g_iUseLocale && pkKiller->GetParty()) { FPartyAlignmentCompute f(-85000, pkKiller->GetX(), pkKiller->GetY()); pkKiller->GetParty()->ForEachOnlineMember(f); if (f.m_iCount == 0) pkKiller->UpdateAlignment(-85000); else { sys_log(0, "ALIGNMENT PARTY count %d amount %d", f.m_iCount, f.m_iAmount); f.m_iStep = 1; pkKiller->GetParty()->ForEachOnlineMember(f); } } else pkKiller->UpdateAlignment(-850000); } } Następnie szukamy Tego : m_iRealAlignment = MINMAX(-200000, m_iRealAlignment + iAmount, 200000); I edytujemy sobie pod siebie, czyli w moim wypadku na - 85.000, a na + 100.000 m_iRealAlignment = MINMAX(-850000, m_iRealAlignment + iAmount, 1000000); _____________________________________________________________________________________________________________________________ Dobra jeżeli już to zrobiłeś/aś to skompiluj sobie swoje game! Więc nadszedł czas na zabranie się za edycję naszego kodu z naszej binkli! _____________________________________________________________________________________________________________________________ Otwieramy sobie Source_Client/Client/InstanceBase.h i Szukamy sobie tego : TITLE_NUM = 9, TITLE_NONE = 4, TITLE_NUM - Ilość Wszystkich Rang. TITLE_NONE - Numer Rangi Neutralnej. I zmieniamy pod siebie czyli w moim wypadku to : TITLE_NUM = 12, TITLE_NONE = 6, Teraz przechodzimy sobie do Source_Client/Client/InstanceBase.cpp i Szukamy : UINT CInstanceBase::GetAlignmentGrade() { if (m_sAlignment >= 12000) return 0; else if (m_sAlignment >= 8000) return 1; else if (m_sAlignment >= 4000) return 2; else if (m_sAlignment >= 1000) return 3; else if (m_sAlignment >= 0) return 4; else if (m_sAlignment > -4000) return 5; else if (m_sAlignment > -8000) return 6; else if (m_sAlignment > -12000) return 7; return 8; } Raczej nie muszę wam pokazywać jak tutaj edytować, bo przed chwilką to samo robiliśmy, ale w przypadku serwera w Char_Battle.cpp! WIĘC EDYTUJ I PRZEJDŹ DALEJ DO PORADNIKA! __________________________________________________________________________________________________________________________________ Dobra jeżeli już zrobiłeś/aś to wyżej no to zabieramy się za case, więc : Szukamy sobie : (dalej w InstanceBase.cpp) Tego : ( I dodajemy case) int CInstanceBase::GetAlignmentType() { switch (GetAlignmentGrade()) { case 0: ------> Ranga Pozytywna // Rycerski case 1: ------> Ranga Pozytywna // Szlachetny case 2: ------> Ranga Pozytywna // Dobry case 3: ------> Ranga Pozytywna // Przyjazny { return ALIGNMENT_TYPE_WHITE; break; } case 5: ------> Ranga Negatywna // Agresywny case 6: ------> Ranga Negatywna // Nieuczciwy case 7: ------> Ranga Negatywna // Złośliwy case 8: ------> Ranga Negatywna // Okrutny { return ALIGNMENT_TYPE_DARK; break; } } return ALIGNMENT_TYPE_NORMAL; } No to teraz skoro dodawaliśmy sobie 3 nowe Rangi ( 2 na + 1 na -) To musimy sobie dodać 3 case. W Moim wypadku będzie wyglądało to tak : int CInstanceBase::GetAlignmentType() { switch (GetAlignmentGrade()) { case 0: ------> Ranga Pozytywna // Metin2Zone (Moja Nowa Ranga Druga) case 1: ------> Ranga Pozytywna // Metin2Zone (Moja Nowa Ranga Pierwsza) case 2: ------> Ranga Pozytywna // Rycerski case 3: ------> Ranga Pozytywna // Szlachetny case 4: ------> Ranga Pozytywna // Dobry case 5: ------> Ranga Pozytywna // Przyjazny { return ALIGNMENT_TYPE_WHITE; break; } case 7: ------> Ranga Negatywna // Agresywny case 8: ------> Ranga Negatywna // Nieuczciwy case 9: ------> Ranga Negatywna // Złośliwy case 10: ------> Ranga Negatywna // Okrutny case 11: ------> Ranga Negatywna // Metin2Zone (Moja Nowa Negatywna Ranga Pierwsza) { return ALIGNMENT_TYPE_DARK; break; } } Dobra jeżeli już zakończyłeś/aś edycję, to możesz skompilować swoją binkę! _____________________________________________________________________________________________________________________________ No to teraz nadszedł czas na naszego Clienta! Przechodzimy do Nasz_Client/Root, a w nim wszukamy LocaleInfo.py i Otwieramy! Teraz szukamy tego : TITLE_NAME_LIST = ( PVP_LEVEL0, PVP_LEVEL1, PVP_LEVEL2, PVP_LEVEL3, PVP_LEVEL4, PVP_LEVEL5, PVP_LEVEL6, PVP_LEVEL7, PVP_LEVEL8, ) I tutaj musimy dopisać nasze 3 nowe Rangi! Czyli w Moim przypadku : ( PVP_LEVEL0, PVP_LEVEL1, PVP_LEVEL2, PVP_LEVEL3, PVP_LEVEL4, PVP_LEVEL5, PVP_LEVEL6, PVP_LEVEL7, PVP_LEVEL8, PVP_LEVEL9, PVP_LEVEL10, PVP_LEVEL11, ) Zapisujemy i przechodzimy do kolejnego Pliku, mianowicie IntroLoading.py (Nasz_Client/Root) Wyszukujemy tego : ## Title TITLE_COLOR_DICT = ( colorInfo.TITLE_RGB_GOOD_4, colorInfo.TITLE_RGB_GOOD_3, colorInfo.TITLE_RGB_GOOD_2, colorInfo.TITLE_RGB_GOOD_1, colorInfo.TITLE_RGB_NORMAL, colorInfo.TITLE_RGB_EVIL_1, colorInfo.TITLE_RGB_EVIL_2, colorInfo.TITLE_RGB_EVIL_3, colorInfo.TITLE_RGB_EVIL_4, ) I Oczywiście edytujemy pod siebie! Czyli w Moim przypadku : ## Title TITLE_COLOR_DICT = ( colorInfo.TITLE_RGB_GOOD_6, colorInfo.TITLE_RGB_GOOD_5, colorInfo.TITLE_RGB_GOOD_4, colorInfo.TITLE_RGB_GOOD_3, colorInfo.TITLE_RGB_GOOD_2, colorInfo.TITLE_RGB_GOOD_1, colorInfo.TITLE_RGB_NORMAL, colorInfo.TITLE_RGB_EVIL_1, colorInfo.TITLE_RGB_EVIL_2, colorInfo.TITLE_RGB_EVIL_3, colorInfo.TITLE_RGB_EVIL_4, colorInfo.TITLE_RGB_EVIL_5, ) Zapisujemy i przechodzimy do UiCharacter.py (Nasz_Client/Root) To samo, szukamy sobie tego : COLOR_DICT = { 0 : colorInfo.TITLE_RGB_GOOD_4, 1 : colorInfo.TITLE_RGB_GOOD_3, 2 : colorInfo.TITLE_RGB_GOOD_2, 3 : colorInfo.TITLE_RGB_GOOD_1, 4 : colorInfo.TITLE_RGB_NORMAL, 5 : colorInfo.TITLE_RGB_EVIL_1, 6 : colorInfo.TITLE_RGB_EVIL_2, 7 : colorInfo.TITLE_RGB_EVIL_3, 8 : colorInfo.TITLE_RGB_EVIL_4, } I edytujemy pod siebie! W Moim przypadku : COLOR_DICT = { 0 : colorInfo.TITLE_RGB_GOOD_6, 1 : colorInfo.TITLE_RGB_GOOD_5, 2 : colorInfo.TITLE_RGB_GOOD_4, 3 : colorInfo.TITLE_RGB_GOOD_3, 4 : colorInfo.TITLE_RGB_GOOD_2, 5 : colorInfo.TITLE_RGB_GOOD_1, 6 : colorInfo.TITLE_RGB_NORMAL, 7 : colorInfo.TITLE_RGB_EVIL_1, 8 : colorInfo.TITLE_RGB_EVIL_2, 9 : colorInfo.TITLE_RGB_EVIL_3, 10 : colorInfo.TITLE_RGB_EVIL_4, 11 : colorInfo.TITLE_RGB_EVIL_5, } Zapisujemy i następnie przechodzimy do : Nasz_Client/Root/Locale/pl/Locale_Game.txt A w nim szukamy sobie naszych rang, czyli : PVP_LEVEL0 Rycerski PVP_LEVEL1 Szlachetny PVP_LEVEL2 Dobry PVP_LEVEL3 Przyjazny PVP_LEVEL4 Neutralny PVP_LEVEL5 Agresywny PVP_LEVEL6 Nieuczciwy PVP_LEVEL7 Złośliwy PVP_LEVEL8 Okrutny I edytujemy pod siebie, czyli w Moim przypadku, to : PVP_LEVEL0 Metin2Zone (Moja Nowa Ranga Druga) PVP_LEVEL1 Metin2Zone (Moja Nowa Ranga Druga) PVP_LEVEL2 Rycerski PVP_LEVEL3 Szlachetny PVP_LEVEL4 Dobry PVP_LEVEL5 Przyjazny PVP_LEVEL6 Neutralny PVP_LEVEL7 Agresywny PVP_LEVEL8 Nieuczciwy PVP_LEVEL9 Złośliwy PVP_LEVEL10 Okrutny PVP_LEVEL11 Metin2Zone (Moja Nowa Negatywna Ranga Druga) Zapisujemy! No i Chyba to tyle Mordki, ale czekej, czekej. Pewnie zastanawiasz się jak edytować sobie kolorki naszych Rang! No to przechodzimy do Nasz_Client/Root i otwieramy ColorInfo.py i Mamy coś takiego : TITLE_RGB_GOOD_4 = ( 0, 204, 255) TITLE_RGB_GOOD_3 = ( 0, 144, 255) TITLE_RGB_GOOD_2 = ( 92, 110, 255) TITLE_RGB_GOOD_1 = (155, 155, 255) TITLE_RGB_NORMAL = (255, 255, 255) TITLE_RGB_EVIL_1 = (207, 117, 0) TITLE_RGB_EVIL_2 = (235, 83, 0) TITLE_RGB_EVIL_3 = (227, 0, 0) TITLE_RGB_EVIL_4 = (255, 0, 0) I Edytujemy pod siebie, czyli w Moim wypadku to : TITLE_RGB_GOOD_6 = ( 0, 204, 255) // Nowa Ranga 2 TITLE_RGB_GOOD_5 = ( 0, 204, 255) // Nowa Ranga 1 TITLE_RGB_GOOD_4 = ( 0, 204, 255) // Rycerski TITLE_RGB_GOOD_3 = ( 0, 144, 255) // Szlachetny TITLE_RGB_GOOD_2 = ( 92, 110, 255) // Dobry TITLE_RGB_GOOD_1 = (155, 155, 255) // Przyjazny TITLE_RGB_NORMAL = (255, 255, 255) // Ranag Neutralna TITLE_RGB_EVIL_1 = (207, 117, 0) // Agresywny TITLE_RGB_EVIL_2 = (235, 83, 0) // Nieuczciwy TITLE_RGB_EVIL_3 = (227, 0, 0) // Złośliwy TITLE_RGB_EVIL_4 = (255, 0, 0) // Okrutny TITLE_RGB_EVIL_5 = (255, 0, 0) // Nowa Negatywna Ranga Powodzenia Mordki!
  31. 16 points
    Edytujemy plik uitip.py w root i zamieniamy w nim całą klase TipBoard na: class TipBoard(ui.Bar): SCROLL_WAIT_TIME = 3.0 TIP_DURATION = 2.0 FONT_HEIGHT = 15 LINE_HEIGHT = FONT_HEIGHT + 5 STEP_HEIGHT = LINE_HEIGHT + 5 SCREEN_WIDTH = wndMgr.GetScreenWidth() def __init__(self): ui.Bar.__init__(self) self.AddFlag("not_pick") self.tipList = [] self.curPos = 0 self.dstPos = 0 self.nextScrollTime = 0 self.width = 370 self.SetPosition(0, 100) self.SetSize(self.SCREEN_WIDTH, 35) self.SetColor(grp.GenerateColor(0.0, 0.0, 0.0, 0.5)) self.SetWindowHorizontalAlignCenter() self.__CreateTextBar() def __del__(self): ui.Bar.__del__(self) def __CreateTextBar(self): x, y = self.GetGlobalPosition() self.textBar = BigTextBar(self.SCREEN_WIDTH*2, 300, self.FONT_HEIGHT) self.textBar.SetParent(self) self.textBar.SetPosition(6, 8) self.textBar.SetTextColor(242, 231, 193) self.textBar.SetClipRect(0, y, self.SCREEN_WIDTH, y+8+self.STEP_HEIGHT) self.textBar.Show() def __CleanOldTip(self): leaveList = [] for tip in self.tipList: madeTime = tip[0] if app.GetTime() - madeTime > self.TIP_DURATION: pass else: leaveList.append(tip) self.tipList = leaveList if not leaveList: self.textBar.ClearBar() self.Hide() return self.__RefreshBoard() def __RefreshBoard(self): self.textBar.ClearBar() index = 0 for tip in self.tipList: text = tip[1] (text_width, text_height) = self.textBar.GetTextExtent(text) self.textBar.TextOut((wndMgr.GetScreenWidth()-text_width)/2, index*self.STEP_HEIGHT, text) index += 1 def SetTip(self, text): if not app.IsVisibleNotice(): return curTime = app.GetTime() self.tipList.append((curTime, text)) self.__RefreshBoard() self.nextScrollTime = app.GetTime() + 1.0 if not self.IsShow(): self.curPos = self.STEP_HEIGHT self.dstPos = 0 self.textBar.SetPosition(3, 8 + self.curPos) self.Show() def OnUpdate(self): if not self.tipList: self.Hide() return if app.GetTime() > self.nextScrollTime: self.nextScrollTime = app.GetTime() + self.SCROLL_WAIT_TIME self.dstPos = self.curPos + self.STEP_HEIGHT if self.dstPos > self.curPos: self.curPos += 1 self.textBar.SetPosition(3, 8 - self.curPos) if self.curPos > len(self.tipList)*self.STEP_HEIGHT: self.curPos = -self.STEP_HEIGHT self.dstPos = -self.STEP_HEIGHT self.__CleanOldTip()
  32. 16 points
    Siemka, posiedziałem trochę i edytowałem Switch bota Mijago co zrobiłem to naprawiłem propozycje które działają teraz na całe EQ a nie tylko bronie co wam zostało do zrobienia to tylko edytować sobie bonusy na dany item te bony które są wpisane są byle jakie i wartości tak samo dodawanie nowych propozycji musi wyglądać tak pamiętajcie o TABACH "EXP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], import shop import player import item import ui import net import locale import chat import grp import wndMgr import mouseModule from uitooltip import ItemToolTip # Switchbot by Mijago poprawa kodowania by xNukox WEAR_NAMES = ItemToolTip.WEAR_NAMES AFFECT_DICT = ItemToolTip.AFFECT_DICT ### Tutaj podajemy applytype np 1 to HP BONI_AVAIL = [1,2,3,4,5,6,7,9,10,12,13,14,15,16,17,18,19,20,21,22,23,27,28,29,30,31,32,33,34,37,39,41,43,44,45,48,53,71,72] # Tutaj podajemy applytype 6-7 bonu BONI_RARE_AVAIL = [1,2] # Tutaj ustawiamy ID zmianek SWITCH_VNUM = 71084 SWITCH_RARE_VNUM = 71084 # Tu ustawiamy minimalny i maksymalny czas // nie wiem do czego to ale prawdopodobnie czas zmiany bonusów MIN_SWITCH_DELAY = 35 MAX_SWITCH_DELAY_APPEND = 120 # Max 10!! MAX_NUM = 7 #Tutaj ustawiamy propozycję bonusów na dany ITEM proposals = { 1: { # 1 = Weapon "PVP (BODY)":[ [5,15], [6,15], [15,10], [9,30], [17,15], ], "PVP (MENTAL)":[ [5,15], [6,15], [15,10], [9,30], [17,15], ], "PVP (DAGGER)":[ [5,15], [6,15], [15,10], [9,30], [17,15], ], "PVP (ARCHER)":[ [5,15], [6,15], [15,10], [9,30], [17,15], ], "PVP (BM)":[ [4,15], [6,15], [15,10], [9,30], [17,15], ], "PVP (WP)":[ [4,15], [5,15], [15,10], [9,30], [17,15], ], "PVP (SMOK)":[ [4,15], [5,15], [15,10], [9,30], [17,15], ], "PVP (HEALER)":[ [4,15], [6,15], [15,10], [9,30], [17,15], ], "PvM": [ [72,60], [19,20], [20,20], [21,20], [22,20], ], }, 2: [ # Armor { #BODY, "PVP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], "EXP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], }, { #HEAD, "PVP":[ [17,15], [37,15], [10,30], [7,8], [12,10], ], "EXP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], }, { #SHIELD, "PVP(WOJ/NINJA)":[ [5,15], [6,15], [17,15], [48,100], [39,10], ], "PVP(SURA/SZAMAN)":[ [4,15], [6,15], [17,15], [48,100], [39,10], ], "EXP (SURA/SZAMAN)":[ [4,15], [19,20], [20,20], [21,20], [48,100], ], "EXP (WOJOWNIK)":[ [5,15], [19,20], [20,20], [21,20], [48,100], ], "EXP (NINJA)":[ [6,15], [19,20], [20,20], [21,20], [48,100], ], }, { #NECK, "PVP":[ [1,3000], [17,15], [23,10], [37,15], [15,10], ], }, { #FOOTS, "PVP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], }, { #WRIST, "PVP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], "EXP":[ [1,3000], [29,15], [30,15], [31,15], [34,15], ], }, { #EAR, "PVP":[ [17,15], [29,15], [30,15], [31,15], [34,15], ], }, ], } COLOR_BG = grp.GenerateColor(0.0, 0.0, 0.0, 0.5) COLOR_INACTIVE = grp.GenerateColor(1.0, 0.0, 0.0, 0.2) COLOR_ACTIVE = grp.GenerateColor(1.0, 0.6, 0.1, 0.2) COLOR_FINISHED = grp.GenerateColor(0.0, 1.0, 0.0, 0.2) COLOR_INACTIVE_RARE = grp.GenerateColor(1.0, 0.2, 0.0, 0.2) COLOR_ACTIVE_RARE = grp.GenerateColor(1.0, 0.7, 0.2, 0.2) COLOR_HIGHLIGHT_RARE = grp.GenerateColor(1.0, 0.2, 0.2, 0.05) COLOR_PIN_HINT = grp.GenerateColor(0.0, 0.5, 1.0, 0.3) COLOR_CHECKBOX_NOT_SELECTED = grp.GenerateColor(1.0, 0.3, 0.0, 0.1) COLOR_CHECKBOX_SELECTED = grp.GenerateColor(0.3, 1.0, 1.0, 0.3) DISTANCE_BOTTOM = 36 class Bar(ui.Bar): def __init__(self,layer = "UI"): ui.Bar.__init__(self,layer) def SetColor(self,color): wndMgr.SetColor(self.hWnd, color) self.color = color class BonusSelector(ui.Bar): def Activate(self): self.sub_parent.resetSwitch() self.Status_new.SetColor(COLOR_ACTIVE) self.sub_parent.StatusBar.SetColor(COLOR_ACTIVE) self.sub_parent.StatusText.SetText("Aktywny") self.Starter.SetText("Zmiana ("+str(self.index+1)+") Zatrzymaj") self.sub_parent.boni_active = 1 def Deactivate(self): self.sub_parent.resetSwitch() self.Status_new.SetColor(COLOR_INACTIVE) self.sub_parent.StatusBar.SetColor(COLOR_INACTIVE) self.sub_parent.StatusText.SetText("Aktywny") self.Starter.SetText("Zmiana ("+str(self.index+1)+") Start") self.sub_parent.boni_active = 0 if self.sub_parent.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.swib_normal.SetColor(COLOR_INACTIVE) pass def Activate_rare(self): self.sub_parent.resetSwitch_rare() self.sub_parent.StatusBar_rare.SetColor(COLOR_ACTIVE_RARE) self.sub_parent.StatusText_rare.SetText("6/7 Aktywny") self.Starter_rare_boni.SetText("6/7 Zatrzymaj") self.sub_parent.boni_rare_active = 1 if self.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.swib_rare.SetColor(COLOR_ACTIVE_RARE) pass def Deactivate_rare(self): self.sub_parent.resetSwitch_rare() self.sub_parent.StatusBar_rare.SetColor(COLOR_INACTIVE_RARE) self.sub_parent.StatusText_rare.SetText("6/7 Aktywny") self.Starter_rare_boni.SetText("6/7 Start") self.Starter_rare_boni.SetUp() self.sub_parent.boni_rare_active = 0 if self.sub_parent.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.swib_rare.SetColor(COLOR_INACTIVE_RARE) pass def Finish(self): self.Status_new.SetColor(COLOR_FINISHED) self.sub_parent.StatusBar.SetColor(COLOR_FINISHED) self.sub_parent.StatusText.SetText("Zakończono") self.Starter.SetText("Zmiana ("+str(self.index+1)+") Kontynuuj") self.sub_parent.boni_active = 0 if self.sub_parent.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.swib_normal.SetColor(COLOR_FINISHED) pass def Finish_rare(self): self.sub_parent.StatusBar_rare.SetColor(COLOR_FINISHED) self.sub_parent.StatusText_rare.SetText("6/7 Zakończono") self.Starter_rare_boni.SetText("6/7 Kontynuuj") self.sub_parent.boni_rare_active = 0 if self.sub_parent.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.swib_rare.SetColor(COLOR_FINISHED) pass def Block(self): self.BlockBar.Show() self.BlockBar.sub.Show() self.Starter.Hide() pass def Unblock(self): self.BlockBar.sub.Hide() self.BlockBar.Hide() self.Starter.Show() pass def enable_rare_boni(self): for i in range(0,4): self.boni[6][i].Show() self.boni[7][i].Show() self.Starter.SetPosition(0,140+45) self.bg_rare_boni.Show() self.bg_rare_boni_but.Show() self.Starter_rare_boni.Show() self.sub_parent.StatusBar_rare.Show() if self.sub_parent.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.Enable_rare(1) def disable_rare_boni(self): for i in range(0,4): self.boni[6][i].Hide() self.boni[7][i].Hide() self.Starter.SetPosition(0,140) self.bg_rare_boni.Hide() self.bg_rare_boni_but.Hide() self.Starter_rare_boni.Hide() self.sub_parent.StatusBar_rare.Hide() self.Deactivate_rare() if self.sub_parent.parentWindow.parentWindow.gameWindow != None: self.sub_parent.blockBar.Enable_rare(0) def __init__(self,sub_parent): ui.Bar.__init__(self, "UI") self.sub_parent = sub_parent self.index = sub_parent.index self.SetColor(COLOR_BG) self.SetSize(500,225+10) self.boni = {} self.Status_new = ui.Bar() self.Status_new.SetParent(self) self.Status_new.SetColor(COLOR_INACTIVE) self.Status_new.SetSize(500,5) self.Status_new.Show() self.bg_rare_boni = ui.Bar() self.bg_rare_boni.SetColor(COLOR_HIGHLIGHT_RARE) self.bg_rare_boni.SetParent(self) self.bg_rare_boni.SetPosition(0,132) self.bg_rare_boni.SetSize(500,51) self.bg_rare_boni.Hide() self.bg_rare_boni_but = ui.Bar() self.bg_rare_boni_but.SetColor(COLOR_HIGHLIGHT_RARE) self.bg_rare_boni_but.SetParent(self) self.bg_rare_boni_but.SetPosition(400,133+50) self.bg_rare_boni_but.SetSize(100,25) self.bg_rare_boni_but.Hide() self.EnableRareBoni = CheckBox("6/7 Wstaw") self.EnableRareBoni.SetParent(self) self.EnableRareBoni.SetPosition(10,185) self.EnableRareBoni.eventUp = self.disable_rare_boni self.EnableRareBoni.eventDown = self.enable_rare_boni self.EnableRareBoni.Show() self.Starter = ui.ToggleButton() self.Starter.SetWindowHorizontalAlignCenter() self.Starter.SetParent(self) self.Starter.SetUpVisual("d:/ymir work/ui/public/XLarge_Button_01.sub") self.Starter.SetOverVisual("d:/ymir work/ui/public/XLarge_button_02.sub") self.Starter.SetDownVisual("d:/ymir work/ui/public/XLarge_button_03.sub") self.Starter.SetPosition(0,140) self.Starter.SetText("Zmieniacz włączony") self.Starter.SetToggleDownEvent(self.Activate) self.Starter.SetToggleUpEvent(self.Deactivate) self.Starter.Show() self.Starter_rare_boni = ui.ToggleButton() self.Starter_rare_boni.SetWindowHorizontalAlignCenter() self.Starter_rare_boni.SetParent(self) self.Starter_rare_boni.SetUpVisual("d:/ymir work/ui/public/Large_Button_01.sub") self.Starter_rare_boni.SetOverVisual("d:/ymir work/ui/public/Large_button_02.sub") self.Starter_rare_boni.SetDownVisual("d:/ymir work/ui/public/Large_button_03.sub") self.Starter_rare_boni.SetPosition(200,140+45) self.Starter_rare_boni.SetText("6/7 Start") self.Starter_rare_boni.SetToggleDownEvent(self.Activate_rare) self.Starter_rare_boni.SetToggleUpEvent(self.Deactivate_rare) self.Starter_rare_boni.Hide() for i in range(7,5,-1): vas = i self.boni[vas] = {} self.boni[vas][0] = ui.TextLine() self.boni[vas][0].SetParent(self) self.boni[vas][0].SetText("Bonus "+str(vas)) self.boni[vas][0].SetPosition(15,10+25*(vas-1)) self.boni[vas][0].Hide() self.boni[vas][1] = DropDown(self,"- Brak -") self.boni[vas][1].SetPosition(70,10+25*(vas-1)) for x in AFFECT_DICT: if x in BONI_RARE_AVAIL: self.boni[vas][1].AppendItem(str(AFFECT_DICT[x](0)),x) self.boni[vas][1].SetSize(330,20) self.boni[vas][1].Hide() self.boni[vas][2] = ui.Bar("UI") self.boni[vas][2].SetParent(self) self.boni[vas][2].SetPosition(410,10+25*(vas-1)) self.boni[vas][2].SetColor(0xC0000000) self.boni[vas][2].SetSize(80,20) self.boni[vas][2].Hide() self.boni[vas][3] = Edit2("0",14) self.boni[vas][3].SetParent(self.boni[vas][2]) self.boni[vas][3].SetNumberMode() self.boni[vas][3].SetSize(80,20) self.boni[vas][3].SetPosition(4,3) self.boni[vas][3].Hide() for i in range(0,5): vas = 5-i self.boni[vas] = {} self.boni[vas][0] = ui.TextLine() self.boni[vas][0].SetParent(self) self.boni[vas][0].SetText("Bonus "+str(vas)) self.boni[vas][0].SetPosition(15,10+25*(vas-1)) self.boni[vas][0].Show() self.boni[vas][1] = DropDown(self,"- Brak -") self.boni[vas][1].SetPosition(70,10+25*(vas-1)) for x in AFFECT_DICT: if x in BONI_AVAIL: self.boni[vas][1].AppendItem(str(AFFECT_DICT[x](0)),x) self.boni[vas][1].SetSize(330,20) self.boni[vas][1].Show() self.boni[vas][2] = ui.Bar("UI") self.boni[vas][2].SetParent(self) self.boni[vas][2].SetPosition(410,10+25*(vas-1)) self.boni[vas][2].SetColor(0xC0000000) self.boni[vas][2].SetSize(80,20) self.boni[vas][2].Show() self.boni[vas][3] = Edit2("0",14) self.boni[vas][3].SetParent(self.boni[vas][2]) self.boni[vas][3].SetNumberMode() self.boni[vas][3].SetSize(80,20) self.boni[vas][3].SetPosition(4,3) self.boni[vas][3].Show() self.but_propose = DropDown(self,'Propozycje',0) self.but_propose.SetParent(self) self.but_propose.SetPosition(380,210) self.but_propose.OnChange=self.change_boni self.but_propose.Show() self.BlockBar = ui.Bar() self.BlockBar.SetParent(self) self.BlockBar.SetColor(COLOR_INACTIVE) self.BlockBar.SetPosition(0,5) self.BlockBar.SetSize(500,170-5+35+2) self.BlockBar.Hide() self.BlockBar.sub = ui.Bar() self.BlockBar.sub.SetParent(self) self.BlockBar.sub.SetColor(COLOR_INACTIVE) self.BlockBar.sub.SetPosition(500-122,5+170-5+35+2) self.BlockBar.sub.SetSize(122,30) self.BlockBar.sub.Hide() self.BlockText = ui.TextLine() self.BlockText.SetParent(self.BlockBar) self.BlockText.SetWindowHorizontalAlignCenter() self.BlockText.SetHorizontalAlignCenter() self.BlockText.SetPosition(0,140) self.BlockText.SetText("Tego itemu nie można zmieniać.") self.BlockText.Show() self.prepare_propose() def change_boni(self): use = self.but_propose.DropList.GetSelectedItem().value bon = 1 item.SelectItem(self.sub_parent.vnum) for x in use: ok = 1 for i in xrange(item.ITEM_APPLY_MAX_NUM): (affectType, affectValue) = item.GetAffect(i) if affectType == x[0]: ok = 0 if ok == 0: continue y = self.boni[bon][1] y.SelectByAffectId(x[0]) self.boni[bon][1].act.SetText(y.DropList.GetSelectedItem().textBox.GetText()) self.boni[bon][3].SetText(str(x[1])) bon+=1 for x in range(bon,6): y = self.boni[x][1].DropList y.SelectIndex(0) self.boni[x][1].act.SetText(y.GetSelectedItem().textBox.GetText()) self.boni[x][3].SetText("0") def prepare_propose(self): self.but_propose.DropList.RemoveAllItems() self.but_propose.maxh = 95 self.but_propose.c = 0 self.but_propose.AppendItem("Pusto",[]) item.SelectItem(self.sub_parent.vnum) type = item.GetItemType() use = proposals[type] if type == 2: use = use[item.GetItemSubType()] for prop in use: self.but_propose.AppendItem(prop,use[prop]) class ItemTabBar(ui.Window): class BlockBar(ui.Window): size_res = 32 multi = 1 def SetSize(self,i=1): self.multi = i ui.Window.SetSize(self,self.size_res,self.size_res*i) if self.rare_enabled == 1: self.swib_normal.SetSize(self.size_res,self.size_res*i/3*2) pos1 = int(1.0*self.size_res*i/3.0*2.0) self.swib_normal.SetSize(self.size_res,pos1) self.swib_rare.SetSize(self.size_res,self.size_res*i-pos1) self.swib_rare.SetPosition(0,pos1) self.swib_rare.Show() else: self.swib_normal.SetSize(self.size_res,self.size_res*i) self.swib_rare.Hide() def Enable_rare(self,o = 1): self.rare_enabled = o self.SetSize(self.multi) def __init__(self): ui.Window.__init__(self) self.rare_enabled = 0 self.swib_normal = ui.Bar() self.swib_normal.SetParent(self) self.swib_normal.SetSize(self.size_res,self.size_res*self.multi) self.swib_normal.SetColor(COLOR_INACTIVE) self.swib_normal.SetPosition(0,0) self.swib_normal.Show() self.swib_rare = ui.Bar() self.swib_rare.SetParent(self) self.swib_rare.SetSize(self.size_res,self.size_res) self.swib_rare.SetColor(COLOR_INACTIVE_RARE) self.swib_rare.SetPosition(0,0) self.swib_rare.Hide() self.SetSize(1) class ItemTab(ui.Bar): height_selected = 36*3+8 height_unselected = 36*3+5 def Destroy(self): self.parentWindow.parentWindow.enable_rebuy.SetParent(self.parentWindow.parentWindow) self.parentWindow.parentWindow.but_speed.SetParent(self.parentWindow.parentWindow) self.parentWindow.parentWindow.help_show_rare.SetParent(self.parentWindow.parentWindow) self.parentWindow.parentWindow.help_rebuy.SetParent(self.parentWindow.parentWindow) self.parentWindow.parentWindow.help_duration.SetParent(self.parentWindow.parentWindow) self.parentWindow.parentWindow.enable_rebuy.Hide() self.parentWindow.parentWindow.but_speed.Hide() self.bonusSelector.Hide() self.bonusSelector.__del__() self.Hide() self.__del__() def DeleteMe(self): self.parentWindow.DeleteTab(self.tabnum) def __init__(self,parent,tabnum,index = 0,vnum = 0): ## Init ItemTab ui.Bar.__init__(self) self.SetColor(COLOR_BG) self.SetSize(self.width,self.height_unselected) self.index = index self.tabnum = tabnum self.vnum = vnum self.count = 0 self.count_rare = 0 self.parentWindow = parent self.SetParent(parent) if self.parentWindow.parentWindow.gameWindow != None: self.blockBar = ItemTabBar.BlockBar() self.blockBar.SetParent(self.parentWindow.parentWindow.gameWindow.interface.wndInventory.wndItem) ipi = self.parentWindow.parentWindow.gameWindow.interface.wndInventory.inventoryPageIndex self.blockBar.Show() ip2 = self.index - ipi*45 self.blockBar.SetPosition(((ip2-int(ip2/5)*5)*self.blockBar.size_res),int(ip2/5)*self.blockBar.size_res) self.ItemIcon = ui.ImageBox() self.ItemIcon.SetParent(self) self.ItemIcon.AddFlag("not_pick") self.ItemIcon.SetWindowHorizontalAlignCenter() self.ItemIcon.SetWindowVerticalAlignCenter() self.ItemIcon.Show() self.SlotName = ui.TextLine() self.SlotName.SetParent(self) self.SlotName.SetWindowHorizontalAlignCenter() self.SlotName.SetHorizontalAlignCenter() self.SlotName.SetPosition(0,5) self.SlotName.SetText("Slot %d" % (self.index+1)) self.SlotName.AddFlag("not_pick") self.SlotName.Show() self.StatusBar = Bar() # Special Bar self.StatusBar.SetParent(self) self.StatusBar.SetWindowVerticalAlignBottom() self.StatusBar.SetSize(self.width,20) self.StatusBar.SetPosition(0,20) self.StatusBar.SetColor(COLOR_INACTIVE) self.StatusBar.AddFlag("not_pick") self.StatusBar.Show() self.StatusText = ui.TextLine() self.StatusText.SetParent(self.StatusBar) # self.StatusText.SetParent(self) self.StatusText.SetWindowHorizontalAlignCenter() self.StatusText.SetWindowVerticalAlignCenter() self.StatusText.SetHorizontalAlignCenter() self.StatusText.SetVerticalAlignCenter() self.StatusText.SetPosition(0,0) self.StatusText.SetText("Aktywny") self.StatusText.Show() self.StatusBar_rare = Bar() # Special Bar self.StatusBar_rare.SetParent(self) self.StatusBar_rare.SetWindowVerticalAlignBottom() self.StatusBar_rare.SetSize(self.width,20) self.StatusBar_rare.SetPosition(0,40) self.StatusBar_rare.SetColor(COLOR_INACTIVE_RARE) self.StatusBar_rare.AddFlag("not_pick") self.StatusBar_rare.Hide() self.StatusText_rare = ui.TextLine() self.StatusText_rare.SetParent(self.StatusBar_rare) self.StatusText_rare.SetWindowHorizontalAlignCenter() self.StatusText_rare.SetWindowVerticalAlignCenter() self.StatusText_rare.SetHorizontalAlignCenter() self.StatusText_rare.SetVerticalAlignCenter() self.StatusText_rare.SetPosition(0,0) self.StatusText_rare.SetText("6/7 Aktywny") self.StatusText_rare.Show() self.CloseBut = ui.Button() self.CloseBut.SetParent(self) self.CloseBut.SetUpVisual("d:/ymir work/ui/public/close_button_01.sub") self.CloseBut.SetOverVisual("d:/ymir work/ui/public/close_button_02.sub") self.CloseBut.SetDownVisual("d:/ymir work/ui/public/close_button_03.sub") self.CloseBut.SetToolTipText("Minimalizacja", 0, -23) self.CloseBut.SetEvent(self.DeleteMe) self.CloseBut.SetPosition(0,0) self.CloseBut.Show() self.OnMouseLeftButtonDown = lambda: self.Select() self.boni_active = 0 self.boni_rare_active = 0 self.bonusSelector = BonusSelector(self) self.bonusSelector.SetParentProxy(self.parentWindow.parentWindow) self.bonusSelector.SetPosition(10,35+36*3+4*2) self.bonusSelector.Hide() self.vnum = 0 self.SetIndex(index) self.resetSwitch() self.resetSwitch_rare() def IsActive(self): return self.boni_active == 1 def IsActive_rare(self): return self.boni_rare_active == 1 def SetParentProxy(self,parent): ui.Bar.SetParentProxy(self,parent) def Select(self): for a in self.parentWindow.tabList: self.parentWindow.tabList[a].UnSelect() self.parentWindow.tabList[a].bonusSelector.Hide() self.bonusSelector.Show() self.SetSize(self.width,self.height_selected) self.Update() self.parentWindow.parentWindow.enable_rebuy.SetParent(self.bonusSelector) self.parentWindow.parentWindow.enable_rebuy.SetPosition(10,200+10) self.parentWindow.parentWindow.enable_rebuy.Show() self.parentWindow.parentWindow.but_speed.SetParent(self.bonusSelector) self.parentWindow.parentWindow.but_speed.SetPosition(0,205+10) self.parentWindow.parentWindow.but_speed.Show() self.parentWindow.parentWindow.help_show_rare.SetParent(self.bonusSelector) self.parentWindow.parentWindow.help_rebuy.SetParent(self.bonusSelector) self.parentWindow.parentWindow.help_duration.SetParent(self.bonusSelector) def UnSelect(self): self.SetSize(self.width,self.height_unselected) self.Update() def Update(self): self.StatusBar.SetPosition(0,20) self.SetPosition((self.width+self.dist)*self.tabnum,0) self.SlotName.SetText("Slot %d" % (self.index+1)) def resetSwitch(self): self.values = [0,0,0,0,0] def resetSwitch_rare(self): self.values_rare = [0,0] # last_switch = -1 rebuyed = 0 def nachkauf(self): if self.parentWindow.parentWindow.buyed != 0: return else: self.parentWindow.parentWindow.buyed = 1 if self.parentWindow.parentWindow.enable_rebuy.checked == 1: for i in range(0,shop.SHOP_SLOT_COUNT): me = shop.GetItemID(i) if me == SWITCH_VNUM: if shop.GetItemPrice(i) > player.GetMoney(): self.bonusSelector.Deactivate() return else: net.SendShopBuyPacket(i) self.rebuyed = 1 return rebuyed_rare = 0 def nachkauf_rare(self): if self.parentWindow.parentWindow.buyed_rare != 0: return else: self.parentWindow.parentWindow.buyed_rare = 1 if self.parentWindow.parentWindow.enable_rebuy.checked == 1: for i in range(0,shop.SHOP_SLOT_COUNT): me = shop.GetItemID(i) if me == SWITCH_RARE_VNUM: if shop.GetItemPrice(i) > player.GetMoney(): self.bonusSelector.Deactivate_rare() return else: net.SendShopBuyPacket(i) self.rebuyed_rare = 1 return def Switch_rare(self): lc = 0 for i in range(0,90*2): if player.GetItemIndex(i) == SWITCH_RARE_VNUM: lc+=player.GetItemCount(i) if lc == 0 and self.parentWindow.parentWindow.enable_rebuy.checked == 0: chat.AppendChat(2,"Slot %d: 6/7 Bonowanie przerwane. - Brak itemow do bonowania & dokup zmianki!" % (self.index+1)) self.bonusSelector.Deactivate_rare() return if lc < 15: self.nachkauf_rare() if lc == 0: self.bonusSelector.Deactivate_rare() chat.AppendChat(2,"Slot %d: 6/7 Bonowanie przerwane -> Brak itemów!" % (self.index+1)) return for i in range(0,90*2): if player.GetItemIndex(i) == SWITCH_RARE_VNUM: net.SendItemUseToItemPacket(i,self.index) return def Switch(self): lc = 0 for i in range(0,90*2): if player.GetItemIndex(i) == SWITCH_VNUM: lc+=player.GetItemCount(i) if lc == 0 and self.parentWindow.parentWindow.enable_rebuy.checked == 0: self.bonusSelector.Deactivate() return if lc < 15: self.nachkauf() if lc == 0: self.bonusSelector.Deactivate() return for i in range(0,90*2): if player.GetItemIndex(i) == SWITCH_VNUM: net.SendItemUseToItemPacket(i,self.index) return def checkSwitch(self): ok = 0 for i in range(0,5): if player.GetItemAttribute(self.index, i) != self.values[i]: ok = 1 self.prob = self.GetProb() self.StatusText.SetText("Aktywny (%d%%)" %self.prob) if ok == 1 or self.prob >= 90: if self.prob >= 90: chat.AppendChat(1,"Slot %d: Bonowanie zakończone!" % (self.index+1)) self.bonusSelector.Finish() return self.values = [player.GetItemAttribute(self.index, i) for i in range(0,5)] self.Switch() elif self.rebuyed > 0: self.rebuyed = 0 self.Switch() elif ok == 0 and self.count < 5: self.count+=1 elif ok == 0 and self.count >= 5: self.count = 0 self.Switch() pass def checkSwitch_rare(self): ok = 0 for i in range(0,2): if player.GetItemAttribute(self.index, i+6) != self.values_rare[i]: ok = 1 self.prob_rare = self.GetProb_rare() self.StatusText_rare.SetText("Aktywny (%d%%)" %self.prob_rare) if ok == 1 or self.prob_rare >= 90: if self.prob_rare >= 90: self.bonusSelector.Finish_rare() chat.AppendChat(1,"Slot %d: 6/7 Bonowanie zakończone!" % (self.index+1)) return self.values_rare = [player.GetItemAttribute(self.index, i) for i in range(5,7)] self.Switch_rare() elif self.rebuyed_rare > 0: self.rebuyed_rare = 0 self.Switch_rare() elif ok == 0 and self.count_rare < 5: self.count_rare+=1 elif ok == 0 and self.count_rare >= 5: self.count_rare = 0 self.Switch_rare() pass def UpdateItem(self): # try: vnum = player.GetItemIndex(self.index) if vnum == 0 and self.vnum != 0: self.resetSwitch() self.resetSwitch_rare() self.vnum = 0 self.bonusSelector.Deactivate() self.bonusSelector.Block() self.bonusSelector.prepare_propose() self.ItemIcon.Hide() if self.parentWindow.parentWindow.gameWindow != None: self.blockBar.SetSize(1) return elif vnum != self.vnum: self.resetSwitch() self.resetSwitch_rare() self.vnum = vnum self.bonusSelector.Deactivate() self.bonusSelector.prepare_propose() item.SelectItem(self.vnum) if self.parentWindow.parentWindow.gameWindow != None: (w,h) = item.GetItemSize() self.blockBar.SetSize(h) if item.GetItemType() != 1 and item.GetItemType() != 2: self.bonusSelector.Block() else: self.bonusSelector.Unblock() self.ItemIcon.Show() self.ItemIcon.LoadImage(item.GetIconImageFileName()) return if self.IsActive(): self.checkSwitch() if self.IsActive_rare(): self.checkSwitch_rare() def SetIndex(self,index): self.index = index self.bonusSelector.index = index self.bonusSelector.Starter.SetText("Zmieniacz ("+str(index+1)+") Start") self.Update() self.UpdateItem() def GetProb_rare(self): values = [player.GetItemAttribute(self.index, i+6) for i in range(0,2)] val2 = {} for i in range(0,2): try: affectString = AFFECT_DICT[values[i][0]](values[i][1]) val2[values[i][0]] = values[i][1] self.bonusSelector.ibi[i+6].SetText(affectString) except: pass prob = 0 max = 0 yp = self.GenList_rare() for x in yp: if yp[x] in val2 and val2[yp[x]] >= int(self.bonusSelector.boni[x+5][3].GetText()): prob = prob+1 max = max+1 if max > 0: prozent = 100/max*prob else: prozent = 100 return prozent pass def GetProb(self): values = [player.GetItemAttribute(self.index, i) for i in range(0,5)] val2 = {} for i in range(0,5): try: affectString = AFFECT_DICT[values[i][0]](values[i][1]) val2[values[i][0]] = values[i][1] self.bonusSelector.ibi[i].SetText(affectString) except: pass prob = 0 max = 0 yp = self.GenList() for x in yp: if yp[x] in val2 and val2[yp[x]] >= int(self.bonusSelector.boni[x][3].GetText()): prob = prob+1 max = max+1 if max > 0: prozent = 100/max*prob else: prozent = 100 return prozent def GenList(self): ret = {} for i in range(0,5): if self.bonusSelector.boni[5-i][1].selected.value != 0: ret[5-i] = self.bonusSelector.boni[5-i][1].selected.value return ret def GenList_rare(self): ret = {} for i in range(0,2): if self.bonusSelector.boni[6+i][1].selected.value != 0: ret[i+1] = self.bonusSelector.boni[6+i][1].selected.value return ret def __init__(self,parent): ui.Window.__init__(self) self.SetSize(500,36*3+4*2) self.tabCount = 0 self.tabList = {} self.parentWindow = parent self.SetParent(parent) self.plusBar = ui.Bar() self.plusBar.SetParent(self) self.plusBar.SetSize(90,30) self.plusBar.SetWindowVerticalAlignCenter() self.plusBar.SetColor(COLOR_BG) self.plusBar.OnMouseLeftButtonUp = lambda: self.AddTab_pre() self.OnMouseLeftButtonUp = lambda: self.AddTab_pre() self.plusBar.SetPosition(30,0) self.plusBar.Show() self.AddText = ui.TextLine() self.AddText.SetParent(self.plusBar) self.AddText.SetText("Daj tu item!") self.AddText.SetWindowVerticalAlignCenter() self.AddText.SetWindowHorizontalAlignCenter() self.AddText.SetVerticalAlignCenter() self.AddText.SetHorizontalAlignCenter() self.AddText.SetPosition(0,0) self.AddText.Show() dist = [ [500, 0 ], #1 [240, 10 ], [160, 10 ], [117, 10.5], # [ 80, 25 ], #5 [ 92, 10 ], #5 [ 75, 10 ], #6 [ 64, 9 ], #7 [ 56, 7.5], #8 [ 50, 6.5], #9 [ 45, 5.5], #10 ][MAX_NUM-1] self.ItemTab.width = dist[0] self.ItemTab.dist = dist[1] def DeleteTab(self,id): if self.parentWindow.gameWindow != None: self.tabList[id].blockBar.Hide() self.tabList[id].blockBar.Destroy() self.tabList[id].Destroy() self.tabCount = self.tabCount -1 if self.tabCount > id and id < 5: for i in xrange(id,self.tabCount): self.tabList[i] = self.tabList[i+1] self.tabList[i].tabnum = i self.tabList[i].SetPosition((self.tabList[i].width+self.tabList[i].dist)*i,0) del self.tabList[self.tabCount] else: del self.tabList[id] if self.tabCount > 0: self.tabList[0].Select() if (self.ItemTab.width+self.ItemTab.dist)*self.tabCount < 20: self.parentWindow.SetSize(520,387-210) self.parentWindow.but_speed.Hide() self.plusBar.SetPosition(20,0) else: (x,y) = self.tabList[self.tabCount-1].GetLocalPosition() self.plusBar.SetPosition(x+self.ItemTab.width+self.ItemTab.dist,0) self.plusBar.Show() def AddTab_pre(self): if mouseModule.mouseController.isAttached(): attachedSlotType = mouseModule.mouseController.GetAttachedType() attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber() attachedSlotVnum = mouseModule.mouseController.GetAttachedItemIndex() item.SelectItem(attachedSlotVnum) if item.GetItemType() != 1 and item.GetItemType() != 2: mouseModule.mouseController.DeattachObject() chat.AppendChat(2,"Tego itemu nie można zmieniać!.") return for a in self.tabList: if self.tabList[a].index == attachedSlotPos: mouseModule.mouseController.DeattachObject() chat.AppendChat(2,"Ten slot został już wstawiony!") return if player.SLOT_TYPE_INVENTORY == attachedSlotType: self.AddTab(attachedSlotPos,attachedSlotVnum) chat.AppendChat(2,"Dodano item!") mouseModule.mouseController.DeattachObject() def AddTab(self,id,vnum = 0): if self.tabCount < MAX_NUM: self.tabList[self.tabCount] = self.ItemTab(self,self.tabCount,id,vnum) self.tabList[self.tabCount].Select() self.tabList[self.tabCount].Show() self.tabCount+= 1 if (self.ItemTab.width+self.ItemTab.dist)*self.tabCount < 20: self.plusBar.SetPosition(20,0) else: (x,y) = self.tabList[self.tabCount-1].GetLocalPosition() self.plusBar.SetPosition(x+self.ItemTab.width+self.ItemTab.dist,0) if self.tabCount == MAX_NUM: self.plusBar.Hide() self.parentWindow.SetSize(520,387+10) self.parentWindow.but_speed.Show() # return 0 class Bot(ui.BoardWithTitleBar): class PinGroup(ui.Bar): def OnUpdate(self): (x,y) = self.GetGlobalPosition() max_x = wndMgr.GetScreenWidth()-self.GetWidth() max_y = wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM if not x == self.pos_x or not y == self.pos_y: old_dir = self.dir if self.pos_x == 0 and not self.pos_y == 0 and not self.pos_y == max_y and old_dir != 1: self.parse_dir(1) elif self.pos_x == max_x and not self.pos_y == 0 and not self.pos_y == max_y and old_dir != 2: self.parse_dir(2) elif self.pos_y == max_y and not self.pos_x == 0 and not self.pos_x == max_x and old_dir != 4: self.parse_dir(4) elif self.pos_y == 0 and not self.pos_x == 0 and not self.pos_x == max_x and old_dir != 3: self.parse_dir(3) max_x = wndMgr.GetScreenWidth()-self.GetWidth() max_y = wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM if self.pos_x == 0 and not self.pos_y == 0 and not self.pos_y == max_y: x = 0 elif self.pos_x == max_x and not self.pos_y == 0 and not self.pos_y == max_y: x = max_x elif self.pos_y == 0 and not self.pos_x == 0 and not self.pos_x == max_x: y = 0 elif self.pos_y == max_y and not self.pos_x == 0 and not self.pos_x == max_x: y = max_y if x > 0 and x < max_x and y > 0 and y < max_y: if y < int(max_y/2): y = 0 else: y = max_y if x < int(max_x/2): x = 0 else: x = max_x x = min(max(0,x),wndMgr.GetScreenWidth()-self.GetWidth()) y = min(max(0,y),wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM) self.SetPosition(x,y) self.pos_x = x self.pos_y = y self.parent.OnUpdate() for c in self.txtlist: c.SetColor(c.item.StatusBar.color) c.txt2.SetText("Status: %s" % c.item.StatusText.GetText()) try: c.listWin2.SetColor(c.item.StatusBar_rare.color) c.txt3.SetText("Status: %s" % c.item.StatusText_rare.GetText()) except: pass def ShowMainWindow(self): (x,y) = self.parent.GetGlobalPosition() x = min(max(32,x),wndMgr.GetScreenWidth()-self.parent.GetWidth()-32) y = min(max(32,y),wndMgr.GetScreenHeight()-self.parent.GetHeight()-DISTANCE_BOTTOM-32) self.parent.SetPosition(x,y) self.parent.Show() self.__del__() def parse_dir(self,dir): self.dir = dir w,h = 100,50 for listWin in self.txtlist: itm = listWin.item listWin.AddFlag("not_pick") if dir >= 3: listWin.SetPosition(w,4) listWin.SetSize(90,h-8) w+=92 if itm.bonusSelector.EnableRareBoni.checked == 1: w+=15 listWin.SetSize(105,4+12+12) listWin.listWin2.SetSize(105,14) listWin.listWin2.Show() listWin.txt3.Show() else: listWin.SetPosition(0,h) listWin.SetSize(w,4+12+12+2) if itm.bonusSelector.EnableRareBoni.checked == 1: listWin.SetSize(w,4+12+12) listWin.listWin2.SetSize(w,14) listWin.listWin2.Show() listWin.txt3.Show() h+=12 pass h+=4+12+12+4 self.SetSize(w,h) def __init__(self,parent,dir = 1): self.parent = parent self.dir = dir ui.Bar.__init__(self) self.SetColor(COLOR_BG) w,h = 100,50 self.AddFlag("float") self.AddFlag("movable") self.maximise_but = ui.Button() self.maximise_but.SetParent(self) self.maximise_but.SetPosition(4,4) self.maximise_but.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub") self.maximise_but.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub") self.maximise_but.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub") self.maximise_but.SetText("Pokaż okno!") self.maximise_but.SetEvent(self.ShowMainWindow) self.maximise_but.Show() self.stop_but = ui.Button() self.stop_but.SetParent(self) self.stop_but.SetPosition(4,24) self.stop_but.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub") self.stop_but.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub") self.stop_but.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub") self.stop_but.SetText("Wyłącz wszystko!") self.stop_but.SetEvent(self.parent.deactivate_all) self.stop_but.Show() self.txtlist = [] for a in self.parent.itemTabBar.tabList: itm = self.parent.itemTabBar.tabList[a] listWin = ui.Bar() listWin.item = itm self.txtlist.append(listWin) listWin.SetColor(itm.StatusBar.color) listWin.SetParent(self) listWin.AddFlag("not_pick") listWin.Show() listWin.txt1 = ui.TextLine() listWin.txt1.SetParent(listWin) listWin.txt1.SetText("Slot %d:" %(itm.index+1)) listWin.txt1.Show() listWin.txt1.SetPosition(4,2) listWin.txt2 = ui.TextLine() listWin.txt2.SetParent(listWin) listWin.txt2.SetText("Status: %s" % itm.StatusText.GetText()) listWin.txt2.SetPosition(4,2+12) listWin.txt2.Show() listWin.listWin2 = ui.Bar() listWin.listWin2.AddFlag("not_pick") listWin.listWin2.SetColor(itm.StatusBar_rare.color) listWin.listWin2.SetParent(listWin) listWin.listWin2.SetPosition(0,4+12+12) listWin.listWin2.SetSize(w,12+2) listWin.listWin2.Hide() listWin.txt3 = ui.TextLine() listWin.txt3.SetParent(listWin.listWin2) listWin.txt3.SetText("Status: %s" % itm.StatusText_rare.GetText()) listWin.txt3.SetPosition(4,0) listWin.txt3.Hide() if dir >= 3: listWin.SetPosition(w,4) listWin.SetSize(90,h-8) w+=92 if itm.bonusSelector.EnableRareBoni.checked == 1: w+=15 listWin.SetSize(105,4+12+12) listWin.listWin2.SetSize(105,14) listWin.listWin2.Show() listWin.txt3.Show() else: listWin.SetPosition(0,h) listWin.SetSize(w,4+12+12+2) if itm.bonusSelector.EnableRareBoni.checked == 1: listWin.SetSize(w,4+12+12) listWin.listWin2.Show() listWin.txt3.Show() h+=12 pass h+=4+12+12+4 self.SetSize(w,h) (x,y) = self.parent.GetGlobalPosition() x = min(max(0,x),wndMgr.GetScreenWidth()-self.GetWidth()) y = min(max(0,y),wndMgr.GetScreenHeight()-self.GetHeight()-DISTANCE_BOTTOM) if dir == 1: self.SetPosition(0,y) elif dir == 2: self.SetPosition(wndMgr.GetScreenWidth()-self.GetWidth(),y) elif dir == 3: self.SetPosition(x,0) else: self.SetPosition(x,wndMgr.GetScreenHeight()-(DISTANCE_BOTTOM+h)) (self.pos_x,self.pos_y) = self.GetGlobalPosition() self.parse_dir(dir) pinhint = 0 def ShowPinHint(self,type): self.pinhint = type if type == 0: self.PinHint.Hide() return (x,y) = self.GetGlobalPosition() if type == 1: # Left self.PinHint.SetWindowHorizontalAlignLeft() self.PinHint.SetWindowVerticalAlignCenter() self.PinHint.SetSize(max(min(30,30-x),3),wndMgr.GetScreenHeight()) self.PinHint.SetPosition(0,0) elif type == 2: # Right self.PinHint.SetWindowHorizontalAlignRight() self.PinHint.SetWindowVerticalAlignCenter() self.PinHint.SetSize(30,wndMgr.GetScreenHeight()) self.PinHint.SetPosition(max(min(30,30-(wndMgr.GetScreenWidth()-(x+self.GetWidth()))),3),0) elif type == 3: # Top self.PinHint.SetWindowHorizontalAlignCenter() self.PinHint.SetWindowVerticalAlignTop() self.PinHint.SetSize(wndMgr.GetScreenWidth(),max(min(30,30-y),3)) self.PinHint.SetPosition(0,0) elif type == 4: # Top self.PinHint.SetWindowHorizontalAlignCenter() self.PinHint.SetWindowVerticalAlignBottom() self.PinHint.SetSize(wndMgr.GetScreenWidth(),30) self.PinHint.SetPosition(0,36+max(min(30,30-(wndMgr.GetScreenHeight()-36-(y+self.GetHeight()))),3)) self.PinHint.Show() # else: def __init__(self): ui.BoardWithTitleBar.__init__(self) self.gameWindow = None self.SetTitleName("Switchbot by xNukox") self.AddFlag("float") self.AddFlag("movable") self.SetPosition(30,30) self.SetSize(520,387-210) self.PinHint = ui.Bar() self.PinHint.SetColor(COLOR_PIN_HINT) self.PinHint.Show() self.OnMouseLeftButtonDown = self.drag_start self.OnMouseLeftButtonUp = self.drag_end self.titleBar.MinimizeBut = ui.Button() self.titleBar.MinimizeBut.SetParent(self.titleBar) self.titleBar.MinimizeBut.SetUpVisual("d:/ymir work/ui/public/minimize_button_01.sub") self.titleBar.MinimizeBut.SetOverVisual("d:/ymir work/ui/public/minimize_button_02.sub") self.titleBar.MinimizeBut.SetDownVisual("d:/ymir work/ui/public/minimize_button_03.sub") self.titleBar.MinimizeBut.SetToolTipText("Zminimalizuj", 0, -23) self.titleBar.MinimizeBut.SetPosition(520 - self.titleBar.btnClose.GetWidth()-3- 32 - 3, 3) self.titleBar.MinimizeBut.SetEvent(lambda: self.PinShow(1)) self.titleBar.MinimizeBut.Show() self.titleBar.HelpBut = ui.ToggleButton() self.titleBar.HelpBut.SetParent(self.titleBar) self.titleBar.HelpBut.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub") self.titleBar.HelpBut.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub") self.titleBar.HelpBut.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub") self.titleBar.HelpBut.SetToolTipText("Szczegółowa pomoc!", 0, -23) self.titleBar.HelpBut.SetText("Pomoc") self.titleBar.HelpBut.SetPosition(3, 0) self.titleBar.HelpBut.SetToggleDownEvent(lambda: self.ToggleHelp(1)) self.titleBar.HelpBut.SetToggleUpEvent(lambda: self.ToggleHelp(0)) self.titleBar.HelpBut.Show() self.but_deactivate_all = ui.Button() self.but_deactivate_all.SetParent(self.titleBar) self.but_deactivate_all.SetPosition(3+5+self.titleBar.HelpBut.GetWidth(), 0) self.but_deactivate_all.SetUpVisual("d:/ymir work/ui/public/large_button_01.sub") self.but_deactivate_all.SetOverVisual("d:/ymir work/ui/public/large_button_02.sub") self.but_deactivate_all.SetDownVisual("d:/ymir work/ui/public/large_button_03.sub") self.but_deactivate_all.SetText("Zatrzymaj wszystkie") self.but_deactivate_all.SetEvent(self.deactivate_all) self.but_deactivate_all.Show() self.titleBar.but_deactivate_all = ui.Button() self.titleBar.but_deactivate_all.SetParent(self.titleBar) self.titleBar.but_deactivate_all.SetPosition(3+5+self.titleBar.HelpBut.GetWidth()+5+self.but_deactivate_all.GetWidth(), 0) self.titleBar.but_deactivate_all.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub") self.titleBar.but_deactivate_all.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub") self.titleBar.but_deactivate_all.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub") self.titleBar.but_deactivate_all.SetText("Info") self.titleBar.but_deactivate_all.SetEvent(self.about) self.titleBar.but_deactivate_all.Show() self.titleName.SetPosition(60, 4) self.enable_rebuy = CheckBox("Aktywuj kupowanie zmianek") self.enable_rebuy.Toggle() self.enable_rebuy.Hide() self.but_speed = ui.SliderBar() self.but_speed.SetParent(self) self.but_speed.SetWindowHorizontalAlignCenter() self.but_speed.SetPosition(0,360) self.but_speed.SetSliderPos(0.0) self.but_speed.Hide() self.itemTabBar = ItemTabBar(self) self.itemTabBar.SetPosition(10,35) self.itemTabBar.Show() self.buyed = 0 self.buyed_rare = 0 self.SetCloseEvent(self._Hide) self.Hide = self._Hide self.help_add_item = HelpBar(0.8,'Upuśc tu item aby go dodać') self.help_add_item.SetParent(self) self.help_add_item.SetPosition(60,50) self.help_minimize = HelpBar(0.8,'Przeciągnij bota do krawędzi lub boku, aby go pomniejszyć!',1) self.help_minimize.SetParent(self.titleBar) self.help_minimize.SetWindowHorizontalAlignCenter() self.help_minimize.SetPosition(100,-30) self.help_show_rare = HelpBar(0.85,'Wyświetlanie 6/7 bon.') self.help_show_rare.SetParent(self) self.help_rebuy = HelpBar(0.5,'Jeśli bot kupi więcej?') self.help_rebuy.SetParent(self) self.help_stop_all = HelpBar(0.8,'Zatrzymaj wszystko!',1) self.help_stop_all.SetParent(self.titleBar) self.help_stop_all.SetPosition(3+5+self.titleBar.HelpBut.GetWidth()*1.2,-30) self.help_duration = HelpBar(0.8,'Spowolnienie bota.',1) self.help_duration.SetParent(self) def ToggleHelp(self,val): self.help_on = val def Show(self): ui.BoardWithTitleBar.Show(self) self.bot_shown = 1 def _Hide(self): ui.BoardWithTitleBar.Hide(self) self.bot_shown = 0 def deactivate_all(self): for a in self.itemTabBar.tabList: self.itemTabBar.tabList[a].bonusSelector.Starter.SetUp() self.itemTabBar.tabList[a].bonusSelector.Starter.OnToggleUp() self.itemTabBar.tabList[a].bonusSelector.Starter_rare_boni.SetUp() self.itemTabBar.tabList[a].bonusSelector.Starter_rare_boni.OnToggleUp() pass drag = 0 def drag_start(self): self.drag = 1 def drag_end(self): self.drag = 0 if self.pinhint > 0: self.PinShow(self.pinhint) # self.PinGroupBox = self.PinGroup() pass self.ShowPinHint(0) def PinShow(self,dir): self.PinGroupBox = self.PinGroup(self,dir) self.Hide() self.PinGroupBox.Show() def EnableInventoryTweak(self,gameWindow): self.gameWindow=gameWindow self.gameWindow.interface.wndInventory.inventoryTab[0].SetEvent(lambda arg=0: self.__SetInventoryPage(arg)) self.gameWindow.interface.wndInventory.inventoryTab[1].SetEvent(lambda arg=1: self.__SetInventoryPage(arg)) def __SetInventoryPage(self,arg): self.gameWindow.interface.wndInventory.SetInventoryPage(arg) for a in self.itemTabBar.tabList: itm = self.itemTabBar.tabList[a] if itm.index >= arg*45 and itm.index < (arg+1)*45: itm.blockBar.Show() else: itm.blockBar.Hide() help_on = 0 counter = 0 AboutWindow = None def OnUpdate(self): if self.AboutWindow: if self.AboutWindow.x_counter > 1: self.AboutWindow.x_counter -=1 self.AboutWindow.text6.SetText("Od: %0.1f" % (self.AboutWindow.x_counter/45.0)) elif self.AboutWindow.x_counter == 1: self.AboutWindow.Hide() # self.AboutWindow.Delete() if self.help_on == 1: (x,y) = self.itemTabBar.plusBar.GetLocalPosition() self.help_add_item.SetPosition(x+20,50) self.help_add_item.Show() self.help_stop_all.Show() self.help_minimize.Show() if self.itemTabBar.tabCount > 0: self.help_show_rare.SetPosition(25,164) self.help_show_rare.Show() self.help_rebuy.SetPosition(15,147) self.help_rebuy.Show() # self.help_duration.SetPosition(300,180) self.help_duration.SetPosition(190-5.5+self.but_speed.GetSliderPos()*int(35.5+self.but_speed.GetWidth()/2),180) self.help_duration.Show() else: self.help_show_rare.Hide() self.help_rebuy.Hide() self.help_duration.Hide() else: self.help_add_item.Hide() self.help_minimize.Hide() self.help_show_rare.Hide() self.help_rebuy.Hide() self.help_stop_all.Hide() self.help_duration.Hide() if self.drag == 1: (x1, y1) = self.GetGlobalPosition() # if x1 < 0: # x1 = 0 # elif x1 > wndMgr.GetScreenWidth()-520: # x1 = wndMgr.GetScreenWidth()-520 # if y1 < 0: # y1 = 0 # elif y1 > wndMgr.GetScreenHeight()-36-self.GetHeight(): # y1 = wndMgr.GetScreenHeight()-36-self.GetHeight() x1 = max(min(wndMgr.GetScreenWidth()-520,x1),0) y1 = max(min(wndMgr.GetScreenHeight()-36-self.GetHeight(),y1),0) self.SetPosition(x1,y1) if x1 < 30: self.ShowPinHint(1) elif wndMgr.GetScreenWidth()-x1-520 < 30: self.ShowPinHint(2) elif y1 < 30: self.ShowPinHint(3) elif wndMgr.GetScreenHeight()-y1-self.GetHeight() < 60: self.ShowPinHint(4) else: self.ShowPinHint(0) # self.SetPosition(x1+(x-self.drag_pos[0]),y1) pass if self.gameWindow != None: for a in self.itemTabBar.tabList: itm = self.itemTabBar.tabList[a] self.counter+=1 if self.counter >= int(self.but_speed.GetSliderPos()*MAX_SWITCH_DELAY_APPEND+MIN_SWITCH_DELAY): self.buyed = 0 self.buyed_rare = 0 self.counter = 0 for a in self.itemTabBar.tabList: itm = self.itemTabBar.tabList[a] itm.UpdateItem() # if itm. def about(self): self.AboutWindow = ui.ThinBoard() self.AboutWindow.SetParent(self) self.AboutWindow.SetSize(250,100) self.AboutWindow.SetWindowHorizontalAlignCenter() self.AboutWindow.SetWindowVerticalAlignCenter() self.AboutWindow.SetPosition(0,0) self.AboutWindow.Show() self.AboutWindow.x_counter = 550 self.AboutWindow.text1 = ui.TextLine() self.AboutWindow.text1.SetParent(self.AboutWindow) self.AboutWindow.text1.SetWindowHorizontalAlignCenter() self.AboutWindow.text1.SetHorizontalAlignCenter() self.AboutWindow.text1.SetPosition(0,5) self.AboutWindow.text1.SetText("Switchbot V2.2 by Mijago Kodowanie By xNukox.") self.AboutWindow.text1.SetPackedFontColor(ui.GenerateColor(58, 141, 221)) self.AboutWindow.text1.Show() self.AboutWindow.text2 = ui.TextLine() self.AboutWindow.text2.SetParent(self.AboutWindow) self.AboutWindow.text2.SetPosition(8,18) self.AboutWindow.text2.SetText("Ten switchbot został‚ opracowany prz Mijago, edytowany przez xNukox.") self.AboutWindow.text2.Show() self.AboutWindow.text3 = ui.TextLine() self.AboutWindow.text3.SetParent(self.AboutWindow) self.AboutWindow.text3.SetPosition(8,18+13) self.AboutWindow.text3.SetText("Nowe pomysły zawszę są mile widziane!") self.AboutWindow.text3.Show() self.AboutWindow.text4 = ui.TextLine() self.AboutWindow.text4.SetParent(self.AboutWindow) self.AboutWindow.text4.SetPosition(8,18+13*3) self.AboutWindow.text4.SetText("Nie rozprzestrzeniaj bota bez mojej wiedzy.") self.AboutWindow.text4.Show() self.AboutWindow.text5 = ui.TextLine() self.AboutWindow.text5.SetParent(self.AboutWindow) self.AboutWindow.text5.SetPosition(8,18+13*4) self.AboutWindow.text5.SetText("Zastosuj zatwierdzenie.") self.AboutWindow.text5.Show() self.AboutWindow.text6 = ui.TextLine() self.AboutWindow.text6.SetParent(self.AboutWindow) self.AboutWindow.text6.SetPosition(200,18+13*5) self.AboutWindow.text6.SetText("Od: %d" % self.AboutWindow.x_counter) self.AboutWindow.text6.Show() def Close(self): self.Hide() def Open(self): self.Show() class HelpBar(ui.Window): def __init__(self,width,text,centered = 0): ui.Window.__init__(self) self.AddFlag("not_pick") self.AddFlag("attach") img = ui.ExpandedImageBox() img.SetParent(self) img.LoadImage("d:/ymir work/ui/pattern/help_stick.tga") img.SetRenderingRect(0.0, -width, 0.0, 0.0) img.Show() self.img = img txt = ui.TextLine() txt=ui.TextLine() txt.SetParent(self) txt.SetText(text) txt.Show() img.SetPosition(0,18-width*img.GetHeight()) txt.SetPosition(0,0) txt.SetWindowHorizontalAlignCenter() if centered != 0: txt.SetHorizontalAlignCenter() # txt.SetPosition(0,0) self.txt = txt class DropDown(ui.Window): dropped = 0 dropstat = 0 last = 0 lastS = 0 maxh = 95 OnChange = None class Item(ui.ListBoxEx.Item): def __init__(self,parent, text,value=0): ui.ListBoxEx.Item.__init__(self) self.textBox=ui.TextLine() self.textBox.SetParent(self) self.textBox.SetText(text) # self.textBox.SetLimitWidth(parent.GetWidth()-132) self.textBox.Show() self.value = value def GetValue(self): return self.value def __del__(self): ui.ListBoxEx.Item.__del__(self) def __init__(self,parent,tt = "",down=1): ui.Window.__init__(self,"TOP_MOST") self.down = down self.SetParentProxy(parent) self.bg = ui.Bar("TOP_MOST") self.bg.SetParent(self) self.bg.SetPosition(0,0) self.bg.SetColor(0xc0000000) self.bg.OnMouseOverIn = self.bgMouseIn self.bg.OnMouseOverOut = self.bgMouseOut self.bg.OnMouseLeftButtonDown = self.ExpandMe self.bg.Show() self.act = ui.TextLine() self.act.SetParent(self.bg) self.act.SetPosition(4,2) self.act.SetText(tt) self.act.Show() self.GetText = self.act.GetText self.Drop = ui.Bar("TOP_MOST") self.Drop.SetParent(self.GetParentProxy()) self.Drop.SetPosition(0,21) # self.Drop.SetSize(150,95) self.Drop.SetSize(150,0) # self.Drop.SetColor(0xc00a0a0a) self.Drop.SetColor(0xff0a0a0a) self.ScrollBar = ui.ThinScrollBar() self.ScrollBar.SetParent(self.Drop) self.ScrollBar.SetPosition(132,0) # self.ScrollBar.SetScrollBarSize(95) self.ScrollBar.SetScrollBarSize(0) # self.ScrollBar.Show() self.DropList = ui.ListBoxEx() self.DropList.SetParent(self.Drop) self.DropList.itemHeight = 12 self.DropList.itemStep = 13 self.DropList.SetPosition(0,0) # self.DropList.SetSize(132,self.maxh) self.DropList.SetSize(132,13) self.DropList.SetScrollBar(self.ScrollBar) self.DropList.SetSelectEvent(self.SetTitle) self.DropList.SetViewItemCount(0) self.DropList.Show() if tt != "": self.AppendItemAndSelect(tt) self.selected = self.DropList.GetSelectedItem() self.SetSize(120,20) def __del__(self): ui.Window.__del__(self) c = 1 def AppendItem(self,text,value=0): self.c+=1 self.DropList.AppendItem(self.Item(self,text,value)) self.maxh = min(95,13*self.c) if self.c > 7: self.ScrollBar.Show() def AppendItemAndSelect(self,text,value=0): self.DropList.AppendItem(self.Item(self,text,value)) self.DropList.SelectIndex(len(self.DropList.itemList)-1) def SelectByAffectId(self,id): for x in self.DropList.itemList: if x.value == id: self.DropList.SelectItem(x) break def SetTitle(self,item): self.act.SetText(str(item.textBox.GetText())) self.last = self.DropList.basePos self.lastS = self.ScrollBar.GetPos() self.dropped = 0 self.selected = item if self.OnChange: self.OnChange() # self.Drop.Hide() def SetPosition(self,w,h): ui.Window.SetPosition(self,w,h) if self.down == 1: self.Drop.SetPosition(w,h+21) else: self.Drop.SetPosition(w,h-self.Drop.GetHeight()) def SetSize(self,w,h): ui.Window.SetSize(self,w,h) self.bg.SetSize(w,h) self.Drop.SetSize(w,0) self.DropList.SetSize(w-18,self.maxh) for x in self.DropList.itemList: x.SetSize(w-18,12) self.ScrollBar.SetPosition(w-18,0) def ExpandMe(self): if self.dropped == 1: # self.Drop.Hide() self.dropped = 0 else: # self.Drop.Show() self.dropped = 1 def OnUpdate(self): iter = 6 if self.Drop.GetHeight() < 50: self.ScrollBar.Hide() else: self.ScrollBar.Show() if self.dropped == 0 and self.dropstat == 1: if self.Drop.GetHeight() <=0: self.dropstat = 0 self.Drop.SetSize(self.Drop.GetWidth(),0) self.ScrollBar.SetScrollBarSize(self.Drop.GetHeight()) self.Drop.Hide() else: if self.Drop.GetHeight()-iter < 0: self.Drop.SetSize(self.Drop.GetWidth(),0) else: self.Drop.SetSize(self.Drop.GetWidth(),self.Drop.GetHeight()-iter) (w,h) = self.GetLocalPosition() self.SetPosition(w,h) self.ScrollBar.SetScrollBarSize(self.Drop.GetHeight()) self.DropList.SetViewItemCount(int(self.Drop.GetHeight()/13)) self.DropList.SetBasePos(self.last+1) self.DropList.SetBasePos(self.last) elif self.dropped == 1 and self.dropstat == 0: self.Drop.Show() self.SetTop() if self.Drop.GetHeight() >=self.maxh: self.Drop.SetSize(self.Drop.GetWidth(),self.maxh) self.ScrollBar.SetScrollBarSize(self.maxh) self.dropstat = 1 self.DropList.SetViewItemCount(7) self.ScrollBar.SetPos(self.lastS) else: self.ScrollBar.SetScrollBarSize(self.Drop.GetHeight()+iter) self.Drop.SetSize(self.Drop.GetWidth(),self.Drop.GetHeight()+iter) (w,h) = self.GetLocalPosition() self.SetPosition(w,h) self.DropList.SetViewItemCount(int(self.Drop.GetHeight()/13)) self.DropList.SetBasePos(self.last+1) self.DropList.SetBasePos(self.last) ## BG Hover def bgMouseIn(self): self.bg.SetColor(0xc00a0a0a) def bgMouseOut(self): self.bg.SetColor(0xc0000000) class Edit2(ui.EditLine): def __init__(self,main = "",ml = 99): ui.EditLine.__init__(self) self.SetText(main) self.main = main self.SetMax(ml) self.SetUserMax(ml) def GetText(self): res = ui.EditLine.GetText(self) if res == "": return "0" else: return res def __del__(self): ui.EditLine.__del__(self) def OnSetFocus(self): ui.EditLine.OnSetFocus(self) if ui.EditLine.GetText(self) == self.main: self.SetText("") def OnKillFocus(self): ui.EditLine.OnKillFocus(self) if ui.EditLine.GetText(self) == "": self.SetText(self.main) class CheckBox(ui.Window): checked = 0 eventUp =None eventDown=None def __init__(self,cont = ""): ui.Window.__init__(self) self.BG = ui.Bar("UI") self.BG.SetParent(self) self.BG.SetPosition(0,0) self.BG.SetSize(20,20) # self.BG.SetColor(0xc00b0b0b) self.BG.SetColor(COLOR_CHECKBOX_NOT_SELECTED) self.BG.OnMouseLeftButtonUp = self.Toggle self.OnMouseLeftButtonUp = self.Toggle self.BG.Show() self.Title = ui.TextLine() self.Title.SetParent(self) self.Title.SetPosition(25,2) self.Title.SetText(cont) self.Title.Show() self.stat = ui.TextLine() self.stat.SetParent(self.BG) self.stat.SetPosition(0,0) self.stat.SetWindowHorizontalAlignCenter() self.stat.SetWindowVerticalAlignCenter() self.stat.SetHorizontalAlignCenter() self.stat.SetVerticalAlignCenter() self.stat.SetSize(0,0) self.stat.SetText("") self.SetSize(25+self.Title.GetTextSize()[0]+5,20) self.stat.Show() def __del__(self): ui.ToggleButton.__del__(self) def Toggle(self): if self.checked == 1: self.OnToggleUp() else: self.OnToggleDown() def OnToggleUp(self): self.stat.SetText("") # self.BG.SetColor(0xc00b0b0b) self.BG.SetColor(COLOR_CHECKBOX_NOT_SELECTED) self.checked = 0 if self.eventUp: self.eventUp() def OnToggleDown(self): # self.BG.SetColor(0xf00b0b0b) self.BG.SetColor(COLOR_CHECKBOX_SELECTED) self.stat.SetText("X") self.checked = 1 if self.eventDown: self.eventDown()
  33. 16 points
    Witam Znalazłem ostatnio pliki Arianea nigdy ich nie używałem nie edytowałem nie odpalałem może komuś się przyda i se spróbuje je odpalić Pozdrawiam ! nowy link stary mi wygasł z mega ! [Hidden Content] skan plików [Hidden Content] zdj co znajduje się w środku [Hidden Content]
  34. 16 points
    Siemka znalazłem na metin2dev questy z globala paczka zawiera dwie wersje germany i ymir Koreańskie minus paczki nie tłumaczone questy ale to nie problem wystarczy przetłumaczyć jeden plik czyli translate.lua metin2_quest.7z
  35. 15 points
    Funkcja może powodować w losowych sytuacjach crash ch. 1. Otwórz questlua_npc.cpp i zamień zawartość funkcji npc_get_leader_vid na: { CQuestManager& q = CQuestManager::instance(); LPCHARACTER npc = q.GetCurrentNPCCharacterPtr(); LPPARTY party = npc->GetParty(); if (!party) { sys_err("npc_get_leader_vid: Function triggered without party"); return 1; } LPCHARACTER leader = party->GetLeader(); if (leader) lua_pushnumber(L, leader->GetVID()); else lua_pushnumber(L, 0); return 1; }
  36. 15 points
    [Hidden Content] [Hidden Content]
  37. 15 points
    Aura System [19.4] SS : [Hidden Content] [Hidden Content] Scan : [Hidden Content] Aura System v0.1.zip
  38. 15 points
    Pobieranie: Strona do rejestracji Konfiguracja: Instalujemy Apache2.4: pkg install apache24 Łączymy się z WinSCP, przechodzimy do /etc/ szukamy i edytujemy plik rc.conf, dopisując na końcu tego pliku: apache24_enable="YES" Uruchamiamy Apache: service apache24 start Instalujemy PHP i najpopularniejsze moduły do niego: pkg install mod_php56 php56-mysql php56-mysqli php56-session ➤ dla osób z nowszą wersją FreeBSD: pkg install php72 php72-mysqli mod_php72 php72-mbstring php72-zlib php72-curl php72-gd php72-json Ponownie łączymy się z WinSCP, przechodzimy do /usr/local/etc/apache24/ szukamy i edytujemy plik httpd.conf, szukając w nim: DirectoryIndex index.html Zamieniamy powyższą linijkę na: DirectoryIndex index.php index.html W tym samym plik httpd.conf na samym końcu dopisujemy: <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch> <FilesMatch "\.phps$"> SetHandler application/x-httpd-php-source </FilesMatch> Pobieramy stronę i wrzucamy do /usr/local/www/apache24/data/ Restartujemy Apache tak aby załapało wszystkie zmiany: service apache24 restart Może się tak zdarzyć że wyskoczy komunikat o istniejącym już koncie w bazie, wtedy wykonaj to jako zapytanie w Navicat: USE account; ALTER TABLE `account` MODIFY COLUMN `last_play` datetime NULL AFTER `money_drop_rate_expire`, MODIFY COLUMN `web_ip` varchar(15) CHARACTER SET ascii COLLATE ascii_general_ci NULL AFTER `web_admin`, MODIFY COLUMN `web_confirm` varchar(32) CHARACTER SET ascii COLLATE ascii_general_ci NULL AFTER `web_ip`;
  39. 15 points
    [Hidden Content] [Hidden Content]
  40. 14 points
    Heja wrzucam wam skille ridacka v1 pack tamte skile co wrzuciłem usunąłem link niechcący a paczke juz dawno usunąłem i nie chce mi sie ich znów wyjmować [Hidden Content] [Hidden Content]
  41. 14 points
    FreeBSD 9.3 przestało być wspierane i linki umierają, Wejdź do WinSCP do /etc/pkg i edytuj tam plik FreeBSD.conf Znajdź w nim:pkg.FreeBSD.or pkg.FreeBSD.org I zamień na: pkg0.nyi.freebsd.org Zapisz plik i ponów komendę.
  42. 14 points
    Usunięcie "wycieku" pamięci. 1. Otwórz db/ClientManager.cpp i znajdź (x2): pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0); 2. Dodaj pod (x2): delete pSafebox; 3. Otwórz game/safebox.cpp i znajdź: if (pkOldGrid) m_pkGrid = M2_NEW CGrid(pkOldGrid, 5, m_iSize); else m_pkGrid = M2_NEW CGrid(5, m_iSize); 4. Zamień na: if (pkOldGrid) { m_pkGrid = M2_NEW CGrid(pkOldGrid, 5, m_iSize); delete pkOldGrid; } else m_pkGrid = M2_NEW CGrid(5, m_iSize);
  43. 14 points
    Paczka (v0.2): [Hidden Content] Znane błędy: Aktualnie brak Aktualizacje: Spolszczenie - v0.2 Pierwsze Wydanie - v0.1 Co zostało zmienione i dodane v0.1 > v0.2:
  44. 13 points
    otwieramy -> uitarget.py szukamy: if app.ENABLE_SEND_TARGET_INFO: class InfoBoard(ui.Board): class ItemListBoxItem(ui.ListBoxExNew.Item): zmieniamy całość na: if app.ENABLE_SEND_TARGET_INFO: class InfoBoard(ui.Board): class ItemListBoxItem(ui.ListBoxExNew.Item): def __init__(self, width): ui.ListBoxExNew.Item.__init__(self) image = ui.ExpandedImageBox() image.SetParent(self) image.Show() self.image = image nameLine = ui.TextLine() nameLine.SetParent(self) nameLine.SetPosition(32 + 5, 0) nameLine.Show() self.nameLine = nameLine self.SetSize(width, 32 + 5) def LoadImage(self, image, name = None): self.image.LoadImage(image) self.SetSize(self.GetWidth(), self.image.GetHeight() + 5 * (self.image.GetHeight() / 32)) if name != None: self.SetText(name) def SetText(self, text): self.nameLine.SetText(text) def RefreshHeight(self): ui.ListBoxExNew.Item.RefreshHeight(self) self.image.SetRenderingRect(0.0, 0.0 - float(self.removeTop) / float(self.GetHeight()), 0.0, 0.0 - float(self.removeBottom) / float(self.GetHeight())) self.image.SetPosition(0, - self.removeTop) MAX_ITEM_COUNT = 16 EXP_BASE_LVDELTA = [ 1, # -15 0 5, # -14 1 10, # -13 2 20, # -12 3 30, # -11 4 50, # -10 5 70, # -9 6 80, # -8 7 85, # -7 8 90, # -6 9 92, # -5 10 94, # -4 11 96, # -3 12 98, # -2 13 100, # -1 14 100, # 0 15 105, # 1 16 110, # 2 17 115, # 3 18 120, # 4 19 125, # 5 20 130, # 6 21 135, # 7 22 140, # 8 23 145, # 9 24 150, # 10 25 155, # 11 26 160, # 12 27 165, # 13 28 170, # 14 29 180, # 15 30 ] RACE_FLAG_TO_NAME = { 1 << 0 : localeInfo.TARGET_INFO_RACE_ANIMAL, 1 << 1 : localeInfo.TARGET_INFO_RACE_UNDEAD, 1 << 2 : localeInfo.TARGET_INFO_RACE_DEVIL, 1 << 3 : localeInfo.TARGET_INFO_RACE_HUMAN, 1 << 4 : localeInfo.TARGET_INFO_RACE_ORC, 1 << 5 : localeInfo.TARGET_INFO_RACE_MILGYO, } SUB_RACE_FLAG_TO_NAME = { 1 << 11 : localeInfo.TARGET_INFO_RACE_ELEC, 1 << 12 : localeInfo.TARGET_INFO_RACE_FIRE, 1 << 13 : localeInfo.TARGET_INFO_RACE_ICE, 1 << 14 : localeInfo.TARGET_INFO_RACE_WIND, 1 << 15 : localeInfo.TARGET_INFO_RACE_EARTH, 1 << 16 : localeInfo.TARGET_INFO_RACE_DARK, } STONE_START_VNUM = 28030 STONE_LAST_VNUM = 28042 BOARD_WIDTH = 16*32+20 def __init__(self): ui.Board.__init__(self) #self.HideCorners(self.LT) #self.HideCorners(self.RT) #self.HideLine(self.T) self.race = 0 self.hasItems = False self.itemTooltip = uiToolTip.ItemToolTip() self.itemTooltip.HideToolTip() self.stoneImg = None self.stoneVnum = None self.lastStoneVnum = 0 self.nextStoneIconChange = 0 wndItem = ui.GridSlotWindow() wndItem.SetParent(self) #wndItem.SetPosition(8, 35) wndItem.ArrangeSlot(0, 16, 5, 32, 32, 0, 0) wndItem.RefreshSlot() wndItem.SetSlotBaseImage("d:/ymir work/ui/public/Slot_Base.sub", 1.0, 1.0, 1.0, 1.0) wndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem)) wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem)) wndItem.Hide() self.wndItem = wndItem self.itemArray = [0 for i in xrange(80)] self.itemVnums = [0 for i in xrange(80)] self.SetSize(self.BOARD_WIDTH, 0) def __del__(self): ui.Board.__del__(self) def __UpdatePosition(self, targetBoard): self.SetPosition(targetBoard.GetLeft() + (targetBoard.GetWidth() - self.GetWidth()) / 2, targetBoard.GetBottom() - 1) def Open(self, targetBoard, race): self.__LoadInformation(race) self.SetSize(self.BOARD_WIDTH, self.yPos + 10) self.__UpdatePosition(targetBoard) self.Show() def Refresh(self): self.__LoadInformation(self.race) self.SetSize(self.BOARD_WIDTH, self.yPos + 10) def Close(self): self.itemTooltip.HideToolTip() self.Hide() def __LoadInformation(self, race): self.yPos = 7 self.children = [] self.race = race self.stoneImg = None self.stoneVnum = None self.nextStoneIconChange = 0 #self.wndItem.ClearAllSlot() for i in xrange(80): self.wndItem.ClearSlot(i) self.itemArray = [0 for i in xrange(80)] self.itemVnums = [0 for i in xrange(80)] #self.AppendSeperator() self.AppendTextLine(localeInfo.TARGET_INFO_DROP_ITEMS) #self.__LoadInformation_Default(race) #self.__LoadInformation_Race(race) self.__LoadInformation_Drops(race) def __LoadInformation_Default_GetHitRate(self, race): attacker_dx = nonplayer.GetMonsterDX(race) attacker_level = nonplayer.GetMonsterLevel(race) self_dx = player.GetStatus(player.DX) self_level = player.GetStatus(player.LEVEL) iARSrc = min(90, (attacker_dx * 4 + attacker_level * 2) / 6) iERSrc = min(90, (self_dx * 4 + self_level * 2) / 6) fAR = (float(iARSrc) + 210.0) / 300.0 fER = (float(iERSrc) * 2 + 5) / (float(iERSrc) + 95) * 3.0 / 10.0 return fAR - fER def __LoadInformation_Default(self, race): self.AppendSeperator() self.AppendTextLine(localeInfo.TARGET_INFO_MAX_HP % str(nonplayer.GetMonsterMaxHP(race))) # calc att damage monsterLevel = nonplayer.GetMonsterLevel(race) fHitRate = self.__LoadInformation_Default_GetHitRate(race) iDamMin, iDamMax = nonplayer.GetMonsterDamage(race) iDamMin = int((iDamMin + nonplayer.GetMonsterST(race)) * 2 * fHitRate) + monsterLevel * 2 iDamMax = int((iDamMax + nonplayer.GetMonsterST(race)) * 2 * fHitRate) + monsterLevel * 2 iDef = player.GetStatus(player.DEF_GRADE) * (100 + player.GetStatus(player.DEF_BONUS)) / 100 fDamMulti = nonplayer.GetMonsterDamageMultiply(race) iDamMin = int(max(0, iDamMin - iDef) * fDamMulti) iDamMax = int(max(0, iDamMax - iDef) * fDamMulti) if iDamMin < 1: iDamMin = 1 if iDamMax < 5: iDamMax = 5 self.AppendTextLine(localeInfo.TARGET_INFO_DAMAGE % (str(iDamMin), str(iDamMax))) idx = min(len(self.EXP_BASE_LVDELTA) - 1, max(0, (monsterLevel + 15) - player.GetStatus(player.LEVEL))) iExp = nonplayer.GetMonsterExp(race) * self.EXP_BASE_LVDELTA[idx] / 100 self.AppendTextLine(localeInfo.TARGET_INFO_EXP % str(iExp)) def __LoadInformation_Race(self, race): dwRaceFlag = nonplayer.GetMonsterRaceFlag(race) self.AppendSeperator() mainrace = "" subrace = "" for i in xrange(17): curFlag = 1 << i if HAS_FLAG(dwRaceFlag, curFlag): if self.RACE_FLAG_TO_NAME.has_key(curFlag): mainrace += self.RACE_FLAG_TO_NAME[curFlag] + ", " elif self.SUB_RACE_FLAG_TO_NAME.has_key(curFlag): subrace += self.SUB_RACE_FLAG_TO_NAME[curFlag] + ", " if nonplayer.IsMonsterStone(race): mainrace += localeInfo.TARGET_INFO_RACE_METIN + ", " if mainrace == "": mainrace = localeInfo.TARGET_INFO_NO_RACE else: mainrace = mainrace[:-2] if subrace == "": subrace = localeInfo.TARGET_INFO_NO_RACE else: subrace = subrace[:-2] self.AppendTextLine(localeInfo.TARGET_INFO_MAINRACE % mainrace) self.AppendTextLine(localeInfo.TARGET_INFO_SUBRACE % subrace) def SerachEmptySlot(self, size): for value in xrange(80): if 0 == self.itemArray[value]: # 빈슬롯이다 if 1 == size: return value emptySlotIndex = value searchSucceed = True for i in range(size - 1): emptySlotIndex = emptySlotIndex + 16 if emptySlotIndex >= 80: searchSucceed = False continue if 1 == self.itemArray[emptySlotIndex]: searchSucceed = False if True == searchSucceed: return value return -1 def __LoadInformation_Drops(self, race): self.AppendSeperator() if race in constInfo.MONSTER_INFO_DATA: if len(constInfo.MONSTER_INFO_DATA[race]["items"]) == 0: self.wndItem.Hide() else: self.wndItem.SetPosition(10, self.yPos - 7) self.yPos += 32*5 self.SetSize(self.BOARD_WIDTH, self.yPos + 5) self.UpdateRect() self.wndItem.Show() for curItem in constInfo.MONSTER_INFO_DATA[race]["items"]: getItemID = 0 if curItem.has_key("vnum_list"): getItemID = curItem["vnum_list"][0] else: getItemID = curItem["vnum"] getItemCount=curItem["count"] item.SelectItem(getItemID) itemSize = item.GetItemSize() emptySlotPos = self.SerachEmptySlot(itemSize[1]) if -1 != emptySlotPos: self.itemArray[emptySlotPos] = 1 if itemSize[1] == 2: self.itemArray[emptySlotPos + 16] = 1 elif itemSize[1] == 3: self.itemArray[emptySlotPos + 16] = 1 self.itemArray[emptySlotPos + 32] = 1 self.wndItem.SetItemSlot(emptySlotPos, getItemID, getItemCount) self.itemVnums[emptySlotPos] = getItemID self.wndItem.RefreshSlot() else: self.wndItem.Hide() def OverInItem(self, slotIndex): vnum = self.itemVnums[slotIndex] if vnum != 0: self.OnShowItemTooltip(vnum) def OverOutItem(self): self.OnHideItemTooltip() def AppendTextLine(self, text): textLine = ui.TextLine() textLine.SetParent(self) textLine.SetWindowHorizontalAlignCenter() textLine.SetHorizontalAlignCenter() textLine.SetText(text) textLine.SetPosition(0, self.yPos) textLine.Show() self.children.append(textLine) self.yPos += 17 def AppendSeperator(self): img = ui.ImageBox() img.LoadImage("d:/ymir work/ui/seperator.tga") self.AppendWindow(img) img.SetPosition(img.GetLeft(), img.GetTop() - 15) self.yPos -= 15 def AppendItem(self, listBox, vnums, count): if type(vnums) == int: vnum = vnums else: vnum = vnums[0] item.SelectItem(vnum) itemName = item.GetItemName() if type(vnums) != int and len(vnums) > 1: vnums = sorted(vnums) realName = itemName[:itemName.find("+")] if item.GetItemType() == item.ITEM_TYPE_METIN: realName = localeInfo.TARGET_INFO_STONE_NAME itemName = realName + "+0 - +4" else: itemName = realName + "+" + str(vnums[0] % 10) + " - +" + str(vnums[len(vnums) - 1] % 10) vnum = vnums[len(vnums) - 1] myItem = self.ItemListBoxItem(listBox.GetWidth()) myItem.LoadImage(item.GetIconImageFileName()) if count <= 1: myItem.SetText(itemName) else: myItem.SetText("%dx %s" % (count, itemName)) myItem.SAFE_SetOverInEvent(self.OnShowItemTooltip, vnum) myItem.SAFE_SetOverOutEvent(self.OnHideItemTooltip) listBox.AppendItem(myItem) if item.GetItemType() == item.ITEM_TYPE_METIN: self.stoneImg = myItem self.stoneVnum = vnums self.lastStoneVnum = self.STONE_LAST_VNUM + vnums[len(vnums) - 1] % 1000 / 100 * 100 return myItem.GetHeight() def OnShowItemTooltip(self, vnum): item.SelectItem(vnum) if item.GetItemType() == item.ITEM_TYPE_METIN: self.itemTooltip.isStone = True self.itemTooltip.isBook = False self.itemTooltip.isBook2 = False self.itemTooltip.SetItemToolTip(self.lastStoneVnum) else: self.itemTooltip.isStone = False self.itemTooltip.isBook = True self.itemTooltip.isBook2 = True self.itemTooltip.SetItemToolTip(vnum) def OnHideItemTooltip(self): self.itemTooltip.HideToolTip() def AppendWindow(self, wnd, x = 0, width = 0, height = 0): if width == 0: width = wnd.GetWidth() if height == 0: height = wnd.GetHeight() wnd.SetParent(self) if x == 0: wnd.SetPosition((self.GetWidth() - width) / 2, self.yPos) else: wnd.SetPosition(x, self.yPos) wnd.Show() self.children.append(wnd) self.yPos += height + 5 def OnUpdate(self): if self.stoneImg != None and self.stoneVnum != None and app.GetTime() >= self.nextStoneIconChange: nextImg = self.lastStoneVnum + 1 if nextImg % 100 > self.STONE_LAST_VNUM % 100: nextImg -= (self.STONE_LAST_VNUM - self.STONE_START_VNUM) + 1 self.lastStoneVnum = nextImg self.nextStoneIconChange = app.GetTime() + 2.5 item.SelectItem(nextImg) itemName = item.GetItemName() realName = itemName[:itemName.find("+")] realName = realName + "+0 - +4" self.stoneImg.LoadImage(item.GetIconImageFileName(), realName) if self.itemTooltip.IsShow() and self.itemTooltip.isStone: self.itemTooltip.SetItemToolTip(nextImg) otwietamy -> locale_game.txt dopisujemy: TARGET_INFO_DROP_ITEMS Informacje o dropie Efekt:
  45. 13 points
    [video=youtube] Wchodzimy do: binka/UserInterface Edytujemy plik: Locale_inc.h Dopisujemy: #define ENABLE_DRAGON_SOUL_SYSTEM #define ENABLE_NEW_EQUIPMENT_SYSTEM Polecenie do Navicata: UPDATE item_proto SET type = 34 where vnum BETWEEN 18000 AND 18089; UPDATE item_proto SET type = 3, subtype = 29, locale_name = 'Kamien Czerw. Plomienia' where vnum = 18900;
  46. 12 points
    Informacje o aktualizacjach: [Hidden Content] Wersja 17.0.12: [Hidden Content] Wersja 17.1.7: [Hidden Content] Wersja 17.2 + 17.3: [Hidden Content] Wersja 17.4: [Hidden Content] Wersja 17.5: [Hidden Content] Wersja 18.1 (Zawierać może skrawki wersji 18.0 i 17.6): [Hidden Content] Wersja nieznana ~18.1+: [Hidden Content] Client DE z dnia 07/04/2018: [Hidden Content] Wersja 18.2: [Hidden Content] Wersja 18.2.6 (brak plików tj.:root, outdoor, outdoorempirebattle1): [Hidden Content] Wersja nieznana 18.2+ (Informacje o aktualizacji) [Hidden Content] Client Beta z dnia 26.09.2018: [Hidden Content] Wersja 18.4.12: [Hidden Content] Wersja 18.5.6: Aktualizacja: [Hidden Content] Client: [Hidden Content] Wersja 19: [Hidden Content] [Hidden Content] Wersja 19.1: [Hidden Content] [Hidden Content] Wersja 19.2: [Hidden Content] Wersja 19.3.9: [Hidden Content] Locale ae & tr [Hidden Content] [Hidden Content] Wersja 19.?: Pet + mount [Hidden Content] Część systemu Aury [Hidden Content] Wersja 19.4.5: pliki mpack [Hidden Content] reszta clienta [Hidden Content] locale [Hidden Content] root [Hidden Content] Wersja 19.5.7 (locale i root): [Hidden Content] Wersja 19.5.7.1: [Hidden Content] Wersja 19.5.9: [Hidden Content] Wersja 19.6.7: [Hidden Content] 19.6.7 Proto: [Hidden Content] 19.6.8 locale & proto: [Hidden Content] Wersja 19.6.12: [Hidden Content] 19.6.12 msm: [Hidden Content] 19.6.15: [Hidden Content] 20.0.6: [Hidden Content] 20.1.3: [Hidden Content] Pełny client [Hidden Content] Legenda: Aktualizacje + Rozpakowany client Same aktualizacje
  47. 12 points
    Cześć, Udostępniam Wam paczkę starych globalnych umiejętności, którą znalazłem u siebie na dysku. Old Skills.rar
  48. 12 points
    Witam Diamonds of Ice pass m2dlzerial.rar
  49. 12 points
    Druga opcja: class TargetBoard(ui.ThinBoard): if app.ENABLE_SEND_TARGET_INFO: class InfoBoard(ui.ThinBoard): class ItemListBoxItem(ui.ListBoxExNew.Item): def __init__(self, width): ui.ListBoxExNew.Item.__init__(self) image = ui.ExpandedImageBox() image.SetParent(self) image.Show() self.image = image nameLine = ui.TextLine() nameLine.SetParent(self) nameLine.SetPosition(32 + 5, 0) nameLine.Show() self.nameLine = nameLine self.SetSize(width, 32 + 5) def LoadImage(self, image, name = None): self.image.LoadImage(image) self.SetSize(self.GetWidth(), self.image.GetHeight() + 5 * (self.image.GetHeight() / 32)) if name != None: self.SetText(name) def SetText(self, text): self.nameLine.SetText(text) def RefreshHeight(self): ui.ListBoxExNew.Item.RefreshHeight(self) self.image.SetRenderingRect(0.0, 0.0 - float(self.removeTop) / float(self.GetHeight()), 0.0, 0.0 - float(self.removeBottom) / float(self.GetHeight())) self.image.SetPosition(0, - self.removeTop) EXP_BASE_LVDELTA = [ 1, # -15 0 5, # -14 1 10, # -13 2 20, # -12 3 30, # -11 4 50, # -10 5 70, # -9 6 80, # -8 7 85, # -7 8 90, # -6 9 92, # -5 10 94, # -4 11 96, # -3 12 98, # -2 13 100, # -1 14 100, # 0 15 105, # 1 16 110, # 2 17 115, # 3 18 120, # 4 19 125, # 5 20 130, # 6 21 135, # 7 22 140, # 8 23 145, # 9 24 150, # 10 25 155, # 11 26 160, # 12 27 165, # 13 28 170, # 14 29 180, # 15 30 ] RACE_FLAG_TO_NAME = { 1 << 0 : localeInfo.TARGET_INFO_RACE_ANIMAL, 1 << 1 : localeInfo.TARGET_INFO_RACE_UNDEAD, 1 << 2 : localeInfo.TARGET_INFO_RACE_DEVIL, 1 << 3 : localeInfo.TARGET_INFO_RACE_HUMAN, 1 << 4 : localeInfo.TARGET_INFO_RACE_ORC, 1 << 5 : localeInfo.TARGET_INFO_RACE_MILGYO, } SUB_RACE_FLAG_TO_NAME = { 1 << 11 : localeInfo.TARGET_INFO_RACE_ELEC, 1 << 12 : localeInfo.TARGET_INFO_RACE_FIRE, 1 << 13 : localeInfo.TARGET_INFO_RACE_ICE, 1 << 14 : localeInfo.TARGET_INFO_RACE_WIND, 1 << 15 : localeInfo.TARGET_INFO_RACE_EARTH, 1 << 16 : localeInfo.TARGET_INFO_RACE_DARK, } STONE_START_VNUM = 28030 STONE_LAST_VNUM = 28043 BOARD_WIDTH = 245 def __init__(self): ui.ThinBoard.__init__(self) self.HideCorners(self.LT) self.HideCorners(self.RT) self.HideLine(self.T) self.race = 0 self.hasItems = False self.itemTooltip = uiToolTip.ItemToolTip() self.itemTooltip.HideToolTip() self.stoneImg = None self.stoneVnum = None self.lastStoneVnum = 0 self.nextStoneIconChange = 0 self.slotSize = 35 wndItem = ui.GridSlotWindow() wndItem.SetParent(self) wndItem.ArrangeSlot(0, 7, self.slotSize/7, 32, 32, 0, 0) wndItem.RefreshSlot() wndItem.SetSlotBaseImage("d:/ymir work/ui/public/Slot_Base.sub", 1.0, 1.0, 1.0, 1.0) wndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem)) wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem)) wndItem.Hide() self.wndItem = wndItem self.itemArray = [0 for i in xrange(self.slotSize)] self.itemVnums = [0 for i in xrange(self.slotSize)] self.SetSize(self.BOARD_WIDTH, 0) def __del__(self): ui.ThinBoard.__del__(self) def __UpdatePosition(self, targetBoard): self.SetPosition(targetBoard.GetLeft() + (targetBoard.GetWidth() - self.GetWidth()) / 2, targetBoard.GetBottom() - 17) def Open(self, targetBoard, race): self.__LoadInformation(race) self.SetSize(self.BOARD_WIDTH, self.yPos + 10) self.__UpdatePosition(targetBoard) self.Show() def Refresh(self): if self.slotSize > 70: self.slotSize = 70 self.__LoadInformation(self.race) tempHeight = ((self.slotSize / 7)-5)*32 self.SetSize(self.BOARD_WIDTH, self.yPos + 10 + tempHeight) def Close(self): self.itemTooltip.HideToolTip() self.slotSize = 35 self.Hide() def __LoadInformation(self, race): self.yPos = 7 self.children = [] self.race = race self.stoneImg = None self.stoneVnum = None self.nextStoneIconChange = 0 for i in xrange(self.slotSize): self.wndItem.ClearSlot(i) self.wndItem.ArrangeSlot(0, 7, self.slotSize/7, 32, 32, 0, 0) self.wndItem.RefreshSlot() self.wndItem.SetSlotBaseImage("d:/ymir work/ui/public/Slot_Base.sub", 1.0, 1.0, 1.0, 1.0) self.itemArray = [0 for i in xrange(self.slotSize)] self.itemVnums = [0 for i in xrange(self.slotSize)] self.__LoadInformation_Default(race) self.__LoadInformation_Resists(race) self.__LoadInformation_Drops(race) def __LoadInformation_Default_GetHitRate(self, race): attacker_dx = nonplayer.GetMonsterDX(race) attacker_level = nonplayer.GetMonsterLevel(race) self_dx = player.GetStatus(player.DX) self_level = player.GetStatus(player.LEVEL) iARSrc = min(90, (attacker_dx * 4 + attacker_level * 2) / 6) iERSrc = min(90, (self_dx * 4 + self_level * 2) / 6) fAR = (float(iARSrc) + 210.0) / 300.0 fER = (float(iERSrc) * 2 + 5) / (float(iERSrc) + 95) * 3.0 / 10.0 return fAR - fER def __LoadInformation_Default(self, race): self.AppendSeperator() self.AppendTextLine(localeInfo.TARGET_INFO_MAX_HP % localeInfo.PrettyNumber(nonplayer.GetMonsterMaxHP(race))) # calc att damage monsterLevel = nonplayer.GetMonsterLevel(race) fHitRate = self.__LoadInformation_Default_GetHitRate(race) iDamMin, iDamMax = nonplayer.GetMonsterDamage(race) iDamMin = int((iDamMin + nonplayer.GetMonsterST(race)) * 2 * fHitRate) + monsterLevel * 2 iDamMax = int((iDamMax + nonplayer.GetMonsterST(race)) * 2 * fHitRate) + monsterLevel * 2 iDef = player.GetStatus(player.DEF_GRADE) * (100 + player.GetStatus(player.DEF_BONUS)) / 100 fDamMulti = nonplayer.GetMonsterDamageMultiply(race) iDamMin = int(max(0, iDamMin - iDef) * fDamMulti) iDamMax = int(max(0, iDamMax - iDef) * fDamMulti) if iDamMax != 0: self.AppendTextLine(localeInfo.TARGET_INFO_DAMAGE % (str(iDamMin), str(iDamMax))) idx = min(len(self.EXP_BASE_LVDELTA) - 1, max(0, (monsterLevel + 15) - player.GetStatus(player.LEVEL))) iExp = nonplayer.GetMonsterExp(race) * self.EXP_BASE_LVDELTA[idx] / 100 self.AppendTextLine(localeInfo.TARGET_INFO_EXP % localeInfo.PrettyNumber(iExp)) # self.AppendTextLine(localeInfo.TARGET_INFO_REGEN_INFO % (nonplayer.GetMobRegenPercent(race), nonplayer.GetMobRegenCycle(race))) def __LoadInformation_Resists(self, race): self.AppendSeperator() self.AppendTextLine(localeInfo.TARGET_INFO_RESISTS) # self.AppendTextLine(localeInfo.TARGET_INFO_RESISTS_LINE0 % (nonplayer.GetResist(race, nonplayer.MOB_RESIST_SWORD), nonplayer.GetResist(race, nonplayer.MOB_RESIST_TWOHAND), nonplayer.GetResist(race, nonplayer.MOB_RESIST_BELL))) # self.AppendTextLine(localeInfo.TARGET_INFO_RESISTS_LINE1 % (nonplayer.GetResist(race, nonplayer.MOB_RESIST_DAGGER), nonplayer.GetResist(race, nonplayer.MOB_RESIST_FAN), nonplayer.GetResist(race, nonplayer.MOB_RESIST_BOW))) def __LoadInformation_Race(self, race): dwRaceFlag = nonplayer.GetMonsterRaceFlag(race) self.AppendSeperator() mainrace = "" subrace = "" for i in xrange(17): curFlag = 1 << i if HAS_FLAG(dwRaceFlag, curFlag): if self.RACE_FLAG_TO_NAME.has_key(curFlag): mainrace += self.RACE_FLAG_TO_NAME[curFlag] + ", " elif self.SUB_RACE_FLAG_TO_NAME.has_key(curFlag): subrace += self.SUB_RACE_FLAG_TO_NAME[curFlag] + ", " if nonplayer.IsMonsterStone(race): mainrace += localeInfo.TARGET_INFO_RACE_METIN + ", " if mainrace == "": mainrace = localeInfo.TARGET_INFO_NO_RACE else: mainrace = mainrace[:-2] if subrace == "": subrace = localeInfo.TARGET_INFO_NO_RACE else: subrace = subrace[:-2] self.AppendTextLine(localeInfo.TARGET_INFO_MAINRACE % mainrace) self.AppendTextLine(localeInfo.TARGET_INFO_SUBRACE % subrace) def SerachEmptySlot(self, size): for value in xrange(self.slotSize): if 0 == self.itemArray[value]: # ????? if 1 == size: return value emptySlotIndex = value searchSucceed = True for i in range(size - 1): emptySlotIndex = emptySlotIndex + 7 if emptySlotIndex >= self.slotSize: searchSucceed = False continue if 1 == self.itemArray[emptySlotIndex]: searchSucceed = False if True == searchSucceed: return value return -1 def __LoadInformation_Drops(self, race): self.AppendSeperator() if race in constInfo.MONSTER_INFO_DATA: if len(constInfo.MONSTER_INFO_DATA[race]["items"]) == 0: self.wndItem.Hide() else: self.wndItem.SetPosition(10, self.yPos - 7) self.yPos += 32*5 self.SetSize(self.BOARD_WIDTH, self.yPos + 5) self.UpdateRect() self.wndItem.Show() for curItem in constInfo.MONSTER_INFO_DATA[race]["items"]: getItemID = 0 if curItem.has_key("vnum_list"): getItemID = curItem["vnum_list"][0] vnum = curItem["vnum_list"][0] else: getItemID = curItem["vnum"] vnum=curItem["vnum"] getItemCount=curItem["count"] item.SelectItem(getItemID) itemSize = item.GetItemSize() if item.GetItemType() == item.ITEM_TYPE_METIN: self.stoneVnum = getItemID self.lastStoneVnum = 28043 #self.wndItem.SAFE_SetOverInEvent(self.OnShowItemTooltip, vnum) #self.wndItem.SAFE_SetOverOutEvent(self.OnHideItemTooltip) emptySlotPos = self.SerachEmptySlot(itemSize[1]) if -1 != emptySlotPos: self.itemArray[emptySlotPos] = 1 if itemSize[1] == 2: self.itemArray[emptySlotPos + 7] = 1 elif itemSize[1] == 3: self.itemArray[emptySlotPos + 7] = 1 self.itemArray[emptySlotPos + 14] = 1 if item.GetItemType() == item.ITEM_TYPE_METIN: self.stoneImg = emptySlotPos self.wndItem.SetItemSlot(emptySlotPos, getItemID, getItemCount) self.itemVnums[emptySlotPos] = getItemID else: if self.slotSize > 70: return self.slotSize += 7 self.Refresh() return self.wndItem.RefreshSlot() else: self.wndItem.Hide() def OverInItem(self, slotIndex): vnum = self.itemVnums[slotIndex] if vnum != 0: self.OnShowItemTooltip(vnum) def OverOutItem(self): self.OnHideItemTooltip() def AppendTextLine(self, text): textLine = ui.TextLine() textLine.SetParent(self) textLine.SetWindowHorizontalAlignCenter() textLine.SetHorizontalAlignCenter() textLine.SetText(text) textLine.SetPosition(0, self.yPos) textLine.Show() self.children.append(textLine) self.yPos += 17 def AppendSeperator(self): img = ui.ImageBox() img.LoadImage("d:/ymir work/ui/seperator.tga") self.AppendWindow(img) img.SetPosition(img.GetLeft(), img.GetTop() - 15) self.yPos -= 15 def AppendItem(self, listBox, vnums, count): if type(vnums) == int: vnum = vnums else: vnum = vnums[0] item.SelectItem(vnum) itemName = item.GetItemName() if type(vnums) != int and len(vnums) > 1: vnums = sorted(vnums) realName = itemName[:itemName.find("+")] if item.GetItemType() == item.ITEM_TYPE_METIN: realName = localeInfo.TARGET_INFO_STONE_NAME itemName = realName + "+0 - +4" else: itemName = realName + "+" + str(vnums[0] % 10) + " - +" + str(vnums[len(vnums) - 1] % 10) vnum = vnums[len(vnums) - 1] myItem = self.ItemListBoxItem(listBox.GetWidth()) myItem.LoadImage(item.GetIconImageFileName()) if count <= 1: myItem.SetText(itemName) else: myItem.SetText("%dx %s" % (count, itemName)) myItem.SAFE_SetOverInEvent(self.OnShowItemTooltip, vnum) myItem.SAFE_SetOverOutEvent(self.OnHideItemTooltip) listBox.AppendItem(myItem) if item.GetItemType() == item.ITEM_TYPE_METIN: self.stoneImg = myItem self.stoneVnum = vnums self.lastStoneVnum = self.STONE_LAST_VNUM + vnums[len(vnums) - 1] % 1000 / 100 * 100 return myItem.GetHeight() def OnShowItemTooltip(self, vnum): item.SelectItem(vnum) if item.GetItemType() == item.ITEM_TYPE_METIN: self.itemTooltip.isStone = True self.itemTooltip.isBook = False self.itemTooltip.isBook2 = False self.itemTooltip.SetItemToolTip(self.lastStoneVnum) else: self.itemTooltip.isStone = False self.itemTooltip.isBook = True self.itemTooltip.isBook2 = True self.itemTooltip.SetItemToolTip(vnum) def OnHideItemTooltip(self): self.itemTooltip.HideToolTip() def AppendWindow(self, wnd, x = 0, width = 0, height = 0): if width == 0: width = wnd.GetWidth() if height == 0: height = wnd.GetHeight() wnd.SetParent(self) if x == 0: wnd.SetPosition((self.GetWidth() - width) / 2, self.yPos) else: wnd.SetPosition(x, self.yPos) wnd.Show() self.children.append(wnd) self.yPos += height + 5 def OnUpdate(self): if self.stoneImg != None and self.stoneVnum != None and app.GetTime() >= self.nextStoneIconChange: nextImg = self.lastStoneVnum + 1 if nextImg % 100 > self.STONE_LAST_VNUM % 100: nextImg -= (self.STONE_LAST_VNUM - self.STONE_START_VNUM) + 1 self.lastStoneVnum = nextImg self.nextStoneIconChange = app.GetTime() + 2.5 item.SelectItem(nextImg) itemName = item.GetItemName() realName = itemName[:itemName.find("+")] realName = realName + "+0 - +4" self.wndItem.SetItemSlot(self.stoneImg, nextImg, 1) if self.itemTooltip.IsShow() and self.itemTooltip.isStone: self.itemTooltip.SetItemToolTip(nextImg) BUTTON_NAME_LIST = ( localeInfo.TARGET_BUTTON_WHISPER, localeInfo.TARGET_BUTTON_EXCHANGE, localeInfo.TARGET_BUTTON_FIGHT, localeInfo.TARGET_BUTTON_ACCEPT_FIGHT, localeInfo.TARGET_BUTTON_AVENGE, localeInfo.TARGET_BUTTON_FRIEND, localeInfo.TARGET_BUTTON_INVITE_PARTY, localeInfo.TARGET_BUTTON_LEAVE_PARTY, localeInfo.TARGET_BUTTON_EXCLUDE, localeInfo.TARGET_BUTTON_INVITE_GUILD, localeInfo.TARGET_BUTTON_DISMOUNT, localeInfo.TARGET_BUTTON_EXIT_OBSERVER, localeInfo.TARGET_BUTTON_VIEW_EQUIPMENT, localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY, localeInfo.TARGET_BUTTON_BUILDING_DESTROY, localeInfo.TARGET_BUTTON_EMOTION_ALLOW, "VOTE_BLOCK_CHAT", ) GRADE_NAME = { nonplayer.PAWN : localeInfo.TARGET_LEVEL_PAWN, nonplayer.S_PAWN : localeInfo.TARGET_LEVEL_S_PAWN, nonplayer.KNIGHT : localeInfo.TARGET_LEVEL_KNIGHT, nonplayer.S_KNIGHT : localeInfo.TARGET_LEVEL_S_KNIGHT, nonplayer.BOSS : localeInfo.TARGET_LEVEL_BOSS, nonplayer.KING : localeInfo.TARGET_LEVEL_KING, } EXCHANGE_LIMIT_RANGE = 3000
  50. 12 points
    Nie pełna paczka clienta someya2 w paczce dużo nowych modeli pewiego wykorzystane na nowej Somejce Drzewa , obiekty , mobki bossy etc [Hidden Content]
This leaderboard is set to Warsaw/GMT+02:00
×
×
  • Create New...