Advertisement
Guest User

Untitled

a guest
May 23rd, 2014
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. WIELD3D_INIT_DELAY = 1
  2. WIELD3D_RETRY_TIME = 10
  3. WIELD3D_UPDATE_TIME = 1
  4.  
  5. local modpath = minetest.get_modpath(minetest.get_current_modname())
  6. local input = io.open(modpath.."/wield3d.conf", "r")
  7. if input then
  8. dofile(modpath.."/wield3d.conf")
  9. input:close()
  10. input = nil
  11. end
  12. dofile(modpath.."/location.lua")
  13.  
  14. local location = {
  15. "Arm_Right", -- default bone
  16. {x=3.5, y=-2, z=3}, -- default position
  17. {x=-97, y=225, z=91}, -- default rotation
  18. }
  19. local player_wielding = {}
  20. local timer = 0
  21.  
  22. local function add_wield_entity(player)
  23. local name = player:get_player_name()
  24. local pos = player:getpos()
  25. local inv = player:get_inventory()
  26. if name and pos and inv then
  27. local offset = {x=pos.x, y=pos.y + 0.5, z=pos.z}
  28. local object = minetest.add_entity(offset, "wield3d:wield_entity")
  29. if object then
  30. object:set_properties({collisionbox={0,0,0, 0,0,0}})
  31. object:set_attach(player, location[1], location[2], location[3])
  32. local entity = object:get_luaentity()
  33. if entity then
  34. entity.player = player
  35. player_wielding[name] = 1
  36. else
  37. object:remove()
  38. end
  39. end
  40. end
  41. end
  42.  
  43. minetest.register_item("wield3d:hand", {
  44. type = "none",
  45. wield_image = "wield3d_trans.png",
  46. })
  47.  
  48. minetest.register_entity("wield3d:wield_entity", {
  49. physical = false,
  50. collisionbox = {-0.125,-0.125,-0.125, 0.125,0.125,0.125},
  51. visual = "wielditem",
  52. visual_size = {x=0.25, y=0.25},
  53. textures = {"wield3d:hand"},
  54. player = nil,
  55. item = nil,
  56. timer = 0,
  57. location = {location[1], location[2], location[3]},
  58. on_step = function(self, dtime)
  59. self.timer = self.timer + dtime
  60. if self.timer < WIELD3D_UPDATE_TIME then
  61. return
  62. end
  63. self.timer = 0
  64. local player = self.player
  65. if player then
  66. local name = player:get_player_name()
  67. local p1 = player:getpos()
  68. local p2 = self.object:getpos()
  69. if p1 and p2 then
  70. if vector.equals(p1, p2) then
  71. local stack = player:get_wielded_item()
  72. local item = stack:get_name()
  73. if item == self.item then
  74. return
  75. end
  76. self.item = item
  77. if item == "" then
  78. item = "wield3d:hand"
  79. end
  80. local loc = wield3d_location[item] or location
  81. if loc[1] ~= self.location[1]
  82. or vector.equals(loc[2], self.location[2]) == false
  83. or vector.equals(loc[3], self.location[3]) == false then
  84. self.object:setpos(p2)
  85. self.object:set_detach()
  86. self.object:set_attach(player, loc[1], loc[2], loc[3])
  87. self.location = {loc[1], loc[2], loc[3]}
  88. end
  89. self.object:set_properties({textures={item}})
  90. return
  91. end
  92. end
  93. player_wielding[name] = 0
  94. end
  95. self.object:remove()
  96. end,
  97. })
  98.  
  99. minetest.register_globalstep(function(dtime)
  100. timer = timer + dtime
  101. if timer > WIELD3D_RETRY_TIME then
  102. for name, state in pairs(player_wielding) do
  103. if state == 0 then
  104. local player = minetest.get_player_by_name(name)
  105. if player then
  106. add_wield_entity(player)
  107. else
  108. player_wielding[name] = nil
  109. end
  110. end
  111. end
  112. timer = 0
  113. end
  114. end)
  115.  
  116. minetest.register_on_leaveplayer(function(player)
  117. local name = player:get_player_name()
  118. if name then
  119. player_wielding[name] = nil
  120. end
  121. end)
  122.  
  123. minetest.register_on_joinplayer(function(player)
  124. player_wielding[player:get_player_name()] = 0
  125. minetest.after(WIELD3D_INIT_DELAY, add_wield_entity, player)
  126. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement