mirror of
https://codeberg.org/tenplus1/mobs_redo.git
synced 2025-07-20 17:20:23 +02:00
Compare commits
8 Commits
804f8b9a0c
...
469e35d6e0
Author | SHA1 | Date | |
---|---|---|---|
469e35d6e0 | |||
1271570780 | |||
ec3c6fb518 | |||
c4f56f4204 | |||
4814f53885 | |||
f033cd401c | |||
903e81bdab | |||
81dd3d75c0 |
51
api.lua
51
api.lua
@ -6,7 +6,7 @@ local use_cmi = minetest.global_exists("cmi")
|
|||||||
|
|
||||||
mobs = {
|
mobs = {
|
||||||
mod = "redo",
|
mod = "redo",
|
||||||
version = "20200701",
|
version = "20200723",
|
||||||
intllib = S,
|
intllib = S,
|
||||||
invis = minetest.global_exists("invisibility") and invisibility or {}
|
invis = minetest.global_exists("invisibility") and invisibility or {}
|
||||||
}
|
}
|
||||||
@ -196,6 +196,8 @@ end
|
|||||||
-- calculate distance
|
-- calculate distance
|
||||||
local get_distance = function(a, b)
|
local get_distance = function(a, b)
|
||||||
|
|
||||||
|
-- if not a or not b then return 50 end -- nil check
|
||||||
|
|
||||||
local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z
|
local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z
|
||||||
|
|
||||||
return square(x * x + y * y + z * z)
|
return square(x * x + y * y + z * z)
|
||||||
@ -812,6 +814,11 @@ local remove_mob = function(self, decrease)
|
|||||||
--print("-- active mobs: " .. active_mobs .. " / " .. active_limit)
|
--print("-- active mobs: " .. active_mobs .. " / " .. active_limit)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- global function for removing mobs
|
||||||
|
function mobs:remove(self, decrease)
|
||||||
|
remove_mob(self, decrease)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- check if mob is dead or only hurt
|
-- check if mob is dead or only hurt
|
||||||
function mob_class:check_for_death(cmi_cause)
|
function mob_class:check_for_death(cmi_cause)
|
||||||
@ -1013,7 +1020,7 @@ function mob_class:do_env_damage()
|
|||||||
self:update_tag()
|
self:update_tag()
|
||||||
end
|
end
|
||||||
|
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos() ; if not pos then return end
|
||||||
|
|
||||||
self.time_of_day = minetest.get_timeofday()
|
self.time_of_day = minetest.get_timeofday()
|
||||||
|
|
||||||
@ -1538,7 +1545,9 @@ local height_switcher = false
|
|||||||
function mob_class:smart_mobs(s, p, dist, dtime)
|
function mob_class:smart_mobs(s, p, dist, dtime)
|
||||||
|
|
||||||
local s1 = self.path.lastpos
|
local s1 = self.path.lastpos
|
||||||
local target_pos = self.attack:get_pos()
|
-- local target_pos = self.attack:get_pos()
|
||||||
|
local target_pos = p
|
||||||
|
|
||||||
|
|
||||||
-- is it becoming stuck?
|
-- is it becoming stuck?
|
||||||
if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then
|
if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then
|
||||||
@ -1602,10 +1611,6 @@ function mob_class:smart_mobs(s, p, dist, dtime)
|
|||||||
|
|
||||||
minetest.after(1, function(self)
|
minetest.after(1, function(self)
|
||||||
|
|
||||||
if not self.object:get_luaentity() then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.object:get_luaentity() then
|
if self.object:get_luaentity() then
|
||||||
|
|
||||||
if has_lineofsight then
|
if has_lineofsight then
|
||||||
@ -1687,7 +1692,10 @@ function mob_class:smart_mobs(s, p, dist, dtime)
|
|||||||
]]
|
]]
|
||||||
|
|
||||||
self.state = ""
|
self.state = ""
|
||||||
|
|
||||||
|
if self.attack then
|
||||||
self:do_attack(self.attack)
|
self:do_attack(self.attack)
|
||||||
|
end
|
||||||
|
|
||||||
-- no path found, try something else
|
-- no path found, try something else
|
||||||
if not self.path.way then
|
if not self.path.way then
|
||||||
@ -1785,12 +1793,16 @@ function mob_class:smart_mobs(s, p, dist, dtime)
|
|||||||
-- will try again in 2 second
|
-- will try again in 2 second
|
||||||
self.path.stuck_timer = stuck_timeout - 2
|
self.path.stuck_timer = stuck_timeout - 2
|
||||||
|
|
||||||
elseif s.y < p1.y and (not self.fly) then
|
elseif s.y < p1.y and (not self.fly) then
|
||||||
self:do_jump() --add jump to pathfinding
|
self:do_jump() --add jump to pathfinding
|
||||||
self.path.following = true
|
self.path.following = true
|
||||||
else
|
else
|
||||||
-- yay i found path
|
-- yay i found path
|
||||||
|
if self.attack then
|
||||||
self:mob_sound(self.sounds.war_cry)
|
self:mob_sound(self.sounds.war_cry)
|
||||||
|
else
|
||||||
|
self:mob_sound(self.sounds.random)
|
||||||
|
end
|
||||||
self:set_velocity(self.walk_velocity)
|
self:set_velocity(self.walk_velocity)
|
||||||
|
|
||||||
-- follow path now that it has it
|
-- follow path now that it has it
|
||||||
@ -1831,7 +1843,7 @@ function mob_class:general_attack()
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local s = self.object:get_pos()
|
local s = self.object:get_pos() ; if not s then return end
|
||||||
local objs = minetest.get_objects_inside_radius(s, self.view_range)
|
local objs = minetest.get_objects_inside_radius(s, self.view_range)
|
||||||
|
|
||||||
-- remove entities we aren't interested in
|
-- remove entities we aren't interested in
|
||||||
@ -2001,7 +2013,7 @@ function mob_class:follow_flop()
|
|||||||
and self.state ~= "attack"
|
and self.state ~= "attack"
|
||||||
and self.state ~= "runaway" then
|
and self.state ~= "runaway" then
|
||||||
|
|
||||||
local s = self.object:get_pos()
|
local s = self.object:get_pos() ; if not s then return end
|
||||||
local players = minetest.get_connected_players()
|
local players = minetest.get_connected_players()
|
||||||
|
|
||||||
for n = 1, #players do
|
for n = 1, #players do
|
||||||
@ -2132,11 +2144,11 @@ end
|
|||||||
-- execute current state (stand, walk, run, attacks)
|
-- execute current state (stand, walk, run, attacks)
|
||||||
function mob_class:do_states(dtime)
|
function mob_class:do_states(dtime)
|
||||||
|
|
||||||
local yaw = self.object:get_yaw() or 0
|
local yaw = self.object:get_yaw() ; if not yaw then return end
|
||||||
|
|
||||||
if self.state == "stand" then
|
if self.state == "stand" then
|
||||||
|
|
||||||
if random(4) == 1 then
|
if self.randomly_turn and random(4) == 1 then
|
||||||
|
|
||||||
local lp
|
local lp
|
||||||
local s = self.object:get_pos()
|
local s = self.object:get_pos()
|
||||||
@ -2224,7 +2236,7 @@ function mob_class:do_states(dtime)
|
|||||||
yaw = self:set_yaw(yaw, 8)
|
yaw = self:set_yaw(yaw, 8)
|
||||||
|
|
||||||
-- otherwise randomly turn
|
-- otherwise randomly turn
|
||||||
elseif random(100) <= 30 then
|
elseif self.randomly_turn and random(100) <= 30 then
|
||||||
|
|
||||||
yaw = yaw + random(-0.5, 0.5)
|
yaw = yaw + random(-0.5, 0.5)
|
||||||
|
|
||||||
@ -2284,12 +2296,12 @@ function mob_class:do_states(dtime)
|
|||||||
-- attack routines (explode, dogfight, shoot, dogshoot)
|
-- attack routines (explode, dogfight, shoot, dogshoot)
|
||||||
elseif self.state == "attack" then
|
elseif self.state == "attack" then
|
||||||
|
|
||||||
-- calculate distance from mob and enemy
|
-- get mob and enemy positions and distance between
|
||||||
local s = self.object:get_pos()
|
local s = self.object:get_pos()
|
||||||
local p = self.attack:get_pos() or s
|
local p = self.attack:get_pos()
|
||||||
local dist = get_distance(p, s)
|
local dist = p and get_distance(p, s) or 500
|
||||||
|
|
||||||
-- stop attacking if player invisible or out of range
|
-- stop attacking if player out of range or invisible
|
||||||
if dist > self.view_range
|
if dist > self.view_range
|
||||||
or not self.attack
|
or not self.attack
|
||||||
or not self.attack:get_pos()
|
or not self.attack:get_pos()
|
||||||
@ -2425,7 +2437,8 @@ function mob_class:do_states(dtime)
|
|||||||
|
|
||||||
elseif self.attack_type == "dogfight"
|
elseif self.attack_type == "dogfight"
|
||||||
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2)
|
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2)
|
||||||
or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then
|
or (self.attack_type == "dogshoot" and dist <= self.reach
|
||||||
|
and self:dogswitch() == 0) then
|
||||||
|
|
||||||
if self.fly
|
if self.fly
|
||||||
and dist > self.reach then
|
and dist > self.reach then
|
||||||
@ -2472,7 +2485,6 @@ function mob_class:do_states(dtime)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- rnd: new movement direction
|
-- rnd: new movement direction
|
||||||
@ -3564,6 +3576,7 @@ minetest.register_entity(name, setmetatable({
|
|||||||
owner_loyal = def.owner_loyal,
|
owner_loyal = def.owner_loyal,
|
||||||
pushable = def.pushable,
|
pushable = def.pushable,
|
||||||
stay_near = def.stay_near,
|
stay_near = def.stay_near,
|
||||||
|
randomly_turn = def.randomly_turn ~= false,
|
||||||
|
|
||||||
on_spawn = def.on_spawn,
|
on_spawn = def.on_spawn,
|
||||||
|
|
||||||
|
4
api.txt
4
api.txt
@ -31,13 +31,15 @@ functions needed for the mob to work properly which contains the following:
|
|||||||
'hp_max' has the maximum health value the mob can spawn with.
|
'hp_max' has the maximum health value the mob can spawn with.
|
||||||
'armor' holds strength of mob, 100 is normal, lower is more powerful
|
'armor' holds strength of mob, 100 is normal, lower is more powerful
|
||||||
and needs more hits and better weapons to kill.
|
and needs more hits and better weapons to kill.
|
||||||
'passive' when true allows animals to defend themselves when hit,
|
'passive' when false allows animals to defend themselves when hit,
|
||||||
otherwise they amble onwards.
|
otherwise they amble onwards.
|
||||||
'walk_velocity' is the speed that your mob can walk around.
|
'walk_velocity' is the speed that your mob can walk around.
|
||||||
'run_velocity' is the speed your mob can run with, usually when attacking.
|
'run_velocity' is the speed your mob can run with, usually when attacking.
|
||||||
'stand_chance' has a 0-100 chance value your mob will stand from walking.
|
'stand_chance' has a 0-100 chance value your mob will stand from walking.
|
||||||
'walk_chance' has a 0-100 chance value your mob will walk from standing,
|
'walk_chance' has a 0-100 chance value your mob will walk from standing,
|
||||||
set to 0 for jumping mobs only.
|
set to 0 for jumping mobs only.
|
||||||
|
'randomly_turn' if set to false then mob will not turn to face player or
|
||||||
|
randomly turn while walking or standing.
|
||||||
'jump' when true allows your mob to jump updwards.
|
'jump' when true allows your mob to jump updwards.
|
||||||
'jump_height' holds the height your mob can jump, 0 to disable jumping.
|
'jump_height' holds the height your mob can jump, 0 to disable jumping.
|
||||||
'stepheight' height of a block that your mob can easily walk up onto,
|
'stepheight' height of a block that your mob can easily walk up onto,
|
||||||
|
Reference in New Issue
Block a user