Allows players to filter their widescan results, by name, to quickly and easily find their desired target.
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.
172 lines
6.4 KiB
172 lines
6.4 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 = 'filterscan'; |
|
_addon.version = '3.0.0'; |
|
|
|
require 'common' |
|
require 'mobparse' |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- Variables |
|
--------------------------------------------------------------------------------------------------- |
|
local FilterScan = |
|
{ |
|
FFXiPath = ashita.file.get_install_dir(0, 1) .. '\\', |
|
MobList = { }, |
|
ZoneDatList = require('zonemoblist'), |
|
Filter = { } |
|
}; |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: UpdateZoneMobList |
|
-- desc: Updates the zone mob list. |
|
--------------------------------------------------------------------------------------------------- |
|
local function UpdateZoneMobList(zoneId) |
|
-- Attempt to get the dat file for this entry.. |
|
local dat = FilterScan.ZoneDatList[zoneId]; |
|
if (dat == nil) then |
|
FilterScan.MobList = { }; |
|
return false; |
|
end |
|
|
|
-- Attempt to parse the dat file.. |
|
FilterScan.MobList = ParseZoneMobDat(FilterScan.FFXiPath .. dat); |
|
return true; |
|
end |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: MobNameFromTargetIndex |
|
-- desc: Returns the mob name from the given target index. |
|
--------------------------------------------------------------------------------------------------- |
|
local function MobNameFromTargetIndex(targetIndex) |
|
if (FilterScan.MobList == nil) then |
|
return nil; |
|
end |
|
for _, v in pairs(FilterScan.MobList) do |
|
if (v[1] == targetIndex) then |
|
return v[2]; |
|
end |
|
end |
|
return nil; |
|
end |
|
|
|
---------------------------------------------------------------------------------------------------- |
|
-- func: load |
|
-- desc: Event called when the addon is being loaded. |
|
---------------------------------------------------------------------------------------------------- |
|
ashita.register_event('load', function() |
|
-- Parse the players current zone if we are in-game.. |
|
if (AshitaCore:GetDataManager():GetParty():GetMemberActive(0) > 0) then |
|
local zoneId = AshitaCore:GetDataManager():GetParty():GetMemberZone(0); |
|
UpdateZoneMobList(zoneId); |
|
print('Loaded zone mobs.') |
|
end |
|
end); |
|
|
|
---------------------------------------------------------------------------------------------------- |
|
-- func: command |
|
-- desc: Event called when a command was entered. |
|
---------------------------------------------------------------------------------------------------- |
|
ashita.register_event('command', function(command, ntype) |
|
-- Ensure we should handle this command.. |
|
local args = command:args(); |
|
if (args[1] ~= '/filterscan') then |
|
return false; |
|
end |
|
|
|
-- the list of targets gets reset anytime the cmd is called. calling w/o params will 'disable' the filter |
|
FilterScan.Filter = { } |
|
|
|
-- pull the target mobs from the arg and split them into the list |
|
local filter = (string.gsub(command, '/filterscan', '')):trim() |
|
|
|
for target in string.gmatch(filter, "[^,]+") do |
|
if (target ~= nil) then |
|
table.insert(FilterScan.Filter, target:lower():trim()) |
|
end |
|
end |
|
|
|
print(string.format('[FilterScan] Set new filter to: %s', filter)); |
|
return true; |
|
end); |
|
|
|
--------------------------------------------------------------------------------------------------- |
|
-- func: incoming_packet |
|
-- desc: Called when our addon receives an incoming packet. |
|
--------------------------------------------------------------------------------------------------- |
|
ashita.register_event('incoming_packet', function(id, size, data) |
|
-- Check for zone-in packets.. |
|
if (id == 0x0A) then |
|
-- Are we zoning into a mog house.. |
|
if (struct.unpack('b', data, 0x80 + 1) == 1) then |
|
return false; |
|
end |
|
|
|
-- Pull the zone id from the packet.. |
|
local zoneId = struct.unpack('H', data, 0x30 + 1); |
|
if (zoneId == 0) then |
|
zoneId = struct.unpack('H', data, 0x42 + 1); |
|
end |
|
|
|
-- Update our mob list.. |
|
UpdateZoneMobList(zoneId); |
|
end |
|
|
|
-- Handle incoming widescan result packets.. |
|
if (id == 0xF4) then |
|
local targetIndex = struct.unpack('H', data, 0x04 + 1); |
|
local mobName = MobNameFromTargetIndex(targetIndex); |
|
|
|
if (mobName == nil) then |
|
return false; |
|
else |
|
|
|
-- there is nothing in the filter list, so you get all the entities |
|
if (table.getn(FilterScan.Filter) == 0) then |
|
return false |
|
end |
|
|
|
local mob = mobName:lower() |
|
local idx_s = tostring(targetIndex) |
|
|
|
for _, target in pairs(FilterScan.Filter) do |
|
if (mob:find(target) ~= nil or targetIndex == tonumber(target, 16) or idx_s == target) then |
|
-- the mob has matched an item in the filter |
|
return false |
|
end |
|
end |
|
|
|
-- Ignore all non-matching entries.. |
|
return true; |
|
end |
|
|
|
-- This should never happen here.. |
|
return true; |
|
end |
|
|
|
return false; |
|
end); |