--[[ * Ashita - Copyright (c) 2014 - 2017 atom0s [atom0s@live.com] * * 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. ]]-- ashita = ashita or { }; ashita.ffxi = ashita.ffxi or { }; ashita.ffxi.targets = ashita.ffxi.targets or { }; -- Scan for patterns.. ashita.ffxi.targets.pointers = { }; ashita.ffxi.targets.pointers = { ['lastst'] = { pointer = ashita.memory.findpattern('FFXiMain.dll', 0, 'A1????????BF????????8B??B9', 0, 0), offset1 = 0x01 }, ['scan'] = { pointer = ashita.memory.findpattern('FFXiMain.dll', 0, 'A1????????85C074??F7', 0, 0), offset1 = 0x01, offset2 = 0x350E4 }, ['r'] = { pointer = ashita.memory.findpattern('FFXiMain.dll', 0, '8B0D????????85C9750333C0C36A00', 0, 0), offset1 = 0x02, offset2 = 0x011E } }; ---------------------------------------------------------------------------------------------------- -- func: get_target_lastst -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_lastst() local lastst = ashita.ffxi.targets.pointers.lastst; -- Ensure the pointer is valid.. if (lastst.pointer == 0) then return nil; end -- Read the target pointer.. local pointer = ashita.memory.read_uint32(lastst.pointer + lastst.offset1); if (pointer == 0) then return nil; end -- Read the pointer.. pointer = ashita.memory.read_uint32(pointer); if (pointer == 0) then return nil; end -- Read the entity index.. return ashita.memory.read_uint32(pointer + 0xB8); end ashita.ffxi.targets.get_target_lastst = get_target_lastst; ---------------------------------------------------------------------------------------------------- -- func: get_target_bt -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_bt() -- Obtain the local player.. local player = GetPlayerEntity(); if (player == nil) then return nil; end -- Obtain the players server id.. local serverId = player.ServerId; for x = 0, 2303 do local entity = GetEntity(x); if (entity ~= nil and entity.WarpPointer ~= 0 and entity.ClaimServerId == serverId) then if (entity.StatusServer ~= 2 and entity.StatusServer ~= 3) then return entity; end end end return nil; end ashita.ffxi.targets.get_target_bt = get_target_bt; ---------------------------------------------------------------------------------------------------- -- func: get_target_bt -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_pet() -- Obtain the local player.. local player = GetPlayerEntity(); if (player == nil) then return nil; end -- Ensure the players pet index is valid.. if (player.PetTargetIndex == 0) then return nil; end -- Return the pet entity.. return GetEntity(player.PetTargetIndex); end ashita.ffxi.targets.get_target_pet = get_target_pet; ---------------------------------------------------------------------------------------------------- -- func: get_target_scan -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_scan() local scan = ashita.ffxi.targets.pointers.scan; -- Ensure the pointer is valid.. if (scan.pointer == 0) then return nil; end -- Read the pointer.. local pointer = ashita.memory.read_uint32(scan.pointer + scan.offset1); if (pointer == 0) then return nil; end -- Read the pointer.. pointer = ashita.memory.read_uint32(pointer); if (pointer == 0) then return nil; end -- Validate the scan target is set.. pointer = pointer + scan.offset2; if (ashita.memory.read_uint32(pointer) ~= 1) then return nil; end -- Read the entity index.. return GetEntity(bit.band(ashita.memory.read_uint32(pointer + 0x10), 0xFFFF)); end ashita.ffxi.targets.get_target_scan = get_target_scan; ---------------------------------------------------------------------------------------------------- -- func: get_target_ht -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_ht() local e = nil; for x = 0, 2303 do local entity = GetEntity(x); if (entity ~= nil and entity.WarpPointer ~= 0 and entity.StatusServer ~= 2 and entity.StatusServer ~= 3) then if (bit.band(bit.rshift(entity.Render.Flags0, 5), 1) == 1) then if (bit.band(bit.rshift(entity.Render.Flags1, 16), 1) == 1) then if (e == nil) then e = entity; else if (math.sqrt(entity.Distance) < math.sqrt(e.Distance)) then e = entity; end end end end end end return e; end ashita.ffxi.targets.get_target_ht = get_target_ht; ---------------------------------------------------------------------------------------------------- -- func: get_target_ft -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_ft() -- Validate the entity map pointer.. local entity_map = AshitaCore:GetPointerManager():GetPointer('entitymap'); if (entity_map == 0) then return nil; end -- Locate the player pointer.. local player = ashita.memory.read_uint32(ashita.memory.read_uint32(entity_map) + (4 * GetPlayerEntity().TargetIndex)); -- Read the follower index.. local follower = ashita.memory.read_uint16(player + 0x264); if (follower == 0) then return nil; end -- Return the follower entity.. return GetEntity(follower); end ashita.ffxi.targets.get_target_ft = get_target_ft; ---------------------------------------------------------------------------------------------------- -- func: get_target_normal -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_normal() return GetEntity(AshitaCore:GetDataManager():GetTarget():GetTargetIndex()); end ashita.ffxi.targets.get_target_normal = get_target_normal; ---------------------------------------------------------------------------------------------------- -- func: get_target_r -- desc: Returns the target. ---------------------------------------------------------------------------------------------------- local function get_target_r() local rtarget = ashita.ffxi.targets.pointers.r; -- Ensure the pointer is valid.. if (rtarget.pointer == 0) then return nil; end -- Read the pointer.. local pointer = ashita.memory.read_uint32(rtarget.pointer + rtarget.offset1); if (pointer == 0) then print('no1');return nil; end -- Read the pointer.. pointer = ashita.memory.read_uint32(pointer); if (pointer == 0) then print('no2');return nil; end -- Offset the pointer.. pointer = pointer + rtarget.offset2; -- Read the response target name.. local name = ashita.memory.read_string(pointer, 30); if (name == nil or #name == 0) then return nil; end -- Locate the matching entity.. for x = 0, 2303 do local ent = GetEntity(x); if (ent ~= nil and ent.Name == name) then return ent; end end return nil; end ashita.ffxi.targets.get_target_r = get_target_r; ---------------------------------------------------------------------------------------------------- -- func: get_target -- desc: Returns the desired target by its short-hand tag. ---------------------------------------------------------------------------------------------------- local function get_target(name) -- Convert to lower name.. name = string.lower(name); -- Return the desired target.. return switch(name) : caseof { ['lastst'] = function() return get_target_lastst(); end, ['bt'] = function() return get_target_bt(); end, ['me'] = function() return GetPlayerEntity(); end, ['pet'] = function() return get_target_pet(); end, ['scan'] = function() return get_target_scan(); end, ['ht'] = function() return get_target_ht(); end, ['ft'] = function() return get_target_ft(); end, ['t'] = function() return get_target_normal(); end, ['r'] = function() return get_target_r(); end, ['default'] = function() return nil; end, }; end ashita.ffxi.targets.get_target = get_target; ---------------------------------------------------------------------------------------------------- -- func: get_last_teller_name -- desc: Returns the name of the last person to send the player a whisper. ---------------------------------------------------------------------------------------------------- local function get_last_teller_name() local rtarget = ashita.ffxi.targets.pointers.r; -- Ensure the pointer is valid.. if (rtarget.pointer == 0) then return nil; end -- Read the pointer.. local pointer = ashita.memory.read_uint32(rtarget.pointer + rtarget.offset1); if (pointer == 0) then print('no1');return nil; end -- Read the pointer.. pointer = ashita.memory.read_uint32(pointer); if (pointer == 0) then print('no2');return nil; end -- Offset the pointer.. pointer = pointer + rtarget.offset2; -- Read the response target name.. return ashita.memory.read_string(pointer, 30); end ashita.ffxi.targets.get_last_teller_name = get_last_teller_name;