framework.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. vehicle_mash = {}
  2. local drive = lib_mount.drive
  3. function vehicle_mash.register_vehicle(name, def)
  4. minetest.register_entity(name, {
  5. terrain_type = def.terrain_type,
  6. collisionbox = def.collisionbox,
  7. can_fly = def.can_fly,
  8. can_go_down = def.can_go_down, -- Applies only when `can_fly` is enabled
  9. can_go_up = def.can_go_up, -- Applies only when `can_fly` is enabled
  10. player_rotation = def.player_rotation,
  11. driver_attach_at = def.driver_attach_at,
  12. driver_eye_offset = def.driver_eye_offset,
  13. driver_detach_pos_offset = def.driver_detach_pos_offset,
  14. number_of_passengers = def.number_of_passengers,
  15. passenger_attach_at = def.passenger_attach_at,
  16. passenger_eye_offset = def.passenger_eye_offset,
  17. passenger_detach_pos_offset = def.passenger_detach_pos_offset,
  18. passenger2_attach_at = def.passenger2_attach_at,
  19. passenger2_eye_offset = def.passenger2_eye_offset,
  20. passenger2_detach_pos_offset = def.passenger2_detach_pos_offset,
  21. passenger3_attach_at = def.passenger3_attach_at,
  22. passenger3_eye_offset = def.passenger3_eye_offset,
  23. passenger3_detach_pos_offset = def.passenger3_detach_pos_offset,
  24. enable_crash = def.enable_crash,
  25. visual = def.visual,
  26. mesh = def.mesh,
  27. textures = def.textures,
  28. tiles = def.tiles,
  29. visual_size = def.visual_size,
  30. stepheight = def.stepheight,
  31. max_speed_forward = def.max_speed_forward,
  32. max_speed_reverse = def.max_speed_reverse,
  33. max_speed_upwards = def.max_speed_upwards, -- Applies only when `can_fly` is enabled
  34. max_speed_downwards = def.max_speed_downwards, -- Applies only when `can_fly` is enabled
  35. accel = def.accel,
  36. braking = def.braking,
  37. turn_spd = def.turn_speed,
  38. drop_on_destroy = def.drop_on_destroy or {},
  39. driver = nil,
  40. passenge = nil,
  41. v = 0,
  42. v2 = 0,
  43. mouselook = false,
  44. physical = true,
  45. removed = false,
  46. offset = {x=0, y=0, z=0},
  47. owner = "",
  48. on_rightclick = function(self, clicker)
  49. if not clicker or not clicker:is_player() then
  50. return
  51. end
  52. -- if there is already a driver
  53. if self.driver then
  54. -- if clicker is driver detach passengers and driver
  55. if clicker == self.driver then
  56. if self.passenger then
  57. lib_mount.detach(self.passenger, self.offset)
  58. end
  59. if self.passenger2 then
  60. lib_mount.detach(self.passenger2, self.offset)
  61. end
  62. if self.passenger3 then
  63. lib_mount.detach(self.passenger3, self.offset)
  64. end
  65. -- detach driver
  66. lib_mount.detach(self.driver, self.offset)
  67. -- if clicker is not the driver
  68. else
  69. -- if clicker is passenger
  70. -- detach passengers
  71. if clicker == self.passenger then
  72. lib_mount.detach(self.passenger, self.offset)
  73. elseif clicker == self.passenger2 then
  74. lib_mount.detach(self.passenger2, self.offset)
  75. elseif clicker == self.passenger3 then
  76. lib_mount.detach(self.passenger3, self.offset)
  77. -- if clicker is not passenger
  78. else
  79. -- attach passengers if possible
  80. if lib_mount.passengers[self.passenger] == self.passenger and self.number_of_passengers >= 1 then
  81. lib_mount.attach(self, clicker, true, 1)
  82. end
  83. if lib_mount.passengers[self.passenger2] == self.passenger2 and self.number_of_passengers >= 2 then
  84. lib_mount.attach(self, clicker, true, 2)
  85. end
  86. if lib_mount.passengers[self.passenger3] == self.passenger3 and self.number_of_passengers >= 3 then
  87. lib_mount.attach(self, clicker, true, 3)
  88. end
  89. end
  90. end
  91. -- if there is no driver
  92. else
  93. -- attach driver
  94. if self.owner == clicker:get_player_name() then
  95. lib_mount.attach(self, clicker, false, 0)
  96. end
  97. end
  98. end,
  99. on_activate = function(self, staticdata, dtime_s)
  100. self.object:set_armor_groups({immortal = 1})
  101. local tmp = minetest.deserialize(staticdata)
  102. if tmp then
  103. for _,stat in pairs(tmp) do
  104. if _ == "owner" then print(stat) end
  105. self[_] = stat
  106. end
  107. end
  108. print("owner: ", self.owner)
  109. self.v2 = self.v
  110. end,
  111. get_staticdata = function(self)
  112. local tmp = {}
  113. for _,stat in pairs(self) do
  114. local t = type(stat)
  115. if t ~= 'function' and t ~= 'nil' and t ~= 'userdata' then
  116. tmp[_] = self[_]
  117. end
  118. end
  119. return core.serialize(tmp)
  120. end,
  121. on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
  122. if not puncher or not puncher:is_player() or self.removed or self.driver then
  123. return
  124. end
  125. local punchername = puncher:get_player_name()
  126. if self.owner == punchername or minetest.get_player_privs(punchername).protection_bypass then
  127. self.removed = true
  128. -- delay remove to ensure player is detached
  129. minetest.after(0.1, function()
  130. self.object:remove()
  131. end)
  132. puncher:get_inventory():add_item("main", self.name)
  133. end
  134. end,
  135. on_step = function(self, dtime)
  136. -- Automatically set `enable_crash` to true if there's no value found
  137. if def.enable_crash == nil then
  138. def.enable_crash = true
  139. end
  140. drive(self, dtime, false, nil, nil, 0, def.can_fly, def.can_go_down, def.can_go_up, def.enable_crash)
  141. end
  142. })
  143. local can_float = false
  144. if def.terrain_type == 2 or def.terrain_type == 3 then
  145. can_float = true
  146. end
  147. minetest.register_craftitem(name, {
  148. description = def.description,
  149. inventory_image = def.inventory_image,
  150. wield_image = def.wield_image,
  151. wield_scale = def.wield_scale,
  152. liquids_pointable = can_float,
  153. on_place = function(itemstack, placer, pointed_thing)
  154. if pointed_thing.type ~= "node" then
  155. return
  156. end
  157. local ent
  158. if minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "liquid") == 0 then
  159. if def.terrain_type == 0 or def.terrain_type == 1 or def.terrain_type == 3 then
  160. pointed_thing.above.y = pointed_thing.above.y + def.onplace_position_adj
  161. ent = minetest.add_entity(pointed_thing.above, name)
  162. else
  163. return
  164. end
  165. else
  166. if def.terrain_type == 2 or def.terrain_type == 3 then
  167. pointed_thing.under.y = pointed_thing.under.y + 0.5
  168. ent = minetest.add_entity(pointed_thing.under, name)
  169. else
  170. return
  171. end
  172. end
  173. if ent:get_luaentity().player_rotation.y == 90 then
  174. ent:set_yaw(placer:get_look_horizontal())
  175. else
  176. ent:set_yaw(placer:get_look_horizontal() - math.pi/2)
  177. end
  178. ent:get_luaentity().owner = placer:get_player_name()
  179. itemstack:take_item()
  180. return itemstack
  181. end
  182. })
  183. if def.recipe then
  184. minetest.register_craft({
  185. output = name,
  186. recipe = def.recipe
  187. })
  188. end
  189. end