Re: Entity cleaner

From Pitriss, 10 Years ago, written in Lua, viewed 742 times. This paste is a reply to from - view diff
URL http://minetest.wjake.com/stikked/view/10c45f72 Shorturl http://gw.gd/AJy1 Embed
Download Paste or View Raw
  1. minetest.register_entity(":__builtin:item", {
  2.         initial_properties = {
  3.                 hp_max = 1,
  4.                 physical = true,
  5.                 collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
  6.                 visual = "sprite",
  7.                 visual_size = {x=0.5, y=0.5},
  8.                 textures = {""},
  9.                 spritediv = {x=1, y=1},
  10.                 initial_sprite_basepos = {x=0, y=0},
  11.                 is_visible = false,
  12.                 timer = 0,
  13.         },
  14.  
  15.         itemstring = '',
  16.         physical_state = true,
  17.  
  18.         set_item = function(self, itemstring)
  19.                 self.itemstring = itemstring
  20.                 local stack = ItemStack(itemstring)
  21.                 local itemtable = stack:to_table()
  22.                 local itemname = nil
  23.                 if itemtable then
  24.                         itemname = stack:to_table().name
  25.                 end
  26.                 local item_texture = nil
  27.                 local item_type = ""
  28.                 if minetest.registered_items[itemname] then
  29.                         item_texture = minetest.registered_items[itemname].inventory_image
  30.                         item_type = minetest.registered_items[itemname].type
  31.                 end
  32.                 prop = {
  33.                         is_visible = true,
  34.                         visual = "sprite",
  35.                         textures = {"unknown_item.png"}
  36.                 }
  37.                 if item_texture and item_texture ~= "" then
  38.                         prop.visual = "sprite"
  39.                         prop.textures = {item_texture}
  40.                         prop.visual_size = {x=0.50, y=0.50}
  41.                 else
  42.                         prop.visual = "wielditem"
  43.                         prop.textures = {itemname}
  44.                         prop.visual_size = {x=0.20, y=0.20}
  45.                         prop.automatic_rotate = math.pi * 0.25
  46.                 end
  47.                 self.object:set_properties(prop)
  48.         end,
  49.  
  50.         get_staticdata = function(self)
  51.                 --return self.itemstring
  52.                 return minetest.serialize({
  53.                         itemstring = self.itemstring,
  54.                         always_collect = self.always_collect,
  55.                         timer = self.timer,
  56.                 })
  57.         end,
  58.  
  59.         on_activate = function(self, staticdata, dtime_s)
  60.                 if string.sub(staticdata, 1, string.len("return")) == "return" then
  61.                         local data = minetest.deserialize(staticdata)
  62.                         if data and type(data) == "table" then
  63.                                 self.itemstring = data.itemstring
  64.                                 self.always_collect = data.always_collect
  65.                                 self.timer = data.timer
  66.                                 if not self.timer then
  67.                                         self.timer = 0
  68.                                 end
  69.                                 self.timer = self.timer+dtime_s
  70.                         end
  71.                 else
  72.                         self.itemstring = staticdata
  73.                 end
  74.                 self.object:set_armor_groups({immortal=1})
  75.                 self.object:setvelocity({x=0, y=2, z=0})
  76.                 self.object:setacceleration({x=0, y=-10, z=0})
  77.                 self:set_item(self.itemstring)
  78.         end,
  79.  
  80.         on_step = function(self, dtime)
  81.                 local time = tonumber(minetest.setting_get("remove_items"))
  82.                 if not time then
  83.                         time = 7200
  84.                 end
  85.                 if not self.timer then
  86.                         self.timer = 0
  87.                 end
  88.                 self.timer = self.timer + dtime
  89.                 if time ~= 0 and (self.timer > time) then
  90.                         self.object:remove()
  91.                 end
  92.  
  93.                 local p = self.object:getpos()
  94.                 local name = minetest.env:get_node(p).name
  95.  
  96.                 p.y = p.y - 0.3
  97.                 local nn = minetest.env:get_node(p).name
  98.                 -- If node is not registered or node is walkably solid
  99.                 if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable then
  100.                         if self.physical_state then
  101.                                 self.object:setvelocity({x=0,y=0,z=0})
  102.                                 self.object:setacceleration({x=0, y=0, z=0})
  103.                                 self.physical_state = false
  104.                                 self.object:set_properties({
  105.                                         physical = false
  106.                                 })
  107.                         end
  108.                 else
  109.                         if not self.physical_state then
  110.                                 self.object:setvelocity({x=0,y=0,z=0})
  111.                                 self.object:setacceleration({x=0, y=-10, z=0})
  112.                                 self.physical_state = true
  113.                                 self.object:set_properties({
  114.                                         physical = true
  115.                                 })
  116.                         end
  117.                 end
  118.         end,
  119.  
  120.         on_punch = function(self, hitter)
  121.                 if self.itemstring ~= '' then
  122.                         local left = hitter:get_inventory():add_item("main", self.itemstring)
  123.                         if not left:is_empty() then
  124.                                 self.itemstring = left:to_string()
  125.                                 return
  126.                         end
  127.                 end
  128.                 self.object:remove()
  129.         end,
  130. })
  131.  
  132. if minetest.setting_get("log_mods") then
  133.         minetest.log("action", "entity_cleaner loaded")
  134. end
  135.  

Reply to "Re: Entity cleaner"

Here you can reply to the paste above