Телепорт на 10 слотов и на 3 типа данных (float, double, integer)
-
- Функции:
- Три типа данных: float, double, integer
- 10 слотов сохранение
- Управление горячими клавишами. ctrl+X - где X от 0 до 9 сохраняет позицию, shift + X загружает ранее сохраненную позицию
- Озвучивание загрузки или сохранения (смотри функцию speakEnglish ниже)
teleport_address = "03D2C6DC" -- "[[address+XX]+XX]" или через registersymbol() type_data = 'INTEGER' -- FLOAT, DOUBLE, INTEGER \-- ctrl + R - сбросить позицию \-- ctrl + X - сохранить в слот X, где X от 0 до 9 \-- shift + X - сохранить в слот X, где X от 0 до 9 \--класс Vector3 = {} function Vector3:new(address, type_data) local object = {} object.address = address object.x = 0 object.y = 0 object.z = 0 object.type_data = type_data function object:getAddress() return self.address end function object:read() if object.type_data == 'FLOAT' then object.x = readFloat(object.address) object.y = readFloat(getAddress(object.address) + 4) object.z = readFloat(getAddress(object.address) + 8) elseif object.type_data == 'DOUBLE' then object.x = readDouble(object.address) object.y = readDouble(getAddress(object.address) + 8) object.z = readDouble(getAddress(object.address) + 16) elseif object.type_data == 'INTEGER' then object.x = readInteger(object.address) object.y = readInteger(getAddress(object.address) + 4) object.z = readInteger(getAddress(object.address) + 8) end return object end function object:write() if object.type_data == 'FLOAT' then writeFloat(object.address, object.x) writeFloat(getAddress(object.address) + 4, object.y) writeFloat(getAddress(object.address) + 8, object.z) elseif object.type_data == 'DOUBLE' then writeDouble(object.address, object.x) writeDouble(getAddress(object.address) + 8, object.y) writeDouble(getAddress(object.address) + 16, object.z) elseif object.type_data == 'INTEGER' then writeInteger(object.address, object.x) writeInteger(getAddress(object.address) + 4, object.y) writeInteger(getAddress(object.address) + 8, object.z) end end function object:print_vector() print(string.format("%s, %s, %s", object.x, object.y, object.z)) end setmetatable(object, self) self.__index = self; return object end \--класс Teleport = {} \--тело класса Teleport function Teleport:new(address, type_data) local object = {} -- Тип данных object.type_data = type_data -- Адрес object.vector3_position = Vector3:new(address, type_data) -- Адреса для слотов object.vector3_positions = {} function object:getAddress() return self.address end function object:make_hotkey_reset_position() local genericHotkey = createHotkey( function() object.vector3_position:write() end, {VK_CONTROL, VK_R} ) genericHotkey.DelayBetweenActivate = 2000 end function object:make_hotkey_save_position(numberKey) local genericHotkey = createHotkey( function() speakEnglish("Save position "..numberKey) object.vector3_positions[numberKey]:read() end, {VK_CONTROL, VK_0 + numberKey} ) genericHotkey.DelayBetweenActivate = 2000 end function object:make_hotkey_load_position(numberKey) local genericHotkey = createHotkey( function() speakEnglish("Load position "..numberKey) object.vector3_position:read() object.vector3_positions[numberKey]:write() end, {VK_SHIFT, VK_0 + numberKey} ) genericHotkey.DelayBetweenActivate = 2000 end function object:registry_hot_keys() object:make_hotkey_reset_position() for numberKey = 0, 9 do local addressPosition = Vector3:new(address, type_data) addressPosition:read() table.insert(object.vector3_positions, addressPosition) object:make_hotkey_save_position(numberKey) object:make_hotkey_load_position(numberKey) end end object:registry_hot_keys() setmetatable(object, self) self.__index = self; return object end local teleport = Teleport:new(teleport_address, type_data)
- Меняем адрес teleport_address = "03D2C6DC" на тот который нужно.
Здесь может быть указатель например -"[[address+XX]+XX]" или через registersymbol() в АА скриптах.
Не тестировалось если адрес еще невалидный, т.е. не существует в памяти. По идее слоты проинициализируются с нулевыми координатами по умолчанию. Поэтому лучше Lua скрипт запускать в момент существования адреса. Проверка на существование адреса - getAddressSafe(string, local OPTIONAL, shallow OPTIONAL): returns the address of a symbol, or nil if not found. Similar to getAddress when errorOnLookup is false, but returns nil instead. Проверку можно делать по таймеру. Запуск скрипта это последняя строка
- Меняем тип данных type_data = 'INTEGER' -- FLOAT, DOUBLE, INTEGER
Справочник по Lua функциям в файле "celua.txt"
-
у меня возникла мысль, если адреса лежать рядом, один под другим, возможно ли просто сохранить двенадцать байт-загрузить двенадцать байт вместо x y z?
-
Конечно, возможно. Если заглянуть в документацию, то через чтение массива по адресу address, bytecount - количеству байт, и ReturnAsTable возвращаемая таблица.
readBytes(address,bytecount, ReturnAsTable ) : returns the bytes at the given address. If ReturnAsTable is true it will return a table instead of multiple bytes Reads the bytes at the given address and returns a table containing the read out bytes writeBytes(address, table) : Write the given bytes to the given address from a table
Я думаю, пример можно найти в Интернете. Только у double байт побольше будет чем у других типов в этом скрипте
-
Ну понятно что с дюбле больше, это же восемь байт а не четыре, тоесть вариант будет сохранить двадцать четыре байта, загрузить двадцать четыре байта, сложнее только в гта, если на улице то всё просто как в любом асм, но если задействованы здания, там ещё доп адрес нужен, кроме координат, еще директория. И самое смешное, эти адреса в разных структурах.
-
Пользователь @MasterGH написал в Телепорт на 10 слотов и на 3 типа данных (float, double, integer):
Конечно, возможно
Тогда как это будет в lua, на примере этого кода?
[ENABLE] aobscan(_teleport_,8BxxxxxxxxxxF3xxxxxxxxF3xxxxxxxxF3xxxxxxxxF3xxxxxxxxF3xxxxxxxx0F5A) alloc(newmem_teleport_,$1000) label(code_teleport_) label(return_teleport_) label(_flag_teleport_) label(_coordinat_X_) label(_coordinat_y_) label(_coordinat_z_) registersymbol(_teleport_) registersymbol(_flag_teleport_) registersymbol(_coordinat_X_) registersymbol(_coordinat_y_) registersymbol(_coordinat_z_) newmem_teleport_: pushad mov eax,[esi+00000CC0] mov eax,[eax+0C] mov eax,[eax+60] mov eax,[eax+18] cmp [_flag_teleport_],1 jne @f mov ebx,[eax+30] mov [_coordinat_X_],ebx mov ebx,[eax+34] mov [_coordinat_y_],ebx mov ebx,[eax+38] mov [_coordinat_z_],ebx mov [_flag_teleport_],0 jmp code_teleport_ @@: cmp [_flag_teleport_],2 jne code_teleport_ mov ebx,[_coordinat_X_] mov [eax+30],ebx mov ebx,[_coordinat_y_] mov [eax+34],ebx mov ebx,[_coordinat_z_] mov [eax+38],ebx mov [_flag_teleport_],0 jmp code_teleport_ code_teleport_: mov edx,[esi+00000CC0] popad jmp return_teleport_ _coordinat_X_: dd 0 _coordinat_y_: dd 0 _coordinat_z_: dd 0 [DISABLE] code_teleport_: mov edx,[esi+00000CC0] unregistersymbol(_teleport_) unregistersymbol(_flag_teleport_) unregistersymbol(_coordinat_X_) unregistersymbol(_coordinat_y_) unregistersymbol(_coordinat_z_) dealloc(newmem_teleport_)
без x y z
-
здесь вариант от указателя, чтоб не искать фильтр я делал.
-
Сначала надо найти адрес через скан сигнатуры. Потом подставить адрес в
teleport_address и поставитт тип type_datateleport = Teleport:new(teleport_address, type_data)
Потом использовать горячие клавиши для сохранения и загрузки
Управление горячими клавишами. ctrl+X - где X от 0 до 9 сохраняет позицию, shift + X загружает ранее сохраненную позицию
Просто это все писать надо и разбираться. Это жк не все так просто.
А мы сегодня с коллегами много работали на Unity и моя голова сегодня требует отдыха. Сейчас открывать CE и писать скрипты не получится. Наверно, только на выходных, либо на неделе. Но вопрос хороший. Код, который не понятно как применить это не очень хоршо. Поставил в todo.
-
-
У меня не горит, более того пока не делаю телепорт, просто чтоб знать как, спросил. Будет время расскажешь. Только бы не забыл.