Zmienna określająca instance zaznaczonego przedmiotu w ekwipunku 1646 4

O temacie

Autor RandomRadioactiveMonster

Zaczęty 16.05.2020 roku

Wyświetleń 1646

Odpowiedzi 4

RandomRadioactiveMonster

RandomRadioactiveMonster

Użytkownicy
posty16
Propsy7
ProfesjaSkrypter
  • Użytkownicy
Dzień dobry
Mam jedno pytanie dot. ikarusa i lego, a mianowicie czy istnieje zmienna określająca instance zaznaczonego w ekwipunku itemu oraz jej nazwę. Szukałem jej dziś wieczorem ale niestety czas nie pozwala na dokładniejsze poszukiwania
Za pomoc z góry dziękuję
 

Khantor

Khantor

Użytkownicy
posty59
Propsy12
Profesjabrak
  • Użytkownicy
Oczywiście, że istnieje. Zmienne znajdują się w klasie "oCItem". Co do instancji to zależy, czy chcesz ją jako string (np. żeby ci się wyświetlała i żebyś wiedział co wpisać w konsoli), czy jako int (żeby jej użyć np. do spawnowania tego itemu w ekwipunku czy cokolwiek innego).

Instancja jako string - "_zCObject_objectName"
Instancja jako int - "instanz"
Nazwa przedmiotu - "description"

Instancję i nazwę możesz wydobyć z ekwipunku np. taką prostą funkcją.

func void _InstancjaINazwa()
{
                var int selectedItemPtr;

var int container; container = ECX;

const int call = 0;

if (CALL_Begin(call))
{
CALL_PutRetValTo(_@(selectedItemPtr));
CALL__thiscall(_@(container), 7377600);
call = CALL_End();
};

var oCItem itm; itm = _^(selectedItemPtr);

                var string InstancjaJakoString; InstancjaJakoString = itm._zCObject_objectName;
                var int InstancjaJakoInt; InstancjaJakoInt = itm.instanz;
                var string Nazwa; Nazwa = itm.description;
};

Możesz potem te stringi i inta wywołać jako print czy cokolwiek innego chcesz. Tą funkcję hookujesz oczywiście do funkcji otwierania ekwipunku.

HookEngineF(7370416, 6, _InstancjaINazwa);

Rzecz jasna będzie to działało za każdym razem jak ekwipunek jest otworzony (nie tylko ręcznie). Jak sobie z tym poradzić pisałem już w innym twoim temacie więc innych zainteresowanych odsyłam.

https://themodders.org/index.php?topic=30411.0
 

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
Ja bym to zhookował tak: HookEngineF(7369071,6,_InstancjaINazwa);i wtedy item to:
var int ptr; ptr = MEM_ReadInt (ESP+324+4);
var c_item itm; itm = _^(ptr);
Jest to wydajniejsze, bo nie wywołujemy dodatkowych metod z silnika.

Trzeba też zaznaczyć, że jeżeli chce tylko instance np. do printu, to nie ma co przypisywać pointera do obiektu, bo zjada to niepotrzebnie tylko wydajność.
Nazwa instance to np. MEM_ReadString(ptr+16);
Resztę można sobie policzyć z offsetów klasy oCItem.
Int to 4 bajty, a string to 20 i po prostu dodajemy kolejne rozmiary zmiennych, aż dotrzemy do tej, która nas interesuje.
 
while(false) Do();

RandomRadioactiveMonster

RandomRadioactiveMonster

Użytkownicy
posty16
Propsy7
ProfesjaSkrypter
  • Użytkownicy
Mógłby ktoś jeszcze wyjaśnić gdzie w tym hooku (https://themodders.org/index.php?topic=30411.0) wpisać własne skrypty aktywowane po otwarciu ekwipunku?
 

RandomRadioactiveMonster

RandomRadioactiveMonster

Użytkownicy
posty16
Propsy7
ProfesjaSkrypter
  • Użytkownicy
Ok dzięki wszystkim za pomoc. Już jakoś ogarniam ten Hook Engine, a przynajmniej jestem na dobrej drodze.
Dziękuje jeszcze raz
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry