parent
							
								
									029d69a36b
								
							
						
					
					
						commit
						af0948bfa0
					
				@ -0,0 +1,31 @@ | 
				
			||||
local RakLuaDll = require "RakLuaDll" | 
				
			||||
 | 
				
			||||
addEventHandler("onScriptTerminate", function(scr) if scr == script.this then RakLuaDll.destroyHandlers() end end) | 
				
			||||
 | 
				
			||||
local events = { | 
				
			||||
    ["onSendRpc"]       = RakLuaEvents.OUTGOING_RPC, | 
				
			||||
    ["onSendPacket"]    = RakLuaEvents.OUTGOING_PACKET, | 
				
			||||
    ["onReceiveRpc"]    = RakLuaEvents.INCOMING_RPC, | 
				
			||||
    ["onReceivePacket"] = RakLuaEvents.INCOMING_PACKET | 
				
			||||
} | 
				
			||||
 | 
				
			||||
local addEventHandler_orig = addEventHandler | 
				
			||||
 | 
				
			||||
function hookAddEventHandler(event, func) | 
				
			||||
    if events[event] then | 
				
			||||
        RakLuaDll.registerHandler(events[event], func) | 
				
			||||
    else | 
				
			||||
        addEventHandler_orig(event, func) | 
				
			||||
    end | 
				
			||||
end | 
				
			||||
 | 
				
			||||
function defineSampLuaCompatibility() | 
				
			||||
    RakLuaDll.defineGlobals() | 
				
			||||
     | 
				
			||||
    addEventHandler = hookAddEventHandler | 
				
			||||
    isSampfuncsLoaded = function() return true end | 
				
			||||
end | 
				
			||||
 | 
				
			||||
RakLuaDll.defineSampLuaCompatibility = defineSampLuaCompatibility | 
				
			||||
 | 
				
			||||
return RakLuaDll | 
				
			||||
									
										Binary file not shown.
									
								
							
						@ -0,0 +1,238 @@ | 
				
			||||
--[[ | 
				
			||||
	    | 
				
			||||
	Author: СоМиК | 
				
			||||
	Links: | 
				
			||||
		- https://www.blast.hk/members/406277/ | 
				
			||||
		- https://t.me/klamet_one | 
				
			||||
		- https://vk.com/klamet1 | 
				
			||||
 | 
				
			||||
]] | 
				
			||||
 | 
				
			||||
local imgui = require 'mimgui' | 
				
			||||
local vk = require 'vkeys' | 
				
			||||
 | 
				
			||||
HOTKEY = { | 
				
			||||
	MODULEINFO = { | 
				
			||||
		version = 1, | 
				
			||||
		author = 'СоМиК' | 
				
			||||
	}, | 
				
			||||
	Text = { | 
				
			||||
		WaitForKey = 'Нажмите любую клавишу...', | 
				
			||||
		NoKey = '< Свободно >' | 
				
			||||
	}, | 
				
			||||
	List = {}, | 
				
			||||
	ActiveKeys = {}, | 
				
			||||
	ReturnHotKeys = nil, | 
				
			||||
	HotKeyIsEdit = nil, | 
				
			||||
	CancelKey = 0x1B, | 
				
			||||
	RemoveKey = 0x08, | 
				
			||||
	True = true | 
				
			||||
} | 
				
			||||
 | 
				
			||||
local specialKeys = { | 
				
			||||
	0x10, | 
				
			||||
	0x11, | 
				
			||||
	0x12, | 
				
			||||
	0xA4, | 
				
			||||
	0xA5 | 
				
			||||
} | 
				
			||||
 | 
				
			||||
deepcopy = function(orig) | 
				
			||||
	local orig_type = type(orig) | 
				
			||||
	local copy | 
				
			||||
	if orig_type == 'table' then | 
				
			||||
		copy = {} | 
				
			||||
		for orig_key, orig_value in next, orig, nil do | 
				
			||||
			copy[deepcopy(orig_key)] = deepcopy(orig_value) | 
				
			||||
		end | 
				
			||||
		setmetatable(copy, deepcopy(getmetatable(orig))) | 
				
			||||
	else -- number, string, boolean, etc | 
				
			||||
		copy = orig | 
				
			||||
	end | 
				
			||||
	return copy | 
				
			||||
end | 
				
			||||
 | 
				
			||||
local keyIsSpecial = function(key) | 
				
			||||
	for k, v in ipairs(specialKeys) do | 
				
			||||
		if v == key then | 
				
			||||
			return true | 
				
			||||
		end | 
				
			||||
	end | 
				
			||||
	return false | 
				
			||||
end | 
				
			||||
 | 
				
			||||
local getKeysText = function(name) | 
				
			||||
	local keysText = {} | 
				
			||||
	if HOTKEY.List[name] ~= nil then | 
				
			||||
		for k, v in ipairs(HOTKEY.List[name].keys) do | 
				
			||||
			table.insert(keysText, vk.id_to_name(v)) | 
				
			||||
		end | 
				
			||||
	end | 
				
			||||
	return table.concat(keysText, ' + ') | 
				
			||||
