Skip to content
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Collapse
Brand Logo

CELua[RU]

  1. Главная
  2. Статьи
  3. Приёмы
  4. Телепорт на 10 слотов и на 3 типа данных (float, double, integer)

Телепорт на 10 слотов и на 3 типа данных (float, double, integer)

Запланировано Прикреплена Закрыта Перенесена Не решенные Приёмы
ce luaтелепортозвучкашаблоныtodo
8 Сообщения 2 Posters 135 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • MasterGHM Не в сети
    MasterGHM Не в сети
    MasterGH Администраторы
    написал в отредактировано MasterGH
    #1
    1. Функции:
    • Три типа данных: 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)
    
    1. Меняем адрес 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. Проверку можно делать по таймеру. Запуск скрипта это последняя строка

    1. Меняем тип данных type_data = 'INTEGER' -- FLOAT, DOUBLE, INTEGER

    Справочник по Lua функциям в файле "celua.txt"

    1 ответ Последний ответ
    0
  • PitronicP Не в сети
    PitronicP Не в сети
    Pitronic Супер модераторы
    написал в отредактировано Pitronic
    #2

    у меня возникла мысль, если адреса лежать рядом, один под другим, возможно ли просто сохранить двенадцать байт-загрузить двенадцать байт вместо x y z?

    1 ответ Последний ответ
    0
  • MasterGHM Не в сети
    MasterGHM Не в сети
    MasterGH Администраторы
    написал в отредактировано MasterGH
    #3

    Конечно, возможно. Если заглянуть в документацию, то через чтение массива по адресу 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 байт побольше будет чем у других типов в этом скрипте

    PitronicP 1 ответ Последний ответ
    0
  • PitronicP Не в сети
    PitronicP Не в сети
    Pitronic Супер модераторы
    написал в отредактировано
    #4

    Ну понятно что с дюбле больше, это же восемь байт а не четыре, тоесть вариант будет сохранить двадцать четыре байта, загрузить двадцать четыре байта, сложнее только в гта, если на улице то всё просто как в любом асм, но если задействованы здания, там ещё доп адрес нужен, кроме координат, еще директория. И самое смешное, эти адреса в разных структурах.

    1 ответ Последний ответ
    0
  • PitronicP Не в сети
    PitronicP Не в сети
    Pitronic Супер модераторы
    replied to MasterGH on отредактировано
    #5

    Пользователь @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

    1 ответ Последний ответ
    0
  • PitronicP Не в сети
    PitronicP Не в сети
    Pitronic Супер модераторы
    написал в отредактировано
    #6

    здесь вариант от указателя, чтоб не искать фильтр я делал.

    1 ответ Последний ответ
    0
  • MasterGHM Не в сети
    MasterGHM Не в сети
    MasterGH Администраторы
    написал в отредактировано
    #7

    Сначала надо найти адрес через скан сигнатуры. Потом подставить адрес в
    teleport_address и поставитт тип type_data

    teleport = Teleport:new(teleport_address, type_data)
    

    Потом использовать горячие клавиши для сохранения и загрузки

    Управление горячими клавишами. ctrl+X - где X от 0 до 9 сохраняет позицию, shift + X загружает ранее сохраненную позицию

    Просто это все писать надо и разбираться. Это жк не все так просто.

    А мы сегодня с коллегами много работали на Unity и моя голова сегодня требует отдыха. Сейчас открывать CE и писать скрипты не получится. Наверно, только на выходных, либо на неделе. Но вопрос хороший. Код, который не понятно как применить это не очень хоршо. Поставил в todo.

    1 ответ Последний ответ
    0
  • MasterGHM MasterGH marked this topic as a question on
  • PitronicP Не в сети
    PitronicP Не в сети
    Pitronic Супер модераторы
    написал в отредактировано Pitronic
    #8

    У меня не горит, более того пока не делаю телепорт, просто чтоб знать как, спросил. Будет время расскажешь. Только бы не забыл.

    1 ответ Последний ответ
    0

Powered by NodeBB | Contributors
СeLua[RU] 2024©
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.
  • Первое сообщение
    Последнее сообщение
0
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы