Made mobs have health and stuff

Pathfinding is also a bit better now
master
opfromthestart 2022-08-28 13:49:50 -04:00
parent 3457fc39f3
commit 1fded82c2e
3 changed files with 76 additions and 23 deletions

View File

@ -19,6 +19,7 @@ minetest.register_tool("pmb_tools:wooden_pickaxe", {
uses = 32,
},
},
damage_groups = { fleshy = 1, cracky = 1},
},
groups = { pickaxe = 1 },
})
@ -34,6 +35,7 @@ minetest.register_tool("pmb_tools:wooden_axe", {
uses = 32,
},
},
damage_groups = { fleshy = 1, choppy = 1},
},
groups = { axe = 1 },
})
@ -49,6 +51,7 @@ minetest.register_tool("pmb_tools:wooden_shovel", {
uses = 32,
},
},
damage_groups = { fleshy = 1, crumbly = 1},
},
groups = { shovel = 1 },
})
@ -67,6 +70,7 @@ minetest.register_tool("pmb_tools:stone_pickaxe", {
uses = 64,
},
},
damage_groups = { fleshy = 1, cracky = 2},
},
groups = { pickaxe = 2 },
})
@ -81,6 +85,7 @@ minetest.register_tool("pmb_tools:stone_axe", {
uses = 64,
},
},
damage_groups = { fleshy = 2, choppy = 2},
},
groups = { axe = 2 },
})
@ -95,6 +100,7 @@ minetest.register_tool("pmb_tools:stone_shovel", {
uses = 64,
},
},
damage_groups = { fleshy = 1, crumbly = 2},
},
groups = { shovel = 2 },
})
@ -113,6 +119,7 @@ minetest.register_tool("pmb_tools:iron_pickaxe", {
uses = 192,
},
},
damage_groups = { fleshy = 2, cracky = 3},
},
groups = { pickaxe = 3 },
})
@ -127,6 +134,7 @@ minetest.register_tool("pmb_tools:iron_axe", {
uses = 192,
},
},
damage_groups = { fleshy = 3, choppy = 3},
},
groups = { axe = 3 },
})
@ -141,6 +149,7 @@ minetest.register_tool("pmb_tools:iron_shovel", {
uses = 192,
},
},
damage_groups = { fleshy = 2, crumbly = 3},
},
groups = { shovel = 3 },
})
@ -159,6 +168,7 @@ minetest.register_tool("pmb_tools:bronze_pickaxe", {
uses = 128,
},
},
damage_groups = { fleshy = 2, cracky = 3},
},
groups = { pickaxe = 3 },
})
@ -173,6 +183,7 @@ minetest.register_tool("pmb_tools:bronze_axe", {
uses = 128,
},
},
damage_groups = { fleshy = 3, choppy = 3},
},
groups = { axe = 3 },
})
@ -187,6 +198,7 @@ minetest.register_tool("pmb_tools:bronze_shovel", {
uses = 128,
},
},
damage_groups = { fleshy = 2, crumbly = 3},
},
groups = { shovel = 3 },
})
@ -205,6 +217,7 @@ minetest.register_tool("pmb_tools:diamond_pickaxe", {
uses = 1024,
},
},
damage_groups = { fleshy = 2, cracky = 4},
},
groups = { pickaxe = 4 },
})
@ -219,6 +232,7 @@ minetest.register_tool("pmb_tools:diamond_axe", {
uses = 1024,
},
},
damage_groups = { fleshy = 4, choppy = 4},
},
groups = { axe = 4 },
})
@ -233,6 +247,7 @@ minetest.register_tool("pmb_tools:diamond_shovel", {
uses = 1024,
},
},
damage_groups = { fleshy = 2, crumbly = 4},
},
groups = { shovel = 4 },
})

View File

