123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- vehicle_mash = {}
- local drive = lib_mount.drive
- function vehicle_mash.register_vehicle(name, def)
- minetest.register_entity(name, {
- terrain_type = def.terrain_type,
- collisionbox = def.collisionbox,
- can_fly = def.can_fly,
- can_go_down = def.can_go_down, -- Applies only when `can_fly` is enabled
- can_go_up = def.can_go_up, -- Applies only when `can_fly` is enabled
- player_rotation = def.player_rotation,
- driver_attach_at = def.driver_attach_at,
- driver_eye_offset = def.driver_eye_offset,
- driver_detach_pos_offset = def.driver_detach_pos_offset,
- number_of_passengers = def.number_of_passengers,
- passenger_attach_at = def.passenger_attach_at,
- passenger_eye_offset = def.passenger_eye_offset,
- passenger_detach_pos_offset = def.passenger_detach_pos_offset,
- passenger2_attach_at = def.passenger2_attach_at,
- passenger2_eye_offset = def.passenger2_eye_offset,
- passenger2_detach_pos_offset = def.passenger2_detach_pos_offset,
- passenger3_attach_at = def.passenger3_attach_at,
- passenger3_eye_offset = def.passenger3_eye_offset,
- passenger3_detach_pos_offset = def.passenger3_detach_pos_offset,
- enable_crash = def.enable_crash,
- visual = def.visual,
- mesh = def.mesh,
- textures = def.textures,
- tiles = def.tiles,
- visual_size = def.visual_size,
- stepheight = def.stepheight,
- max_speed_forward = def.max_speed_forward,
- max_speed_reverse = def.max_speed_reverse,
- max_speed_upwards = def.max_speed_upwards, -- Applies only when `can_fly` is enabled
- max_speed_downwards = def.max_speed_downwards, -- Applies only when `can_fly` is enabled
- accel = def.accel,
- braking = def.braking,
- turn_spd = def.turn_speed,
- drop_on_destroy = def.drop_on_destroy or {},
- driver = nil,
- passenge = nil,
- v = 0,
- v2 = 0,
- mouselook = false,
- physical = true,
- removed = false,
- offset = {x=0, y=0, z=0},
- owner = "",
- on_rightclick = function(self, clicker)
- if not clicker or not clicker:is_player() then
- return
- end
- -- if there is already a driver
- if self.driver then
- -- if clicker is driver detach passengers and driver
- if clicker == self.driver then
- if self.passenger then
- lib_mount.detach(self.passenger, self.offset)
- end
- if self.passenger2 then
- lib_mount.detach(self.passenger2, self.offset)
- end
- if self.passenger3 then
- lib_mount.detach(self.passenger3, self.offset)
- end
- -- detach driver
- lib_mount.detach(self.driver, self.offset)
- -- if clicker is not the driver
- else
- -- if clicker is passenger
- -- detach passengers
- if clicker == self.passenger then
- lib_mount.detach(self.passenger, self.offset)
- elseif clicker == self.passenger2 then
- lib_mount.detach(self.passenger2, self.offset)
- elseif clicker == self.passenger3 then
- lib_mount.detach(self.passenger3, self.offset)
- -- if clicker is not passenger
- else
- -- attach passengers if possible
- if lib_mount.passengers[self.passenger] == self.passenger and self.number_of_passengers >= 1 then
- lib_mount.attach(self, clicker, true, 1)
- end
- if lib_mount.passengers[self.passenger2] == self.passenger2 and self.number_of_passengers >= 2 then
- lib_mount.attach(self, clicker, true, 2)
- end
- if lib_mount.passengers[self.passenger3] == self.passenger3 and self.number_of_passengers >= 3 then
- lib_mount.attach(self, clicker, true, 3)
- end
- end
- end
- -- if there is no driver
- else
- -- attach driver
- if self.owner == clicker:get_player_name() then
- lib_mount.attach(self, clicker, false, 0)
- end
- end
- end,
- on_activate = function(self, staticdata, dtime_s)
- self.object:set_armor_groups({immortal = 1})
- local tmp = minetest.deserialize(staticdata)
- if tmp then
- for _,stat in pairs(tmp) do
- if _ == "owner" then print(stat) end
- self[_] = stat
- end
- end
- print("owner: ", self.owner)
- self.v2 = self.v
- end,
- get_staticdata = function(self)
- local tmp = {}
- for _,stat in pairs(self) do
- local t = type(stat)
- if t ~= 'function' and t ~= 'nil' and t ~= 'userdata' then
- tmp[_] = self[_]
- end
- end
- return core.serialize(tmp)
- end,
- on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
- if not puncher or not puncher:is_player() or self.removed or self.driver then
- return
- end
- local punchername = puncher:get_player_name()
- if self.owner == punchername or minetest.get_player_privs(punchername).protection_bypass then
- self.removed = true
- -- delay remove to ensure player is detached
- minetest.after(0.1, function()
- self.object:remove()
- end)
- puncher:get_inventory():add_item("main", self.name)
- end
- end,
- on_step = function(self, dtime)
- -- Automatically set `enable_crash` to true if there's no value found
- if def.enable_crash == nil then
- def.enable_crash = true
- end
- drive(self, dtime, false, nil, nil, 0, def.can_fly, def.can_go_down, def.can_go_up, def.enable_crash)
- end
- })
- local can_float = false
- if def.terrain_type == 2 or def.terrain_type == 3 then
- can_float = true
- end
- minetest.register_craftitem(name, {
- description = def.description,
- inventory_image = def.inventory_image,
- wield_image = def.wield_image,
- wield_scale = def.wield_scale,
- liquids_pointable = can_float,
- on_place = function(itemstack, placer, pointed_thing)
- if pointed_thing.type ~= "node" then
- return
- end
- local ent
- if minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "liquid") == 0 then
- if def.terrain_type == 0 or def.terrain_type == 1 or def.terrain_type == 3 then
- pointed_thing.above.y = pointed_thing.above.y + def.onplace_position_adj
- ent = minetest.add_entity(pointed_thing.above, name)
- else
- return
- end
- else
- if def.terrain_type == 2 or def.terrain_type == 3 then
- pointed_thing.under.y = pointed_thing.under.y + 0.5
- ent = minetest.add_entity(pointed_thing.under, name)
- else
- return
- end
- end
- if ent:get_luaentity().player_rotation.y == 90 then
- ent:set_yaw(placer:get_look_horizontal())
- else
- ent:set_yaw(placer:get_look_horizontal() - math.pi/2)
- end
- ent:get_luaentity().owner = placer:get_player_name()
- itemstack:take_item()
- return itemstack
- end
- })
- if def.recipe then
- minetest.register_craft({
- output = name,
- recipe = def.recipe
- })
- end
- end
|