initial_properties update

This commit is contained in:
tenplus1 2023-09-23 13:31:49 +01:00
parent 7044e20382
commit 130d67a8f7
1 changed files with 94 additions and 46 deletions

140
api.lua
View File

@ -11,7 +11,7 @@ local use_mc2 = minetest.get_modpath("mcl_core")
-- Global -- Global
mobs = { mobs = {
mod = "redo", mod = "redo",
version = "20230817", version = "20230923",
translate = S, translate = S,
invis = minetest.global_exists("invisibility") and invisibility or {}, invis = minetest.global_exists("invisibility") and invisibility or {},
node_snow = minetest.registered_aliases["mapgen_snow"] node_snow = minetest.registered_aliases["mapgen_snow"]
@ -126,17 +126,17 @@ local creatura = minetest.get_modpath("creatura") and
mobs.mob_class = { mobs.mob_class = {
stepheight = 1.1, -- stepheight = 1.1,
fly_in = "air", fly_in = "air",
owner = "", owner = "",
order = "", order = "",
jump_height = 4, jump_height = 4,
lifetimer = 180, -- 3 minutes lifetimer = 180, -- 3 minutes
physical = true, -- physical = true,
collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, -- collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25},
visual_size = {x = 1, y = 1}, -- visual_size = {x = 1, y = 1},
texture_mods = "", texture_mods = "",
makes_footstep_sound = false, -- makes_footstep_sound = false,
view_range = 5, view_range = 5,
walk_velocity = 1, walk_velocity = 1,
run_velocity = 2, run_velocity = 2,
@ -733,7 +733,7 @@ local CHILD_GROW_TIME = 60 * 20 -- 20 minutes
function mob_class:update_tag() function mob_class:update_tag()
local col local col
local qua = self.hp_max / 6 local qua = self.initial_properties.hp_max / 6
if self.health <= qua then if self.health <= qua then
col = "#FF0000" col = "#FF0000"
@ -767,7 +767,7 @@ function mob_class:update_tag()
end end
end end
self.infotext = "Health: " .. self.health .. " / " .. self.hp_max self.infotext = "Health: " .. self.health .. " / " .. self.initial_properties.hp_max
.. (self.owner == "" and "" or "\nOwner: " .. self.owner) .. (self.owner == "" and "" or "\nOwner: " .. self.owner)
.. text .. text
@ -903,8 +903,8 @@ function mob_class:check_for_death(cmi_cause)
end end
-- make sure health isn't higher than max -- make sure health isn't higher than max
if self.health > self.hp_max then if self.health > self.initial_properties.hp_max then
self.health = self.hp_max self.health = self.initial_properties.hp_max
end end
self:update_tag() self:update_tag()
@ -1743,7 +1743,7 @@ function mob_class:smart_mobs(s, p, dist, dtime)
end, self) end, self)
end end
if abs(vsubtract(s, target_pos).y) > self.stepheight then if abs(vsubtract(s, target_pos).y) > self.initial_properties.stepheight then
if height_switcher then if height_switcher then
use_pathfind = true use_pathfind = true
@ -1789,7 +1789,7 @@ function mob_class:smart_mobs(s, p, dist, dtime)
jumpheight = min(ceil( jumpheight = min(ceil(
self.jump_height / pathfinding_max_jump), pathfinding_max_jump) self.jump_height / pathfinding_max_jump), pathfinding_max_jump)
elseif self.stepheight > 0.5 then elseif self.initial_properties.stepheight > 0.5 then
jumpheight = 1 jumpheight = 1
end end
@ -2959,9 +2959,11 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
-- add healthy afterglow when hit (can cause lag with larger textures) -- add healthy afterglow when hit (can cause lag with larger textures)
if mob_hit_effect then if mob_hit_effect then
local _dtm = self.initial_properties.damage_texture_modifier
self.old_texture_mods = self.texture_mods self.old_texture_mods = self.texture_mods
self.object:set_texture_mod(self.texture_mods .. self.damage_texture_modifier) self.object:set_texture_mod(self.texture_mods .. _dtm)
minetest.after(0.3, function() minetest.after(0.3, function()
@ -3209,11 +3211,12 @@ function mob_class:mob_activate(staticdata, def, dtime)
def.textures = {def.textures} def.textures = {def.textures}
end end
self.base_texture = def.textures and def.textures[random(#def.textures)] self.base_texture = def.textures
and def.textures[random(#def.textures)]
self.base_mesh = def.mesh self.base_mesh = def.mesh
self.base_size = self.visual_size self.base_size = self.initial_properties.visual_size
self.base_colbox = self.collisionbox self.base_colbox = self.initial_properties.collisionbox
self.base_selbox = self.selectionbox self.base_selbox = self.initial_properties.selectionbox
end end
-- for current mobs that dont have this set -- for current mobs that dont have this set
@ -3259,7 +3262,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
end end
if self.health == 0 then if self.health == 0 then
self.health = random(self.hp_min, self.hp_max) self.health = random(self.hp_min, self.initial_properties.hp_max)
end end
-- pathfinding init -- pathfinding init
@ -3292,7 +3295,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
self.standing_on = "air" self.standing_on = "air"
-- check for existing nametag -- check for existing nametag
self.nametag = self.nametag or def.nametag self.nametag = self.initial_properties.nametag or def.nametag
-- set anything changed above -- set anything changed above
self.object:set_properties(self) self.object:set_properties(self)
@ -3593,7 +3596,44 @@ function mobs:register_mob(name, def)
minetest.register_entity(":" .. name, setmetatable({ minetest.register_entity(":" .. name, setmetatable({
stepheight = def.stepheight, initial_properties = {
hp_max = max(1, (def.hp_max or 10) * difficulty),
-- breath_max
-- zoom_fov
-- eye_height
physical = true,
-- collide_with_objects
collisionbox = collisionbox,
selectionbox = def.selectionbox or collisionbox,
-- pointable
visual = def.visual,
visual_size = def.visual_size,
mesh = def.mesh,
textures = nil,
-- colors
-- use_texture_alpha
-- spritediv
-- initial_sprite_basepos
-- is_visible
make_footstep_sound = def.make_footstep_sound,
-- automatic_rotate
stepheight = def.stepheight or 1.1,
-- automatic_face_movement_dir
-- automatic_face_movement_max_rotation_per_sec
-- backface_culling
glow = def.glow,
-- nametag
-- nametag_color
-- nametag_bgcolor
-- infotext
-- static_save
damage_texture_modifier = def.damage_texture_modifier or "^[colorize:#c9900070",
-- shaded
-- show_on_minimap
},
-- stepheight = def.stepheight,
name = name, name = name,
type = def.type, type = def.type,
attack_type = def.attack_type, attack_type = def.attack_type,
@ -3609,22 +3649,22 @@ minetest.register_entity(":" .. name, setmetatable({
can_leap = def.can_leap, can_leap = def.can_leap,
drawtype = def.drawtype, -- DEPRECATED, use rotate instead drawtype = def.drawtype, -- DEPRECATED, use rotate instead
rotate = rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2 rotate = rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2
glow = def.glow, -- glow = def.glow,
lifetimer = def.lifetimer, lifetimer = def.lifetimer,
hp_min = max(1, (def.hp_min or 5) * difficulty), hp_min = max(1, (def.hp_min or 5) * difficulty),
hp_max = max(1, (def.hp_max or 10) * difficulty), -- hp_max = max(1, (def.hp_max or 10) * difficulty),
collisionbox = collisionbox, --def.collisionbox, -- collisionbox = collisionbox,
selectionbox = def.selectionbox or collisionbox, --def.collisionbox, -- selectionbox = def.selectionbox or collisionbox,
visual = def.visual, -- visual = def.visual,
visual_size = def.visual_size, -- visual_size = def.visual_size,
mesh = def.mesh, -- mesh = def.mesh,
makes_footstep_sound = def.makes_footstep_sound, -- makes_footstep_sound = def.makes_footstep_sound,
view_range = def.view_range, view_range = def.view_range,
walk_velocity = def.walk_velocity, walk_velocity = def.walk_velocity,
run_velocity = def.run_velocity, run_velocity = def.run_velocity,
damage = max(0, (def.damage or 0) * difficulty), damage = max(0, (def.damage or 0) * difficulty),
damage_group = def.damage_group, damage_group = def.damage_group,
damage_texture_modifier = def.damage_texture_modifier or "^[colorize:#c9900070", -- damage_texture_modifier = def.damage_texture_modifier or "^[colorize:#c9900070",
light_damage = def.light_damage, light_damage = def.light_damage,
light_damage_min = def.light_damage_min, light_damage_min = def.light_damage_min,
light_damage_max = def.light_damage_max, light_damage_max = def.light_damage_max,
@ -3637,7 +3677,6 @@ minetest.register_entity(":" .. name, setmetatable({
fall_speed = def.fall_speed, fall_speed = def.fall_speed,
drops = def.drops, drops = def.drops,
armor = def.armor, armor = def.armor,
on_rightclick = def.on_rightclick,
arrow = def.arrow, arrow = def.arrow,
arrow_override = def.arrow_override, arrow_override = def.arrow_override,
shoot_interval = def.shoot_interval, shoot_interval = def.shoot_interval,
@ -3658,7 +3697,6 @@ minetest.register_entity(":" .. name, setmetatable({
replace_what = def.replace_what, replace_what = def.replace_what,
replace_with = def.replace_with, replace_with = def.replace_with,
replace_offset = def.replace_offset, replace_offset = def.replace_offset,
on_replace = def.on_replace,
reach = def.reach, reach = def.reach,
texture_list = def.textures, texture_list = def.textures,
texture_mods = def.texture_mods or "", texture_mods = def.texture_mods or "",
@ -3673,7 +3711,6 @@ minetest.register_entity(":" .. name, setmetatable({
explosion_timer = def.explosion_timer, explosion_timer = def.explosion_timer,
allow_fuse_reset = def.allow_fuse_reset, allow_fuse_reset = def.allow_fuse_reset,
stop_to_explode = def.stop_to_explode, stop_to_explode = def.stop_to_explode,
custom_attack = def.custom_attack,
double_melee_attack = def.double_melee_attack, double_melee_attack = def.double_melee_attack,
dogshoot_switch = def.dogshoot_switch, dogshoot_switch = def.dogshoot_switch,
dogshoot_count_max = def.dogshoot_count_max, dogshoot_count_max = def.dogshoot_count_max,
@ -3694,6 +3731,9 @@ minetest.register_entity(":" .. name, setmetatable({
ignore_invisibility = def.ignore_invisibility, ignore_invisibility = def.ignore_invisibility,
messages = def.messages, messages = def.messages,
custom_attack = def.custom_attack,
on_replace = def.on_replace,
on_rightclick = def.on_rightclick,
on_spawn = def.on_spawn, on_spawn = def.on_spawn,
on_blast = def.on_blast, -- class redifinition on_blast = def.on_blast, -- class redifinition
do_punch = def.do_punch, do_punch = def.do_punch,
@ -4053,12 +4093,13 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter
end end
local ent = minetest.registered_entities[name] local ent = minetest.registered_entities[name]
local cbox = ent.initial_properties.collisionbox
-- should we check mob area for obstructions ? -- should we check mob area for obstructions ?
if mob_area_spawn ~= true then if mob_area_spawn ~= true then
-- do we have enough height clearance to spawn mob? -- do we have enough height clearance to spawn mob?
local height = max(0, ent.collisionbox[5] - ent.collisionbox[2]) local height = max(0, cbox[5] - cbox[2])
for n = 0, floor(height) do for n = 0, floor(height) do
@ -4077,7 +4118,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter
if pos then if pos then
-- adjust for mob collision box -- adjust for mob collision box
pos.y = pos.y + (ent.collisionbox[2] * -1) - 0.4 pos.y = pos.y + (cbox[2] * -1) - 0.4
local mob = minetest.add_entity(pos, name) local mob = minetest.add_entity(pos, name)
@ -4166,27 +4207,31 @@ function mobs:register_arrow(name, def)
minetest.register_entity(":" .. name, { minetest.register_entity(":" .. name, {
physical = def.physical or false, initial_properties = {
collide_with_objects = def.collide_with_objects or false,
static_save = false, physical = def.physical or false,
collide_with_objects = def.collide_with_objects or false,
static_save = false,
visual = def.visual,
visual_size = def.visual_size,
textures = def.textures,
collisionbox = def.collisionbox or {-.1, -.1, -.1, .1, .1, .1},
glow = def.glow
},
visual = def.visual,
visual_size = def.visual_size,
textures = def.textures,
velocity = def.velocity, velocity = def.velocity,
hit_player = def.hit_player, hit_player = def.hit_player,
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,
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 = def.collisionbox or {-.1, -.1, -.1, .1, .1, .1},
timer = 0, timer = 0,
lifetime = def.lifetime or 4.5, lifetime = def.lifetime or 4.5,
switch = 0, switch = 0,
owner_id = def.owner_id, owner_id = def.owner_id,
rotate = def.rotate, rotate = def.rotate,
automatic_face_movement_dir = def.rotate
and (def.rotate - (pi / 180)) or false, automatic_face_movement_dir = def.rotate and (def.rotate - (pi / 180)) or false,
on_activate = def.on_activate, on_activate = def.on_activate,
@ -4679,9 +4724,9 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame)
-- increase health -- increase health
self.health = self.health + 4 self.health = self.health + 4
if self.health >= self.hp_max then if self.health >= self.initial_properties.hp_max then
self.health = self.hp_max self.health = self.initial_properties.hp_max
end end
self.object:set_hp(self.health) self.object:set_hp(self.health)
@ -4838,7 +4883,10 @@ function mobs:alias_mob(old_name, new_name)
-- entity -- entity
minetest.register_entity(":" .. old_name, { minetest.register_entity(":" .. old_name, {
physical = false, static_save = false, initial_properties = {
physical = false,
static_save = false
},
on_activate = function(self, staticdata) on_activate = function(self, staticdata)