• Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти
CELua[RU]
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти

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

Запланировано Прикреплена Закрыта Перенесена Не решенные Приёмы
ce luaтелепортозвучкашаблоныtodo
8 Сообщения 2 Posters 149 Просмотры 2 Watching
Загружаем больше сообщений
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • M Не в сети
    MasterGH Администраторы
    отредактировано MasterGH 4 окт. 2023 г., 18:13 1 апр. 2023 г., 22:20

    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
    • P Не в сети
      Pitronic Супер модераторы
      отредактировано Pitronic 4 сент. 2023 г., 09:51 9 апр. 2023 г., 09:50

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

      1 ответ Последний ответ Ответить Цитировать 0
      • M Не в сети
        MasterGH Администраторы
        отредактировано MasterGH 4 сент. 2023 г., 18:58 9 апр. 2023 г., 18:58

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

        P 1 ответ Последний ответ 10 апр. 2023 г., 06:54 Ответить Цитировать 0
        • P Не в сети
          Pitronic Супер модераторы
          отредактировано 9 апр. 2023 г., 19:07

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

          1 ответ Последний ответ Ответить Цитировать 0
          • PitronicP Не в сети
            Pitronic Супер модераторы @MasterGH
            отредактировано 10 апр. 2023 г., 06:54

            Пользователь @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 Не в сети
              Pitronic Супер модераторы
              отредактировано 10 апр. 2023 г., 06:56

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

              1 ответ Последний ответ Ответить Цитировать 0
              • MasterGHM Не в сети
                MasterGH Администраторы
                отредактировано 10 апр. 2023 г., 18:12

                Сначала надо найти адрес через скан сигнатуры. Потом подставить адрес в
                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 10 апр. 2023 г., 18:13
                • PitronicP Не в сети
                  Pitronic Супер модераторы
                  отредактировано Pitronic 4 окт. 2023 г., 18:20 10 апр. 2023 г., 18:19

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

                  1 ответ Последний ответ Ответить Цитировать 0

                  • 1 / 1
                  • Первое сообщение
                    Последнее сообщение
                  Powered by NodeBB | Contributors
                  СeLua[RU] 2025©