forked from VoxeLibre/VoxeLibre
322 lines
6.2 KiB
Lua
322 lines
6.2 KiB
Lua
|
|
--[[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
|
|
|
|
]]--
|