Guest User

Untitled

a guest
May 16th, 2014
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. minetest.register_entity(":__builtin:item", {
  2. initial_properties = {
  3. hp_max = 1,
  4. physical = true,
  5. collide_with_objects = false,
  6. collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
  7. visual = "sprite",
  8. visual_size = {x=0.5, y=0.5},
  9. textures = {""},
  10. spritediv = {x=1, y=1},
  11. initial_sprite_basepos = {x=0, y=0},
  12. is_visible = false,
  13. play_flash = false,
  14. },
  15.  
  16. itemstring = '',
  17. physical_state = true,
  18.  
  19. set_item = function(self, itemstring)
  20. self.itemstring = itemstring
  21. local stack = ItemStack(itemstring)
  22. local itemtable = stack:to_table()
  23. local itemname = nil
  24. if itemtable then
  25. itemname = stack:to_table().name
  26. end
  27. local item_texture = nil
  28. local item_type = ""
  29. if minetest.registered_items[itemname] then
  30. item_texture = minetest.registered_items[itemname].inventory_image
  31. item_type = minetest.registered_items[itemname].type
  32. end
  33. prop = {
  34. is_visible = true,
  35. visual = "sprite",
  36. textures = {"unknown_item.png"}
  37. }
  38. if item_texture and item_texture ~= "" then
  39. prop.visual = "sprite"
  40. prop.textures = {item_texture}
  41. prop.visual_size = {x=0.50, y=0.50}
  42. else
  43. prop.visual = "wielditem"
  44. prop.textures = {itemname}
  45. prop.visual_size = {x=0.30, y=0.30}
  46. prop.automatic_rotate = math.pi * 0.25
  47. end
  48. self.object:set_properties(prop)
  49. end,
  50.  
  51. get_staticdata = function(self)
  52. --return self.itemstring
  53. return minetest.serialize({
  54. itemstring = self.itemstring,
  55. always_collect = self.always_collect,
  56. })
  57. end,
  58.  
  59. on_activate = function(self, staticdata)
  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. end
  66. else
  67. self.itemstring = staticdata
  68. end
  69. self.object:set_armor_groups({immortal=1})
  70. self.object:setvelocity({x=0, y=2, z=0})
  71. self.object:setacceleration({x=0, y=-10, z=0})
  72. self:set_item(self.itemstring)
  73. end,
  74.  
  75. on_step = function(self, dtime)
  76. local p = self.object:getpos()
  77. p.y = p.y - 0.3
  78. local nn = minetest.get_node(p).name
  79. -- If node is not registered or node is walkably solid and resting on nodebox
  80. local v = self.object:getvelocity()
  81. if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable and v.y == 0 then
  82. if self.physical_state then
  83. local own_stack = ItemStack(self.object:get_luaentity().itemstring)
  84. for _,object in ipairs(minetest.env:get_objects_inside_radius(p, 1)) do
  85. if object:get_luaentity().name == "__builtin:item" and object:get_luaentity().physical_state == false then
  86. local stack = ItemStack(object:get_luaentity().itemstring)
  87. if own_stack:get_name() == stack:get_name() and stack:get_free_space() > 0 then
  88. local new_count = stack:get_count() + own_stack:get_count()
  89. if new_count <= stack:get_stack_max() then
  90. object:get_luaentity().itemstring = stack:get_name().." "..new_count
  91. stack:set_count(new_count)
  92. self.itemstring = ''
  93. self.object:remove()
  94. return
  95. else
  96. object:get_luaentity().itemstring = stack:get_name().." "..stack:get_stack_max()
  97. self.itemstring = stack:get_name().." "..new_count - stack:get_stack_max()
  98. end
  99. object:set_properties({play_flash = true})
  100. end
  101. end
  102. end
  103. self.object:setvelocity({x=0,y=0,z=0})
  104. self.object:setacceleration({x=0, y=0, z=0})
  105. self.physical_state = false
  106. self.object:set_properties({
  107. physical = false
  108. })
  109. end
  110. else
  111. if not self.physical_state then
  112. self.object:setvelocity({x=0,y=0,z=0})
  113. self.object:setacceleration({x=0, y=-10, z=0})
  114. self.physical_state = true
  115. self.object:set_properties({
  116. physical = true
  117. })
  118. end
  119. end
  120. end,
  121.  
  122. on_punch = function(self, hitter)
  123. if self.itemstring ~= '' then
  124. local left = hitter:get_inventory():add_item("main", self.itemstring)
  125. if not left:is_empty() then
  126. self.itemstring = left:to_string()
  127. return
  128. end
  129. end
  130. self.itemstring = ''
  131. self.object:remove()
  132. end,
  133. })
Advertisement
Add Comment
Please, Sign In to add comment