IME is an addon that enables the Japanese IME toolbar on any language client. This allows you to type in Japanese regardless of what language your client is set to. http://ashita.atom0s.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
5.8 KiB

--[[
* Ashita - Copyright (c) 2014 - 2016 atom0s [[email protected]]
*
* This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/ or send a letter to
* Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
*
* By using Ashita, you agree to the above license and its terms.
*
* Attribution - You must give appropriate credit, provide a link to the license and indicate if changes were
* made. You must do so in any reasonable manner, but not in any way that suggests the licensor
* endorses you or your use.
*
* Non-Commercial - You may not use the material (Ashita) for commercial purposes.
*
* No-Derivatives - If you remix, transform, or build upon the material (Ashita), you may not distribute the
* modified material. You are, however, allowed to submit the modified works back to the original
* Ashita project in attempt to have it added to the original project.
*
* You may not apply legal terms or technological measures that legally restrict others
* from doing anything the license permits.
*
* No warranties are given.
]]--
_addon.author = 'atom0s';
_addon.name = 'IME';
_addon.version = '3.0.0';
require 'common'
----------------------------------------------------------------------------------------------------
-- Variables
----------------------------------------------------------------------------------------------------
local ime =
{
bar_visible_offset = 0x2F,
bar_visible_ptr = 0,
bar_usage_offset1 = 0xF0EC,
bar_usage_offset2 = 0xF10C,
bar_usage_ptr = 0,
last_update_check = 0,
};
----------------------------------------------------------------------------------------------------
-- func: load
-- desc: Event called when the addon is being loaded.
----------------------------------------------------------------------------------------------------
ashita.register_event('load', function()
-- Locate the IME bar visibility function..
local bar_visible = ashita.memory.findpattern('FFXiMain.dll', 0, '83EC08A1????????5333DB56', 0, 0);
if (bar_visible == nil or bar_visible == 0) then
print('[IME] Failed to locate required function: IMEBarVisible');
return;
end
ime.bar_visible_ptr = bar_visible + ime.bar_visible_offset;
-- Ensure we have the proper instruction to replace..
if (ashita.memory.read_uint8(ime.bar_visible_ptr) ~= 0x74) then
print('[IME] Failed to locate required function: IMEBarVisible -- Offset appears wrong!');
return;
end
-- Locate the IME bar usage function..
local bar_usage = ashita.memory.findpattern('FFXiMain.dll', 0, '8B0D????????81EC0401000053568B', 0, 0);
if (bar_usage == nil or bar_usage == 0) then
print('[IME] Failed to locate required function: IMEBarUsage');
return;
end
ime.bar_usage_ptr = bar_usage + 2;
ime.bar_usage_ptr = ashita.memory.read_uint32(ime.bar_usage_ptr);
end);
----------------------------------------------------------------------------------------------------
-- func: unload
-- desc: Event called when the addon is being unloaded.
----------------------------------------------------------------------------------------------------
ashita.register_event('unload', function()
-- Restore our patch for the IME visibility..
if (ime.bar_visible_ptr ~= nil and ime.bar_visible_ptr ~= 0) then
ashita.memory.write_uint8(ime.bar_visible_ptr, 0x74);
end
-- Restore the IME usage variables..
local ptr = ashita.memory.read_uint32(ime.bar_usage_ptr);
if (ptr == nil or ptr == 0) then
print('[IME] Failed to read bar usage pointer, cannot apply needed fixes! (1)');
else
ptr = ashita.memory.read_uint32(ime.bar_usage_ptr);
if (ptr == nil or ptr == 0) then
print('[IME] Failed to read bar usage pointer, cannot apply needed fixes! (2)');
else
ashita.memory.write_uint8(ptr + ime.bar_usage_offset1, 1);
ashita.memory.write_uint8(ptr + ime.bar_usage_offset2, 1);
end
end
end);
----------------------------------------------------------------------------------------------------
-- func: render
-- desc: Event called when the addon is being rendered.
----------------------------------------------------------------------------------------------------
ashita.register_event('render', function()
-- Ensure we have valid pointers..
if (ime.bar_visible_ptr == 0 or ime.bar_visible_ptr == nil or
ime.bar_usage_ptr == 0 or ime.bar_usage_ptr == nil) then
return;
end
-- Ensure our patches are applied every 5 seconds..
if (ime.last_update_check <= (os.clock() - 5)) then
-- Store the current update check time..
ime.last_update_check = os.clock();
-- Ensure our patch for the IME visibility is set..
-- Patch: JE -> JMP
if (ashita.memory.read_uint8(ime.bar_visible_ptr) == 0x74) then
ashita.memory.write_uint8(ime.bar_visible_ptr, 0xEB);
end
-- Ensure the game allows us to use the IME bar..
local ptr = ashita.memory.read_uint32(ime.bar_usage_ptr);
if (ptr == nil or ptr == 0) then
print('[IME] Failed to read bar usage pointer, cannot apply needed fixes! (1)');
else
ptr = ashita.memory.read_uint32(ime.bar_usage_ptr);
if (ptr == nil or ptr == 0) then
print('[IME] Failed to read bar usage pointer, cannot apply needed fixes! (2)');
else
ashita.memory.write_uint8(ptr + ime.bar_usage_offset1, 0);
ashita.memory.write_uint8(ptr + ime.bar_usage_offset2, 0);
end
end
end
end);