diff options
| -rw-r--r-- | depends.txt | 2 | ||||
| -rw-r--r-- | init.lua | 263 | ||||
| -rw-r--r-- | textures/feedlot_feed.png | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..ea0a589 --- /dev/null +++ b/textures/feedlot_feed.png  | 