@ -36,13 +36,49 @@ end
-- prev_pos = vector,
-- cost = float,
-- }
local function astar(s_pos, e_pos, min_cost, max_tries, max_queue)
local function astar(s_pos, e_pos, min_cost, max_tries, max_queue, valid_node)
if not max_tries then
max_tries = 500
end
if not max_queue then
max_queue = 1000
end
if not valid_node then
function valid_node(nodepos, frompos)
local offset = vector.subtract(nodepos, frompos)
if offset.x==0 and offset.z==0 then
return false
end
local node = minetest.get_node(nodepos)
local nodedef = minetest.registered_nodes[node.name]
if nodedef.walkable then
return false
end
node = minetest.get_node(vector.offset(nodepos, 0, -1, 0))
nodedef = minetest.registered_nodes[node.name]
if not nodedef.walkable then
return false
end
node = minetest.get_node(vector.offset(nodepos, 0, 1, 0))
nodedef = minetest.registered_nodes[node.name]
if nodedef.walkable then
return false
end
if offset.x ~= 0 and offset.z ~= 0 then
node = minetest.get_node(vector.offset(nodepos, -offset.x, 0, 0))
nodedef = minetest.registered_nodes[node.name]
if nodedef.walkable then
return false
end
node = minetest.get_node(vector.offset(nodepos, 0, 0, -offset.z))
nodedef = minetest.registered_nodes[node.name]
if nodedef.walkable then
return false
end
end
return true
end
end
if not min_cost then
function min_cost(pos1, pos2)
return vector.distance(pos1, pos2)
@ -67,19 +103,10 @@ local function astar(s_pos, e_pos, min_cost, max_tries, max_queue)
for dx = -1, 1 do
for dy = -1, 1 do
for dz = -1, 1 do
if dx == 0 and dz == 0 then
break
end
local nodepos = vector.offset(from.pos, dx, dy, dz)
local node = minetest.get_node(nodepos)
local nodedef = minetest.registered_nodes[node.name]
if not nodedef.walkable then
node = minetest.get_node(vector.offset(nodepos, 0, -1, 0))
nodedef = minetest.registered_nodes[node.name]
if nodedef.walkable then
table.insert(to_add,
{ pos = nodepos, prev_pos = from, cost = from.cost + min_cost(from.pos, nodepos) })
end
if valid_node(nodepos, from.pos) then
table.insert(to_add,
{ pos = nodepos, prev_pos = from, cost = from.cost + min_cost(from.pos, nodepos) })
end
end
end
@ -143,34 +170,44 @@ function pmb_entity_api.get_default_movement(callable)
if not self._pmb_last_pos then
self._pmb_last_pos = p
end
if not self._pmb_stuck_timer then
self._pmb_stuck_timer = 0
end
if vector.distance(self._pmb_last_pos, p) < 0.02 then
if min_cost_2d(self._pmb_last_pos, p) < 0.02 then
self._pmb_stuck_timer = self._pmb_stuck_timer + 1
--minetest.log(tostring(self._pmb_stuck_timer))
else
self._pmb_stuck_timer = 0
end
if self._pmb_stuck_timer > 20 then
if self._pmb_stuck_timer > 70 then
self._pmb_path = nil
self._pmb_stuck_timer = 0
end
if not self._pmb_path or table.maxn(self._pmb_path) == 0 then
if not self._pmb_path_timer then
self._pmb_path_timer = 0
end
self._pmb_path_timer = self._pmb_path_timer + 1
if (not self._pmb_path or table.maxn(self._pmb_path) == 0) and self._pmb_path_timer > 70 then
--local ang = math.random()*6.28
minetest.log("new path")
local wander_pos = self._pmb_follow:get_pos()
self._pmb_path = astar(p, wander_pos, nil, nil)
self._pmb_path_timer = 0
end
local last_vel = self.object:get_velocity()
self.object:set_velocity(vector.offset(last_vel, 0, -12*dtime, 0))
if table.maxn(self._pmb_path) == 0 then
self.object:set_velocity(vector.offset(last_vel, 0, -12 * dtime, 0))
if not self._pmb_path or table.maxn(self._pmb_path) == 0 then
return
end
if min_cost_2d(p, self._pmb_path[1]) < 1 then
if min_cost_2d(p, self._pmb_path[1]) < 1.2 then
table.remove(self._pmb_path, 1)
end
if table.maxn(self._pmb_path) == 0 then
self.object:set_velocity(vector.new(0, last_vel.y, 0))
return
end
local next_pos = self._pmb_path[1]

View File

@ -2,13 +2,14 @@ minetest.register_entity("pmb_entity_base:base", {
initial_properties = {
visual = "mesh",
mesh = "humanoid.b3d",
stepheight = 1,
hp_max = 3,
physical = true,
},
on_step = pmb_entity_api.get_default_movement(function()
--minetest.log("tick")
end),
physical = true,
stepheight = 1.1,
_pmb_speed = 3,
_pmb_speed = 2,
})
minetest.register_craftitem("pmb_entity_base:base_spawn",