Divergent/mods/Western Goods/gamedata/scripts/western_goods_bind_object.s...

162 lines
7.7 KiB
Plaintext

---==================================================================================================================---
--- ---
--- Original Author(s) : NLTP_ASHES, Aoldri ---
--- Edited : N/A ---
--- Date : 17/02/2024 ---
--- License : Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) ---
--- ---
--- Script used to bind a game_object to a luabind class, to enable specific scripted behaviors. ---
--- ---
--- This wrapper exists because it isn't possible to have inheritance of more than one level of depth with engine ---
--- classes. In other words, let -> mark an inheritance, lua -> lua -> c++ breaks for some weird reason. ---
--- ---
--- This wrapper basically delegates the calls to an inner class (called wrapper). This inner class is a "pure" ---
--- LUA class, meaning it does not directly, or indirectly inherit an engine class. This allows to have as many ---
--- levels of depth as we want, thus resolving the issue. ---
--- ---
--- This wrapper class thing was heavily inspired by Aoldri's implementation in Hideout Furniture addon. ---
--- ---
--- Bellow is an minimal example of how to use this custom wrapped binder. ---
--- ---
---=== gamedata/scripts/my_addon_s_script.script ====================================================================---
--- ---
--- function bind(obj) ---
--- obj:bind_object(child_binder(obj).binder) -- main difference is here. you must add .binder ---
--- end ---
--- ---
--- class "child_binder" (western_goods_bind_object.object_binder_lua) ---
--- ---
--- function child_binder:__init(obj) super(obj) ---
--- printf("child_binder's __init runs properly") ---
--- end ---
--- ---
--- function child_binder:update(delta) ---
--- bind_object_wrapper.lua_object_binder.update(self, delta) ---
--- printf("child_binder's update runs properly") ---
--- end ---
--- ---
---==================================================================================================================---
--- ---
---==================================================================================================================---
-- ---------------------------------------------------------------------------------------------------------------------
-- Pure LUA Object Binder Class
-- ---------------------------------------------------------------------------------------------------------------------
class "object_binder_lua"
function object_binder_lua:__init(obj)
self.binder = this.object_binder_wrapper(obj)
self.binder.wrapper = self
self.object = obj
end
function object_binder_lua:__finalize()
end
function object_binder_lua:reinit()
end
function object_binder_lua:reload(section)
end
function object_binder_lua:net_spawn(se_abstract)
return true
end
function object_binder_lua:net_destroy()
self.binder.wrapper = nil
self.binder = nil
self.object = nil
end
function object_binder_lua:net_import(net_packet)
end
function object_binder_lua:net_export(net_packet)
end
function object_binder_lua:update(delta)
end
function object_binder_lua:save(output_packet)
end
function object_binder_lua:load(input_packet)
end
function object_binder_lua:net_save_relevant()
end
function object_binder_lua:net_Relcase(obj)
end
-- ---------------------------------------------------------------------------------------------------------------------
-- Object Binder Wrapper Class
-- ---------------------------------------------------------------------------------------------------------------------
class "object_binder_wrapper" (object_binder)
function object_binder_wrapper:__init(obj) super(obj)
self.wrapper = nil
end
function object_binder_wrapper:__finalize()
end
function object_binder_wrapper:reinit()
object_binder.reinit(self)
self.wrapper:reinit()
end
function object_binder_wrapper:reload(section)
object_binder.reload(self, section)
self.wrapper:reload(section)
end
function object_binder_wrapper:net_spawn(se_abstract)
if not object_binder.net_spawn(self, se_abstract) then
return false
end
return self.wrapper:net_spawn(se_abstract)
end
function object_binder_wrapper:net_destroy()
self.wrapper:net_destroy()
object_binder.net_destroy(self)
end
function object_binder_wrapper:net_import(net_packet)
object_binder.net_import(self, net_packet)
self.wrapper:net_import(net_packet)
end
function object_binder_wrapper:net_export(net_packet)
object_binder.net_export(self, net_packet)
self.wrapper:net_export(net_packet)
end
function object_binder_wrapper:update(delta)
object_binder.update(self, delta)
self.wrapper:update(delta)
end
function object_binder_wrapper:save(output_packet)
object_binder.save(self, output_packet)
self.wrapper:save(output_packet)
end
function object_binder_wrapper:load(input_packet)
object_binder.load(self, input_packet)
self.wrapper:load(input_packet)
end
function object_binder_wrapper:net_save_relevant()
object_binder.net_save_relevant(self)
self.wrapper:net_save_relevant()
end
function object_binder_wrapper:net_Relcase(obj)
object_binder.net_Relcase(self, obj)
self.wrapper:net_Relcase(obj)
end