summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>2017-11-12 13:40:56 +0100
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>2017-11-12 13:40:56 +0100
commit50f857eb3341d69e256676954a95a2300c19662a (patch)
treec9196d112e44f9af6a42051ecc28d800f88928d6
downloadfeedlot-50f857eb3341d69e256676954a95a2300c19662a.tar.gz
feedlot-50f857eb3341d69e256676954a95a2300c19662a.tar.bz2
feedlot-50f857eb3341d69e256676954a95a2300c19662a.zip
Initial commit
-rw-r--r--depends.txt2
-rw-r--r--init.lua263
-rw-r--r--textures/feedlot_feed.pngbin0 -> 514 bytes
3 files changed, 265 insertions, 0 deletions
diff --git a/depends.txt b/depends.txt
new file mode 100644
index 0000000..393de54
--- /dev/null
+++ b/depends.txt
@@ -0,0 +1,2 @@
+mobs
+default
diff --git a/init.lua b/init.lua
new file mode 100644
index 0000000..6480887
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,263 @@
+-- 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
+
+
+local function get_formspec(pos)
+ local spos = pos.x .. "," ..pos.y .. "," .. pos.z
+ local xbg = default.gui_bg .. default.gui_bg_img .. default.gui_slots
+-- local detached_inv = minetest.create_detached_inventory("mailbox_"..owner)
+ return "size[8,5.5]" .. xbg .. default.get_hotbar_bg(0, 1.5) ..
+ "label[0,0;Feedlot]" ..
+ "list[nodemeta:" .. spos .. ";main;3.5,0;1,1;]" ..
+ "list[current_player;main;0,1.5;8,1;]" ..
+ "list[current_player;main;0,2.75;8,3;8]" ..
+-- "listring[detached:mailbox_" .. owner .. ";drop]" ..
+ "listring[current_player;main]"
+end
+
+minetest.register_node("feedlot:feedlot", {
+ description = "Feedlot",
+ tiles = {
+ "default_wood.png^feedlot_feed.png",
+ "default_wood.png",
+ "default_wood.png",
+ "default_wood.png",
+ "default_wood.png",
+ "default_wood.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, -0.1875, -0.4375}, -- NodeBox6
+ {0.4375, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox7
+ {-0.5, -0.5, 0.4375, 0.5, -0.1875, 0.5}, -- NodeBox8
+ {-0.5, -0.5, -0.5, -0.4375, -0.1875, 0.5}, -- NodeBox9
+ {-0.4375, -0.5, -0.4375, 0.4375, -0.375, 0.4375}, -- NodeBox10
+ }
+ },
+
+ on_construct = function (pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ meta:set_string("formspec", get_formspec(pos))
+ inv:set_size("main", 1)
+ end,
+ can_dig = function (pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+ end,
+ groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1},
+ tube = {
+ insert_object = function(pos, node, stack, direction)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local added = inv:add_item("main", stack)
+ return added
+ end,
+ can_insert = function(pos, node, stack, direction)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:room_for_item("main", stack)
+ end,
+ input_inventory = "main",
+ connect_sides = {left = 0, right = 0, front = 0, back = 0, top = 0, bottom = 1}},
+})
+
+local function is_mob(obj)
+ return obj.get_luaentity and obj:get_luaentity().name and string.sub(obj:get_luaentity().name,1,string.len("mob"))=="mob"
+end
+
+
+minetest.register_abm({
+ label = "lava cooling",
+ nodenames = {"feedlot:feedlot"},
+ interval = 5,
+ chance = 1,
+
+ action = function (pos)
+ local fake_player = DigtronFakePlayer.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
+ -- obj:on_rightclick(fake_player)
+ obj:get_luaentity():on_rightclick(fake_player)
+-- minetest.chat_send_all("animal fed")
+ end
+ end
+ end,
+})
+
+minetest.register_craft({
+ output = "feedlot:feedlot",
+ recipe = {
+ {"","",""},
+ {"default:wood", "farming:seed_wheat", "default:wood"},
+ {"default:wood", "default:wood", "default:wood"}
+}})
diff --git a/textures/feedlot_feed.png b/textures/feedlot_feed.png
new file mode 100644
index 0000000..ea0a589
--- /dev/null
+++ b/textures/feedlot_feed.png
Binary files differ