Add support for mobs and boats in minecarts

This commit is contained in:
Nils Dagsson Moskopp 2021-07-08 14:53:56 +02:00
parent eddbfb4b5c
commit c593036b61
Signed by untrusted user who does not match committer: erlehmann
GPG Key ID: A3BC671C35191080
1 changed files with 26 additions and 7 deletions

View File

@ -12,8 +12,14 @@ local function detach_driver(self)
if not self._driver then
return
end
mcl_player.player_attached[self._driver] = nil
local player = minetest.get_player_by_name(self._driver)
if not self._driver:is_player() then
self._driver:set_detach()
self._driver = nil
return
end
local player_name = self._driver:get_player_name()
mcl_player.player_attached[player_name] = nil
local player = minetest.get_player_by_name(player_name)
self._driver = nil
self._start_pos = nil
if player then
@ -151,7 +157,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
end
local vel = self.object:get_velocity()
if puncher:get_player_name() == self._driver then
if self._driver and puncher:get_player_name() == self._driver:get_player_name() then
if math.abs(vel.x + vel.z) > 7 then
return
end
@ -175,9 +181,22 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
cart.on_activate_by_rail = on_activate_by_rail
function cart:on_step(dtime)
local entity_name = self.object:get_luaentity().name
if entity_name == "mcl_minecarts:minecart" then
for _, obj in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 1.3)) do
local entity = obj:get_luaentity()
if not self._driver and entity and ( entity._cmi_is_mob or entity.name == "mcl_boats:boat" ) and not obj:get_attach() then
self._driver = obj
obj:set_attach(self.object)
break
end
end
end
local ctrl, player = nil, nil
if self._driver then
player = minetest.get_player_by_name(self._driver)
if self._driver and self._driver:is_player() then
local player_name = self._driver:get_player_name()
player = minetest.get_player_by_name(player_name)
if player then
ctrl = player:get_player_control()
-- player detach
@ -446,7 +465,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o
end
-- Give achievement when player reached a distance of 1000 nodes from the start position
if self._driver and (vector.distance(self._start_pos, pos) >= 1000) then
if self._driver and self._driver:is_player() and (vector.distance(self._start_pos, pos) >= 1000) then
awards.unlock(self._driver, "mcl:onARail")
end
@ -634,7 +653,7 @@ register_minecart(
if self._driver and player_name == self._driver then
detach_driver(self)
elseif not self._driver then
self._driver = player_name
self._driver = clicker
self._start_pos = self.object:get_pos()
mcl_player.player_attached[player_name] = true
clicker:set_attach(self.object, "", {x=0, y=-1.75, z=-2}, {x=0, y=0, z=0})