commit cb8d9f74f2e62dfaf9858ed10ca1c1d6522ab6ee Author: atom0s Date: Thu Jan 12 11:52:47 2017 -0800 Initial code commit. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c9e322 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# checker + +Overrides the response displayed when checking a monster for its difficulty. Colorizes the message based on the type (easy prey, tough, etc.). Also includes displaying monsters levels (including NMs). + +For NM levels to show, you must widescan first! \ No newline at end of file diff --git a/checker.lua b/checker.lua new file mode 100644 index 0000000..77dab15 --- /dev/null +++ b/checker.lua @@ -0,0 +1,152 @@ +--[[ +* Ashita - Copyright (c) 2014 - 2017 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 & Lolwutt'; +_addon.name = 'Checker'; +_addon.version = '3.0.0'; + +require 'common' + +--------------------------------------------------------------------------------------------------- +-- Check Condition Table +--------------------------------------------------------------------------------------------------- +local conditions = +{ + { 0xAA, '\31\200(\31\130High Evasion, High Defense\31\200)'}, + { 0xAB, '\31\200(\31\130High Evasion\31\200)' }, + { 0xAC, '\31\200(\31\130High Evasion, Low Defense\31\200)' }, + { 0xAD, '\31\200(\31\130High Defense\31\200)' }, + { 0xAE, '' }, + { 0xAF, '\31\200(\31\130Low Defense\31\200)' }, + { 0xB0, '\31\200(\31\130Low Evasion, High Defense\31\200)' }, + { 0xB1, '\31\200(\31\130Low Evasion\31\200)' }, + { 0xB2, '\31\200(\31\130Low Evasion, Low Defense\31\200)' }, +}; + +--------------------------------------------------------------------------------------------------- +-- Check Type Table +--------------------------------------------------------------------------------------------------- +local checktype = +{ + { 0x40, '\30\02too weak to be worthwhile' }, + { 0x41, '\30\02like incredibly easy prey' }, + { 0x42, '\30\02like easy prey' }, + { 0x43, '\30\102like a decent challenge' }, + { 0x44, '\30\08like an even match' }, + { 0x45, '\30\68tough' }, + { 0x46, '\30\76very tough' }, + { 0x47, '\30\76incredibly tough' } +}; + +--------------------------------------------------------------------------------------------------- +-- Widescan Storage Data +--------------------------------------------------------------------------------------------------- +local widescan = { }; + +--------------------------------------------------------------------------------------------------- +-- func: incoming_packet +-- desc: Called when our addon receives an incoming packet. +--------------------------------------------------------------------------------------------------- +ashita.register_event('incoming_packet', function(id, size, data) + -- Zone Change Packet + if (id == 0x000A) then + -- Reset the widescan data.. + widescan = { }; + return false; + end + + -- Message Basic Packet + if (id == 0x0029) then + local p = struct.unpack('l', data, 0x0C + 1); -- Monster Level + local v = struct.unpack('L', data, 0x10 + 1); -- Check Type + local m = struct.unpack('H', data, 0x18 + 1); -- Defense and Evasion + + local ctype = nil; + local ccond = nil; + + -- Obtain the check type and condition string.. + for k, vv in pairs(checktype) do + if (vv[1] == v) then + ctype = vv[2]; + end + end + for k, vv in pairs(conditions) do + if (vv[1] == m) then + ccond = vv[2]; + end + end + + -- Check for impossible to gauge.. + if (m == 0xF9) then + ctype = ''; + ccond = ''; + end + + -- Ensure a check type and condition was found.. + if (ctype == nil or ccond == nil) then + return false; + end + + -- Obtain the target entity.. + local target = struct.unpack('H', data, 0x16 + 1); + local entity = GetEntity(target); + if (entity == nil) then + return false; + end + + -- Check the level for overrides from widescan.. + if (p <= 0) then + local l = widescan[target]; + if (l ~= nil) then + p = l; + end + end + + -- Print out based on NM or not.. + if (m == 0xF9) then + local lvl = '???'; + if (p > 0) then + lvl = tostring(p); + end + print(string.format('\31\200[\30\82checker\31\200] \31\130%s \30\82%s\31\130 \31\200(Lv. \30\82%s\31\200) \30\05Impossible to gauge!', entity.Name, string.char(0x81, 0xA8), lvl)); + else + print(string.format('\31\200[\30\82checker\31\200] \31\130%s \30\82%s\31\130 \31\200(Lv. \30\82%d\31\200) \31\130Seems %s\31\130. %s', entity.Name, string.char(0x81, 0xA8), p, ctype, ccond)); + end + + return true; + end + + -- Widescan Result Packet + if (id == 0x00F4) then + local i = struct.unpack('H', data, 0x04 + 1); -- Entity Index + local l = struct.unpack('b', data, 0x06 + 1); -- Entity Level + + -- Store the index and level information.. + widescan[i] = l; + return false; + end + + return false; +end); \ No newline at end of file