VoxeLibre/mods/ENTITIES/mcl_mobs/spawning.lua

1167 lines
39 KiB
Lua
Raw Normal View History

2021-04-08 15:52:50 +02:00
--lua locals
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local modern_lighting = minetest.settings:get_bool("mcl_mobs_modern_lighting", true)
local nether_threshold = tonumber(minetest.settings:get("mcl_mobs_nether_threshold")) or 11
local end_threshold = tonumber(minetest.settings:get("mcl_mobs_end_threshold")) or 0
local overworld_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_threshold")) or 0
local overworld_sky_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_sky_threshold")) or 7
2023-09-20 01:24:51 +02:00
local overworld_passive_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_passive_threshold")) or 7
2022-04-15 11:48:58 +02:00
local get_node = minetest.get_node
local get_item_group = minetest.get_item_group
local get_node_light = minetest.get_node_light
2021-04-08 15:52:50 +02:00
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
local mt_get_biome_name = minetest.get_biome_name
2022-04-15 11:48:58 +02:00
local get_objects_inside_radius = minetest.get_objects_inside_radius
local get_connected_players = minetest.get_connected_players
local math_random = math.random
2022-04-15 11:48:58 +02:00
local math_floor = math.floor
local math_ceil = math.ceil
local math_cos = math.cos
local math_sin = math.sin
local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end
2024-03-18 19:20:46 +01:00
local math_sqrt = math.sqrt
2022-04-15 11:48:58 +02:00
2022-07-17 05:42:45 +02:00
local vector_distance = vector.distance
2022-04-15 11:48:58 +02:00
local vector_new = vector.new
local vector_floor = vector.floor
local table_copy = table.copy
local table_remove = table.remove
local pairs = pairs
2023-01-28 03:31:41 +01:00
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_spawning", false)
2023-05-29 20:26:43 +02:00
local function mcl_log (message, property)
if LOGGING_ON then
2023-05-29 20:26:43 +02:00
if property then
message = message .. ": " .. dump(property)
end
mcl_util.mcl_log (message, "[Mobs spawn]", true)
end
end
local dbg_spawn_attempts = 0
local dbg_spawn_succ = 0
2022-10-07 22:46:13 +02:00
local dbg_spawn_counts = {}
2023-01-26 17:44:25 +01:00
local remove_far = true
local WAIT_FOR_SPAWN_ATTEMPT = 10
2023-02-09 21:43:46 +01:00
local FIND_SPAWN_POS_RETRIES = 16
local FIND_SPAWN_POS_RETRIES_SUCCESS_RESPIN = 8
2023-01-26 14:44:29 +01:00
local MOB_SPAWN_ZONE_INNER = 24
local MOB_SPAWN_ZONE_MIDDLE = 32
local MOB_SPAWN_ZONE_OUTER = 128
2023-01-26 14:44:29 +01:00
2021-04-08 18:07:20 +02:00
-- range for mob count
2023-01-26 14:44:29 +01:00
local MOB_CAP_INNER_RADIUS = 32
2022-07-17 05:42:45 +02:00
local aoc_range = 136
2023-01-26 17:44:25 +01:00
local MISSING_CAP_DEFAULT = 15
2023-05-29 20:26:43 +02:00
local MOBS_CAP_CLOSE = 10
local SPAWN_MAPGEN_LIMIT = mcl_vars.mapgen_limit - 150
2022-07-17 05:42:45 +02:00
local mob_cap = {
hostile = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
2023-05-29 22:43:27 +02:00
passive = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10,
2022-10-13 06:27:04 +02:00
ambient = tonumber(minetest.settings:get("mcl_mob_cap_ambient")) or 15,
2023-01-31 19:04:01 +01:00
water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 8,
2023-05-29 21:08:44 +02:00
water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20,
water_underground = tonumber(minetest.settings:get("mcl_mob_cap_water_underground")) or 5,
axolotl = tonumber(minetest.settings:get("mcl_mob_cap_axolotl")) or 2, -- TODO should be 5 when lush caves added
2022-10-13 06:27:04 +02:00
player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75,
2023-05-29 20:26:43 +02:00
global_hostile = tonumber(minetest.settings:get("mcl_mob_cap_hostile")) or 300,
global_non_hostile = tonumber(minetest.settings:get("mcl_mob_cap_non_hostile")) or 300,
2022-10-13 06:27:04 +02:00
total = tonumber(minetest.settings:get("mcl_mob_cap_total")) or 500,
2022-07-17 05:42:45 +02:00
}
2021-04-08 12:04:36 +02:00
2023-05-29 22:43:27 +02:00
local peaceful_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_percentage_spawned")) or 30
local peaceful_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_group_percentage_spawned")) or 15
local hostile_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_hostile_group_percentage_spawned")) or 20
mcl_log("Mob cap hostile: " .. mob_cap.hostile)
mcl_log("Mob cap water: " .. mob_cap.water)
mcl_log("Mob cap passive: " .. mob_cap.passive)
mcl_log("Percentage of peacefuls spawned: " .. peaceful_percentage_spawned)
mcl_log("Percentage of peaceful spawns are group: " .. peaceful_group_percentage_spawned)
mcl_log("Percentage of hostile spawns are group: " .. hostile_group_percentage_spawned)
2022-04-15 11:48:58 +02:00
--do mobs spawn?
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
local logging = minetest.settings:get_bool("mcl_logging_mobs_spawn",true)
2021-04-08 12:04:36 +02:00
local list_of_all_biomes = {}
2022-04-15 11:48:58 +02:00
-- count how many mobs are in an area
2022-07-17 05:42:45 +02:00
local function count_mobs(pos,r,mob_type)
2021-04-08 08:07:15 +02:00
local num = 0
2022-07-17 05:42:45 +02:00
for _,l in pairs(minetest.luaentities) do
if l and l.is_mob and (mob_type == nil or l.type == mob_type) then
local p = l.object:get_pos()
if p and vector_distance(p,pos) < r then
num = num + 1
end
2021-04-08 08:07:15 +02:00
end
end
return num
end
2021-04-08 18:07:20 +02:00
2022-07-17 05:42:45 +02:00
local function count_mobs_total(mob_type)
2022-07-17 03:45:41 +02:00
local num = 0
for _,l in pairs(minetest.luaentities) do
if l.is_mob then
2022-07-17 05:42:45 +02:00
if mob_type == nil or l.type == mob_type then
num = num + 1
end
2022-07-17 03:45:41 +02:00
end
end
return num
end
local function count_mobs_add_entry (mobs_list, mob_cat)
if mobs_list[mob_cat] then
mobs_list[mob_cat] = mobs_list[mob_cat] + 1
else
mobs_list[mob_cat] = 1
end
end
--categorise_by can be name or type or spawn_class
local function count_mobs_all(categorise_by, pos)
local mobs_found_wide = {}
local mobs_found_close = {}
2023-01-07 21:37:29 +01:00
local num = 0
for _,entity in pairs(minetest.luaentities) do
if entity and entity.is_mob then
local add_entry = false
--local mob_type = entity.type -- animal / monster / npc
local mob_cat = entity[categorise_by]
if pos then
local mob_pos = entity.object:get_pos()
if mob_pos then
local distance = vector.distance(pos, mob_pos)
2023-02-09 21:43:46 +01:00
--mcl_log("distance: ".. distance)
if distance <= MOB_SPAWN_ZONE_MIDDLE then
2023-02-09 21:43:46 +01:00
--mcl_log("distance is close")
count_mobs_add_entry (mobs_found_close, mob_cat)
count_mobs_add_entry (mobs_found_wide, mob_cat)
add_entry = true
elseif distance <= MOB_SPAWN_ZONE_OUTER then
2023-02-09 21:43:46 +01:00
--mcl_log("distance is wide")
count_mobs_add_entry (mobs_found_wide, mob_cat)
add_entry = true
else
--mcl_log("mob_pos: " .. minetest.pos_to_string(mob_pos))
end
end
2023-01-07 21:37:29 +01:00
else
count_mobs_add_entry (mobs_found_wide, mob_cat)
add_entry = true
end
if add_entry then
num = num + 1
2023-01-07 21:37:29 +01:00
end
end
end
2023-02-09 21:43:46 +01:00
--mcl_log("num: ".. num)
return mobs_found_close, mobs_found_wide, num
2023-01-07 21:37:29 +01:00
end
local function count_mobs_total_cap(mob_type)
2023-05-29 20:26:43 +02:00
local total = 0
local num = 0
2023-05-29 20:26:43 +02:00
local hostile = 0
local non_hostile = 0
for _,l in pairs(minetest.luaentities) do
if l.is_mob then
2023-05-29 20:26:43 +02:00
total = total + 1
local nametagged = l.nametag and l.nametag ~= ""
if ( mob_type == nil or l.type == mob_type ) and not nametagged then
if l.spawn_class == "hostile" then
hostile = hostile + 1
else
non_hostile = non_hostile + 1
end
num = num + 1
2023-05-29 20:26:43 +02:00
else
2023-05-29 21:08:44 +02:00
mcl_log("l.name", l.name)
2023-05-29 20:26:43 +02:00
mcl_log("l.nametag", l.nametag)
end
end
end
2023-05-29 20:26:43 +02:00
mcl_log("Total mobs", total)
mcl_log("hostile", hostile)
mcl_log("non_hostile", non_hostile)
return num, non_hostile, hostile
end
2021-04-08 08:07:15 +02:00
2023-02-09 21:43:46 +01:00
local function output_mob_stats(mob_counts, total_mobs, chat_display)
if (total_mobs) then
2023-02-09 21:43:46 +01:00
local total_output = "Total mobs found: " .. total_mobs
if chat_display then
minetest.log(total_output)
else
minetest.log("action", total_output)
end
end
2023-02-09 21:43:46 +01:00
local detailed = ""
if mob_counts then
for k, v1 in pairs(mob_counts) do
2023-02-09 21:43:46 +01:00
detailed = detailed .. tostring(k) .. ": " .. tostring(v1) .. "; "
end
end
if detailed and detailed ~= "" then
if chat_display then
minetest.log(detailed)
else
minetest.log("action", detailed)
end
end
end
2021-04-08 08:07:15 +02:00
-- global functions
2022-05-25 14:44:49 +02:00
function mcl_mobs:spawn_abm_check(pos, node, name)
2021-04-08 08:07:15 +02:00
-- global function to add additional spawn checks
-- return true to stop spawning mob
end
--[[
Custom elements changed:
2021-04-08 12:48:25 +02:00
2021-04-08 08:07:15 +02:00
name:
the mobs name
2021-04-12 15:45:00 +02:00
dimension:
2021-04-08 08:07:15 +02:00
"overworld"
"nether"
"end"
types of spawning:
"water"
"ground"
"lava"
2021-04-08 12:48:25 +02:00
biomes: tells the spawner to allow certain mobs to spawn in certain biomes
{"this", "that", "grasslands", "whatever"}
what is aoc??? objects in area
2021-04-08 08:07:15 +02:00
WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
]]--
2021-04-08 18:07:20 +02:00
2021-04-08 08:07:15 +02:00
--this is where all of the spawning information is kept
2021-04-08 14:09:43 +02:00
local spawn_dictionary = {}
--this is where all of the spawning information is kept for mobs that don't naturally spawn
local non_spawn_dictionary = {}
2021-04-08 08:07:15 +02:00
2022-05-25 14:44:49 +02:00
function mcl_mobs:spawn_setup(def)
2022-04-15 11:48:58 +02:00
if not mobs_spawn then return end
2021-04-08 12:48:25 +02:00
2022-04-15 11:48:58 +02:00
if not def then
minetest.log("warning", "Empty mob spawn setup definition")
return
end
2021-04-08 12:48:25 +02:00
2022-04-15 11:48:58 +02:00
local name = def.name
if not name then
minetest.log("warning", "Missing mob name")
2021-04-08 08:07:15 +02:00
return
end
2022-04-15 11:48:58 +02:00
local dimension = def.dimension or "overworld"
local type_of_spawning = def.type_of_spawning or "ground"
local biomes = def.biomes or list_of_all_biomes
local min_light = def.min_light or 0
local max_light = def.max_light or (minetest.LIGHT_MAX + 1)
local chance = def.chance or 1000
local aoc = def.aoc or aoc_range
local min_height = def.min_height or mcl_mapgen.overworld.min
local max_height = def.max_height or mcl_mapgen.overworld.max
local day_toggle = def.day_toggle
local on_spawn = def.on_spawn
local check_position = def.check_position
2021-04-08 08:07:15 +02:00
-- chance/spawn number override in minetest.conf for registered mob
local numbers = minetest.settings:get(name)
if numbers then
numbers = numbers:split(",")
chance = tonumber(numbers[1]) or chance
aoc = tonumber(numbers[2]) or aoc
if chance == 0 then
2022-05-25 14:44:49 +02:00
minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name))
2021-04-08 08:07:15 +02:00
return
end
2022-05-25 14:44:49 +02:00
minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
2021-04-08 08:07:15 +02:00
end
2022-04-15 11:48:58 +02:00
if chance < 1 then
chance = 1
minetest.log("warning", "Chance shouldn't be less than 1 (mob name: " .. name ..")")
end
2021-04-08 08:07:15 +02:00
2022-04-15 11:48:58 +02:00
spawn_dictionary[#spawn_dictionary + 1] = {
name = name,
dimension = dimension,
2022-07-17 05:42:45 +02:00
type_of_spawning = type_of_spawning,
2022-04-15 11:48:58 +02:00
biomes = biomes,
min_light = min_light,
max_light = max_light,
chance = chance,
aoc = aoc,
min_height = min_height,
max_height = max_height,
day_toggle = day_toggle,
check_position = check_position,
on_spawn = on_spawn,
}
end
2021-04-08 08:07:15 +02:00
function mcl_mobs:mob_light_lvl(mob_name, dimension)
local spawn_dictionary_consolidated = {}
if non_spawn_dictionary[mob_name] then
local mob_dimension = non_spawn_dictionary[mob_name][dimension]
if mob_dimension then
--minetest.log("Found in non spawn dictionary for dimension")
return mob_dimension.min_light, mob_dimension.max_light
else
--minetest.log("Found in non spawn dictionary but not for dimension")
local overworld_non_spawn_def = non_spawn_dictionary[mob_name]["overworld"]
if overworld_non_spawn_def then
return overworld_non_spawn_def.min_light, overworld_non_spawn_def.max_light
end
end
else
--minetest.log("must be in spawning dictionary")
for i,v in pairs(spawn_dictionary) do
local current_mob_name = spawn_dictionary[i].name
local current_mob_dim = spawn_dictionary[i].dimension
if mob_name == current_mob_name then
if not spawn_dictionary_consolidated[current_mob_name] then
spawn_dictionary_consolidated[current_mob_name] = {}
end
spawn_dictionary_consolidated[current_mob_name][current_mob_dim] = {
["min_light"] = spawn_dictionary[i].min_light,
["max_light"] = spawn_dictionary[i].max_light
}
end
end
if spawn_dictionary_consolidated[mob_name] then
--minetest.log("is in consolidated")
local mob_dimension = spawn_dictionary_consolidated[mob_name][dimension]
if mob_dimension then
--minetest.log("found for dimension")
return mob_dimension.min_light, mob_dimension.max_light
else
--minetest.log("not found for dimension, use overworld def")
local mob_dimension_default = spawn_dictionary_consolidated[mob_name]["overworld"]
if mob_dimension_default then
return mob_dimension_default.min_light, mob_dimension_default.max_light
end
end
else
--minetest.log("not in consolidated")
end
end
minetest.log("action", "There are no light levels for mob (" .. tostring(mob_name) .. ") in dimension (" .. tostring(dimension) .. "). Return defaults")
return 0, minetest.LIGHT_MAX+1
end
function mcl_mobs:non_spawn_specific(mob_name,dimension,min_light,max_light)
table.insert(non_spawn_dictionary, mob_name)
non_spawn_dictionary[mob_name] = {
[dimension] = {
min_light = min_light , max_light = max_light
}
}
end
function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn, check_position)
2021-04-08 08:07:15 +02:00
2022-04-15 11:48:58 +02:00
-- Do mobs spawn at all?
if not mobs_spawn then
return
end
2021-04-08 08:07:15 +02:00
2024-04-27 14:29:00 +02:00
assert(min_height)
assert(max_height)
2022-04-15 11:48:58 +02:00
-- chance/spawn number override in minetest.conf for registered mob
local numbers = minetest.settings:get(name)
2021-04-08 08:07:15 +02:00
2022-04-15 11:48:58 +02:00
if numbers then
numbers = numbers:split(",")
chance = tonumber(numbers[1]) or chance
aoc = tonumber(numbers[2]) or aoc
2021-04-08 08:07:15 +02:00
2022-04-15 11:48:58 +02:00
if chance == 0 then
2022-05-25 14:44:49 +02:00
minetest.log("warning", string.format("[mcl_mobs] %s has spawning disabled", name))
2022-04-15 11:48:58 +02:00
return
end
2021-04-08 08:07:15 +02:00
2022-05-25 14:44:49 +02:00
minetest.log("action", string.format("[mcl_mobs] Chance setting for %s changed to %s (total: %s)", name, chance, aoc))
2021-04-08 18:07:20 +02:00
end
2021-04-08 08:07:15 +02:00
--load information into the spawn dictionary
2021-04-08 15:52:50 +02:00
local key = #spawn_dictionary + 1
spawn_dictionary[key] = {}
spawn_dictionary[key]["name"] = name
spawn_dictionary[key]["dimension"] = dimension
spawn_dictionary[key]["type_of_spawning"] = type_of_spawning
spawn_dictionary[key]["biomes"] = biomes
spawn_dictionary[key]["min_light"] = min_light
spawn_dictionary[key]["max_light"] = max_light
spawn_dictionary[key]["chance"] = chance
spawn_dictionary[key]["aoc"] = aoc
spawn_dictionary[key]["min_height"] = min_height
spawn_dictionary[key]["max_height"] = max_height
spawn_dictionary[key]["day_toggle"] = day_toggle
spawn_dictionary[key]["check_position"] = check_position
end
-- Calculate the inverse of a piecewise linear function f(x). Line segments are represented as two
-- adjacent points specified as { x, f(x) }. At least 2 points are required. If there are most solutions,
-- the one with a lower x value will be chosen.
local function inverse_pwl(fx, f)
if fx < f[1][2] then
return f[1][1]
end
2021-04-08 08:07:15 +02:00
for i=2,#f do
local x0,fx0 = unpack(f[i-1])
local x1,fx1 = unpack(f[i ])
if fx < fx1 then
return (fx - fx0) * (x1 - x0) / (fx1 - fx0) + x0
end
end
return f[#f][1]
2023-11-23 00:11:13 +01:00
end
2023-01-26 14:44:29 +01:00
local SPAWN_DISTANCE_CDF_PWL = {
{0.000,0.00},
{0.083,0.40},
{0.416,0.75},
{1.000,1.00},
}
2022-04-15 11:48:58 +02:00
local two_pi = 2 * math.pi
local function get_next_mob_spawn_pos(pos)
-- Select a distance such that distances closer to the player are selected much more often than
-- those further away from the player.
local fx = (math_random(1,10000)-1) / 10000
local x = inverse_pwl(fx, SPAWN_DISTANCE_CDF_PWL)
local distance = x * (MOB_SPAWN_ZONE_OUTER - MOB_SPAWN_ZONE_INNER) + MOB_SPAWN_ZONE_INNER
--print("Using spawn distance of "..tostring(distance).." fx="..tostring(fx)..",x="..tostring(x))
2023-02-09 21:43:46 +01:00
-- TODO Floor xoff and zoff and add 0.5 so it tries to spawn in the middle of the square. Less failed attempts.
-- Use spherical coordinates https://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates
local theta = math_random() * two_pi
local phi = math_random() * two_pi
local xoff = math_round(distance * math_sin(theta) * math_cos(phi))
local yoff = math_round(distance * math_cos(theta))
local zoff = math_round(distance * math_sin(theta) * math_sin(phi))
local goal_pos = vector.offset(pos, xoff, yoff, zoff)
if not ( math.abs(goal_pos.x) <= SPAWN_MAPGEN_LIMIT and math.abs(pos.y) <= SPAWN_MAPGEN_LIMIT and math.abs(goal_pos.z) <= SPAWN_MAPGEN_LIMIT ) then
mcl_log("Pos outside mapgen limits: " .. minetest.pos_to_string(goal_pos))
return nil
end
2024-03-18 19:20:46 +01:00
-- Calculate upper/lower y limits
local R1 = MOB_SPAWN_ZONE_OUTER
2024-03-18 19:20:46 +01:00
local d = vector_distance( pos, vector.new( goal_pos.x, pos.y, goal_pos.z ) ) -- distance from player to projected point on horizontal plane
local y1 = math_sqrt( R1*R1 - d*d ) -- absolue value of distance to outer sphere
local y_min
local y_max
2024-03-18 19:20:46 +01:00
if d >= MOB_SPAWN_ZONE_INNER then
-- Outer region, y range has both ends on the outer sphere
y_min = pos.y - y1
y_max = pos.y + y1
else
2024-03-18 19:20:46 +01:00
-- Inner region, y range spans between inner and outer spheres
local R2 = MOB_SPAWN_ZONE_INNER
local y2 = math_sqrt( R2*R2 - d*d )
if goal_pos.y > pos. y then
-- Upper hemisphere
y_min = pos.y + y2
y_max = pos.y + y1
else
-- Lower hemisphere
y_min = pos.y - y1
y_max = pos.y - y2
end
end
2024-03-18 19:20:46 +01:00
y_min = math_round(y_min)
y_max = math_round(y_max)
-- Limit total range of check to 32 nodes (maximum of 3 map blocks)
if y_max > goal_pos.y + 16 then
y_max = goal_pos.y + 16
end
if y_min < goal_pos.y - 16 then
y_min = goal_pos.y - 16
end
-- Ask engine for valid spawn locations
local spawning_position_list = find_nodes_in_area_under_air(
{x = goal_pos.x, y = y_min, z = goal_pos.z},
{x = goal_pos.x, y = y_max, z = goal_pos.z},
{"group:solid", "group:water", "group:lava"}
) or {}
-- Select only the locations at a valid distance
local valid_positions = {}
for _,check_pos in ipairs(spawning_position_list) do
local dist = vector.distance(pos, check_pos)
if dist >= MOB_SPAWN_ZONE_INNER and dist <= MOB_SPAWN_ZONE_OUTER then
valid_positions[#valid_positions + 1] = check_pos
end
end
spawning_position_list = valid_positions
2021-04-08 08:07:15 +02:00
-- No valid locations, failed to find a position
if #spawning_position_list == 0 then
mcl_log("Spawning position isn't good. Do not spawn: " .. minetest.pos_to_string(goal_pos))
return nil
end
-- Pick a random valid location
mcl_log("Spawning positions available: " .. minetest.pos_to_string(goal_pos))
return spawning_position_list[math_random(1, #spawning_position_list)]
2021-04-08 08:07:15 +02:00
end
2021-04-08 15:52:50 +02:00
--a simple helper function for mob_spawn
local function biome_check(biome_list, biome_goal)
2022-04-15 11:48:58 +02:00
for _, data in pairs(biome_list) do
2021-04-08 15:52:50 +02:00
if data == biome_goal then
return true
end
2021-04-08 08:07:15 +02:00
end
2021-04-08 15:52:50 +02:00
return false
end
2021-04-12 15:45:00 +02:00
local function is_farm_animal(n)
return n == "mobs_mc:pig" or n == "mobs_mc:cow" or n == "mobs_mc:sheep" or n == "mobs_mc:chicken" or n == "mobs_mc:horse" or n == "mobs_mc:donkey"
end
2021-04-08 08:07:15 +02:00
2022-07-05 03:49:46 +02:00
local function get_water_spawn(p)
local nn = minetest.find_nodes_in_area(vector.offset(p,-2,-1,-2),vector.offset(p,2,-15,2),{"group:water"})
if nn and #nn > 0 then
return nn[math.random(#nn)]
end
end
local function has_room(self,pos)
local cb = self.collisionbox
local nodes = {}
if self.fly_in then
local t = type(self.fly_in)
if t == "table" then
nodes = table.copy(self.fly_in)
elseif t == "string" then
table.insert(nodes,self.fly_in)
end
end
table.insert(nodes,"air")
local x = cb[4] - cb[1]
local y = cb[5] - cb[2]
local z = cb[6] - cb[3]
local r = math.ceil(x * y * z)
local p1 = vector.offset(pos,cb[1],cb[2],cb[3])
local p2 = vector.offset(pos,cb[4],cb[5],cb[6])
local n = #minetest.find_nodes_in_area(p1,p2,nodes) or 0
if r > n then
2022-10-13 21:48:32 +02:00
minetest.log("warning","[mcl_mobs] No room for mob "..self.name.." at "..minetest.pos_to_string(vector.round(pos)))
return false
end
return true
end
mcl_mobs.custom_biomecheck = nil
2023-01-26 14:44:29 +01:00
function mcl_mobs.register_custom_biomecheck(custom_biomecheck)
mcl_mobs.custom_biomecheck = custom_biomecheck
end
local function get_biome_name(pos)
if mcl_mobs.custom_biomecheck then
return mcl_mobs.custom_biomecheck (pos)
else
local gotten_biome = minetest.get_biome_data(pos)
if not gotten_biome then
return
end
gotten_biome = mt_get_biome_name(gotten_biome.biome)
--minetest.log ("biome: " .. dump(gotten_biome))
return gotten_biome
end
end
2023-01-26 14:44:29 +01:00
local counts = {}
local function spawn_check(pos, spawn_def)
local function log_fail(reason)
local count = (counts[reason] or 0) + 1
counts[reason] = count
mcl_log("Spawn check failed - "..reason.." ("..count..")")
return false
end
if not spawn_def or not pos then return log_fail("missing pos or spawn_def") end
local gotten_node = get_node(pos).name
if not gotten_node then return log_fail("unable to get node") end
dbg_spawn_attempts = dbg_spawn_attempts + 1
-- Make sure the mob can spawn at this location
if pos.y < spawn_def.min_height or pos.y > spawn_def.max_height then return log_fail("incorrect height") end
-- Make the dimention is correct
local dimension = mcl_worlds.pos_to_dimension(pos)
if spawn_def.dimension ~= dimension then return log_fail("incorrect dimension") end
2023-03-16 21:22:52 +01:00
-- Make sure the biome is correct
local biome_name = get_biome_name(pos)
if not biome_name then return end
if not biome_check(spawn_def.biomes, biome_name) then return log_fail("incorrect biome") end
-- Never spawn directly on bedrock
if gotten_node == "mcl_core:bedrock" then return log_fail("tried to spawn on bedrock") end
-- Spawning prohibited in protected areas
if spawn_protected and minetest.is_protected(pos, "") then return log_fail("tried to spawn in protected area") end
-- Ground mobs must spawn on solid nodes that are not leafes
local is_ground = minetest.get_item_group(gotten_node,"solid") ~= 0
if not is_ground then
mcl_log("Node "..gotten_node.." not solid, trying one block")
pos.y = pos.y - 1
gotten_node = get_node(pos).name
is_ground = minetest.get_item_group(gotten_node,"solid") ~= 0
end
pos.y = pos.y + 1
if spawn_def.type_of_spawning == "ground" and (not is_ground or get_item_group(gotten_node, "leaves") ~= 0) then
return log_fail("not ground node")
end
-- Water mobs must spawn in water
if spawn_def.type_of_spawning == "water" and get_item_group(gotten_node, "water") == 0 then return log_fail("not water node") end
-- Farm animals must spawn on grass
if is_farm_animal(spawn_def.name) and get_item_group(gotten_node, "grass_block") == 0 then return log_fail("not grass block") end
-- Spawns require enough room for the mob
local mob_def = minetest.registered_entities[spawn_def.name]
if not has_room(mob_def,pos) then return log_fail("mob doesn't fit here") end
-- Don't spawn if the spawn definition has a custom check and that fails
if spawn_def.check_position and not spawn_def.check_position(pos) then return log_fail("custom position check failed") end
local gotten_light = get_node_light(pos)
-- Legacy lighting
if not modern_lighting then
if gotten_light < spawn_def.min_light or gotten_light > spawn_def.max_light then
return log_fail("incorrect light level")
end
end
-- Modern lighting
local my_node = get_node(pos)
local sky_light = minetest.get_natural_light(pos)
local art_light = minetest.get_artificial_light(my_node.param1)
if mob_def.spawn_check then
if not mob_def.spawn_check(pos, gotten_light, art_light, sky_light) then
return log_fail("mob_def.spawn_check failed")
end
elseif mob_def.type == "monster" then
if dimension == "nether" then
if art_light > nether_threshold then
return log_fail("artificial light too high")
end
elseif dimension == "end" then
if art_light > end_threshold then
return log_fail("artificial light too high")
end
elseif dimension == "overworld" then
if art_light > overworld_threshold then
return log_fail("artificial light too high")
end
if sky_light > overworld_sky_threshold then
return log_fail("sky light too high")
end
end
else
-- passive threshold is apparently the same in all dimensions ...
if gotten_light < overworld_passive_threshold then
return log_fail("light too low")
end
end
return true
end
2022-07-17 03:45:41 +02:00
2022-09-09 23:31:02 +02:00
function mcl_mobs.spawn(pos,id)
local def = minetest.registered_entities[id] or minetest.registered_entities["mobs_mc:"..id] or minetest.registered_entities["extra_mobs:"..id]
if not def or (def.can_spawn and not def.can_spawn(pos)) or not def.is_mob then
return false
end
2022-10-07 22:46:13 +02:00
if not dbg_spawn_counts[def.name] then
dbg_spawn_counts[def.name] = 1
else
dbg_spawn_counts[def.name] = dbg_spawn_counts[def.name] + 1
end
2022-09-09 23:31:02 +02:00
return minetest.add_entity(pos, def.name)
end
local function spawn_group(p,mob,spawn_on,amount_to_spawn)
2022-07-17 05:42:45 +02:00
local nn= minetest.find_nodes_in_area_under_air(vector.offset(p,-5,-3,-5),vector.offset(p,5,3,5),spawn_on)
2022-07-17 02:20:12 +02:00
local o
table.shuffle(nn)
if not nn or #nn < 1 then
nn = {}
table.insert(nn,p)
end
for i = 1, amount_to_spawn do
2022-07-17 05:42:45 +02:00
local sp = vector.offset(nn[math.random(#nn)],0,1,0)
if spawn_check(nn[math.random(#nn)],mob) then
if mob.type_of_spawning == "water" then
sp = get_water_spawn(sp)
end
o = mcl_mobs.spawn(sp,mob.name)
if o then dbg_spawn_succ = dbg_spawn_succ + 1 end
2022-07-17 05:42:45 +02:00
end
2022-07-05 12:55:14 +02:00
end
2022-07-17 02:20:12 +02:00
return o
2022-07-05 12:55:14 +02:00
end
2022-09-09 23:31:02 +02:00
mcl_mobs.spawn_group = spawn_group
2022-08-01 05:35:47 +02:00
local S = minetest.get_translator("mcl_mobs")
2022-08-01 05:35:47 +02:00
minetest.register_chatcommand("spawn_mob",{
privs = { debug = true },
description=S("spawn_mob is a chatcommand that allows you to type in the name of a mob without 'typing mobs_mc:' all the time like so; 'spawn_mob spider'. however, there is more you can do with this special command, currently you can edit any number, boolean, and string variable you choose with this format: spawn_mob 'any_mob:var<mobs_variable=variable_value>:'. any_mob being your mob of choice, mobs_variable being the variable, and variable value being the value of the chosen variable. and example of this format: \n spawn_mob skeleton:var<passive=true>:\n this would spawn a skeleton that wouldn't attack you. REMEMBER-THIS> when changing a number value always prefix it with 'NUM', example: \n spawn_mob skeleton:var<jump_height=NUM10>:\n this setting the skelly's jump height to 10. if you want to make multiple changes to a mob, you can, example: \n spawn_mob skeleton:var<passive=true>::var<jump_height=NUM10>::var<fly_in=air>::var<fly=true>:\n etc."),
2022-08-01 05:35:47 +02:00
func = function(n,param)
local pos = minetest.get_player_by_name(n):get_pos()
local modifiers = {}
for capture in string.gmatch(param, "%:(.-)%:") do
table.insert(modifiers, ":"..capture)
end
local mod1 = string.find(param, ":")
local mobname = param
if mod1 then
mobname = string.sub(param, 1, mod1-1)
end
local mob = mcl_mobs.spawn(pos,mobname)
if mob then
for c=1, #modifiers do
modifs = modifiers[c]
local mod1 = string.find(modifs, ":")
local mod_start = string.find(modifs, "<")
local mod_vals = string.find(modifs, "=")
local mod_end = string.find(modifs, ">")
local mob_entity = mob:get_luaentity()
if string.sub(modifs, mod1+1, mod1+3) == "var" then
if mod1 and mod_start and mod_vals and mod_end then
local variable = string.sub(modifs, mod_start+1, mod_vals-1)
local value = string.sub(modifs, mod_vals+1, mod_end-1)
number_tag = string.find(value, "NUM")
if number_tag then
value = tonumber(string.sub(value, 4, -1))
end
if value == "true" then
value = true
elseif value == "false" then
value = false
end
if not mob_entity[variable] then
minetest.log("warning", n.." mob variable "..variable.." previously unset")
end
mob_entity[variable] = value
else
minetest.log("warning", n.." couldn't modify "..mobname.." at "..minetest.pos_to_string(pos).. ", missing paramaters")
end
else
minetest.log("warning", n.." couldn't modify "..mobname.." at "..minetest.pos_to_string(pos).. ", missing modification type")
end
end
minetest.log("action", n.." spawned "..mobname.." at "..minetest.pos_to_string(pos))
return true, mobname.." spawned at "..minetest.pos_to_string(pos)
else
return false, "Couldn't spawn "..mobname
2022-08-01 05:35:47 +02:00
end
end
})
if mobs_spawn then
Merge NEW MOBS by @jordan4ibanez from `mineclone5` branch commit cd472337985d6e885eef019185f0965d13148e7f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 22:02:20 2021 -0400 Fix rabbit rotation commit 0f4628db09d68f69a997f98dcd462f29e7ecbe06 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 20:48:42 2021 -0400 Bring mob spawning variable to the top of the spawning.lua file so it's easier to find commit ddb33acf0d85f29dddb8bdab7a3a7030f9f595be Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 20:46:45 2021 -0400 Add in unused head code elements commit e52aab45c07c22605993126c4a8ba39c8318d904 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 20:23:46 2021 -0400 Implement no-op head operations for enderman commit ac852309388e1f9a7dec294440975c7dc89e498c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 20:08:45 2021 -0400 Add in chicken head code with additional pitch modifier commit f57c4709ac74d1e2b0b683bebc706a1a3e59db73 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 19:54:11 2021 -0400 Comment out code that causes mobs to glitch push players in mcl_playerplus commit b6c9a1c423a9831cb3684e6a7e1b57163d6d4ab4 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 19:51:11 2021 -0400 Fix creeper head commit a8152760b96ca3a9f142b006d2d888da0ebeff6a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 19:44:15 2021 -0400 Integrate more switches into internal api elements of head code commit 6a38198e97fd0b573b3b9e590177977d900d5b14 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 18:24:10 2021 -0400 Add in swap_y_with_x and reverse_head_yaw to flesh out head code api element commit d28e81bc9fc1f11b10da524d6874e8e1ee4a956d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 17:54:14 2021 -0400 Add in mobs look pitch commit 5a2773ea1abb6c8706c477802aae2fa60704714c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 17:48:41 2021 -0400 Add in basics of head code yaw commit 555935ff3d35d4ac28dad42f5facac0bbfe9b1c9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 16:43:23 2021 -0400 Implement basic fall damage commit 7e3b69348e405425712cf8196907a913be10b62e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 16:11:45 2021 -0400 Add secondary existence check after main logic has been executed to prevent future crashes commit c898e1e4db3b866ddc4ff391ff89798397775fbf Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 15:59:00 2021 -0400 Update sheep.lua commit 9b5c9dc8ae9d1221340d1c72e4f48f3212a07fb7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 04:31:48 2021 -0400 Make farmable mobs/food mobs a lot less rare commit 5e6653ff651a65e6bfc4057cb5de39f09e9b9cca Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 04:19:02 2021 -0400 Implement mob cramming commit 1616cb7538141cd38485b4bf59a7b8b049ddd3f0 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 04:09:35 2021 -0400 Fix nametags commit a3ff108cd4b71cd823518eae0186cbf1d819267e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 04:03:06 2021 -0400 Make mobs walk up stairs/slabs properly, yet not glitch out when jumping over solid nodes commit df364eed286fced64f3c4bff897fcfe91a9dd540 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 01:45:35 2021 -0400 Implement basics of head movement and fix walking mobs flying away after floating commit bac191293bc23405bfc02ef0795f0296fdaeb95a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 01:45:03 2021 -0400 Fix clientside guessing making floating go crazy client side commit b7c7c2627beba086c922df0a20939b67ae1eb464 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 01:44:46 2021 -0400 Fix parrots not drowning commit 38c22f277db652226ce9911e8bffbb8e8b8bc398 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 01:24:19 2021 -0400 Add pop sound when baby mob is born commit f83ccdb2ed5974486a030196f9b31d0490dcdff3 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 01:22:43 2021 -0400 Add in breeding and feeding baby mob sounds commit 7733e05a120cb07ed37c351956c1f451da3658b1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 01:14:48 2021 -0400 Add in random sounds/hurt/death sounds and stop mobs from reviving on server restart again commit 0a380265c888c64386406187b34914438cdff161 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 00:16:54 2021 -0400 Fix dead-alive mobs and add in hurt/die sound commit 8d3eff0c16abeff9fbce2f9d4af2b64931765696 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 25 00:06:12 2021 -0400 Enable mob drowning commit 56086bf02be689ba83ba3ccf4858429ad4d6a10b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 23:33:46 2021 -0400 Fix villager commit 079811984cd952714e6cf85297c91830c0790a1d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 23:29:56 2021 -0400 Make every mob besides spiders get slowed down by cobwebs like players commit 7e8e63b0e37300b16a4556aa45758d737514316e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 23:15:40 2021 -0400 If mob is in daylight and ignites_in_daylight = true, make mob burn commit 49b01dca4fcea165314c1548f6c3e673a5de0bd3 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 22:28:26 2021 -0400 Make mobs drop xp on death commit 3d5cceab76768e360e3ea958c71bcf79e9cc2eec Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 22:21:58 2021 -0400 Fix ghast strange behavior in the nether commit a73e5b57c02275a37b98dc9c80cf35a8c782d9f7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 22:14:25 2021 -0400 Make pitch movement for fly/swim mobs more dynamic and make ghasts randomly fly around when attacking commit b401b50c045830386c1c06c22be2232bda3e5b61 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 21:15:42 2021 -0400 Give mobs 6 seconds of memory to prevent strange behavior when player hides behind something commit 807fb6966d747550da276b264e8e3bf376b332ab Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 20:27:37 2021 -0400 Make spiders climb up walls, fix problems with mob following freaking out when under, fix spider collisionbox commit 11b5684a90a7779986b5685d899a55a606922a0f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 20:05:14 2021 -0400 Remove wolf-dog shift click breeding, and implement better logic commit 41bfaae370729b7409d5dea2cc65a6f5c83979ac Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 20:02:59 2021 -0400 Allow putting chest on carpeted llama by owner, enable swapping carpets commit 8c855f5b0955ebce15a1aaf4c17e407b5cad7ae8 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 19:29:37 2021 -0400 Add in llama carpets commit e0185a93113136862b24ad06bea75f1b2e24901f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 18:43:17 2021 -0400 Fix pig logic issue commit c2cb15a47f75674afaac721217384c8d7ead1c57 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 18:36:22 2021 -0400 Fix horse breeding commit 39f7d0cf3cc7d33d786761376a035a31e434434f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 18:18:53 2021 -0400 Update api.txt commit 3e9bbca91400e0f587aef13df1ece7d8071b188a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 18:06:24 2021 -0400 Fix enderman crashing commit 81713a342d8038c2b51140dbd4bc00f1440b73e8 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:38:50 2021 -0400 Allow tamed wolves to be shift click bred commit a27e6731cd97a1e41861d8a2acbdd4d2d530c220 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:29:30 2021 -0400 Make sheep breedable commit efce97c1723ac25e9dabdfd9572781a6d50f0821 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:27:17 2021 -0400 Make llamas shift click breedable commit 53c96cae2d28c3a6f4642b8a6d5b72365d32267d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:26:45 2021 -0400 Make pigs shift click breedable commit dbe712bc17cc875c5e9b4b1a919880b0f6893ea1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:23:33 2021 -0400 Make llama breedable commit 0d4d85bac6b3412a2fec3f01ebc5b3ff6c294173 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:19:41 2021 -0400 Fix horse literally blinding you following you commit 6f2e2ab4c57fe651dd90b4897e4f10673da1de3a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:17:22 2021 -0400 Make chicken breedable commit 3649e5f6f50c917e3c29bbd0b95327e3667ae1ef Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:17:09 2021 -0400 Make horse breedable commit 2dab0773dffd40cb166c8a14ad79035ac898d4dc Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 24 00:00:21 2021 -0400 Remove unused breedable api call commit 0568c14a435e663dccc1a42ae999a76d0936f153 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 23:59:35 2021 -0400 Fix timer and make mooshroom breedable commit 531253008a13559cdab63f420e9d35c78b382c95 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 23:56:59 2021 -0400 Complete mob breeding, make cows breedable commit 79cb6ddc4923ea8a009b2810efe785cf3720c63f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 22:35:35 2021 -0400 Fix lua locals in environment.lua commit 6eb3eef21561ddf2091682f3703fa9a23e35915e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 22:34:40 2021 -0400 Fix typo in function commit c37a82d4a2589d372f88b5101918858c2d210e57 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 22:03:29 2021 -0400 Add comments commit ed9d629b99a9f873cebfa8e45239271a81a8025c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 21:59:42 2021 -0400 Add in mob following for cows commit fcfd6b9d19bbc1e894b8dafed490e04102c87878 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 21:14:23 2021 -0400 Set up basics for breeding mechanics commit 5ee6cf6c9b3b9da36830c8a58f105d289dfbe54c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 19:49:35 2021 -0400 Implement mob despawner/mob limiter commit 19c8dd1dd48532bfb07eac133cd11b702ad74de7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 18:41:41 2021 -0400 Stop hostile mobs from falling through water when stunned commit 31ded5e40fc97a7afd252fd74154183afaf1f568 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 18:34:20 2021 -0400 Re-implement neutral mob switch commit 13c321e8f2c8cb43460093852d44ddae7edec0c1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 18:03:01 2021 -0400 Re-enable mob spawning commit ea6912c980952bed2a0b5e62009e0a2639d75d75 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:44:49 2021 -0400 Don't do knockback effect for mobs when hurt by a rider commit 8dafac50a865f189074272303b83f37391c11c3c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:37:20 2021 -0400 Make mobs run away slightly faster commit 3560bda4a5a8be026c5d50eb8ddeca9ed45e0b8e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:29:23 2021 -0400 Remove unused code and variables from mob punch commit 9720986c4d30bf8fcd2cf1117d80eea06da5332a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:27:08 2021 -0400 Fix punching a mob breaking it's velocity commit dc7592528cf948556e4e925310e830648b52dff1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:23:00 2021 -0400 Add red tint hurt effect commit 304cbed447adbcccff246f242d18d51fc010df35 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:12:02 2021 -0400 Make mobs that should be skittish, skittish commit af4c42fea7112ada76fd9b273f771611532bdcf9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 17:10:44 2021 -0400 Add skittish behavior (runaway from punch) and fix ocelot commit 8daf197fb899a0bee8f61aad4ccedec1108f5f92 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:52:07 2021 -0400 Fix iron golem rotation commit c138050e0b877f5dc987959efe4acbe17ffd86f2 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:45:12 2021 -0400 Make iron golem neutral and protective, fix rotation commit 36d5af1d15b432d84e24e161b78d4b41ce2731bd Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:35:16 2021 -0400 Stop dead mobs from getting in the way of fighting other mobs commit 73b4d3c1d2c74cb5bd5bb23604ce1d74e183cb0d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:31:13 2021 -0400 stop projectile mobs from being completely disabled while stunned commit eb7ae5e10e731fc949a9a4184e02a39103f83a1e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:28:30 2021 -0400 Fix random crash commit c831da2c02253450df965930cbfcd539b820f3b9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:22:34 2021 -0400 Fix mobs not making hit sound when hit by node commit d5a38fef58c1862490c9f32238ec83cf1a2c2d5c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:19:37 2021 -0400 Add in new mob punched sounds commit 8e7ce5a72ae3e7cedf985a414c64ca259bcd6136 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 16:04:01 2021 -0400 Add in a visual for horse taming (hearts) commit 189c0ad157a8871d51045effcded0662aff7b1af Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 15:53:01 2021 -0400 Half finish horse (riding logic, etc) commit f64f8e31e3ba8e7a14b22d084be5ef584895242d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 14:50:38 2021 -0400 Fix llama blaze and ghast projectile sprites commit 58bee2a2dd1b4d6d3d1873d3ac566be9e0aa7930 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 14:43:00 2021 -0400 Fix projectile tails clipping through sprite commit 16cc7e37d2fc83e50d4e2c380cef05224dbbed38 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 14:34:59 2021 -0400 Randomize projectile cooldown timer commit 8eb9ba12cef918cb116aea8eaea5a1e757123b01 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 14:33:40 2021 -0400 Fix crash when mob collides with nil entity commit 5d59583583462563f7d65747a198b0d6d8ed34fc Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 14:10:12 2021 -0400 Massive overhaul to projectile mobs with custom projectile function, make llamas spit commit f6fa90096dfdb9d21b6f52968daa60943a07470e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 13:35:30 2021 -0400 Fix enderman teleport attack commit 4fb9e69e41a8c2ee91c659acb0b11fc76a6a97fe Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 13:27:17 2021 -0400 Make enderman become hostile when stared at, freeze when attacking when stared at commit 99f13f84b563c1962c285b2e9973aec8a5d079d7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 13:13:23 2021 -0400 Half-fix enderman commit dd76b15c501a1a458f2fa112b29784e26c3140bd Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 13:06:57 2021 -0400 Make ghasts not insta-kill commit b6f19699e9059a382421f55ac9ee5b642e7751a6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 13:06:17 2021 -0400 Make enderdragon half work commit 4efec1ef58ba4afe4692a22a361079b5026a7de3 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 23 12:55:11 2021 -0400 Add in chicken slow falling commit 08956664073078fd896add1e57ff0a524de2a32f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 23:36:58 2021 -0400 Fix random crash with mixed mob ally data types commit 408296140a4fe0c785f5fb4760899fdb3851fe00 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 23:30:32 2021 -0400 Fix and overhaul wolves commit aac1e1933677d119b52c25a64b3ee6c77e16e770 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 23:18:33 2021 -0400 Implement rotation locking when standing, fix rotation unlock/lock for fly/swim mobs commit fa059b5df245e81d71d73bbc87b51c59cd47a876 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 22:59:03 2021 -0400 Fix ghast's eyeheight commit 2e3e92e39337e5c4ecba13855f134af1bd672ae6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 22:58:32 2021 -0400 Fix ghast's insane difficulty commit 11bcf3aa34e85dcc19142258ca2c4abaf963b806 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 22:51:13 2021 -0400 Add attributes to epCode commit 2099be43ea25740a402587f40b3004f6ef2d8c1d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 22:50:14 2021 -0400 Update to epCode's fixed version of ghast model commit 5037ec3736a564157408df12699c91df17c934b6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 22:40:16 2021 -0400 Fix ghasts horrible collisionbox commit 0a8fff65249610aba7fef7e9675bf28469265f29 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 22:08:54 2021 -0400 Add in mob criticals when falling commit afdcada1fd6f7c8cbe68b0fd1486d6d92f3d12f7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 21:46:13 2021 -0400 Fix endermite commit 5d876725c599b060c5150b0508f21b6a83001f9a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 21:45:00 2021 -0400 Fix bats commit ef0d52a2df9a3d2d2c1e59b12084017c405bc398 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 21:41:54 2021 -0400 Update backup_code_api.lua commit 8142f7e51214672292d3bffe3fa8119eb8a1cf1c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 21:36:42 2021 -0400 Add in mob death commit ebf27866ca3bb02c726d4729c0666ee28e20a3dd Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 21:12:08 2021 -0400 Fix typo and error in animation.lua commit 3fe8d2d3c59ca6c173817a9d2d6b48e3549acd57 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 20:30:50 2021 -0400 Add file death_logic.lua commit b73ab976a1115044bc336f9e3f181ecf6e75cc06 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 20:25:58 2021 -0400 Implement framework for mob death commit 8530e6ee368f510581c618666613432f25266ce5 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 20:20:56 2021 -0400 Make mob punching time based commit e1812b2cdba132afec9ed6cdc45ee9f078806264 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 20:12:02 2021 -0400 Reset pause timer to 0 commit 991bba0a1d611cf545020c9129fdcbc4806e73c6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 20:10:01 2021 -0400 Add comments into ai.lua commit f9a7144b658f747be895bb6a8b69c8a0124fdd2a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 20:07:30 2021 -0400 Implement ability to hurt mobs commit 45790c0be0eec380e281a687a1ff03ea1f114143 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 19:12:02 2021 -0400 Re-enable mob punching (broken) commit 31a791c33b19d76350993d844747a0c51a77382c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 18:20:58 2021 -0400 Undo debug.txt spam from mob spawning commit d0d128c1d8f84e8de590e34adfe0265556ccd3e1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 18:18:57 2021 -0400 Break infinite loop if unable to find any mob to spawn commit ee905642c2cdfaa3be3eb5c2af7ec75599ffd41e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 17:56:38 2021 -0400 Add temporary warning debug to spawning algorithm output commit 2cef9e7cca2e70e544eb3068a0e3e36487cab669 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 00:39:32 2021 -0400 Optimize mob spawning even further with additional lua locals commit edb1939649c62a2b486e1c04c5af27458f978388 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 00:27:35 2021 -0400 Fix mob_counter in mob spawning limiter commit 7c1adeab459d452ac016108b588957082c1347c1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 22 00:20:57 2021 -0400 Hyper-optimize mob spawning commit fbe3ccc5c05b5d5141737d3a73df3e4d14a33a33 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 23:28:38 2021 -0400 Delete current state of things comment commit 5e15af260bed13b07b295f558f5cb05bedaa7eae Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 23:25:19 2021 -0400 Fix pig rotation commit 6aa636449211b1bbec1297723281f72b4c76c4da Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 23:25:10 2021 -0400 Fix sheep rotation commit 29305f548db88b0b895ec747ebfbc092c51c4762 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 15:08:35 2021 -0400 Overhaul arrow register, implement basic blaze, break parts of arrow register for now, remove fallback for detecting players commit 08c90c34e83c498ee2cc883a2cad9b98a269a850 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 13:05:46 2021 -0400 Make parrots and squids work with tilt fly/swim commit 91099c3be93689c2569f838a63e75e38ca382162 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 13:01:14 2021 -0400 Fix auto-true statement for tilt fly/swim commit 71c34823bc87b0892d4450b877fb1c78cd6ad416 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 12:56:36 2021 -0400 Make tilt flying/swimming dynamic commit 20886f54bb8887fb88ce0e0e0c6f28a789868740 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 12:48:23 2021 -0400 Make shooty mobs jump commit ebd995fbd2eb089a37b659e9ae87c86562e3ed69 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 12:45:02 2021 -0400 Simplify skeleton arrow damage calculation commit c9f71d66f52f2e80fea6cd01fcb2db30ae399c39 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 12:42:34 2021 -0400 Implement skeletons/strays commit 99e808296b81f37a9e01d4b4beb02120526bb4e9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 12:17:51 2021 -0400 Add missing skeleton/stray run animation commit 74094938bb0918df12ffa778c95b966d7bd6c9f3 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 12:10:29 2021 -0400 Fix crash with non-punch attack mobs in collision commit 6bd279255c7e4b5623afa39caae8f988127f7ac3 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 11:50:22 2021 -0400 Fully implement zombie pigmen commit 964ce9ccf7101aef387bdd5ec2213ba4ac361a51 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 11:42:01 2021 -0400 Temporarily disable spawn eggs from setting owner commit 5062d56a5d89346234f6125848799f32915b31a4 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 11:00:02 2021 -0400 Implement neutral mob mechanics and partial implement of zombie pigmen commit b0b1ec9436776fdc89edaf3046499a9e2cfaed0f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 10:53:20 2021 -0400 Implement zombie pigmen and make them turn hostile when punched commit f1dc2864425bab2eed2f5bec7b7ccd0307145b1f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 10:23:51 2021 -0400 Dump mob_punch from backup_code_api.lua back into interaction.lua commit cc2a0ae52cefc388d18c9d106ef70fc0718f5e40 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 10:21:11 2021 -0400 Complete charged creeper commit 486959515ca13ba0d5756ba5d930ff43e9d135b5 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 21 10:20:31 2021 -0400 Make creepers even more dangerous commit 576621169b468f317cf32d6d0be391252a033d3a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 23:26:18 2021 -0400 Make creepers and zombies even harder commit 2c87bd19f3c6a4a5a1a3b88a45cd673ecccb838b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 23:14:53 2021 -0400 Overhaul zombie villager commit 1ed3377559c4690fa19488f526bcaf97d5ff94b1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 23:11:18 2021 -0400 Add punch mobs knockback to players when hit commit 8c9356a18cb60cd28691e3782723df763b75a1fa Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 22:58:39 2021 -0400 Implement eye_height and viewing range for hostile mobs, along with making punchy mobs jump over nodes commit a05ebd7cc29c96b622dbc043529513b07d5cf47b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 22:44:34 2021 -0400 Add informative text art commit 60ac3058ce1e3e05caa87c18bdf95c78a71ed750 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 22:42:51 2021 -0400 Make zombies more difficult commit 751c4c2d995a011a3298d374c77b9c4567ed2fa1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 22:41:13 2021 -0400 Integrate mob punching into collision detection commit 6b52b945165a8501e09ca70c18514049df194c05 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 22:30:34 2021 -0400 Start setting up hostile punch attack type commit d371d6fdc9cb85e140399eafb89f15195f72d09f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 22:04:54 2021 -0400 Adjust creeper explosion settings commit fabd4d64e6745b9ea8c4bb1a76c190c2d66576be Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 21:35:19 2021 -0400 Slow down creeper type mobs explosion buildup commit bf367fffd054fe180dbc6d7f46e20e286d68bb09 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 21:34:18 2021 -0400 Add in sound_handling and make explosion type mobs make their attack sound before explosion animation commit 0b763f54b55ea47b7889816612759447bfb50422 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 21:00:36 2021 -0400 Finish creeper movement ai and move jump_check into environment commit cd6f07537f64bdbe7573642982ec24ac3fb19ec1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 20:43:45 2021 -0400 Make creepers even more deadly commit 9678b556e17b124f841b0019b3a31880a415bd11 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 20:33:30 2021 -0400 Fix crashes when trying to collision detect a removed mob commit cdb840609dc2586b31a1e44c8c1004379ef37979 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 20:19:55 2021 -0400 Add in creeper basic prototype commit 008d670ed9006d918b1ed1698a5b644de27191b1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 17:10:51 2021 -0400 Remove wandering from ai commit 491ef6c8f818e43ef0545963eb27b5476c95ea28 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 16:48:20 2021 -0400 Add in auto mob removal if something goes horribly wrong commit 348df0fcecc2709fe088493d5665112827f08129 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 16:46:10 2021 -0400 Rename detect_players_in_area to detect_closest_player_within_radius commit ac08c6991c0ce7f9bb8d9de5880ec64a7882c3e7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 16:39:05 2021 -0400 Add in detect_players_in_area commit 3d776138e97b904c9b299119ae9b9a8a2811ae7a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 20 14:55:22 2021 -0400 Start implementing creeper ai commit 85e531bf106df326b2ca470b5a94aeb06f92d4d6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 18 21:24:31 2021 -0400 Remove unneeded mobs:protect from code commit 4d589dfb2aa10cb664b4d3b3471960e6d648b92c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 18 21:22:39 2021 -0400 Remove literally unneeded mobs:capture_mob commit 39985aa558d9f43a6a2e82fb6d59ad0ca8b6324d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 18 21:22:21 2021 -0400 Up fallback max xp to 3 commit 1920ddf91530a7c033c8288cd3a752f3ee7ba850 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 18 21:02:03 2021 -0400 Change all enemy attack info to more workable and understandable attacks commit 719bb2a3c96ca020f8f828959e377831f47cd27b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 18:21:33 2021 -0400 Add in prototype jump-only mobs api commit db87b8e0a37cd15ef7931a76d21bbb190a158205 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 17:09:57 2021 -0400 fix chicken rotation commit e2987245fd6c6ee75383ea92da30e9fc5e10ad1e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 17:00:34 2021 -0400 Balance out collision forces for mobs commit 3cf263d292f9fc5a7a18fafa2aa1fbc8e1840a0a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 16:23:38 2021 -0400 Add in dynamic pitch in flying/swimming mobs commit 5ade34115cff228994ff3fd680aa15c8225ab6e7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 13:17:29 2021 -0400 Remove random state initialization in set_up.lua commit d9729fc8651d06566e61bcfcb2e7df0484f25f48 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 13:13:45 2021 -0400 Fix parrot's rotation commit 58d9670e777c3798c676924023375a2579450142 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 13:11:39 2021 -0400 Remove collisionbox addition for y position for fly mobs commit a20f272e08f0170b2761eeba2a12aeaf88efad7b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 13:05:53 2021 -0400 re-adjust logic gate for mobs floating in water and lava commit 0794bc54372c6aaa9c653693da3a18194adf5c95 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 13:04:55 2021 -0400 Make flying mobs float in water and lava commit 8783912938aed1f5566f3e2f5056213f0cefe4a6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:48:57 2021 -0400 Add in mobs api swimming animation commit f2e909ab8d182febabbdacd9de50a65f27137761 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:41:14 2021 -0400 Add in fly logic gate commit 07841c89632626f1c3bb4790f8db0c2adddfb2eb Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:38:48 2021 -0400 Swap name of quick_rotate_45 to quick_rotate commit 240d6ea21155f2044d3b728a210811821540013a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:37:04 2021 -0400 Add note about quick_rotate_45 actually rotating 11.25 degrees commit e8148f81ab7641554096bc03ecda8927d9ad9491 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:36:19 2021 -0400 Make underwater mobs try to continuously swim around with quick_rotate_45 commit 061602d9d46d4e4607e407c064070709ef99f9b7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:28:07 2021 -0400 Overhaul separation of swimming and flying for ease of use with writing mobs api commit 5365dec19a8a088263916a3686f27859be51e870 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sat Apr 17 12:01:27 2021 -0400 Adjust "flying" vector checks for mobs commit dda7839d8c4c2292e9c8d6472faf38372654d886 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 21:43:02 2021 -0400 Add in prototype swimming commit f1141aed9fa52bf57e8867fdb3ffb520793dab07 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 21:08:54 2021 -0400 Make mobs flop when outside of flying node commit 84ca7681fc9ee3e9945488865678b2b82eb0a22d Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 20:47:16 2021 -0400 Make squids fly in water flowing and water source commit 52c3db041e602ebd0861a0b86c55b35662c8c33a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 20:32:05 2021 -0400 Add in fly state prep for mobs commit 6db4511dd5b038cd95c7ea196559bb25a53246e9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 20:06:55 2021 -0400 Add notes commit 15ea9c1c71f3e4d4dd24ce145d385f8457e4905e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 19:59:20 2021 -0400 Implement self walking velocity for walking state commit 9d6d042ee325a010d97abdff7efc37f3dcf46b5e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 19:37:01 2021 -0400 Fix formatting in ai.lua commit ce7f4918b061fa9a4d46045a389497cb0da1a5ee Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 19:35:19 2021 -0400 Re-organize comments commit 05d06a4c8f0128ac5edd21b8096bb75553c1f89e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 18:36:23 2021 -0400 Add comment to state_execution commit c761db86c7e67aab27d3806a76b7a58504a7d5c6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 18:29:42 2021 -0400 re-arrange mob logic for random wandering commit ed456ecb47d788efe9aa526849110015e9c04e9a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 18:17:51 2021 -0400 Make mobs not fear cliffs if fear_height is 0 commit 8ca5f221ec9ce534e91f7094193b4ec951e743b1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 18:13:54 2021 -0400 clean up ai.lua commit cadd53c103f4047069f581abdc033d2def4ed2dd Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 16:39:03 2021 -0400 Adjust mob jumping default to account for higher gravity commit 57b293de2b02be81ff3e17e620807c653fe9b625 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 16:37:15 2021 -0400 Make mobs gravity equal to player's commit fb9a55e562c3e4102fa4e02603f93d1c78e397ad Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 15:55:11 2021 -0400 Make jump_check more modular and allow mobs to turn if at a wall commit a6a54b34140c279d7a9ff3db5b21f1be0ead15f8 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 15:49:03 2021 -0400 Make mobs not jump if against a wall commit 6c5393427f72c082a5c85514cb3b54aa4a9ce45f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 15:39:39 2021 -0400 Smooth out mob cliff check and check if falling before cliff check commit 2486ffef11113a40b43a2548bde57e9cca186da9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 15:30:44 2021 -0400 Make wandering mobs avoid cliffs commit adc683c6a7cd56c33bebc22ce1363671db4f4846 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 14:19:22 2021 -0400 Clear mob animation on activate commit d0695e7929460728f7da2e01cc809cb343481e1a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 13:58:08 2021 -0400 Fix mob animation "memory leak" commit 024cf46307abb6fefbfe8be04941205026561177 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 11:52:29 2021 -0400 Adjust spacing in animation.lua commit f38492bcb031b7fcc2ee8299f66fcd3cd3a68398 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 11:50:29 2021 -0400 Re-implement animation check gate for mobs commit a934a59f3b64e8adef64676daaf81b574a6ceecd Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 11:50:13 2021 -0400 Implement mob random walk directions commit 94ca7e8b89bd39144d85bc6a622778babb226d47 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 11:31:18 2021 -0400 Add in state switch and state execution for mobs commit 626c30de6d4191cd4a18b0f11cb4805c425f9648 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 16 11:30:55 2021 -0400 Create todo.txt commit c2bac87a6d03364193aedf67c780fdea9f545cac Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 21:46:33 2021 -0400 Update set_up.lua commit 375d683d08266586d024491dcba2268c66583989 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 16:18:42 2021 -0400 Fix forgotten localization in collision.lua commit 246bdf9707c98f787cb5264dc7ff638e340d768b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 15:55:10 2021 -0400 Implement basic mob walking animation test commit d07d0ae31c0d39c526c8418e725b5dce1d120793 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 15:34:07 2021 -0400 Make mobs jump properly commit 6cb6d714c9bcf55213a9449416bec37c0fe318af Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 15:04:55 2021 -0400 Reorganize all mob sections into multiple files commit 5155d12d05c5b563a78923b3fc02a885cd23fe85 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 14:09:54 2021 -0400 Reformat mobs_mcl to api folder for ease of use commit bbcfb3fdb171053e3142854f658860e7693f31d1 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 11:33:09 2021 -0400 Randomize walking or standing on spawn in commit 9e4bf6e130195b4f2176658581ad17646a48ce3a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 11:29:18 2021 -0400 Move old set_yaw and add node on set_velocity commit e53a193c4fe61e88e6501a2a863e22d533132ae4 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 11:25:55 2021 -0400 Fix get_velocity (mobs internal) commit 14207dd96aa60652c0ad1f4351441659c33d3ff6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 11:23:52 2021 -0400 Smooth out mob movement set_velocity more commit a0ed1a0b2004baeb3d0f64c5eb02bbf0b21bf823 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 10:05:24 2021 -0400 Add automatic rotation lock commit ba46e7fa42bbd25175d3505ca9699a11912d491f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 09:28:58 2021 -0400 Remove old debug of colliding with objects commit 61124905f3d862d00f00674067003d8da7722405 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 15 09:28:22 2021 -0400 Add in mob auto rotation (implementation 1) commit 8b200c7352cb9fdd01f1b073308acacd36b2672a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 14 19:38:14 2021 -0400 Add in basic movement rotation testing commit 67259891a85e54f56dc543087bd98cfe12feb6f4 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 14 18:01:29 2021 -0400 Remove unneeded comments commit d063db751c1657c367f2277b24a5aa51a8d90fa3 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 14 17:26:20 2021 -0400 Disable mcl_playerplus random check that moves players randomly commit d4db27f0e1edd439f65821b814146a237ebea799 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 14 17:25:39 2021 -0400 Update backup_code_api.lua commit 755533beeb6c708603096cce4f99bea558c8b6ce Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 14 11:50:22 2021 -0400 Disable literally everything in mobs api commit 3f6312a631c6726c3bc4b09d9ec3e64b3ae810e5 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 20:24:46 2021 -0400 Make mobs magnetic collision more jello-y commit aa4d34c10e4bc367fc6ad7d898cd145d9f58ed0c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 20:00:38 2021 -0400 Improve mob to mob collision commit 1210bc463adb949496fc521e3169fb88e49fc4e9 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 19:44:24 2021 -0400 prevent mob collision detection shootout commit ed6026671381c99723eccbf2089d99748e19bfe2 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 19:17:48 2021 -0400 Gut even more elements of the api commit 220d30df5f159d69be22663733feb1fbf51c45f8 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 19:13:29 2021 -0400 Completely gut do_states commit 9758bbf2e7e382948b4ad1ab8c360519270fec14 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 08:21:04 2021 -0400 Finish gutting mob api commit f29ad4b8b78689ed0d759c18178a6b2dbc9a1e25 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 08:20:11 2021 -0400 Reorganize more settings to the top of file commit 54f5bee8a379bf910c1cc6ea3d33bd32b819f3dd Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 08:08:29 2021 -0400 reorganize load settings commit 02515f0778bbe9cd962acc514b084c9dedf55074 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 08:07:32 2021 -0400 Move a large chunk of code to backup_code_api.lua commit 3fc0184182f70be0c2fd9b3be1c5d78fa7f00503 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Tue Apr 13 07:39:57 2021 -0400 Disable entire mob ai to work on vanilla walking commit 6fff719322ee250fc7c074d2362edbf0c4090406 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Mon Apr 12 08:47:07 2021 -0400 Localize minetest library commit adaf74fc5c6354cf2fb1a9f784e5a37a4fb31caa Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Mon Apr 12 08:13:11 2021 -0400 Remove spacing and delete old collision comments commit a564009e4aeda08372b80fb1a5fc2d16f5dfd364 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Mon Apr 12 08:11:55 2021 -0400 Change HORNY_TIMER to BREED_TIMER commit 00759da39d621b36be6200fa365c51be86dbb99f Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 11 18:29:32 2021 -0400 Unlimit mob ai commit 9aafc28a2009998017753d0aa4d013e3cd8795b6 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 11 14:47:56 2021 -0400 Fix mobs nil check during mob_step commit 67c40885ef62b4e4e8dcaba3b65c58502c558f7e Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 11 14:21:19 2021 -0400 Fix mobs collision system only running during movement - major overhaul with ai disabled commit 2456e3cd1ef6954415e4a771bb704a12364895eb Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 11 12:52:31 2021 -0400 Adjust math localizations in api.lua commit 725dc731ddc2a6f1cf1a20832e06883613d5974a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Sun Apr 11 11:58:33 2021 -0400 Adjust mob collision detection - this breaks a lot of things and will be fixed later commit e15fd2f4b60fafcae3b765d345914032b4a52668 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Fri Apr 9 01:38:34 2021 -0400 Add lua locals into mcl_dungeons for performance commit c937b2a97338097700cd3836811ce46366e88027 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 14:19:42 2021 -0400 test commit 8c10fe4057d5a973d448e32addbc07617f9b8edc Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 12:48:02 2021 -0400 Adjust spawning to be closer and more frequent commit bd7866d7983aae52aef426bc7a305ae166817ed7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 12:07:20 2021 -0400 Finish mob limiter commit 9369c9cab8f25d5fa34fe0cdaeee4f9570db4551 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 10:01:15 2021 -0400 Fix spawn timer reset debug commit 28823298e1536d4ce34d67ada624dcb5aaf377e0 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 10:00:04 2021 -0400 Fix forgotten biome check commit 9d48549ec5901de887eb9fb2d75fd07f08edb39b Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 09:52:50 2021 -0400 Complete prototype of biome generated mobs commit 518252679f642d00057889b462eb8c87b0992de7 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 08:42:57 2021 -0400 Fix a lot of things commit bb078b0c4c48ac6932d2953561ac03bea3bde51a Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 08:33:50 2021 -0400 Fix silverfish typo commit adab48ff0c95c2fad11e4d58824d635ae6945875 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 08:29:16 2021 -0400 Readjust mobs internal settings to not cause insane memory usage commit 47c59edb511fde5db934fca519b9d8aa1fc68838 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 08:13:46 2021 -0400 Fix typo commit 5ca30fa8eec24a1f9bee879bb49d3dfce82484fb Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 08:12:43 2021 -0400 Combine air and ground type spawning into ground commit aacb8fc7b95013e42c832927088708b8c9889201 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 08:09:43 2021 -0400 Add in extra_mobs information commit f900b24b53a802fd5db1bf1a633d7f89e42bcce5 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 07:39:18 2021 -0400 Add in all biome information to mobs commit 0ad833c046095d83a789705aa15dd7f30fd8f3ed Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 06:57:24 2021 -0400 Add bats, chicken, and blaze spawn info commit f4a6bdc6b89b2d605cfd06f0b7baa6170a19314c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 06:48:25 2021 -0400 Make reference list copy-pastable commit bf4bf9a0cc60a1a15f1ddbfed314ec5a9c75561c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 06:10:07 2021 -0400 Ignore default or void dimensions commit 8e1e02d1fbc189680dbd004bdd905446467a4e29 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 06:04:36 2021 -0400 Add biome list commit da045c207d3bd5931e3cf73c5459b45d86596c12 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 8 02:07:15 2021 -0400 Refactor spawning into it's own file commit 6ec66ef6f666007e411e23689e0d4eccd5a5fbfe Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 7 23:16:03 2021 -0400 Fix mobs colliding with other mobs/players commit 6bd249547a888493af6c5cfc65d3e206e1467c19 Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Wed Apr 7 23:07:04 2021 -0400 Fix mobs colliding with objects commit c4d030d111ea6e21ca6343f76fb98b8aa9d29f6c Author: jordan4ibanez <jordan4ibanez@users.noreply.github.com> Date: Thu Apr 1 23:48:00 2021 -0400 Fix item drop on laggy servers
2021-04-29 02:11:33 +02:00
2023-01-07 21:37:29 +01:00
-- Get pos to spawn, x and z are randomised, y is range
2023-01-26 17:44:25 +01:00
2023-05-29 20:26:43 +02:00
local function mob_cap_space (pos, mob_type, mob_counts_close, mob_counts_wide, cap_space_hostile, cap_space_non_hostile)
-- Some mob examples
--type = "monster", spawn_class = "hostile",
--type = "animal", spawn_class = "passive",
--local cod = { type = "animal", spawn_class = "water",
2023-01-26 17:44:25 +01:00
local type_cap = mob_cap[mob_type] or MISSING_CAP_DEFAULT
local close_zone_cap = MOBS_CAP_CLOSE
local mob_total_wide = mob_counts_wide[mob_type]
if not mob_total_wide then
2023-01-27 03:47:01 +01:00
--mcl_log("none of type found. set as 0")
mob_total_wide = 0
end
2023-05-29 20:26:43 +02:00
local cap_space_wide = math.max(type_cap - mob_total_wide, 0)
2023-05-29 21:08:44 +02:00
mcl_log("mob_type", mob_type)
mcl_log("cap_space_wide", cap_space_wide)
2023-05-29 20:26:43 +02:00
local cap_space_available = 0
if mob_type == "hostile" then
mcl_log("cap_space_global", cap_space_hostile)
cap_space_available = math.min(cap_space_hostile, cap_space_wide)
else
mcl_log("cap_space_global", cap_space_non_hostile)
cap_space_available = math.min(cap_space_non_hostile, cap_space_wide)
end
local mob_total_close = mob_counts_close[mob_type]
if not mob_total_close then
2023-01-27 03:47:01 +01:00
--mcl_log("none of type found. set as 0")
mob_total_close = 0
end
2023-05-29 20:26:43 +02:00
local cap_space_close = math.max(close_zone_cap - mob_total_close, 0)
cap_space_available = math.min(cap_space_available, cap_space_close)
2023-05-29 21:08:44 +02:00
mcl_log("cap_space_close", cap_space_close)
mcl_log("cap_space_available", cap_space_available)
if false and mob_type == "water" then
mcl_log("mob_type: " .. mob_type .. " and pos: " .. minetest.pos_to_string(pos))
mcl_log("wide: " .. mob_total_wide .. "/" .. type_cap)
mcl_log("cap_space_wide: " .. cap_space_wide)
mcl_log("close: " .. mob_total_close .. "/" .. close_zone_cap)
mcl_log("cap_space_close: " .. cap_space_close)
end
2023-01-28 03:31:41 +01:00
2023-05-29 20:26:43 +02:00
return cap_space_available
end
2023-01-07 21:37:29 +01:00
local function find_spawning_position(pos, max_times)
local spawning_position
local max_loops = max_times or 1
2023-05-29 20:26:43 +02:00
--mcl_log("mapgen_limit: " .. SPAWN_MAPGEN_LIMIT)
while max_loops > 0 do
local spawning_position = get_next_mob_spawn_pos(pos)
2024-03-17 21:33:35 +01:00
if spawning_position then return spawning_position end
max_loops = max_loops - 1
end
return nil
2023-01-27 04:50:00 +01:00
end
2022-04-15 11:48:58 +02:00
2023-11-23 00:11:13 +01:00
local cumulative_chance = nil
local mob_library_worker_table = nil
local function initialize_spawn_data()
if not mob_library_worker_table then
mob_library_worker_table = table_copy(spawn_dictionary)
end
2023-11-23 00:11:13 +01:00
if not cumulative_chance then
cumulative_chance = 0
for k, v in pairs(mob_library_worker_table) do
cumulative_chance = cumulative_chance + v.chance
end
end
end
local function select_random_mob_def()
local mob_chance_offset = math_random(1, 1e6) / 1e6 * cumulative_chance
minetest.log("action", "mob_chance_offset = "..tostring(mob_chance_offset).."/"..tostring(cumulative_chance))
2023-01-27 04:50:00 +01:00
for i = 1,#mob_library_worker_table do
local mob_def = mob_library_worker_table[i]
local mob_chance = mob_def.chance
if mob_chance_offset <= mob_chance then
minetest.log(mob_def.name.." "..mob_chance)
return mob_def
end
mob_chance_offset = mob_chance_offset - mob_chance
end
assert(not "failed")
end
-- Spawns one mob or one group of mobs
local function spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile)
local spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES)
2023-01-27 04:50:00 +01:00
if not spawning_position then
2023-01-31 19:04:01 +01:00
minetest.log("action", "[Mobs spawn] Cannot find a valid spawn position after retries: " .. FIND_SPAWN_POS_RETRIES)
2023-01-27 04:50:00 +01:00
return
end
local mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("spawn_class", spawning_position)
2023-02-09 21:43:46 +01:00
--output_mob_stats(mob_counts_close, total_mobs)
--output_mob_stats(mob_counts_wide)
2023-01-27 04:50:00 +01:00
--grab mob that fits into the spawning location
--use random weighted choice with replacement to grab a mob, don't exclude any possibilities
--shuffle table once every loop to provide equal inclusion probability to all mobs
--repeat grabbing a mob to maintain existing spawn rates
2023-11-23 00:11:13 +01:00
local spawn_loop_counter = #mob_library_worker_table
2023-01-27 04:50:00 +01:00
local spawn_check_cache = {}
local function inner_loop()
local mob_def = select_random_mob_def()
if not mob_def or not mob_def.name then return end
local mob_def_ent = minetest.registered_entities[mob_def.name]
if not mob_def_ent then return end
2023-01-27 04:50:00 +01:00
-- Check capacity
local mob_spawn_class = mob_def_ent.spawn_class
local cap_space_available = mob_cap_space(spawning_position, mob_spawn_class, mob_counts_close, mob_counts_wide, cap_space_hostile, cap_space_non_hostile)
if cap_space_available == 0 then
mcl_log("Cap space full")
return
end
2023-01-27 04:50:00 +01:00
-- Spawn caps for animals and water creatures fill up rapidly. Need to throttle this somewhat
-- for performance and for early game challenge. We don't want to reduce hostiles though.
local spawn_hostile = (mob_spawn_class == "hostile")
local spawn_passive = (mob_spawn_class ~= "hostile") and math.random(100) < peaceful_percentage_spawned
--mcl_log("Spawn_passive: " .. tostring(spawn_passive))
--mcl_log("Spawn_hostile: " .. tostring(spawn_hostile))
-- Make sure we would be spawning a mob
if not (spawn_hostile or spawn_passive) then return end
if not (spawn_check_cache[mob_def.name] or spawn_check(spawning_position, mob_def)) then
mcl_log("Spawn check failed")
return
end
spawn_check_cache[mob_def.name] = true
-- Water mob special case
if mob_def.type_of_spawning == "water" then
spawning_position = get_water_spawn(spawning_position)
if not spawning_position then
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
return
end
end
if mob_def_ent.can_spawn and not mob_def_ent.can_spawn(spawning_position) then
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
return
end
--everything is correct, spawn mob
local spawn_in_group = mob_def_ent.spawn_in_group or 4
local spawn_group_hostile = (mob_spawn_class == "hostile") and (math.random(100) < hostile_group_percentage_spawned)
local spawn_group_passive = (mob_spawn_class ~= "hostile") and (math.random(100) < peaceful_group_percentage_spawned)
2023-05-29 20:26:43 +02:00
mcl_log("spawn_group_hostile: " .. tostring(spawn_group_hostile))
mcl_log("spawn_group_passive: " .. tostring(spawn_group_passive))
local spawned
if spawn_in_group and (spawn_group_hostile or spawn_group_passive) then
local group_min = mob_def_ent.spawn_in_group_min or 1
if not group_min then group_min = 1 end
local amount_to_spawn = math.random(group_min, spawn_in_group)
mcl_log("Spawning quantity: " .. amount_to_spawn)
amount_to_spawn = math.min(amount_to_spawn, cap_space_available)
mcl_log("throttled spawning quantity: " .. amount_to_spawn)
2023-01-27 04:50:00 +01:00
if logging then
minetest.log("action", "[mcl_mobs] A group of " ..amount_to_spawn .. " " .. mob_def.name ..
"mob spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name ..
" at " .. minetest.pos_to_string(spawning_position, 1)
)
2022-10-13 06:26:51 +02:00
end
return spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name}, amount_to_spawn)
else
if logging then
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..
minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at "..
minetest.pos_to_string(spawning_position, 1)
)
end
return mcl_mobs.spawn(spawning_position, mob_def.name)
2022-04-15 11:48:58 +02:00
end
end
while spawn_loop_counter > 0 do
if inner_loop() then return end
2023-11-23 00:11:13 +01:00
spawn_loop_counter = spawn_loop_counter - 1
2022-04-15 11:48:58 +02:00
end
end
2021-04-08 08:07:15 +02:00
2022-04-15 11:48:58 +02:00
--MAIN LOOP
2022-04-15 11:48:58 +02:00
local timer = 0
minetest.register_globalstep(function(dtime)
2023-01-27 04:50:00 +01:00
2022-04-15 11:48:58 +02:00
timer = timer + dtime
if timer < WAIT_FOR_SPAWN_ATTEMPT then return end
2023-11-23 00:11:13 +01:00
initialize_spawn_data()
2022-04-15 11:48:58 +02:00
timer = 0
2023-01-27 04:50:00 +01:00
local start_time_us = minetest.get_us_time()
2022-10-13 06:27:04 +02:00
local players = get_connected_players()
2023-05-29 20:26:43 +02:00
local total_mobs, total_non_hostile, total_hostile = count_mobs_total_cap()
local cap_space_hostile = math.max(mob_cap.global_hostile - total_hostile, 0)
local cap_space_non_hostile = math.max(mob_cap.global_non_hostile - total_non_hostile, 0)
mcl_log("global cap_space_hostile", cap_space_hostile)
mcl_log("global cap_space_non_hostile", cap_space_non_hostile)
2022-10-13 06:27:04 +02:00
if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then
minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.")
minetest.log("action","[mcl_mobs] took "..(minetest.get_us_time() - start_time_us).." us")
2022-10-13 06:27:04 +02:00
return
end --mob cap per player
2023-01-27 04:50:00 +01:00
2022-10-13 06:27:04 +02:00
for _, player in pairs(players) do
2022-04-15 11:48:58 +02:00
local pos = player:get_pos()
local dimension = mcl_worlds.pos_to_dimension(pos)
-- ignore void and unloaded area
if dimension ~= "void" and dimension ~= "default" then
2023-05-29 20:26:43 +02:00
spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile)
end
end
minetest.log("action","[mcl_mobs] took "..(minetest.get_us_time() - start_time_us).." us")
end)
2021-04-08 12:48:25 +02:00
end
local function despawn_allowed(self)
local nametag = self.nametag and self.nametag ~= ""
local not_busy = self.state ~= "attack" and self.following == nil
if self.can_despawn == true then
if not nametag and not_busy and not self.tamed == true and not self.persistent == true then
return true
end
end
return false
end
function mob_class:despawn_allowed()
despawn_allowed(self)
end
assert(despawn_allowed({can_despawn=false}) == false, "despawn_allowed - can_despawn false failed")
assert(despawn_allowed({can_despawn=true}) == true, "despawn_allowed - can_despawn true failed")
assert(despawn_allowed({can_despawn=true, nametag=""}) == true, "despawn_allowed - blank nametag failed")
assert(despawn_allowed({can_despawn=true, nametag=nil}) == true, "despawn_allowed - nil nametag failed")
assert(despawn_allowed({can_despawn=true, nametag="bob"}) == false, "despawn_allowed - nametag failed")
assert(despawn_allowed({can_despawn=true, state="attack"}) == false, "despawn_allowed - attack state failed")
assert(despawn_allowed({can_despawn=true, following="blah"}) == false, "despawn_allowed - following state failed")
assert(despawn_allowed({can_despawn=true, tamed=false}) == true, "despawn_allowed - not tamed")
assert(despawn_allowed({can_despawn=true, tamed=true}) == false, "despawn_allowed - tamed")
assert(despawn_allowed({can_despawn=true, persistent=true}) == false, "despawn_allowed - persistent")
assert(despawn_allowed({can_despawn=true, persistent=false}) == true, "despawn_allowed - not persistent")
2023-01-07 00:39:56 +01:00
function mob_class:check_despawn(pos, dtime)
self.lifetimer = self.lifetimer - dtime
-- Despawning: when lifetimer expires, remove mob
if remove_far and despawn_allowed(self) then
if self.despawn_immediately or self.lifetimer <= 0 then
2022-11-11 17:28:45 +01:00
if logging then
minetest.log("action", "[mcl_mobs] Mob "..self.name.." despawns at "..minetest.pos_to_string(pos, 1) .. " lifetimer ran out")
end
mcl_burning.extinguish(self.object)
self.object:remove()
return true
elseif self.lifetimer <= 10 then
if math.random(10) < 4 then
self.despawn_immediately = true
else
self.lifetimer = 20
end
end
end
end
minetest.register_chatcommand("mobstats",{
privs = { debug = true },
func = function(n,param)
2023-02-09 21:43:46 +01:00
--minetest.chat_send_player(n,dump(dbg_spawn_counts))
local pos = minetest.get_player_by_name(n):get_pos()
2023-02-09 21:43:46 +01:00
minetest.chat_send_player(n,"mobs: within 32 radius of player/total loaded :"..count_mobs(pos,MOB_CAP_INNER_RADIUS) .. "/" .. count_mobs_total())
minetest.chat_send_player(n,"spawning attempts since server start:" .. dbg_spawn_succ .. "/" .. dbg_spawn_attempts)
2023-01-07 21:37:29 +01:00
2023-01-26 16:25:59 +01:00
local mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("name") -- Can use "type"
2023-02-09 21:43:46 +01:00
output_mob_stats(mob_counts_wide, total_mobs, true)
end
})
minetest.register_on_mods_loaded(function()
for _,def in pairs(minetest.registered_biomes) do
table.insert(list_of_all_biomes, def.name)
end
end)