end | 
				
			||||
 | 
				
			||||
local searchHotKey = function(keys) | 
				
			||||
	local needCombo = deepcopy(keys) | 
				
			||||
	table.sort(needCombo) | 
				
			||||
	needCombo = table.concat(needCombo, ':') | 
				
			||||
	for k, v in pairs(HOTKEY.List) do | 
				
			||||
		if next(v.keys) then | 
				
			||||
			local foundCombo = deepcopy(v.keys) | 
				
			||||
			table.sort(foundCombo) | 
				
			||||
			foundCombo = table.concat(foundCombo, ':') | 
				
			||||
			if foundCombo == needCombo then | 
				
			||||
				v.callback() | 
				
			||||
				break | 
				
			||||
			end | 
				
			||||
		end | 
				
			||||
	end | 
				
			||||
end | 
				
			||||
 | 
				
			||||
HOTKEY.RegisterHotKey = function(name, soloKey, keys, callback) | 
				
			||||
	if HOTKEY.List[name] == nil then | 
				
			||||
		HOTKEY.List[name] = { | 
				
			||||
			soloKey = soloKey, | 
				
			||||
			keys = keys, | 
				
			||||
			callback = callback | 
				
			||||
		} | 
				
			||||
		return { | 
				
			||||
			name, | 
				
			||||
			['ShowHotKey'] = setmetatable({}, {__call = function(self, arg1, arg2) return HOTKEY.ShowHotKey(arg1[1], arg2) end}), | 
				
			||||
			['EditHotKey'] = setmetatable({}, {__call = function(self, arg1, arg2) return HOTKEY.EditHotKey(arg1[1], arg2) end}), | 
				
			||||
			['RemoveHotKey'] = setmetatable({}, {__call = function(self, arg) return HOTKEY.RemoveHotKey(arg[1]) end}), | 
				
			||||
			['GetHotKey'] = setmetatable({}, {__call = function(self, arg) return HOTKEY.GetHotKey(arg[1]) end}) | 
				
			||||
		} | 
				
			||||
	end | 
				
			||||
end | 
				
			||||
 | 
				
			||||
HOTKEY.EditHotKey = setmetatable( | 
				
			||||
	{}, | 
				
			||||
	{ | 
				
			||||
		__call = function(self, name, keys) | 
				
			||||
			if HOTKEY.List[name] ~= nil then | 
				
			||||
				HOTKEY.List[name].keys = keys | 
				
			||||
				return true | 
				
			||||
			end | 
				
			||||
			return false | 
				
			||||
		end | 
				
			||||
	} | 
				
			||||
) | 
				
			||||
 | 
				
			||||
HOTKEY.RemoveHotKey = setmetatable( | 
				
			||||
	{}, | 
				
			||||
	{ | 
				
			||||
		__call = function(self, name) | 
				
			||||
			HOTKEY.List[name] = nil | 
				
			||||
			return true | 
				
			||||
		end | 
				
			||||
	} | 
				
			||||
) | 
				
			||||
 | 
				
			||||
HOTKEY.ShowHotKey = setmetatable( | 
				
			||||
	{}, | 
				
			||||
	{ | 
				
			||||
		__call = function(self, name, sizeButton) | 
				
			||||
			if HOTKEY.List[name] ~= nil then | 
				
			||||
				local HotKeyText = #HOTKEY.List[name].keys == 0 and ((HOTKEY.HotKeyIsEdit ~= nil and HOTKEY.HotKeyIsEdit.NameHotKey == name) and HOTKEY.Text.WaitForKey or HOTKEY.Text.NoKey) or getKeysText(name) | 
				
			||||
				if imgui.Button(('%s##HK:%s'):format(HotKeyText, name), sizeButton) then | 
				
			||||
					HOTKEY.HotKeyIsEdit = { | 
				
			||||
						NameHotKey = name, | 
				
			||||
						BackupHotKeyKeys = HOTKEY.List[name].keys, | 
				
			||||
					} | 
				
			||||
					HOTKEY.ActiveKeys = {} | 
				
			||||
					HOTKEY.HotKeyIsEdit.ActiveKeys = {} | 
				
			||||
					HOTKEY.List[name].keys = {} | 
				
			||||
				end | 
				
			||||
				if HOTKEY.ReturnHotKeys == name then | 
				
			||||
					HOTKEY.ReturnHotKeys = nil | 
				
			||||
					return true | 
				
			||||
				end | 
				
			||||
			else | 
				
			||||
				imgui.Button('Хоткей не найден', sizeButton) | 
				
			||||
			end | 
				
			||||
		end | 
				
			||||
	} | 
				
			||||
) | 
				
			||||
 | 
				
			||||
