summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/MobCompass/MobCompass.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/MobCompass/MobCompass.lua')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/MobCompass/MobCompass.lua248
1 files changed, 248 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/MobCompass/MobCompass.lua b/Data/BuiltIn/Libraries/lua-addons/addons/MobCompass/MobCompass.lua
new file mode 100644
index 0000000..7a833f2
--- /dev/null
+++ b/Data/BuiltIn/Libraries/lua-addons/addons/MobCompass/MobCompass.lua
@@ -0,0 +1,248 @@
+--[[
+Copyright (c) 2013, Sebastien Gomez
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of MobCompass nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Sebastien Gomez BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+]]
+
+_addon.name = 'MobCompass'
+_addon.version = '2.0.1'
+
+texts = require('texts')
+config = require('config')
+
+do
+ local s_arrows={
+ pos = {},
+ bg = {visible=false},
+ flags = {draggable=false},
+ text = {size=33,font='Wingdings'}
+ }
+
+ circle = texts.new('l',s_arrows)
+ circle2 = texts.new('l',s_arrows)
+
+ n = texts.new('Ù',s_arrows)
+ s = texts.new('Ú',s_arrows)
+ w = texts.new('×',s_arrows)
+ e = texts.new('Ø',s_arrows)
+
+ s_arrows.text.size = 20
+
+ ne = texts.new('w',s_arrows)
+ nw = texts.new('w',s_arrows)
+ sw = texts.new('w',s_arrows)
+ se = texts.new('w',s_arrows)
+
+ _defaults = config.load({
+ x_pos = 0,
+ y_pos = 0,
+ })
+ x_pos = _defaults.x_pos
+ y_pos = _defaults.y_pos
+
+ config.register(_defaults, function(settings_table)
+ local x_pos = settings_table.x_pos
+ local y_pos = settings_table.y_pos
+
+ n:pos(x_pos+29,y_pos)
+ s:pos(x_pos+29,y_pos+58)
+ e:pos(x_pos+62,y_pos+29)
+ w:pos(x_pos,y_pos+29)
+
+ circle:pos(x_pos+22,y_pos+14)
+ circle2:pos(x_pos-8,y_pos-27)
+
+ sw:pos(x_pos+19,y_pos+60)
+ se:pos(x_pos+64,y_pos+60)
+ nw:pos(x_pos+19,y_pos+17)
+ ne:pos(x_pos+64,y_pos+17)
+ sas:pos(x_pos+32,y_pos+40)
+ labels:pos(x_pos-22,y_pos-18)
+
+ end)
+
+ sas = texts.new('360',{
+ pos = {x=x_pos+32,y=y_pos+40},
+ bg = {visible=false},
+ flags = {draggable=false},
+ text = {size=15,font='Consolas',}
+ })
+
+ labels = texts.new(' Crit\n\n\n\nMB Att\n\n\n\n Acc',{
+ pos = {x=x_pos-22,y=y_pos-18},
+ bg = {visible=false},
+ flags = {draggable=false},
+ text = {size=10,font='Consolas',}
+ })
+
+ n:pos(x_pos+29,y_pos)
+ s:pos(x_pos+29,y_pos+58)
+ e:pos(x_pos+62,y_pos+29)
+ w:pos(x_pos,y_pos+29)
+
+ circle:pos(x_pos+22,y_pos+14)
+ circle2:pos(x_pos-8,y_pos-27)
+
+ sw:pos(x_pos+19,y_pos+60)
+ se:pos(x_pos+64,y_pos+60)
+ nw:pos(x_pos+19,y_pos+17)
+ ne:pos(x_pos+64,y_pos+17)
+
+ circle:size(53)
+ circle:alpha(100)
+ circle2:size(111)
+ circle2:color(0,0,165)
+ circle2:alpha(28)
+
+ s_arrows.text.alpha = 255
+end
+
+do
+ local drag_and_drop
+
+ windower.register_event('mouse', function(type, x, y, delta, blocked)
+ if blocked then return end
+ if type == 0 then
+ if drag_and_drop then
+ sas:pos(x-drag_and_drop[1]+32,y-drag_and_drop[2]+40)
+ n:pos(x-drag_and_drop[1]+29,y-drag_and_drop[2])
+ s:pos(x-drag_and_drop[1]+29,y-drag_and_drop[2]+58)
+ e:pos(x-drag_and_drop[1]+62,y-drag_and_drop[2]+29)
+ w:pos(x-drag_and_drop[1],y-drag_and_drop[2]+29)
+ sw:pos(x-drag_and_drop[1]+19,y-drag_and_drop[2]+60)
+ se:pos(x-drag_and_drop[1]+64,y-drag_and_drop[2]+60)
+ nw:pos(x-drag_and_drop[1]+19,y-drag_and_drop[2]+17)
+ ne:pos(x-drag_and_drop[1]+64,y-drag_and_drop[2]+17)
+ circle:pos(x-drag_and_drop[1]+22,y-drag_and_drop[2]+14)
+ circle2:pos(x-drag_and_drop[1]-8,y-drag_and_drop[2]-27)
+ labels:pos(x-drag_and_drop[1]-22,y-drag_and_drop[2]-18)
+ return true
+ end
+ elseif type == 1 then
+ if (x-x_pos-45)^2 + (y-y_pos-45)^2 < 2025 then
+ drag_and_drop = {x-x_pos,y-y_pos}
+ return true
+ end
+ elseif type == 2 then
+ if drag_and_drop then
+ x_pos,y_pos = x-drag_and_drop[1],y-drag_and_drop[2]
+ _defaults.x_pos = x_pos
+ _defaults.y_pos = y_pos
+ config.save(_defaults)
+ drag_and_drop = nil
+ return true
+ end
+ end
+ end)
+end
+
+do
+ local is_labels_visible = false
+ windower.register_event('job change', function(main_job_id,_,sub_job_id)
+ is_labels_visible = main_job_id == 21 or sub_job_id == 21
+ labels:visible(is_labels_visible and w:visible())
+ end)
+
+ local player_index
+ if windower.ffxi.get_info().logged_in then
+ local player = windower.ffxi.get_player()
+ player_index = player.index
+ is_labels_visible = player.main_job_id == 21 or player.sub_job_id == 21
+ end
+
+ windower.register_event('zone change', function()
+ player_index = windower.ffxi.get_player().index
+ end)
+
+ windower.register_event('login', function()
+ player_index = windower.ffxi.get_player().index
+ end)
+
+ local target = 0
+
+ windower.register_event('target change', function(n)
+ target = n ~= player_index and n or 0
+ if target == 0 then
+ for i=1,#windower.text.saved_texts do
+ windower.text.saved_texts[i]:hide()
+ end
+ elseif not w:visible() then
+ for i=1,#windower.text.saved_texts do
+ windower.text.saved_texts[i]:show()
+ end
+ labels:visible(is_labels_visible)
+ end
+ end)
+
+ local atan = math.atan
+ local pi = math.pi
+ local last45angle = 10
+ local last16angle
+ local direction = {
+ [0]=' N ', ' N ', 'NNE', 'N E', 'ENE', ' E ', 'ESE', 'S E', 'SSE', ' S ', 'SSW', 'S W', 'WSW',
+ ' W ', 'WNW', 'N W', 'NNW', [-7]='SSW', [-6]='S W', [-5]='WSW', [-4]=' W ', [-3]='WNW', [-2]='N W', [-1]='NNW',
+ }
+ local arrow_map = {[0]=e,e,ne,n,nw,w,sw,s,se,e,sas}
+
+ windower.register_event('prerender', function()
+ if target ~= 0 then
+ local player = windower.ffxi.get_mob_by_index(player_index)
+ if not player then
+ target = 0
+ return
+ end
+ local mob = windower.ffxi.get_mob_by_index(target)
+ local x,y = player.x-mob.x,player.y-mob.y
+ local angle = atan(y/x)
+ if x < 0 then
+ angle = angle+pi
+ elseif y < 0 then
+ angle = angle+2*pi
+ end
+ local next45angle = math.ceil((angle+pi/8)/(pi/4))
+ if next45angle ~= last45angle then
+ if next45angle ~= nil and last45angle ~=nil then
+ arrow_map[last45angle]:color(255,255,255)
+ arrow_map[next45angle]:color(255,0,0)
+ last45angle = next45angle
+ end
+ end
+ local heading = mob.facing
+ if heading < 0 then
+ heading = -heading
+ else
+ heading = 2*pi-heading
+ end
+
+ heading = heading - angle
+
+ local next16angle = math.ceil((heading+pi/16)/(pi/8))
+ if next16angle ~= last16angle then
+ sas:text(direction[next16angle])
+ last16angle = next16angle
+ end
+ end
+ end)
+end