Finish creeper movement ai and move jump_check into environment

This commit is contained in:
jordan4ibanez 2021-04-20 21:00:36 -04:00
parent cd6f07537f
commit 0b763f54b5
4 changed files with 49 additions and 36 deletions

View File

@ -53,40 +53,6 @@ local cliff_check = function(self,dtime)
return free_fall return free_fall
end end
--check if a mob needs to jump
local jump_check = function(self,dtime)
local pos = self.object:get_pos()
pos.y = pos.y + 0.1
local dir = minetest_yaw_to_dir(self.yaw)
local collisionbox = self.object:get_properties().collisionbox
local radius = collisionbox[4] + 0.5
vector_multiply(dir, radius)
--only jump if there's a node and a non-solid node above it
local test_dir = vector.add(pos,dir)
local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0
test_dir.y = test_dir.y + 1
local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0
if green_flag_1 and green_flag_2 then
--can jump over node
return(1)
elseif green_flag_1 and not green_flag_2 then
--wall in front of mob
return(2)
end
--nothing to jump over
return(0)
end
-- state switching logic (stand, walk, run, attacks) -- state switching logic (stand, walk, run, attacks)
local land_state_list_wandering = {"stand", "walk"} local land_state_list_wandering = {"stand", "walk"}
@ -157,7 +123,7 @@ local land_state_execution = function(self,dtime)
mobs.movement_rotation_lock(self) mobs.movement_rotation_lock(self)
--check for nodes to jump over --check for nodes to jump over
local node_in_front_of = jump_check(self) local node_in_front_of = mobs.jump_check(self)
if node_in_front_of == 1 then if node_in_front_of == 1 then

View File

@ -34,7 +34,14 @@ mobs.explode_attack_walk = function(self,dtime)
self.explosion_animation = self.explosion_animation + (dtime/2) self.explosion_animation = self.explosion_animation + (dtime/2)
print(self.explosion_animation) end
--make explosive mobs jump
--check for nodes to jump over
--explosive mobs will just ride against walls for now
local node_in_front_of = mobs.jump_check(self)
if node_in_front_of == 1 then
mobs.jump(self)
end end

View File

@ -1,6 +1,11 @@
local minetest_line_of_sight = minetest.line_of_sight local minetest_line_of_sight = minetest.line_of_sight
local minetest_dir_to_yaw = minetest.dir_to_yaw
local minetest_yaw_to_dir = minetest.yaw_to_dir
local minetest_get_node = minetest.get_node
local minetest_get_item_group = minetest.get_item_group
local vector_new = vector.new local vector_new = vector.new
local vector_multiply = vector.multiply
-- default function when mobs are blown up with TNT -- default function when mobs are blown up with TNT
local do_tnt = function(obj, damage) local do_tnt = function(obj, damage)
@ -71,3 +76,37 @@ mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius,
return(winner_player) return(winner_player)
end end
--check if a mob needs to jump
mobs.jump_check = function(self,dtime)
local pos = self.object:get_pos()
pos.y = pos.y + 0.1
local dir = minetest_yaw_to_dir(self.yaw)
local collisionbox = self.object:get_properties().collisionbox
local radius = collisionbox[4] + 0.5
vector_multiply(dir, radius)
--only jump if there's a node and a non-solid node above it
local test_dir = vector.add(pos,dir)
local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0
test_dir.y = test_dir.y + 1
local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0
if green_flag_1 and green_flag_2 then
--can jump over node
return(1)
elseif green_flag_1 and not green_flag_2 then
--wall in front of mob
return(2)
end
--nothing to jump over
return(0)
end

View File

@ -151,6 +151,7 @@ mobs:register_mob("mobs_mc:creeper_charged", {
"mobs_mc_creeper_charge.png"}, "mobs_mc_creeper_charge.png"},
}, },
visual_size = {x=3, y=3}, visual_size = {x=3, y=3},
rotate = 270,
sounds = { sounds = {
attack = "tnt_ignite", attack = "tnt_ignite",
death = "mobs_mc_creeper_death", death = "mobs_mc_creeper_death",