Display information about yourself and your targets.
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.
415 lines
16 KiB
415 lines
16 KiB
--[[ |
|
* The MIT License (MIT) |
|
* |
|
* Copyright (c) 2014 Vicrelant |
|
* |
|
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|
* of this software and associated documentation files (the "Software"), to |
|
* deal in the Software without restriction, including without limitation the |
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
|
* sell copies of the Software, and to permit persons to whom the Software is |
|
* furnished to do so, subject to the following conditions: |
|
* |
|
* The above copyright notice and this permission notice shall be included in |
|
* all copies or substantial portions of the Software. |
|
* |
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
|
* DEALINGS IN THE SOFTWARE. |
|
]]-- |
|
|
|
_addon.author = 'Vicrelant'; |
|
_addon.name = 'ibar'; |
|
_addon.version = '3.0.2'; |
|
|
|
require 'common' |
|
|
|
mb_data = {}; |
|
arraySize = 0; |
|
|
|
jobs = { |
|
[1] = 'WAR', |
|
[2] = 'MNK', |
|
[3] = 'WHM', |
|
[4] = 'BLM', |
|
[5] = 'RDM', |
|
[6] = 'THF', |
|
[7] = 'PLD', |
|
[8] = 'DRK', |
|
[9] = 'BST', |
|
[10] = 'BRD', |
|
[11] = 'RNG', |
|
[12] = 'SAM', |
|
[13] = 'NIN', |
|
[14] = 'DRG', |
|
[15] = 'SMN', |
|
[16] = 'BLU', |
|
[17] = 'COR', |
|
[18] = 'PUP', |
|
[19] = 'DNC', |
|
[20] = 'SCH', |
|
[21] = 'GEO', |
|
[22] = 'RUN' |
|
}; |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- desc: Default ibar configuration table. |
|
--------------------------------------------------------------------------------------------------- |
|
local default_config = |
|
{ |
|
font = |
|
{ |
|
name = 'Arial', |
|
size = 10, |
|
color = '255,255,255,255', |
|
position = { 130, 0 }, |
|
bgcolor = '200,0,0,0', |
|
bgvisible = true, |
|
bold = true |
|
}, |
|
layout = |
|
{ |
|
player = '$zone $name [$level] [$position] - $ecompass', |
|
target = '$target [$job / $level / $aggro] Weak[$weak] [$position]', |
|
npc = '$target [$position] [ID: $id / Index: $m_index]' |
|
} |
|
}; |
|
local ibar_config = default_config; |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: load |
|
-- desc: First called when our addon is loaded. |
|
--------------------------------------------------------------------------------------------------- |
|
ashita.register_event('load', function() |
|
ibar_config = ashita.settings.load_merged(_addon.path .. 'settings/ibar.json', ibar_config); |
|
|
|
local a,r,g,b = ibar_config.font.color:match("([^,]+),([^,]+),([^,]+),([^,]+)"); |
|
local fcolor = math.d3dcolor(a,r,g,b); |
|
local a,r,g,b = ibar_config.font.bgcolor:match("([^,]+),([^,]+),([^,]+),([^,]+)"); |
|
local bcolor = math.d3dcolor(a,r,g,b); |
|
|
|
local f = AshitaCore:GetFontManager():Create( '__ibar_addon' ); |
|
f:SetBold( ibar_config.font.bold ); |
|
f:SetColor( fcolor ); |
|
f:SetFontFamily( ibar_config.font.name ); |
|
f:SetFontHeight( ibar_config.font.size ); |
|
f:SetPositionX( ibar_config.font.position[1] ); |
|
f:SetPositionY( ibar_config.font.position[2] ); |
|
f:SetText( '' ); |
|
f:SetVisibility( false ); |
|
f:GetBackground():SetColor( bcolor ); |
|
f:GetBackground():SetVisibility( ibar_config.font.bgvisible ); |
|
|
|
local ZoneID = AshitaCore:GetDataManager():GetParty():GetMemberZone(0); |
|
|
|
local _, mb_data = pcall(require, 'data.' .. tostring(ZoneID)); |
|
if (mb_data == nil or type(mb_data) ~= 'table') then |
|
mb_data = { }; |
|
end |
|
|
|
arraySize = table.getn(mb_data); |
|
end ); |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: unload |
|
-- desc: Called when our addon is unloaded. |
|
--------------------------------------------------------------------------------------------------- |
|
ashita.register_event('unload', function() |
|
local f = AshitaCore:GetFontManager():Get( '__ibar_addon' ); |
|
ibar_config.font.position = { f:GetPositionX(), f:GetPositionY() }; |
|
|
|
ashita.settings.save(_addon.path .. 'settings/ibar.json', ibar_config); |
|
|
|
AshitaCore:GetFontManager():Delete( '__ibar_addon' ); |
|
end ); |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: Render |
|
-- desc: Called when our addon is rendered. |
|
--------------------------------------------------------------------------------------------------- |
|
ashita.register_event('render', function() |
|
local f = AshitaCore:GetFontManager():Get( '__ibar_addon' ); |
|
local Entity = AshitaCore:GetDataManager():GetEntity(); |
|
local party = AshitaCore:GetDataManager():GetParty(); |
|
local player = AshitaCore:GetDataManager():GetPlayer(); |
|
local target = AshitaCore:GetDataManager():GetTarget(); |
|
local ZoneName = AshitaCore:GetResourceManager():GetString('areas', party:GetMemberZone(0)); |
|
|
|
-- disable view if no player |
|
if (player:GetMainJobLevel() == 0) then |
|
f:SetVisibility(false); |
|
return; |
|
end |
|
|
|
f:SetVisibility(true); |
|
|
|
ibar_config = ashita.settings.load_merged(_addon.path .. 'settings/ibar.json', ibar_config); |
|
|
|
-- obtain values from json configuration. |
|
|
|
local s_target = ibar_config.layout.player; |
|
|
|
local name = string.find(s_target,'$name'); |
|
local zone = string.find(s_target,'$zone'); |
|
local z_id = string.find(s_target,'$z_id'); |
|
local mlvl = string.find(s_target,'$level'); |
|
local gpos = string.find(s_target,'$position'); |
|
local ecom = string.find(s_target,'$ecompass'); |
|
local scom = string.find(s_target,'$scompass'); |
|
local p_hp = string.find(s_target,'$hpp'); |
|
local m_id = string.find(s_target,'$id'); |
|
local m_ix = string.find(s_target,'$m_index'); |
|
|
|
-- obtain player position. |
|
local pX = string.format('%2.3f',Entity:GetLocalX(party:GetMemberTargetIndex(0))); |
|
local pY = string.format('%2.3f',Entity:GetLocalY(party:GetMemberTargetIndex(0))); |
|
local pZ = string.format('%2.3f',Entity:GetLocalZ(party:GetMemberTargetIndex(0))); |
|
local pH = string.format('%2.3f',Entity:GetLocalYaw(party:GetMemberTargetIndex(0))); |
|
|
|
local sResult = ''; |
|
local eResult = ''; |
|
|
|
if (ecom ~= nil or scom ~= nil) then |
|
local degrees = pH * (180 / math.pi) + 90; |
|
|
|
if (degrees > 360) then |
|
degrees = degrees - 360; |
|
elseif (degrees < 0) then |
|
degrees = degrees + 360; |
|
end |
|
|
|
sResult = math.floor(degrees); |
|
|
|
if (337 < degrees or 23 >= degrees) then |
|
eResult = string.format('|cff787878|N|r'); |
|
sResult = 'N'; |
|
elseif (23 < degrees and 68 >= degrees) then |
|
eResult = string.format('|cFFFFFFFF|NE|r'); |
|
sResult = 'NE'; |
|
elseif (68 < degrees and 113 >= degrees) then |
|
eResult = string.format('|cff2cf0e8|E|r'); |
|
sResult = 'E'; |
|
elseif (113 < degrees and 158 >= degrees) then |
|
eResult = string.format('|cff49ff49|SE|r'); |
|
sResult = 'SE'; |
|
elseif (158 < degrees and 203 >= degrees) then |
|
eResult = string.format('|cffffc900|S|r'); |
|
sResult = 'S'; |
|
elseif (203 < degrees and 248 >= degrees) then |
|
eResult = string.format('|cffcd18cd|SW|r'); |
|
sResult = 'SW'; |
|
elseif (248 < degrees and 293 >= degrees) then |
|
eResult = string.format('|cff4949ff|W|r'); |
|
sResult = 'W'; |
|
elseif (293 < degrees and 337 >= degrees) then |
|
eResult = string.format('|cffff1900|NW|r'); |
|
sResult = 'NW'; |
|
end |
|
end |
|
|
|
-- attempt to display player information. |
|
-- check if player selected and or nothing selected. |
|
|
|
if (target:GetTargetEntityPointer() == nil or target:GetTargetName() == '' or target:GetTargetServerId() == 0 or |
|
target:GetTargetServerId() == party:GetMemberServerId(0)) then |
|
|
|
-- player does not have a sub-job unlocked. |
|
if (player:GetSubJobLevel() == 0) then |
|
|
|
if (name ~= nil) then s_target = string.gsub(s_target,'$name',party:GetMemberName(0)); end |
|
if (z_id ~= nil) then s_target = string.gsub(s_target,'$z_id',party:GetMemberZone(0)); end |
|
if (zone ~= nil) then s_target = string.gsub(s_target,'$zone',ZoneName); end |
|
if (p_hp ~= nil) then s_target = string.gsub(s_target,'$hpp',party:GetMemberHPP(0)); end |
|
if (m_id ~= nil) then s_target = string.gsub(s_target,'$id',target:GetTargetServerId()); end |
|
if (m_ix ~= nil) then s_target = string.gsub(s_target,'$m_index',target:GetTargetIndex()); end |
|
|
|
if (mlvl ~= nil) then |
|
s_target = string.gsub(s_target,'$level', |
|
jobs[player:GetMainJob()] .. |
|
player:GetMainJobLevel()); |
|
end |
|
|
|
if (gpos ~= nil) then s_target = string.gsub(s_target,'$position',pX .. ', ' .. pY .. ', ' .. pZ); end |
|
if (ecom ~= nil) then s_target = string.gsub(s_target,'$ecompass',eResult); end |
|
if (scom ~= nil) then s_target = string.gsub(s_target,'$scompass',sResult); end |
|
|
|
f:SetText(string.format(s_target)); |
|
return; |
|
|
|
-- player has sub-job unlocked. |
|
elseif (player:GetSubJobLevel() > 0) then |
|
|
|
if (name ~= nil) then s_target = string.gsub(s_target,'$name',party:GetMemberName(0)); end |
|
if (z_id ~= nil) then s_target = string.gsub(s_target,'$z_id',party:GetMemberZone(0)); end |
|
if (zone ~= nil) then s_target = string.gsub(s_target,'$zone',ZoneName); end |
|
if (p_hp ~= nil) then s_target = string.gsub(s_target,'$hpp',party:GetMemberHPP(0)); end |
|
if (m_id ~= nil) then s_target = string.gsub(s_target,'$id',target:GetTargetServerId()); end |
|
if (m_ix ~= nil) then s_target = string.gsub(s_target,'$m_index',target:GetTargetIndex()); end |
|
|
|
if (party:GetMemberZone(0) ~= 285) then |
|
if (mlvl ~= nil) then |
|
s_target = string.gsub(s_target,'$level', |
|
jobs[player:GetMainJob()] .. |
|
player:GetMainJobLevel() .. '/' .. |
|
jobs[player:GetSubJob()] .. |
|
player:GetSubJobLevel()); |
|
end |
|
elseif (party:GetMemberZone(0) == 285) then |
|
if (mlvl ~= nil) then |
|
s_target = string.gsub(s_target,'$level', |
|
tostring(jobs[player:GetMainJob()])); |
|
end |
|
end |
|
|
|
if (gpos ~= nil) then s_target = string.gsub(s_target,'$position',pX .. ', ' .. pY .. ', ' .. pZ); end |
|
if (ecom ~= nil) then s_target = string.gsub(s_target,'$ecompass',eResult); end |
|
if (scom ~= nil) then s_target = string.gsub(s_target,'$scompass',sResult); end |
|
|
|
f:SetText(string.format(s_target)); |
|
return; |
|
end |
|
end |
|
|
|
local m_target = ibar_config.layout.target; |
|
|
|
name = string.find(m_target,'$target'); |
|
zone = string.find(m_target,'$zone'); |
|
mlvl = string.find(m_target,'$level'); |
|
gpos = string.find(m_target,'$position'); |
|
m_id = string.find(m_target,'$id'); |
|
m_ix = string.find(m_target,'$m_index'); |
|
local flag = string.find(m_target,'$aggro'); |
|
local mjob = string.find(m_target,'$job'); |
|
local weak = string.find(m_target,'$weak'); |
|
local m_hp = string.find(m_target,'$hpp'); |
|
|
|
-- attempt to obtain target information. |
|
if (target:GetTargetServerId() ~= nil) then |
|
for i = 1, arraySize do |
|
if (tonumber(mb_data[i].id) == target:GetTargetServerId()) then |
|
if (mb_data[i].sj == mb_data[i].mj) then |
|
|
|
local tentity = GetEntity(target:GetTargetIndex()); |
|
pX = string.format('%2.3f',tentity.Movement.LocalPosition.X); |
|
pY = string.format('%2.3f',tentity.Movement.LocalPosition.Y); |
|
pZ = string.format('%2.3f',tentity.Movement.LocalPosition.Z); |
|
|
|
if (name ~= nil) then m_target = string.gsub(m_target,'$target',tentity.Name); end |
|
if (zone ~= nil) then m_target = string.gsub(m_target,'$zone',ZoneName); end |
|
if (m_id ~= nil) then m_target = string.gsub(m_target,'$id',target:GetTargetServerId()); end |
|
if (m_ix ~= nil) then m_target = string.gsub(m_target,'$m_index',target:GetTargetIndex()); end |
|
if (mjob ~= nil) then m_target = string.gsub(m_target,'$job',jobs[tonumber(mb_data[i].mj)]); end |
|
if (mlvl ~= nil) then m_target = string.gsub(m_target,'$level',mb_data[i].mlvl); end |
|
if (gpos ~= nil) then m_target = string.gsub(m_target,'$position', pX .. ',' .. pY .. ',' .. pZ); end |
|
if (weak ~= nil) then m_target = string.gsub(m_target,'$weak',mb_data[i].weak); end |
|
if (m_hp ~= nil) then m_target = string.gsub(m_target,'$hpp',tentity.HealthPercent); end |
|
|
|
if (flag ~= nil) then |
|
if (mb_data[i].links == 'Y') then |
|
m_target = string.gsub(m_target,'$aggro',mb_data[i].aggro .. ',L'); |
|
else |
|
m_target = string.gsub(m_target,'$aggro',mb_data[i].aggro); |
|
end |
|
end |
|
|
|
f:SetText(string.format(m_target)); |
|
return; |
|
|
|
else |
|
|
|
local tentity = GetEntity(target:GetTargetIndex()); |
|
pX = string.format('%2.3f',tentity.Movement.LocalPosition.X); |
|
pY = string.format('%2.3f',tentity.Movement.LocalPosition.Y); |
|
pZ = string.format('%2.3f',tentity.Movement.LocalPosition.Z); |
|
|
|
if (name ~= nil) then m_target = string.gsub(m_target,'$target',tentity.Name); end |
|
if (zone ~= nil) then m_target = string.gsub(m_target,'$zone',ZoneName); end |
|
if (m_id ~= nil) then m_target = string.gsub(m_target,'$id',target:GetTargetServerId()); end |
|
if (m_ix ~= nil) then m_target = string.gsub(m_target,'$m_index',target:GetTargetIndex()); end |
|
if (mlvl ~= nil) then m_target = string.gsub(m_target,'$level',mb_data[i].mlvl); end |
|
if (gpos ~= nil) then m_target = string.gsub(m_target,'$position', pX .. ',' .. pY .. ',' .. pZ); end |
|
if (weak ~= nil) then m_target = string.gsub(m_target,'$weak',mb_data[i].weak); end |
|
if (m_hp ~= nil) then m_target = string.gsub(m_target,'$hpp',tentity.HealthPercent); end |
|
|
|
if (mjob ~= nil) then |
|
m_target = string.gsub(m_target,'$job', |
|
jobs[tonumber(mb_data[i].mj)] .. '/' .. |
|
jobs[tonumber(mb_data[i].sj)]); |
|
end |
|
|
|
if (flag ~= nil) then |
|
if (mb_data[i].links == 'Y') then |
|
m_target = string.gsub(m_target,'$aggro',mb_data[i].aggro .. ',L'); |
|
else |
|
m_target = string.gsub(m_target,'$aggro',mb_data[i].aggro); |
|
end |
|
end |
|
|
|
f:SetText(string.format(m_target)); |
|
return; |
|
|
|
end |
|
end |
|
end |
|
|
|
m_target = ibar_config.layout.npc; |
|
|
|
m_id = string.find(m_target,'$id'); |
|
m_ix = string.find(m_target,'$m_index'); |
|
gpos = string.find(m_target,'$position'); |
|
n_hp = string.find(m_target,'$hpp'); |
|
|
|
local tentity = GetEntity(target:GetTargetIndex()); |
|
if (tentity ~= nil) then |
|
pX = string.format('%2.3f',tentity.Movement.LocalPosition.X); |
|
pY = string.format('%2.3f',tentity.Movement.LocalPosition.Y); |
|
pZ = string.format('%2.3f',tentity.Movement.LocalPosition.Z); |
|
|
|
if (name ~= nil) then m_target = string.gsub(m_target,'$target',tentity.Name); end |
|
if (m_id ~= nil) then m_target = string.gsub(m_target,'$id',target:GetTargetServerId()); end |
|
if (m_ix ~= nil) then m_target = string.gsub(m_target,'$m_index',target:GetTargetIndex()); end |
|
if (gpos ~= nil) then m_target = string.gsub(m_target,'$position', pX .. ',' .. pY .. ',' .. pZ); end |
|
if (n_hp ~= nil) then m_target = string.gsub(m_target,'$hpp',tentity.HealthPercent); end |
|
|
|
f:SetText(string.format(m_target)); |
|
return; |
|
else |
|
f:SetText(''); |
|
end |
|
end |
|
end ); |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: incoming_packet |
|
-- desc: Called when our addon receives an incoming packet. |
|
--------------------------------------------------------------------------------------------------- |
|
ashita.register_event('incoming_packet', function(id, size, packet) |
|
-- Check for zone-in packets.. |
|
if (id == 0x0A) then |
|
-- Are we zoning into a mog house.. |
|
if (struct.unpack('b', packet, 0x80 + 1) == 1) then |
|
return false; |
|
end |
|
|
|
-- Pull the zone id from the packet.. |
|
local zoneId = struct.unpack('H', packet, 0x30 + 1); |
|
if (zoneId == 0) then |
|
zoneId = struct.unpack('H', packet, 0x42 + 1); |
|
end |
|
|
|
-- Update our mob list.. |
|
--mb_data = require('data.' .. tostring(zoneId)); |
|
_, mb_data = pcall(require, 'data.' .. tostring(zoneId)); |
|
if (mb_data == nil or type(mb_data) ~= 'table') then |
|
mb_data = { }; |
|
end |
|
|
|
arraySize = table.getn(mb_data); |
|
end |
|
|
|
return false; |
|
end ); |