forked from VoxeLibre/VoxeLibre
Merge pull request 'Shulker improvements and homing mob projectiles' (#4000) from Bakawun/MineClone2:Shulker_shot_speed into master
Reviewed-on: MineClone2/MineClone2#4000 Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
This commit is contained in:
commit
d44b00a20e
|
@ -1231,6 +1231,9 @@ function mob_class:do_states_attack (dtime)
|
||||||
-- important for mcl_shields
|
-- important for mcl_shields
|
||||||
ent._shooter = self.object
|
ent._shooter = self.object
|
||||||
ent._saved_shooter_pos = self.object:get_pos()
|
ent._saved_shooter_pos = self.object:get_pos()
|
||||||
|
if ent.homing then
|
||||||
|
ent._target = self.attack
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5
|
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5
|
||||||
|
|
|
@ -334,6 +334,13 @@ function mcl_mobs.register_mob(name, def)
|
||||||
end -- END mcl_mobs.register_mob function
|
end -- END mcl_mobs.register_mob function
|
||||||
|
|
||||||
|
|
||||||
|
function mcl_mobs.get_arrow_damage_func(damage, typ)
|
||||||
|
local typ = mcl_damage.types[typ] and typ or "arrow"
|
||||||
|
return function(projectile, object)
|
||||||
|
return mcl_util.deal_damage(object, damage, {type = typ})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- register arrow for shoot attack
|
-- register arrow for shoot attack
|
||||||
function mcl_mobs.register_arrow(name, def)
|
function mcl_mobs.register_arrow(name, def)
|
||||||
|
|
||||||
|
@ -350,6 +357,7 @@ function mcl_mobs.register_arrow(name, def)
|
||||||
hit_node = def.hit_node,
|
hit_node = def.hit_node,
|
||||||
hit_mob = def.hit_mob,
|
hit_mob = def.hit_mob,
|
||||||
hit_object = def.hit_object,
|
hit_object = def.hit_object,
|
||||||
|
homing = def.homing,
|
||||||
drop = def.drop or false, -- drops arrow as registered item when true
|
drop = def.drop or false, -- drops arrow as registered item when true
|
||||||
collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows
|
collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows
|
||||||
timer = 0,
|
timer = 0,
|
||||||
|
@ -422,6 +430,17 @@ function mcl_mobs.register_arrow(name, def)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if self.homing and self._target then
|
||||||
|
local p = self._target:get_pos()
|
||||||
|
if p then
|
||||||
|
if minetest.line_of_sight(self.object:get_pos(), p) then
|
||||||
|
self.object:set_velocity(vector.direction(self.object:get_pos(), p) * self.velocity)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self._target = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if self.hit_player or self.hit_mob or self.hit_object then
|
if self.hit_player or self.hit_mob or self.hit_object then
|
||||||
|
|
||||||
for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do
|
for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do
|
||||||
|
|
|
@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
|
||||||
type = "monster",
|
type = "monster",
|
||||||
spawn_class = "hostile",
|
spawn_class = "hostile",
|
||||||
attack_type = "shoot",
|
attack_type = "shoot",
|
||||||
shoot_interval = 0.5,
|
shoot_interval = 6,
|
||||||
arrow = "mobs_mc:shulkerbullet",
|
arrow = "mobs_mc:shulkerbullet",
|
||||||
shoot_offset = 0.5,
|
shoot_offset = 0.5,
|
||||||
passive = false,
|
passive = false,
|
||||||
|
@ -43,7 +43,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
|
||||||
hp_max = 30,
|
hp_max = 30,
|
||||||
xp_min = 5,
|
xp_min = 5,
|
||||||
xp_max = 5,
|
xp_max = 5,
|
||||||
armor = 150,
|
armor = 20,
|
||||||
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5},
|
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5},
|
||||||
visual = "mesh",
|
visual = "mesh",
|
||||||
mesh = "mobs_mc_shulker.b3d",
|
mesh = "mobs_mc_shulker.b3d",
|
||||||
|
@ -51,7 +51,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
|
||||||
-- TODO: sounds
|
-- TODO: sounds
|
||||||
-- TODO: Make shulker dye-able
|
-- TODO: Make shulker dye-able
|
||||||
visual_size = {x=3, y=3},
|
visual_size = {x=3, y=3},
|
||||||
walk_chance = 0,
|
walk_chance = 10,
|
||||||
knock_back = false,
|
knock_back = false,
|
||||||
jump = false,
|
jump = false,
|
||||||
can_despawn = false,
|
can_despawn = false,
|
||||||
|
@ -65,15 +65,19 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
|
||||||
looting_factor = 0.0625},
|
looting_factor = 0.0625},
|
||||||
},
|
},
|
||||||
animation = {
|
animation = {
|
||||||
stand_speed = 25, walk_speed = 0, run_speed = 50, punch_speed = 25,
|
stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25,
|
||||||
speed_normal = 25, speed_run = 50,
|
speed_normal = 25, speed_run = 50,
|
||||||
stand_start = 0, stand_end = 25,
|
stand_start = 0, stand_end = 25,
|
||||||
walk_start = 25, walk_end = 45,
|
walk_start = 45, walk_end = 65,
|
||||||
run_start = 45, run_end = 85,
|
walk_loop = false,
|
||||||
|
run_start = 65, run_end = 85,
|
||||||
|
run_loop = false,
|
||||||
punch_start = 80, punch_end = 100,
|
punch_start = 80, punch_end = 100,
|
||||||
},
|
},
|
||||||
view_range = 16,
|
view_range = 16,
|
||||||
fear_height = 0,
|
fear_height = 0,
|
||||||
|
walk_velocity = 0,
|
||||||
|
run_velocity = 0,
|
||||||
noyaw = true,
|
noyaw = true,
|
||||||
do_custom = function(self,dtime)
|
do_custom = function(self,dtime)
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos()
|
||||||
|
@ -81,12 +85,13 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
|
||||||
self.object:set_yaw(0)
|
self.object:set_yaw(0)
|
||||||
mcl_mobs:yaw(self, 0, 0, dtime)
|
mcl_mobs:yaw(self, 0, 0, dtime)
|
||||||
end
|
end
|
||||||
if self.state == "walk" or self.state == "stand" then
|
|
||||||
self.state = "stand"
|
|
||||||
self:set_animation("stand")
|
|
||||||
end
|
|
||||||
if self.state == "attack" then
|
if self.state == "attack" then
|
||||||
self:set_animation("punch")
|
self:set_animation("run")
|
||||||
|
self.armor = 0
|
||||||
|
elseif self.state == "stand" then
|
||||||
|
self.armor = 20
|
||||||
|
elseif self.state == "walk" or self.state == "run" then
|
||||||
|
self.armor = 0
|
||||||
end
|
end
|
||||||
self.path.way = false
|
self.path.way = false
|
||||||
self.look_at_players = false
|
self.look_at_players = false
|
||||||
|
@ -149,6 +154,9 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
on_attack = function(self, dtime)
|
||||||
|
self.shoot_interval = math.random(1, 6)
|
||||||
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- bullet arrow (weapon)
|
-- bullet arrow (weapon)
|
||||||
|
@ -156,27 +164,12 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", {
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
visual_size = {x = 0.25, y = 0.25},
|
visual_size = {x = 0.25, y = 0.25},
|
||||||
textures = {"mobs_mc_shulkerbullet.png"},
|
textures = {"mobs_mc_shulkerbullet.png"},
|
||||||
velocity = 6,
|
velocity = 5,
|
||||||
|
homing = true,
|
||||||
hit_player = function(self, player)
|
hit_player = mcl_mobs.get_arrow_damage_func(4),
|
||||||
player:punch(self.object, 1.0, {
|
hit_mob = mcl_mobs.get_arrow_damage_func(4),
|
||||||
full_punch_interval = 1.0,
|
|
||||||
damage_groups = {fleshy = 4},
|
|
||||||
}, nil)
|
|
||||||
end,
|
|
||||||
|
|
||||||
hit_mob = function(self, mob)
|
|
||||||
mob:punch(self.object, 1.0, {
|
|
||||||
full_punch_interval = 1.0,
|
|
||||||
damage_groups = {fleshy = 4},
|
|
||||||
}, nil)
|
|
||||||
end,
|
|
||||||
|
|
||||||
hit_node = function(self, pos, node)
|
|
||||||
end
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
|
mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
|
||||||
mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1)
|
mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1)
|
||||||
--[[
|
--[[
|
||||||
|
|
Loading…
Reference in New Issue