--[[local node_ok = function(pos, fallback) fallback = fallback or "mcl_core:dirt" local node = minetest.get_node_or_nil(pos) if node and minetest.registered_nodes[node.name] then return node end return {name = fallback} end local function node_is(pos) local node = minetest.get_node(pos) if node.name == "air" then return "air" end if minetest.get_item_group(node.name, "lava") ~= 0 then return "lava" end if minetest.get_item_group(node.name, "liquid") ~= 0 then return "liquid" end local def = minetest.registered_nodes[node.name] if not def or def.walkable then return "walkable" end return "other" end --]] function mcl_mobs.mob:mount(obj) if mcl_mount.mount(obj) then if self.def.on_mount(obj) == false then return end self.driver = obj obj:set_attach(self.object, "", self.def.driver_offset) if obj:is_player() then obj:set_eye_offset(self.def.driver_eye_offset, vector.new(0, 0, 0)) end end end --[[ function mobs:drive(moving_anim, stand_anim, can_fly, dtime) local rot_view = 0 if self.player_rotation.y == 90 then rot_view = math.pi/2 end local acce_y = 0 local velo = self.object:get_velocity() self.v = get_v(velo) * get_sign(self.v) -- process controls if self.driver then local ctrl = self.driver:get_player_control() -- move forwards if ctrl.up then self:set_velocity(self.run_velocity) self:set_mob_animation( moving_anim) -- move backwards elseif ctrl.down then self:set_velocity(-self.run_velocity) self:set_mob_animation(moving_anim) --halt else mobs.set_velocity(entity, 0) mobs.set_mob_animation(entity, stand_anim) end -- mob rotation entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) entity.yaw = entity.driver:get_look_horizontal() - entity.rotate --[[ if can_fly then -- fly up if ctrl.jump then velo.y = velo.y + 1 if velo.y > entity.accel then velo.y = entity.accel end elseif velo.y > 0 then velo.y = velo.y - 0.1 if velo.y < 0 then velo.y = 0 end end -- fly down if ctrl.sneak then velo.y = velo.y - 1 if velo.y < -entity.accel then velo.y = -entity.accel end elseif velo.y < 0 then velo.y = velo.y + 0.1 if velo.y > 0 then velo.y = 0 end end else ] ]-- -- jump if ctrl.jump then mobs.jump(entity) end --end end --[[ -- set moving animation if moving_anim then mobs:set_mob_animation(entity, moving_anim) end -- Stop! local s = get_sign(entity.v) entity.v = entity.v - 0.02 * s if s ~= get_sign(entity.v) then entity.object:set_velocity({x = 0, y = 0, z = 0}) entity.v = 0 return end -- enforce speed limit forward and reverse local max_spd = entity.max_speed_reverse if get_sign(entity.v) >= 0 then max_spd = entity.max_speed_forward end if math.abs(entity.v) > max_spd then entity.v = entity.v - get_sign(entity.v) end -- Set position, velocity and acceleration local p = entity.object:get_pos() local new_velo local new_acce = {x = 0, y = -9.8, z = 0} p.y = p.y - 0.5 local ni = node_is(p) local v = entity.v if ni == "air" then if can_fly == true then new_acce.y = 0 end elseif ni == "liquid" or ni == "lava" then if ni == "lava" and entity.lava_damage ~= 0 then entity.lava_counter = (entity.lava_counter or 0) + dtime if entity.lava_counter > 1 then minetest.sound_play("default_punch", { object = entity.object, max_hear_distance = 5 }, true) entity.object:punch(entity.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = entity.lava_damage} }, nil) entity.lava_counter = 0 end end if entity.terrain_type == 2 or entity.terrain_type == 3 then new_acce.y = 0 p.y = p.y + 1 if node_is(p) == "liquid" then if velo.y >= 5 then velo.y = 5 elseif velo.y < 0 then new_acce.y = 20 else new_acce.y = 5 end else if math.abs(velo.y) < 1 then local pos = entity.object:get_pos() pos.y = math.floor(pos.y) + 0.5 entity.object:set_pos(pos) velo.y = 0 end end else v = v * 0.25 end end new_velo = get_velocity(v, entity.object:get_yaw() - rot_view, velo.y) new_acce.y = new_acce.y + acce_y entity.object:set_velocity(new_velo) entity.object:set_acceleration(new_acce) -- CRASH! if enable_crash then local intensity = entity.v2 - v if intensity >= crash_threshold then entity.object:punch(entity.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = intensity} }, nil) end end entity.v2 = v ] ]-- end -- directional flying routine by D00Med (edited by TenPlus1) function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) if true then print("succ") return end local ctrl = entity.driver:get_player_control() local velo = entity.object:get_velocity() local dir = entity.driver:get_look_dir() local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands if ctrl.up then entity.object:set_velocity({ x = dir.x * speed, y = dir.y * speed + 2, z = dir.z * speed }) elseif ctrl.down then entity.object:set_velocity({ x = -dir.x * speed, y = dir.y * speed + 2, z = -dir.z * speed }) elseif not ctrl.down or ctrl.up or ctrl.jump then entity.object:set_velocity({x = 0, y = -2, z = 0}) end entity.object:set_yaw(yaw + math.pi + math.pi / 2 - entity.rotate) -- firing arrows if ctrl.LMB and ctrl.sneak and shoots then local pos = entity.object:get_pos() local obj = minetest.add_entity({ x = pos.x + 0 + dir.x * 2.5, y = pos.y + 1.5 + dir.y, z = pos.z + 0 + dir.z * 2.5}, arrow) local ent = obj:get_luaentity() if ent then ent.switch = 1 -- for mob specific arrows ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} local yaw = entity.driver:get_look_horizontal() obj:set_yaw(yaw + math.pi / 2) obj:set_velocity(vec) else obj:remove() end end -- change animation if stopped if velo.x == 0 and velo.y == 0 and velo.z == 0 then mobs:set_mob_animation(entity, stand_anim) else -- moving animation mobs:set_mob_animation(entity, moving_anim) end end ]]--