227 lines
9.8 KiB
Plaintext
227 lines
9.8 KiB
Plaintext
|
---==================================================================================================================---
|
||
|
--- ---
|
||
|
--- Original Author(s) : NLTP_ASHES ---
|
||
|
--- Edited : N/A ---
|
||
|
--- Date : 20/02/2024 ---
|
||
|
--- License : Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) ---
|
||
|
--- ---
|
||
|
--- Script used to monkey-patch some functions of base anomaly, or other addons. ---
|
||
|
--- ---
|
||
|
---==================================================================================================================---
|
||
|
|
||
|
-- ---------------------------------------------------------------------------------------------------------------------
|
||
|
-- Constants, global variables and imported functions
|
||
|
-- ---------------------------------------------------------------------------------------------------------------------
|
||
|
|
||
|
-- New callbacks
|
||
|
AddScriptCallback("western_goods_on_campfire_use")
|
||
|
AddScriptCallback("western_goods_on_item_before_use")
|
||
|
AddScriptCallback("western_goods_on_hideout_furniture_light_use")
|
||
|
|
||
|
-- Imported functions
|
||
|
local dbg_printf = western_goods_utils.dbg_printf
|
||
|
|
||
|
-- Configuration
|
||
|
monkey_patches = {
|
||
|
hideout_furniture_light = {
|
||
|
name = "hideout_furniture_light",
|
||
|
patches = {
|
||
|
{ prio=1, script="ui_furniture_light", func="toggle_light", cond = function() return western_goods_core.is_hideout_furniture_installed() end }
|
||
|
}
|
||
|
},
|
||
|
item_before_use = {
|
||
|
name = "item_before_use",
|
||
|
patches = {
|
||
|
{ prio=1, script="itms_manager", func="actor_on_item_before_use", cond = function() return true end },
|
||
|
{ prio=2, script="enhanced_animations", func="originalAOIBU", cond = function() return western_goods_core.is_fdda_installed() end }
|
||
|
}
|
||
|
},
|
||
|
campfire_on_interact = {
|
||
|
name = "campfire_on_interact",
|
||
|
patches = {
|
||
|
{ prio=1, script="western_goods_core", func="use_campfire", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
trader_autoinject_update = {
|
||
|
name = "trader_autoinject_update",
|
||
|
patches = {
|
||
|
{ prio=1, script="trader_autoinject", func="update", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
death_manager_spawn_cosmetics = {
|
||
|
name = "death_manager_spawn_cosmetics",
|
||
|
patches = {
|
||
|
{ prio=1, script="death_manager", func="spawn_cosmetics", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
trade_manager_update = {
|
||
|
name = "trade_manager_update",
|
||
|
patches = {
|
||
|
{ prio=1, script="trade_manager", func="update", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
barter_ui_gui_on_show = {
|
||
|
name = "barter_ui_gui_on_show",
|
||
|
patches = {
|
||
|
{ prio=1, script="barter_ui", func="GUI_on_show", cond = function() return western_goods_core.is_barter_ui_installed() end }
|
||
|
}
|
||
|
},
|
||
|
ui_inventory_update_character = {
|
||
|
name = "ui_inventory_update_character",
|
||
|
patches = {
|
||
|
{ prio=1, script="ui_inventory", class="UIInventory", func="UpdateCharacter", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
ui_inventory_t_mode_update_price = {
|
||
|
name = "ui_inventory_t_mode_update_price",
|
||
|
patches = {
|
||
|
{ prio=1, script="ui_inventory", class="UIInventory", func="TMode_UpdatePrice", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
ui_inventory_t_mode_sell = {
|
||
|
name = "ui_inventory_t_mode_sell",
|
||
|
patches = {
|
||
|
{ prio=1, script="ui_inventory", class="UIInventory", func="TMode_Sell", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
ui_inventory_t_mode_buy = {
|
||
|
name = "ui_inventory_t_mode_buy",
|
||
|
patches = {
|
||
|
{ prio=1, script="ui_inventory", class="UIInventory", func="TMode_Buy", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
surge_manager_get_task_target = {
|
||
|
name = "surge_manager_get_task_target",
|
||
|
patches = {
|
||
|
{ prio=1, script="surge_manager", func="get_task_target", cond = function() return true end }
|
||
|
}
|
||
|
},
|
||
|
arszi_psy_get_psy_health_regeneration = {
|
||
|
name = "arszi_psy_get_psy_health_regeneration",
|
||
|
patches = {
|
||
|
{ prio=1, script="arszi_psy", func="get_psy_health_regeneration", cond = function() return true end }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-- ---------------------------------------------------------------------------------------------------------------------
|
||
|
-- Functions
|
||
|
-- ---------------------------------------------------------------------------------------------------------------------
|
||
|
|
||
|
function find_best_monkey_patch(monkey_patch_group)
|
||
|
-- Filter out invalid monkey-patches (keep only ones that can be executed)
|
||
|
local valid_patches = {}
|
||
|
for _,patch in pairs(monkey_patch_group.patches) do
|
||
|
if patch.cond() then
|
||
|
table.insert(valid_patches, patch)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Find highest priority-monkey patch
|
||
|
local monkey_patch = nil
|
||
|
for idx,patch in pairs(valid_patches) do
|
||
|
monkey_patch = monkey_patch or patch
|
||
|
if monkey_patch.prio <= patch.prio then
|
||
|
monkey_patch = patch
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if not monkey_patch then
|
||
|
dbg_printf("[WG] Fire Source Binder | No applicable monkey-patch for %s", monkey_patch_group.name)
|
||
|
return
|
||
|
end
|
||
|
|
||
|
return monkey_patch
|
||
|
end
|
||
|
|
||
|
function make_monkey_patch(monkey_patch_group, func)
|
||
|
local monkey_patch = this.find_best_monkey_patch(monkey_patch_group)
|
||
|
if not monkey_patch then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- Variabilized to fix a highlight bug in my IDE
|
||
|
local script_name = monkey_patch.script
|
||
|
local class_name = monkey_patch.class
|
||
|
local function_name = monkey_patch.func
|
||
|
|
||
|
if class_name then
|
||
|
dbg_printf("[WG] Fire Source Binder | Monkey-patching %s function from class %s in %s.script", function_name, class_name, script_name)
|
||
|
this[monkey_patch_group.name] = _G[script_name][class_name][function_name]
|
||
|
_G[script_name][class_name][function_name] = func
|
||
|
else
|
||
|
dbg_printf("[WG] Fire Source Binder | Monkey-patching %s function in %s.script", function_name, script_name)
|
||
|
this[monkey_patch_group.name] = _G[script_name][function_name]
|
||
|
_G[script_name][function_name] = func
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- ---------------------------------------------------------------------------------------------------------------------
|
||
|
-- Monkey-patches
|
||
|
-- ---------------------------------------------------------------------------------------------------------------------
|
||
|
|
||
|
make_monkey_patch(monkey_patches.hideout_furniture_light, function(obj_id)
|
||
|
local is_on_before = hf_obj_manager.get_data(obj_id).is_on
|
||
|
this.hideout_furniture_light(obj_id)
|
||
|
local is_on_after = hf_obj_manager.get_data(obj_id).is_on
|
||
|
if not is_on_before and not is_on_after then
|
||
|
SendScriptCallback("western_goods_on_hideout_furniture_light_use", obj_id)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.item_before_use, function(obj, flags)
|
||
|
this.item_before_use(obj, flags)
|
||
|
SendScriptCallback("western_goods_on_item_before_use", obj, flags)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.campfire_on_interact, function()
|
||
|
this.campfire_on_interact()
|
||
|
SendScriptCallback("western_goods_on_campfire_use")
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.trader_autoinject_update, function(npc)
|
||
|
this.trader_autoinject_update(npc)
|
||
|
western_goods_loot.spawn_trader_loot(npc)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.death_manager_spawn_cosmetics, function(npc, npc_id, npc_comm, npc_rank, visual, rand_condition)
|
||
|
this.death_manager_spawn_cosmetics(npc, npc_id, npc_comm, npc_rank, visual, rand_condition)
|
||
|
western_goods_loot.spawn_corpse_loot(npc, npc_rank, npc_comm)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.trade_manager_update, function(npc, force_refresh)
|
||
|
western_goods_trade_eur_usd.trade_manager_update(npc, force_refresh)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.ui_inventory_update_character, function(self)
|
||
|
this.ui_inventory_update_character(self)
|
||
|
western_goods_trade_eur_usd.ui_inventory_UIInventory_UpdateCharacter(self)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.ui_inventory_t_mode_update_price, function(self, ele_txt, ele_btn, bag)
|
||
|
this.ui_inventory_t_mode_update_price(self, ele_txt, ele_btn, bag)
|
||
|
western_goods_trade_eur_usd.ui_inventory_UIInventory_TMode_UpdatePrice(self, ele_txt, ele_btn, bag)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.ui_inventory_t_mode_sell, function(self)
|
||
|
western_goods_trade_eur_usd.ui_inventory_UIInventory_TMode_Sell(self)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.ui_inventory_t_mode_buy, function(self)
|
||
|
western_goods_trade_eur_usd.ui_inventory_UIInventory_TMode_Buy(self)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.barter_ui_gui_on_show, function(name, path)
|
||
|
western_goods_trade_eur_usd.barter_ui_gui_on_show(name, path)
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.surge_manager_get_task_target, function()
|
||
|
return western_goods_ui_gps_locator.surge_manager_get_task_target()
|
||
|
end)
|
||
|
|
||
|
make_monkey_patch(monkey_patches.arszi_psy_get_psy_health_regeneration, function()
|
||
|
local base_psy_heal = this.arszi_psy_get_psy_health_regeneration() or 0
|
||
|
local bonus_psy_heal_magazine = western_goods_ui_readable.get_psy_health_regeneration_magazine() or 0
|
||
|
return base_psy_heal + bonus_psy_heal_magazine
|
||
|
end)
|