From 0d09bb04904c01aaf7670172d9a2ca75b2ee147a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20P=C3=A9rez-Cerezo?= Date: Sun, 12 Nov 2017 13:49:37 +0100 Subject: Added license and modularized --- LICENSE | 22 ++++++++ fakeplayer.lua | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ init.lua | 171 ++------------------------------------------------------ 3 files changed, 199 insertions(+), 167 deletions(-) create mode 100644 LICENSE create mode 100644 fakeplayer.lua diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0184e79 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +Copyright (C) 2017 Gabriel Pérez-Cerezo +fakeplayer.lua: (C) 2017 FaceDeer + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/fakeplayer.lua b/fakeplayer.lua new file mode 100644 index 0000000..d56f29a --- /dev/null +++ b/fakeplayer.lua @@ -0,0 +1,173 @@ +-- mostly taken from the digtron mod + +-- Copyright (C) 2017 FaceDeer, licensed under MIT license + +-- The purpose of this class is to have something that can be passed into callbacks that +-- demand a "Player" object as a parameter and hopefully prevent the mods that have +-- registered with those callbacks from crashing on a nil dereference or bad function +-- call. This is not supposed to be a remotely functional thing, it's just supposed +-- to provide dummy methods and return values of the correct data type for anything that +-- might ignore the false "is_player()" return and go ahead and try to use this thing +-- anyway. + +-- I'm trying to patch holes in bad mod programming, essentially. If a mod is so badly +-- programmed that it crashes anyway there's not a lot else I can do on my end of things. + + + +feedlotFakePlayer = {} +feedlotFakePlayer.__index = feedlotFakePlayer + +local function return_value(x) + return (function() return x end) +end + +local function return_nil() + return nil +end + +local function return_empty_string() + return "" +end + +local function return_zero() + return 0 +end + +local function return_empty_table() + return {} +end + +function feedlotFakePlayer.update(self, pos, player_name) + self.is_fake_player = ":digtron " .. player_name + self.get_pos = return_value(pos) +end +local function get_feed (pos) + return function () + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv or not inv:get_list("main") then + return ItemStack(nil) + end + -- minetest.chat_send_all(inv:get_stack("main", 1):get_name()) + return inv:get_stack("main", 1) + end +end +local function set_feed (pos) + return function (_, stack) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_stack("main", 1, stack) + return + end +end + +function feedlotFakePlayer.create(pos, player_name) + local self = {} + setmetatable(self, feedlotFakePlayer) + + self.is_fake_player = ":digtron " .. player_name + + -- ObjectRef + self.get_pos = return_value(pos) + self.set_pos = return_nil + self.move_to = return_nil + self.punch = return_nil + self.right_click = return_nil + self.get_hp = return_value(10) + self.set_hp = return_nil + self.get_inventory = return_nil -- returns an `InvRef` + self.get_wield_list = return_empty_string + self.get_wield_index = return_value(1) +-- self.get_wielded_item = return_value(ItemStack(nil)) + self.get_wielded_item = get_feed(pos) + self.set_wielded_item = set_feed(pos) + + self.set_armor_groups = return_nil + self.get_armor_groups = return_empty_table + self.set_animation = return_nil + self.get_animation = return_nil -- a set of values, maybe important? + self.set_attach = return_nil + self.get_attach = return_nil + self.set_detach = return_nil + self.set_bone_position = return_nil + self.get_bone_position = return_nil + self.set_properties = return_nil + self.get_properties = return_empty_table + + self.is_player = return_value(false) + + self.get_nametag_attributes = return_empty_table + self.set_nametag_attributes = return_nil + + --LuaEntitySAO + self.set_velocity = return_nil + self.get_velocity = return_value({x=0,y=0,z=0}) + self.set_acceleration = return_nil + self.get_acceleration = return_value({x=0,y=0,z=0}) + self.set_yaw = return_nil + self.get_yaw = return_zero + self.set_texture_mod = return_nil + self.get_texture_mod = return_nil -- maybe important? + self.set_sprite = return_nil + --self.get_entity_name` (**Deprecated**: Will be removed in a future version) + self.get_luaentity = return_nil + + -- Player object + + self.get_player_name = return_empty_string + self.get_player_velocity = return_nil + self.get_look_dir = return_value({x=0,y=1,z=0}) + self.get_look_horizontal = return_zero + self.set_look_horizontal = return_nil + self.get_look_vertical = return_zero + self.set_look_vertical = return_nil + + --self.get_look_pitch`: pitch in radians - Deprecated as broken. Use `get_look_vertical` + --self.get_look_yaw`: yaw in radians - Deprecated as broken. Use `get_look_horizontal` + --self.set_look_pitch(radians)`: sets look pitch - Deprecated. Use `set_look_vertical`. + --self.set_look_yaw(radians)`: sets look yaw - Deprecated. Use `set_look_horizontal`. + self.get_breath = return_value(10) + self.set_breath = return_nil + self.get_attribute = return_nil + self.set_attribute = return_nil + + self.set_inventory_formspec = return_nil + self.get_inventory_formspec = return_empty_string + self.get_player_control = return_value({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=false, aux1=false, down=false, up=false} ) + self.get_player_control_bits = return_zero + + self.set_physics_override = return_nil + self.get_physics_override = return_value({speed = 1, jump = 1, gravity = 1, sneak = true, sneak_glitch = false, new_move = true,}) + + + self.hud_add = return_nil + self.hud_remove = return_nil + self.hud_change = return_nil + self.hud_get = return_nil -- possibly important return value? + self.hud_set_flags = return_nil + self.hud_get_flags = return_value({ hotbar=true, healthbar=true, crosshair=true, wielditem=true, breathbar=true, minimap=true }) + self.hud_set_hotbar_itemcount = return_nil + self.hud_get_hotbar_itemcount = return_zero + self.hud_set_hotbar_image = return_nil + self.hud_get_hotbar_image = return_empty_string + self.hud_set_hotbar_selected_image = return_nil + self.hud_get_hotbar_selected_image = return_empty_string + self.set_sky = return_nil + self.get_sky = return_empty_table -- may need members on this table + + self.set_clouds = return_nil + self.get_clouds = return_value({density = 0, color = "#fff0f0e5", ambient = "#000000", height = 120, thickness = 16, speed = {x=0, y=-2}}) + + self.override_day_night_ratio = return_nil + self.get_day_night_ratio = return_nil + + self.set_local_animation = return_nil + self.get_local_animation = return_empty_table + + self.set_eye_offset = return_nil + self.get_eye_offset = return_value({x=0,y=0,z=0},{x=0,y=0,z=0}) + + return self +end + diff --git a/init.lua b/init.lua index 6480887..26aa1d9 100644 --- a/init.lua +++ b/init.lua @@ -1,170 +1,7 @@ --- The purpose of this class is to have something that can be passed into callbacks that --- demand a "Player" object as a parameter and hopefully prevent the mods that have --- registered with those callbacks from crashing on a nil dereference or bad function --- call. This is not supposed to be a remotely functional thing, it's just supposed --- to provide dummy methods and return values of the correct data type for anything that --- might ignore the false "is_player()" return and go ahead and try to use this thing --- anyway. - --- I'm trying to patch holes in bad mod programming, essentially. If a mod is so badly --- programmed that it crashes anyway there's not a lot else I can do on my end of things. - -DigtronFakePlayer = {} -DigtronFakePlayer.__index = DigtronFakePlayer - -local function return_value(x) - return (function() return x end) -end - -local function return_nil() - return nil -end - -local function return_empty_string() - return "" -end - -local function return_zero() - return 0 -end - -local function return_empty_table() - return {} -end - -function DigtronFakePlayer.update(self, pos, player_name) - self.is_fake_player = ":digtron " .. player_name - self.get_pos = return_value(pos) -end -local function get_feed (pos) - return function () - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if not inv or not inv:get_list("main") then - return ItemStack(nil) - end - -- minetest.chat_send_all(inv:get_stack("main", 1):get_name()) - return inv:get_stack("main", 1) - end -end -local function set_feed (pos) - return function (_, stack) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_stack("main", 1, stack) - return - end -end - -function DigtronFakePlayer.create(pos, player_name) - local self = {} - setmetatable(self, DigtronFakePlayer) - - self.is_fake_player = ":digtron " .. player_name - - -- ObjectRef - self.get_pos = return_value(pos) - self.set_pos = return_nil - self.move_to = return_nil - self.punch = return_nil - self.right_click = return_nil - self.get_hp = return_value(10) - self.set_hp = return_nil - self.get_inventory = return_nil -- returns an `InvRef` - self.get_wield_list = return_empty_string - self.get_wield_index = return_value(1) --- self.get_wielded_item = return_value(ItemStack(nil)) - self.get_wielded_item = get_feed(pos) - self.set_wielded_item = set_feed(pos) - - self.set_armor_groups = return_nil - self.get_armor_groups = return_empty_table - self.set_animation = return_nil - self.get_animation = return_nil -- a set of values, maybe important? - self.set_attach = return_nil - self.get_attach = return_nil - self.set_detach = return_nil - self.set_bone_position = return_nil - self.get_bone_position = return_nil - self.set_properties = return_nil - self.get_properties = return_empty_table - - self.is_player = return_value(false) - - self.get_nametag_attributes = return_empty_table - self.set_nametag_attributes = return_nil - - --LuaEntitySAO - self.set_velocity = return_nil - self.get_velocity = return_value({x=0,y=0,z=0}) - self.set_acceleration = return_nil - self.get_acceleration = return_value({x=0,y=0,z=0}) - self.set_yaw = return_nil - self.get_yaw = return_zero - self.set_texture_mod = return_nil - self.get_texture_mod = return_nil -- maybe important? - self.set_sprite = return_nil - --self.get_entity_name` (**Deprecated**: Will be removed in a future version) - self.get_luaentity = return_nil - - -- Player object - - self.get_player_name = return_empty_string - self.get_player_velocity = return_nil - self.get_look_dir = return_value({x=0,y=1,z=0}) - self.get_look_horizontal = return_zero - self.set_look_horizontal = return_nil - self.get_look_vertical = return_zero - self.set_look_vertical = return_nil - - --self.get_look_pitch`: pitch in radians - Deprecated as broken. Use `get_look_vertical` - --self.get_look_yaw`: yaw in radians - Deprecated as broken. Use `get_look_horizontal` - --self.set_look_pitch(radians)`: sets look pitch - Deprecated. Use `set_look_vertical`. - --self.set_look_yaw(radians)`: sets look yaw - Deprecated. Use `set_look_horizontal`. - self.get_breath = return_value(10) - self.set_breath = return_nil - self.get_attribute = return_nil - self.set_attribute = return_nil - - self.set_inventory_formspec = return_nil - self.get_inventory_formspec = return_empty_string - self.get_player_control = return_value({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=false, aux1=false, down=false, up=false} ) - self.get_player_control_bits = return_zero - - self.set_physics_override = return_nil - self.get_physics_override = return_value({speed = 1, jump = 1, gravity = 1, sneak = true, sneak_glitch = false, new_move = true,}) - - - self.hud_add = return_nil - self.hud_remove = return_nil - self.hud_change = return_nil - self.hud_get = return_nil -- possibly important return value? - self.hud_set_flags = return_nil - self.hud_get_flags = return_value({ hotbar=true, healthbar=true, crosshair=true, wielditem=true, breathbar=true, minimap=true }) - self.hud_set_hotbar_itemcount = return_nil - self.hud_get_hotbar_itemcount = return_zero - self.hud_set_hotbar_image = return_nil - self.hud_get_hotbar_image = return_empty_string - self.hud_set_hotbar_selected_image = return_nil - self.hud_get_hotbar_selected_image = return_empty_string - self.set_sky = return_nil - self.get_sky = return_empty_table -- may need members on this table - - self.set_clouds = return_nil - self.get_clouds = return_value({density = 0, color = "#fff0f0e5", ambient = "#000000", height = 120, thickness = 16, speed = {x=0, y=-2}}) - - self.override_day_night_ratio = return_nil - self.get_day_night_ratio = return_nil - - self.set_local_animation = return_nil - self.get_local_animation = return_empty_table - - self.set_eye_offset = return_nil - self.get_eye_offset = return_value({x=0,y=0,z=0},{x=0,y=0,z=0}) - - return self -end +-- feedlot mod Copyright (C) 2017 Gabriel Pérez-Cerezo +local modpath = minetest.get_modpath( "feedlot" ) +dofile(modpath.."/fakeplayer.lua") local function get_formspec(pos) local spos = pos.x .. "," ..pos.y .. "," .. pos.z @@ -242,7 +79,7 @@ minetest.register_abm({ chance = 1, action = function (pos) - local fake_player = DigtronFakePlayer.create(pos, "fake_player") + local fake_player = feedlotFakePlayer.create(pos, "fake_player") local objs = minetest.get_objects_inside_radius(pos, 3) for _,obj in ipairs(objs) do if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0 and is_mob(obj) then -- cgit v1.2.3