|
|
|
--[[
|
|
|
|
* Ashita - Copyright (c) 2014 - 2016 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.
|
|
|
|
]]--
|
|
|
|
|
|
|
|
_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);
|