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

--[[
* 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 );