HOTKEY.GetHotKey = setmetatable( | 
				
			||||
	{}, | 
				
			||||
	{ | 
				
			||||
		__call = function(self, name) | 
				
			||||
			if HOTKEY.List[name] ~= nil then | 
				
			||||
				return HOTKEY.List[name].keys | 
				
			||||
			end | 
				
			||||
		end | 
				
			||||
	} | 
				
			||||
) | 
				
			||||
 | 
				
			||||
addEventHandler('onWindowMessage', function(msg, key, lparam) | 
				
			||||
	if msg == 0x100 or msg == 260 then | 
				
			||||
		if HOTKEY.HotKeyIsEdit == nil then | 
				
			||||
			if key ~= HOTKEY.CancelKey and key ~= HOTKEY.RemoveKey and key ~= 0x1B and key ~= 0x08 and next(HOTKEY.List) then | 
				
			||||
				local found = false | 
				
			||||
				for k, v in ipairs(HOTKEY.ActiveKeys) do | 
				
			||||
					if v == key then | 
				
			||||
						found = true | 
				
			||||
						break | 
				
			||||
					end | 
				
			||||
				end | 
				
			||||
				if not found then | 
				
			||||
					table.insert(HOTKEY.ActiveKeys, key) | 
				
			||||
					if keyIsSpecial(key) then | 
				
			||||
						table.sort(HOTKEY.ActiveKeys) | 
				
			||||
					else | 
				
			||||
						searchHotKey(HOTKEY.ActiveKeys) | 
				
			||||
						table.remove(HOTKEY.ActiveKeys) | 
				
			||||
					end | 
				
			||||
				end | 
				
			||||
			end | 
				
			||||
		else | 
				
			||||
			if key == HOTKEY.CancelKey then | 
				
			||||
				HOTKEY.List[HOTKEY.HotKeyIsEdit.NameHotKey].keys = HOTKEY.HotKeyIsEdit.BackupHotKeyKeys | 
				
			||||
				HOTKEY.HotKeyIsEdit = nil | 
				
			||||
			elseif key == HOTKEY.RemoveKey then | 
				
			||||
				HOTKEY.List[HOTKEY.HotKeyIsEdit.NameHotKey].keys = {} | 
				
			||||
				HOTKEY.ReturnHotKeys = HOTKEY.HotKeyIsEdit.NameHotKey | 
				
			||||
				HOTKEY.HotKeyIsEdit = nil | 
				
			||||
			elseif key ~= 0x1B and key ~= 0x08 then | 
				
			||||
				local found = false | 
				
			||||
				for k, v in ipairs(HOTKEY.HotKeyIsEdit.ActiveKeys) do | 
				
			||||
					if v == key then | 
				
			||||
						found = true | 
				
			||||
						break | 
				
			||||
					end | 
				
			||||
				end | 
				
			||||
				if not found then | 
				
			||||
					if keyIsSpecial(key) then | 
				
			||||
						if not HOTKEY.List[HOTKEY.HotKeyIsEdit.NameHotKey].soloKey then | 
				
			||||
							for k, v in ipairs(specialKeys) do | 
				
			||||
								if key == v then | 
				
			||||
									table.insert(HOTKEY.HotKeyIsEdit.ActiveKeys, v) | 
				
			||||
								end | 
				
			||||
							end | 
				
			||||
							table.sort(HOTKEY.HotKeyIsEdit.ActiveKeys) | 
				
			||||
							HOTKEY.List[HOTKEY.HotKeyIsEdit.NameHotKey].keys = HOTKEY.HotKeyIsEdit.ActiveKeys | 
				
			||||
						end | 
				
			||||
					else | 
				
			||||
						table.insert(HOTKEY.List[HOTKEY.HotKeyIsEdit.NameHotKey].keys, key) | 
				
			||||
						HOTKEY.ReturnHotKeys = HOTKEY.HotKeyIsEdit.NameHotKey | 
				
			||||
						HOTKEY.HotKeyIsEdit = nil | 
				
			||||
					end | 
				
			||||
				end | 
				
			||||
			end | 
				
			||||
			consumeWindowMessage(true, true) | 
				
			||||
		end | 
				
			||||
	elseif msg == 0x101 or msg == 261 then | 
				
			||||
		if keyIsSpecial(key) then | 
				
			||||
			local pizdec = HOTKEY.HotKeyIsEdit ~= nil and HOTKEY.HotKeyIsEdit.ActiveKeys or HOTKEY.ActiveKeys | 
				
			||||
			for k, v in ipairs(pizdec) do | 
				
			||||
				if v == key then | 
				
			||||
					table.remove(pizdec, k) | 
				
			||||
					break | 
				
			||||
				end | 
				
			||||
			end | 
				
			||||
		end | 
				
			||||
	end | 
				
			||||
end) | 
				
			||||
 | 
				
			||||
return HOTKEY | 
				
			||||
					Loading…
					
					
				
		Reference in new issue