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

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

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

      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 Не в сети
        Pitronic Супер модераторы
        отредактировано Pitronic

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

        1 ответ Последний ответ Ответить Цитировать 0
        • MasterGHM Не в сети
          MasterGH Администраторы
          отредактировано MasterGH

          Конечно, возможно. Если заглянуть в документацию, то через чтение массива по адресу 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 Не в сети
            Pitronic Супер модераторы
            отредактировано

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

            1 ответ Последний ответ Ответить Цитировать 0
            • PitronicP Не в сети
              Pitronic Супер модераторы @MasterGH
              отредактировано

              Пользователь @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 Супер модераторы
                отредактировано

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

                1 ответ Последний ответ Ответить Цитировать 0
                • MasterGHM Не в сети
                  MasterGH Администраторы
                  отредактировано

                  Сначала надо найти адрес через скан сигнатуры. Потом подставить адрес в
                  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 Не в сети
                    Pitronic Супер модераторы
                    отредактировано Pitronic

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

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

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