Skocz do zawartości

Snake

Użytkownicy
  • Postów

    1 445
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Snake

  1. Sam sobie przekonwertuj... http://www.ismavatar.com/lgm
  2. Oby wprowadzili ;D Tylko że na pewno te wbudowane wątki działały by szybciej niż z GMThreads ;p Tzn, wątek tworzony przez GMThreads jest nieco opóźniony przy starcie, bo musi kompilować podany kod (kompilacja też odbywa się w wątku, więc to nie przerywa głównego wątku gry). Ale interpretacja odbywa się z taką samą szybkością, co w GM.
  3. No i jest nowa wersja ;) Teraz jest wsparcie dla procesorów wielordzeniowych :D Dodałem 3 nowe funkcje: thread_affinity_mask( UchwytWatku, Maska ) - ustawia maskę affinity (typ wektora bitowego) podanego wątku. Jak to działa ? Każdy bit podanej wartości (maski) rozprezentuje procesor (rdzeń) czyli np. 3 w postaci binarnej to 0000 0011, więc wątek z taką maską będzie korzystał z pierwszego i drugiego rdzenia 10 w postaci binarnej to 0000 1010, więc wątek będzie korzystał z 2 i 4 rdzenia. Żeby sobie dopasować taką wartość możecie użyć kalkulatora windowsowego w trybie naukowym. Jeśli funkcja zawiedzie - zwraca 0, w innym wypadku zwraca poprzednia maskę. more info: <a href="http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx</a> thread_ideal_processor( UchwytWatku, NumerProcesora ) - ustawia preferowany procesor (rdzeń) dla wątku. Numer procesora ustawiany jest od 0, czyli 0 = pierwszy rdzeń, 1 = drugi itd. Zwraca -1 gdy wystąpi błąd, inaczej zwróci poprzedni ustawiony numer procesora. more info: <a href="http://msdn.microsoft.com/en-us/library/ms686253(VS.85).aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms686253(VS.85).aspx</a> thread_num_of_processors() - Zwraca ilość rdzeni/procesorów. Download: http://www.gmclan.org/up541_4_GMThreads14.html Podziękowania dla Maxpayna, za testowanie nowej wersji na swoim procku (Quad) :D
  4. Snake

    AO: peal.no-ip.org

    @Markuz: Po pierwsze: takie sprawy to na PW. Po drugie: Ten co ja zrobiłem nam pasuje. A i tak wkrótce zmieniamy CMS-a i będę robił thema od nowa. No chyba, że jakieś naprawdę dobre skórki rysujesz to zobaczymy (tylko pokaż mi na PW jakieś swoje "prace") ;D
  5. Snake

    AO: peal.no-ip.org

    Lolek / Pasterz. Ale teraz go nie ma. Ja jestem "współwłaścicielem" :D
  6. http://www.youtube.com/watch?v=iMU2rd1Fx8o !
  7. I masz tu przykład ominięcia DMA :D Ten skrypt wyświetla wartości wszystkich zmiennych globalnych typu real (czy tam double) i ich adresy z wybranej gry GM7 (procesu) ;p GlobalVarStructPtr to adres wskaźnika na strukturę listy zmiennych, w której można znaleźć adres do ilości zmiennych globalnych (offset: 0x08h) i wskaźnik do adresu tablicy zmiennych globalnych (offset: 0x04h), w której pierwszy element przesunięty jest o +0x10h ;p GML // Inicjacja init_xtend(); process = process_id_from_name( get_string( "Nazwa procesu ? (gra GM7)", filename_name( parameter_string( 0 ) ) ) ); if ( process == 0 ) { show_message( 'Nie znaleziono procesu' ); game_end(); } // Adres (stały!) struktury obiektu listy zmiennych globalnych (?) GlobalVarStructPtr = $589720; // ** liczba zmiennych globalnych ** // // Odczytaj adres w ktorym znajduje sie ilosc zmiennych globalnych: GlobalVarNumAddr = process_read_long( process, GlobalVarStructPtr ) + $8; // + offset 0x08h // Odczytaj ilosc zmiennych: GlobalVarNum = process_read_long( process, GlobalVarNumAddr ); // ** Adres tablicy zmiennych globalnych ** // // Odczytaj wskaznik do adresu tablicy zmiennych globalnych: GlobalVarPtr = process_read_long( process, GlobalVarStructPtr ) + $4; // + offset 0x04h // Odczytaj adres tablicy zmiennych globalnych: GlobalVarTableAddr = process_read_long( process, GlobalVarPtr ) + $10; // + offset 0x10h // odczytywanie i wyswietlanie zmiennych globalnych (tylko real) var CurrentGlobalVal; for (i = 0; i < GlobalVarNum; i += 1) { // Pobieranie wartosci z tablicy obiektow (?) zmiennych globalnych (rozmiar elementu: 0x28h) CurrentGlobalVal = process_read_double( process, GlobalVarTableAddr + i * $28 ); // wyswietlanie listy zmiennych i ich wartosci draw_text( 10, 10 + i * 15, 'Globalna ' + string( i ) + ': ' + string( CurrentGlobalVal ) + ' (' + real_to_hex( GlobalVarTableAddr + i * $28, 8 ) + ')' ); }
  8. Jak pozbyć się problemów z DMA ? Hmm... czasami wystarczy, że znajdziesz tylko adres wskaźnika do wartości w pamięci i odczytasz wartość, mniej więcej tak: GML // wskaznik na adres w ktorym znajduje sie adres wartosci (np. attack speed) AttackSpeedPointer = $1234ABCD; // odczyta adres wartosci (np. attack speed) AttackSpeedAddress = process_read_long( process, AttackSpeedPointer ); // odczyta wartosc AttackSpeed = process_read_long( process, AttackSpeedAddress ); czasami musisz dowiedzieć się, jaki jest wskaźnik by go znaleźć, bo adres wartości jest odczytywany z dodanym offsetem do wskaźnika tzn. przykładowo: Adres jakiejś wartości to 0x00100050, ale wskaźnika nie możesz znaleźć w pamięci, bo adres jest obliczany z offsetem, więc prawidłowym wskaźnikiem może być 0x00100000 i trzeba wtedy do niego dodawać 0x50 by dostać się do wartości. Tylko jak to znaleźć ? Niektóre edytory pamięci mają jakieś opcje dzięki którym można znaleźć ten prawidłowy wskaźnik (oczywiście najczęściej nie wyskoczy Ci jeden adres tylko ok. >= 1000 ), ale o wiele lepszym sposobem jest podejrzenie tego w debugerze (podstawy asemblera wymagane). W najgorszym wypadku będzie trzeba szukać całych łańcuchów wskaźników czyli wskaźniki na wskaźniki które wskazują kolejne wskaźniki (czasami trzeba dodać offsety), aż w końcu dojdziesz do adresu struktury/wartości ;D (czasami potrzeba większej znajomości asemblera). Ogólnie róźnie z tym bywa... A dynamiczna alokacja pamięci to dynamiczna alokacja pamięci. (pamięć jest alokowana w trakcie działania gry/programu, dlatego przydzielane są różne regiony pamięci...) BTW: Apostrof != cudzysłów. więc ciężko będzie z gamehackingiem...
  9. U mnie wyświetliło szybkość ataku i nazwę gracza. (oczywiście po restarcie gry adresy się pozmieniały przez dynamiczną alokację pamięci). Albo podajesz złe adresy albo nie można przechwycić PID po nazwie procesu. Sprawdź czy pobrano ID procesu GML if ( PROCES == 0 ) show_message( 'Metin 2 nie jest uruchomiony.' ); Jeśli będzie ok, to nie wiem co robisz źle, bo u mnie działa. A mam tak: GML init_xtend(); attack_speed_pointer = $4A64C614; // tymczasowy adres zmiennej przechowującej szybkość ataku process = process_id_from_name( 'metin2.bin' ); if ( process == 0 ) show_message( 'Nie znaleziono procesu' ); attack_speed = process_read_long( process, attack_speed_pointer ); PS: Nie, nie gram w Metina - mój brat sprawdzał co to jest i zostało na dysku.
  10. A dane z jakiegokolwiek adresu może odczytać ? Znajdź może jakiś string typu nazwa serwera, etykieta przycisku czy nazwa postaci i sprawdź czy Ci odczytuje.
  11. Update: Dodałem jedną funkcję - xtend_set_debug_privilege. Po wywołaniu jej Xtend ma prawo dostępu do każdego procesu. Download (v1.5): http://www.gmclan.org/up541_4_Xtend15.html
  12. Wiem na czym to polega. Czyli w edytorze pamięci miałeś prawidłową wartość tego speeda... pewnie Xtend nie może otworzyć procesu Metina, bo nie ma dostępu. Zaraz zrobię update dll-a i zobaczymy czy uda Ci się to odczytać. EDIT: Już zrobiłem: https://forum.gmclan.org/index.php?showtopic=11240 Dodaj linijkę: GML xtend_set_debug_privilege(); po init_xtend();
  13. "Sprawdzałem hexa"... sprawdzałeś adres i w edytorze pamięci miałeś prawidłową wartość ? Może Xtend nie ma dostępu do tego regionu pamięci / do procesu bo process_read_* zwraca 0 gdy nie udaje się odczytać wartości z pamięci...
  14. Nie zdefiniowałeś zmiennej "metin2" / nie zapisałeś w niej uchwytu okna z tej gry ? GML // wyszukaj okno gry po nazwie ( nie wiem czy nazwane jest "Metin 2" ) metin2 = window_find( '', 'Metin 2' ); // pobierz identyfikator procesu z uchwytu okna PROCES = process_id_from_window_handle( metin2 ); albo możesz tak znaleźć PID: GML // odszukaj PID po nazwie procesu ( nie wiem czy nazywa się "metin2.exe" ) PROCES = process_id_from_name( 'metin2.exe' );
  15. Snake

    Zdanie.

    Dziurawy DżON, który kupił zielsko, wrócił do domu i zwalił konia, którego czubek bardzo napalony i zrogowaciały wymknął mu się i się okazało że jest pedałem oraz zabawnym klałnem oraz niezabawnym dziadkiem który bardzo lubi spaghetti i przedszkolaki, które często odwiedzał w łóżku ponieważ lubił je miziać na bosaka z kupą w buzi swojego kretoszczura, gdy nagle wielki, spocony grubas złapał Tuxmana za krzywą nogę i strzelił kupą w głowę wykonując potrójne salto w bok po czym strzelił sobie litr wódki i zasnął. Przynajmniej Tuxman zrozumiał, że nie jest lubiany ale coś w nim podpowiadało mu żeby zrobić kupę... Więc nienamyślając się długo zrobił kupę... Nie zaczynając myśleć stawił kloca na dywanie babuni, która jarała dywan przez słomkę szatana - Ave! Jednak - krzyknęła "Agghr!" i uciekła z dupy misia strony pedobear kochającego stare babcie. Lubie pierogi. Nagle spuścił talerz na twoją starą i twój zasmarkany interes
  16. Snake

    Zdanie.

    Dziurawy DżON, który kupił zielsko, wrócił do domu i zwalił konia, którego czubek bardzo napalony i zrogowaciały wymknął mu się i się okazało że jest pedałem oraz zabawnym klałnem oraz niezabawnym dziadkiem który bardzo lubi spaghetti i przedszkolaki, które często odwiedzał w łóżku ponieważ lubił je miziać na bosaka z kupą w buzi swojego kretoszczura, gdy nagle wielki, spocony grubas złapał Tuxmana za krzywą nogę i strzelił kupą w głowę wykonując potrójne salto w bok po czym strzelił sobie litr wódki i zasnął. Przynajmniej Tuxman zrozumiał, że nie jest lubiany ale coś w nim podpowiadało mu żeby zrobić kupę... Więc nienamyślając się długo zrobił kupę... Nie zaczynając myśleć stawił kloca na dywanie babuni, która jarała dywan przez słomkę szatana - Ave! Jednak - krzyknęła "Agghr!" i uciekła z dupy misia strony pedobear kochającego stare babcie. Lubie pierogi. Nagle
  17. Poczytaj o rysowaniu za pomocą primitives. Tu masz tutoriala napisanego przez RaistlinBlackRobe: https://forum.gmclan.org/index.php?showtopic=10579
  18. Nie podoba mi się wygląd tego. min( 100, $ilosc );
  19. Źle. GML if ( distance_to_object( obiekt1 ) < 500 ) { sound_volume( sound1, 1 - distance_to_object( obiekt1 ) / 500 ); sound_play( sound1 ); } // lub dla dzwieku 3d: if ( distance_to_object( obiekt1 ) < 500 ) { sound_3d_set_sound_distance( sound1, 5, 500 ); sound_3d_set_sound_position( sound1, x - obiekt1.x, y - obiekt1.y, 0 ); /* albo sound_3d_set_sound_position( sound1, x - (instance_nearest( x, y, obiekt1 )).x, y - (instance_nearest( x, y, obiekt1 )).y, 0 ); gdy instancji jest wiecej niz 1 */ sound_play( sound1 ); } Albo sound_loop na początku i tylko zmieniać głośność / pozycje i dystans 3D.
  20. Snake

    Wirusy a Microsoft

    :D Najlepiej spybotem przeskanować kompa B)
  21. Snake

    GameMaker C++

    Musieli by wprowadzić wielowątkowość do GM, żeby można było dobrze skorzystać z dodatkowych rdzeni ;d Jeśli tylko przepiszą ten silnik runnera na C++, to nie spodziewałbym się wzrostu wydajności powyżej 10%. Mam nadzieję, że zajmą się również optymalizacją parsera i interpretera... ;D
  22. Pomnóż przez 10, ceil(), podziel przez 10.
  23. Wątki na pewno są zwalniane... hmm, zapodaj może jakiś przykład czy cuś gdy to występuje, bo ja nie zauważyłem niczego takiego. ;p Aha, chyba nie próbujesz się dostawać z kilku wątków do jednej zmiennej jednocześnie ?
×
×
  • Dodaj nową pozycję...