1
0
Fork 0

Compare commits

...

63 Commits

Author SHA1 Message Date
Eliy21 95be0ca64c Remove unnecessary space in the attack reach limit on mobs code 2023-12-14 09:32:23 +01:00
Eliy21 c09c3aad47 Make fire aspect enchant respect attack reach limit 2023-12-14 09:32:08 +01:00
Eliy21 bac92efd8f Add vertical lift & minimum pvp knockback 2023-12-14 09:31:53 +01:00
Eliy21 fafe585dde Prevent knockback if player is beyond attack reach limit 2023-12-14 09:30:22 +01:00
Eliy21 589d7e660e Fix a potential bug that could bypass attack reach limit when a stronger attack breaches the invul 2023-12-14 09:30:03 +01:00
Eliy21 d074ed6cc3 Readjust pvp enchant knockback to make the running knockback difference more pronounced 2023-12-14 09:29:50 +01:00
Eliy21 bf8c452165 Nerf long pvp enchanted knockbacks especially when running 2023-12-14 09:29:29 +01:00
Eliy21 2901eadc55 Add player invulnerability & fix not continuously damaging players when holding the attack key
Player invulnerability is the same as Minecraft's Damage Immunity https://minecraft.wiki/w/Damage#Immunity

The old code for some reason only allows a few damage by holding and does not continuously damage other players after a few hits
2023-12-14 09:29:11 +01:00
the-real-herowl d658b1977f Nerfed vexes and evokers 2023-12-13 07:02:55 +01:00
the-real-herowl 2e30b2120c Nerfed slime and magma cube attack range 2023-12-13 07:02:06 +01:00
Bakawun 8555afe7f7 Mobs:creeper: add another missing comma 2023-12-13 06:44:39 +01:00
Bakawun 89a2c3f681 Mobs:creeper: fix missing comma 2023-12-13 06:44:19 +01:00
the-real-herowl 80af7a29a9 Unified and refactored FOV API code 2023-12-13 06:42:35 +01:00
the-real-herowl 0aa2ff6a68 Made spyglass reset instant 2023-12-13 06:42:16 +01:00
bakawun a30df7dcdc Merge branch 'master' of https://git.minetest.land/MineClone2/MineClone2 into myserver 2023-12-13 06:41:29 +01:00
the-real-herowl dd50112349 Fixed the exclusive modifiers not being exclusive 2023-12-12 09:52:02 +01:00
Michieal d63cf1478d Fixed a couple of errors
Removed a debug statement that was broken.
Changed `modififer` to `modifier` in a code block.
2023-12-12 09:50:59 +01:00
the-real-herowl b5112fd5c5 Script and documentation cleanup 2023-12-12 09:50:38 +01:00
the-real-herowl 9e1a2a480b Updated credits 2023-12-12 09:50:23 +01:00
the-real-herowl fafc28a694 Updated the api.md file 2023-12-12 09:50:03 +01:00
the-real-herowl 4314de9d88 Made bow unfocus faster 2023-12-12 09:49:46 +01:00
the-real-herowl a37ebc0f87 Moved sprinting into the new FOV api 2023-12-12 09:49:30 +01:00
the-real-herowl 9dd524003d Fixed modifier application and removal 2023-12-12 09:49:12 +01:00
the-real-herowl 7334416a53 Re-registered FOV mods using new API version 2023-12-12 09:48:55 +01:00
the-real-herowl b4329d0b44 Made fovapi registration more robust 2023-12-12 09:48:38 +01:00
Michieal fb13dfec4f Reworked some of the Apply_Modifier code to help prevent errors. 2023-12-12 09:48:24 +01:00
Michieal 0e3c8f063f Put in check to prevent Trying to Reference a Nil error in Apply_Modifier. 2023-12-12 09:48:07 +01:00
Michieal 149097ff90 Put in checks to prevent repeatedly applying the same FOV modifier.
Added short circuit to remove_modifier if the modifier is not currently applied.
2023-12-12 09:47:51 +01:00
Michieal 03a4afa416 Set up the Bows to use the new FOV API. Bows now zoom in and clear out the zoom. 2023-12-12 09:47:32 +01:00
Michieal a6a39cb8f0 Added reset for player respawning to remove FOV modifiers.
Fixed missing on_end call in remove_all_modifiers.
Added mcl_fovapi to Bows, Sprint, and Spyglass.
Set up the Spyglass to use the new FOV API.
2023-12-12 09:47:12 +01:00
Michieal a82ff254ff Added reset for player respawning to remove FOV modifiers.
Fixed missing on_end call in remove_all_modifiers.
Added mcl_fovapi to Bows, Sprint, and Spyglass.
2023-12-12 09:46:56 +01:00
Michieal a24e5f85c0 Fleshed out the API Documentation.
Modified missing pieces of code.
2023-12-12 09:46:42 +01:00
Michieal dd00dc4496 Initial API state. 2023-12-12 09:46:22 +01:00
Michieal b4e8b0ea88 Initial Commit. 2023-12-12 09:46:06 +01:00
bakawun 8fad74c90f core:explosions: fix blast radius rounding
mc rounds to nearest int, do the same
simplify the calculation
2023-12-12 09:26:03 +01:00
bakawun 06132d01a8 controls:android:fix bow/rocket/spyglass/burger_follow
this requires the following minetest pr
https://github.com/minetest/minetest/pull/14087
2023-12-12 09:25:35 +01:00
bakawun ba564f843f mobs:villager: reduce job/bed/bell search radius
and turn it into a setting
this makes villager breeding possible on low end
hardware like android
2023-12-12 09:23:53 +01:00
bakawun cff3d8d802 mapgen:villages:Increase village spawn chance
from ~1.3% to ~3.3% to more close match mc 50% chance
per 500 blocks
2023-12-12 09:23:26 +01:00
bakawun 238031921a obs: loot table updates
fix table being defined twice for hoglin
enable looting enchantment effects wheee missing
use int 1 in N chances
correct some values to those from mc wiki
2023-12-12 09:22:46 +01:00
bakawun e152a392e0 loot chance: fix 1 in N chance calculation.
add mc 2nd roll when enchanted to base chance value
remove unused math.floor calculation from num to drop
remove looting_ignore_chance, only used for ghast and
its not needed.
2023-12-12 09:22:27 +01:00
bakawun 91880967cb Set all mob spawn chance weights according to mc now that weights are actually taken into account 2023-12-12 09:21:55 +01:00
bakawun d2d04d77ca Spawning: add a comment to clarify what the random select is doing 2023-12-12 09:21:28 +01:00
bakawun 8c7e26989f Spawning: break mob selection loop when out of bounds 2023-12-12 09:21:10 +01:00
bakawun 31a56f6a2a Spawning: remove unused summary_chance 2023-12-12 09:20:53 +01:00
bakawun 3a00986266 Spawning: remove another unused perlin var 2023-12-12 09:20:37 +01:00
cora ad3a888e65 Mob spawning: Remove unused vars 2023-12-12 09:20:15 +01:00
bakawun e86c8a8ac6 Spawning: fix random weighted choice 2023-12-12 09:20:00 +01:00
bakawun d12cbbb706 mobs:shulker:use on_attack to set shoot interval
to between 1 and 6 seconds
2023-12-12 09:19:28 +01:00
the-real-herowl 2a0e21444b Fixed crashes 2023-12-12 09:19:13 +01:00
bakawun 78ef56a2f3 Shulker: align armor value with mc and set it to 0 when opened 2023-12-12 09:18:52 +01:00
bakawun 697fdca549 Shulker: make bullet speed match mc
speed is 5 according to https://www.gmbinder.com/share/-MelLRYIg8yCfuAqQ82g#:~:text=After%20doing%20some%20experimentation%20I,~5%20blocks%2Fsecond).
2023-12-12 09:18:37 +01:00
cora 83522126c5 Fix shulker bullets ignoring armor 2023-12-12 09:18:17 +01:00
cora 069513f70b Add a get_arrow_hit_func function to mcl_mobs
reason for this is that player:punch used by most mobs ignores armor
worn by player
2023-12-12 09:17:55 +01:00
cora 6c93e17731 Make shulker bullets homing 2023-12-12 09:17:36 +01:00
cora 28c1fb4278 Add an option for mob arrows to be "homing" 2023-12-12 09:17:18 +01:00
Bakawun a845437ea3 Shulker, add missing false statement 2023-12-12 09:17:01 +01:00
Bakawun 2a3abe54e9 Shulker; fix attack open animation, improve peek 2023-12-12 09:16:45 +01:00
Bakawun b7f84bb059 Shulker: randomize shoot interval
Randomize shoot interval to between 1 and 5.5 seconds and set default shoot interval to 5.5
2023-12-12 09:16:20 +01:00
Bakawun 74aa25da4c Shulker: Make shulker peek periodically
Adjust walk and animation settings so the shulker peeks out randomly.
2023-12-12 09:16:04 +01:00
Bakawun 69cca594e2 Shulker: lower shoot interval to 1 second
In this video we can see the shulkers are shooting at a rate of once per second.
https://youtube.com/shorts/8tUFaSZ4b7I?si=sszp4cnyXR4dXg9B

The wiki confirms this but mentions a range of 1 to 5.5 seconds. 
I think this range is caused by the shulker closing and stopping shots for a few seconds but no longer than the max interval of 5.5

https://minecraft.fandom.com/wiki/Shulker#:~:text=The%20shulker%20continues%20firing%20every,unaffected%20by%20Levitation%20when%20hit
2023-12-12 09:15:49 +01:00
Bakawun 77e2beea17 Ghast: align attributes with mc
Ghast should spawn much more rarely than they currently do
I set the value to 1/4th of the original value before 72000 was set as an attempt to lower spawn rates, it actually increased them.

Align View distance, sound distance and shot interval with mc wiki.
https://minecraft.fandom.com/wiki/Ghast

Align fireball velocity with mc issue tracker
https://bugs.mojang.com/browse/MC-238286
2023-12-12 09:14:48 +01:00
bakawun 0952a92a5e fix walking and running animation for horse donkey and mule
no more gliding horses
2023-12-12 09:12:46 +01:00
bakawun edc4c95f6d mobs:animations:align animation to movement speed
change walk speed of evoker and enderman to match mc
make enderman walk less
2023-12-12 09:12:12 +01:00
61 changed files with 740 additions and 301 deletions

View File

@ -459,7 +459,7 @@ function mcl_explosions.explode(pos, strength, info, direct, source)
end end
-- The maximum blast radius (in the air) -- The maximum blast radius (in the air)
local radius = math.ceil(1.3 * strength / (0.3 * 0.75) * 0.3) local radius = math.floor(1.3 * strength / 0.225 * 0.3 + 0.5)
if not sphere_shapes[radius] then if not sphere_shapes[radius] then
sphere_shapes[radius] = compute_sphere_rays(radius) sphere_shapes[radius] = compute_sphere_rays(radius)

View File

@ -522,7 +522,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir)
if is_player then if is_player then
-- is mob out of reach? -- is mob out of reach?
if vector.distance(mob_pos, player_pos) > 3 then if vector.distance(mob_pos, player_pos) > 3 then
return return
end end
-- is mob protected? -- is mob protected?
@ -1231,6 +1231,9 @@ function mob_class:do_states_attack (dtime)
-- important for mcl_shields -- important for mcl_shields
ent._shooter = self.object ent._shooter = self.object
ent._saved_shooter_pos = self.object:get_pos() ent._saved_shooter_pos = self.object:get_pos()
if ent.homing then
ent._target = self.attack
end
end end
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5

View File

@ -334,6 +334,13 @@ function mcl_mobs.register_mob(name, def)
end -- END mcl_mobs.register_mob function end -- END mcl_mobs.register_mob function
function mcl_mobs.get_arrow_damage_func(damage, typ)
local typ = mcl_damage.types[typ] and typ or "arrow"
return function(projectile, object)
return mcl_util.deal_damage(object, damage, {type = typ})
end
end
-- register arrow for shoot attack -- register arrow for shoot attack
function mcl_mobs.register_arrow(name, def) function mcl_mobs.register_arrow(name, def)
@ -350,6 +357,7 @@ function mcl_mobs.register_arrow(name, def)
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,
homing = def.homing,
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 = {0, 0, 0, 0, 0, 0}, -- remove box around arrows collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows
timer = 0, timer = 0,
@ -422,6 +430,17 @@ function mcl_mobs.register_arrow(name, def)
end end
end end
if self.homing and self._target then
local p = self._target:get_pos()
if p then
if minetest.line_of_sight(self.object:get_pos(), p) then
self.object:set_velocity(vector.direction(self.object:get_pos(), p) * self.velocity)
end
else
self.target = nil
end
end
if self.hit_player or self.hit_mob or self.hit_object then if self.hit_player or self.hit_mob or self.hit_object then
for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do

View File

@ -104,20 +104,23 @@ function mob_class:item_drop(cooked, looting_level)
if chance_function then if chance_function then
chance = chance_function(looting_level) chance = chance_function(looting_level)
elseif looting_type == "rare" then elseif looting_type == "rare" then
chance = chance + (dropdef.looting_factor or 0.01) * looting_level local enchant_bonus = (dropdef.looting_factor or 0.01) * looting_level
chance = chance + enchant_bonus
--simulate 2nd roll by adding its chance value
local chance_bonus = chance * (looting_level / (looting_level + 1))
chance = chance + chance_bonus
end end
end end
local num = 0 local num = 0
local do_common_looting = (looting_level > 0 and looting_type == "common") local do_common_looting = (looting_level > 0 and looting_type == "common")
if math.random() < chance then chance = math.floor(1 / chance)
if math.random(1, chance) == 1 then
num = math.random(dropdef.min or 1, dropdef.max or 1) num = math.random(dropdef.min or 1, dropdef.max or 1)
elseif not dropdef.looting_ignore_chance then
do_common_looting = false
end end
if do_common_looting then if do_common_looting then
num = num + math.floor(math.random(0, looting_level) + 0.5) num = num + math.random(0, looting_level)
end end
if num > 0 then if num > 0 then

63
mods/ENTITIES/mcl_mobs/spawning.lua Normal file → Executable file
View File

@ -16,7 +16,6 @@ local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
local get_biome_name = minetest.get_biome_name local get_biome_name = minetest.get_biome_name
local get_objects_inside_radius = minetest.get_objects_inside_radius local get_objects_inside_radius = minetest.get_objects_inside_radius
local get_connected_players = minetest.get_connected_players local get_connected_players = minetest.get_connected_players
local minetest_get_perlin = minetest.get_perlin
local math_random = math.random local math_random = math.random
local math_floor = math.floor local math_floor = math.floor
@ -97,19 +96,6 @@ local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
local logging = minetest.settings:get_bool("mcl_logging_mobs_spawn",true) local logging = minetest.settings:get_bool("mcl_logging_mobs_spawn",true)
local noise_params = {
offset = 0,
scale = 3,
spread = {
x = 301,
y = 50,
z = 304,
},
seed = 100,
octaves = 3,
persistence = 0.5,
}
-- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs -- THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs
-- Also used for missing parameter -- Also used for missing parameter
-- Please update the list when adding new biomes! -- Please update the list when adding new biomes!
@ -446,7 +432,6 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
local spawn_dictionary = {} local spawn_dictionary = {}
--this is where all of the spawning information is kept for mobs that don't naturally spawn --this is where all of the spawning information is kept for mobs that don't naturally spawn
local non_spawn_dictionary = {} local non_spawn_dictionary = {}
local summary_chance = 0
function mcl_mobs:spawn_setup(def) function mcl_mobs:spawn_setup(def)
if not mobs_spawn then return end if not mobs_spawn then return end
@ -508,7 +493,6 @@ function mcl_mobs:spawn_setup(def)
check_position = check_position, check_position = check_position,
on_spawn = on_spawn, on_spawn = on_spawn,
} }
summary_chance = summary_chance + chance
end end
function mcl_mobs:mob_light_lvl(mob_name, dimension) function mcl_mobs:mob_light_lvl(mob_name, dimension)
@ -612,10 +596,8 @@ function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_
spawn_dictionary[key]["day_toggle"] = day_toggle spawn_dictionary[key]["day_toggle"] = day_toggle
spawn_dictionary[key]["check_position"] = check_position spawn_dictionary[key]["check_position"] = check_position
summary_chance = summary_chance + chance
end end
local two_pi = 2 * math.pi local two_pi = 2 * math.pi
local function get_next_mob_spawn_pos(pos) local function get_next_mob_spawn_pos(pos)
-- TODO We should consider spawning something a little further away sporadically. -- TODO We should consider spawning something a little further away sporadically.
@ -875,8 +857,6 @@ minetest.register_chatcommand("spawn_mob",{
if mobs_spawn then if mobs_spawn then
local perlin_noise
-- Get pos to spawn, x and z are randomised, y is range -- Get pos to spawn, x and z are randomised, y is range
@ -973,9 +953,21 @@ if mobs_spawn then
return spawning_position return spawning_position
end end
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
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 spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile) local function spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile)
--create a disconnected clone of the spawn dictionary, prevents memory leak
local mob_library_worker_table = table_copy(spawn_dictionary)
local spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES) local spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES)
if not spawning_position then if not spawning_position then
@ -988,22 +980,25 @@ if mobs_spawn then
--output_mob_stats(mob_counts_wide) --output_mob_stats(mob_counts_wide)
--grab mob that fits into the spawning location --grab mob that fits into the spawning location
--randomly grab a mob, don't exclude any possibilities --use random weighted choice with replacement to grab a mob, don't exclude any possibilities
perlin_noise = perlin_noise or minetest_get_perlin(noise_params) --shuffle table once every loop to provide equal inclusion probability to all mobs
local noise = perlin_noise:get_3d(spawning_position) --repeat grabbing a mob to maintain existing spawn rates
local current_summary_chance = summary_chance local spawn_loop_counter = #mob_library_worker_table
table.shuffle(mob_library_worker_table) while spawn_loop_counter > 0 do
table.shuffle(mob_library_worker_table)
while #mob_library_worker_table > 0 do local mob_chance_offset = math_random(1, cumulative_chance)
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
local mob_index = 1 local mob_index = 1
local mob_chance = mob_library_worker_table[mob_index].chance local mob_chance = mob_library_worker_table[mob_index].chance
local step_chance = mob_chance local step_chance = mob_chance
while step_chance < mob_chance_offset do while step_chance < mob_chance_offset do
mob_index = mob_index + 1 mob_index = mob_index + 1
mob_chance = mob_library_worker_table[mob_index].chance if mob_index <= #mob_library_worker_table then
step_chance = step_chance + mob_chance mob_chance = mob_library_worker_table[mob_index].chance
step_chance = step_chance + mob_chance
else
break
end
end end
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance) --minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
@ -1088,8 +1083,7 @@ if mobs_spawn then
end end
end end
current_summary_chance = current_summary_chance - mob_chance spawn_loop_counter = spawn_loop_counter - 1
table_remove(mob_library_worker_table, mob_index)
end end
end end
@ -1101,6 +1095,7 @@ if mobs_spawn then
timer = timer + dtime timer = timer + dtime
if timer < WAIT_FOR_SPAWN_ATTEMPT then return end if timer < WAIT_FOR_SPAWN_ATTEMPT then return end
initialize_spawn_data()
timer = 0 timer = 0
local players = get_connected_players() local players = get_connected_players()

View File

@ -171,7 +171,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
4000, 100,
3, 3,
water-16, water-16,
water+1) water+1)

View File

@ -150,7 +150,7 @@ mcl_mobs:spawn_specific(
0, 0,
maxlight, maxlight,
20, 20,
5000, 100,
2, 2,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mobs_mc.water_level-1) mobs_mc.water_level-1)

View File

@ -151,7 +151,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
5000, 1000,
3, 3,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)

View File

@ -65,13 +65,13 @@ mcl_mobs.register_mob("mobs_mc:chicken", {
}, },
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 20, walk_speed = 25, walk_start = 0, walk_end = 20, walk_speed = 100,
run_start = 0, run_end = 20, run_speed = 50, run_start = 0, run_end = 20, run_speed = 200,
}, },
child_animations = { child_animations = {
stand_start = 31, stand_end = 31, stand_start = 31, stand_end = 31,
walk_start = 31, walk_end = 51, walk_speed = 37, walk_start = 31, walk_end = 51, walk_speed = 100,
run_start = 31, run_end = 51, run_speed = 75, run_start = 31, run_end = 51, run_speed = 200,
}, },
follow = { follow = {
"mcl_farming:wheat_seeds", "mcl_farming:wheat_seeds",
@ -157,7 +157,7 @@ mcl_mobs:spawn_specific(
}, },
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 17000, 30, 100,
3, 3,
mobs_mc.water_level, mobs_mc.water_level,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -67,7 +67,8 @@ local cod = {
{name = "mcl_bone_meal:bone_meal", {name = "mcl_bone_meal:bone_meal",
chance = 20, chance = 20,
min = 1, min = 1,
max = 1,}, max = 1,
looting = rare},
}, },
visual_size = {x=3, y=3}, visual_size = {x=3, y=3},
makes_footstep_sound = false, makes_footstep_sound = false,
@ -266,7 +267,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
4000, 750,
3, 3,
water-16, water-16,
water+1) water+1)

View File

@ -50,13 +50,13 @@ local cow_def = {
}, },
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_speed = 30, walk_start = 0, walk_end = 40, walk_speed = 100,
run_start = 0, run_end = 40, run_speed = 40, run_start = 0, run_end = 40, run_speed = 200,
}, },
child_animations = { child_animations = {
stand_start = 41, stand_end = 41, stand_start = 41, stand_end = 41,
walk_start = 41, walk_end = 81, walk_speed = 45, walk_start = 41, walk_end = 81, walk_speed = 100,
run_start = 41, run_end = 81, run_speed = 60, run_start = 41, run_end = 81, run_speed = 200,
}, },
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if self:feed_tame(clicker, 1, true, false) then return end if self:feed_tame(clicker, 1, true, false) then return end
@ -207,7 +207,7 @@ mcl_mobs:spawn_specific(
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
17000, 80,
10, 10,
mobs_mc.water_level, mobs_mc.water_level,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -225,7 +225,7 @@ mcl_mobs:spawn_specific(
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
17000, 80,
5, 5,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -115,14 +115,14 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
max = 1,}, max = 1,},
}, },
animation = { animation = {
speed_normal = 24,
speed_run = 48,
stand_start = 0, stand_start = 0,
stand_end = 23, stand_end = 23,
walk_start = 24, walk_speed = 100,
walk_end = 49, walk_start = 0,
run_start = 24, walk_end = 40,
run_end = 49, run_speed = 100,
run_start = 0,
run_end = 40,
hurt_start = 110, hurt_start = 110,
hurt_end = 139, hurt_end = 139,
death_start = 140, death_start = 140,
@ -241,12 +241,12 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", {
max = 1,}, max = 1,},
}, },
animation = { animation = {
speed_normal = 24,
speed_run = 48,
stand_start = 0, stand_start = 0,
stand_end = 23, stand_end = 23,
walk_speed = 100,
walk_start = 24, walk_start = 24,
walk_end = 49, walk_end = 49,
run_speed = 200,
run_start = 24, run_start = 24,
run_end = 49, run_end = 49,
hurt_start = 110, hurt_start = 110,
@ -407,7 +407,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
20, 20,
16500, 1000,
2, 2,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -244,7 +244,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
4000, 70,
3, 3,
water-16, water-16,
water+1) water+1)

View File

@ -205,8 +205,8 @@ local select_enderman_animation = function(animation_type)
-- Enderman holds a block -- Enderman holds a block
if animation_type == "block" then if animation_type == "block" then
return { return {
walk_speed = 25, walk_speed = 80,
run_speed = 50, run_speed = 160,
stand_speed = 25, stand_speed = 25,
stand_start = 200, stand_start = 200,
stand_end = 200, stand_end = 200,
@ -220,8 +220,8 @@ local select_enderman_animation = function(animation_type)
-- Enderman doesn't hold a block -- Enderman doesn't hold a block
elseif animation_type == "normal" or animation_type == nil then elseif animation_type == "normal" or animation_type == nil then
return { return {
walk_speed = 25, walk_speed = 80,
run_speed = 50, run_speed = 160,
stand_speed = 25, stand_speed = 25,
stand_start = 40, stand_start = 40,
stand_end = 80, stand_end = 80,
@ -292,7 +292,8 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
random = {name="mobs_mc_enderman_random", gain=0.5}, random = {name="mobs_mc_enderman_random", gain=0.5},
distance = 16, distance = 16,
}, },
walk_velocity = 0.2, walk_velocity = 1.0,
walk_chance = 10,
run_velocity = 3.4, run_velocity = 3.4,
damage = 7, damage = 7,
reach = 2, reach = 2,
@ -668,7 +669,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
3000, 100,
12, 12,
mcl_vars.mg_end_min, mcl_vars.mg_end_min,
mcl_vars.mg_end_max) mcl_vars.mg_end_max)
@ -816,7 +817,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
19000, 100,
2, 2,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -833,7 +834,7 @@ mcl_mobs:spawn_specific(
0, 0,
11, 11,
30, 30,
27500, 100,
4, 4,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
@ -849,7 +850,7 @@ mcl_mobs:spawn_specific(
0, 0,
11, 11,
30, 30,
5000, 100,
4, 4,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)

View File

@ -33,7 +33,7 @@ mcl_mobs.register_mob("mobs_mc:ghast", {
death = "mobs_mc_zombie_death", death = "mobs_mc_zombie_death",
attack = "mobs_fireball", attack = "mobs_fireball",
random = "mobs_eerie", random = "mobs_eerie",
distance = 16, distance = 80,
-- TODO: damage -- TODO: damage
-- TODO: better death -- TODO: better death
}, },
@ -41,7 +41,7 @@ mcl_mobs.register_mob("mobs_mc:ghast", {
run_velocity = 3.2, run_velocity = 3.2,
drops = { drops = {
{name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, looting = "common"}, {name = "mcl_mobitems:gunpowder", chance = 1, min = 0, max = 2, looting = "common"},
{name = "mcl_mobitems:ghast_tear", chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true}, {name = "mcl_mobitems:ghast_tear", chance = 1, min = 0, max = 1, looting = "common",},
}, },
animation = { animation = {
stand_speed = 50, walk_speed = 50, run_speed = 50, stand_speed = 50, walk_speed = 50, run_speed = 50,
@ -50,10 +50,10 @@ mcl_mobs.register_mob("mobs_mc:ghast", {
run_start = 0, run_end = 40, run_start = 0, run_end = 40,
}, },
fall_damage = 0, fall_damage = 0,
view_range = 100, view_range = 64,
attack_type = "dogshoot", attack_type = "dogshoot",
arrow = "mobs_mc:fireball", arrow = "mobs_mc:fireball",
shoot_interval = 3.5, shoot_interval = 3,
shoot_offset = -5, shoot_offset = -5,
dogshoot_switch = 1, dogshoot_switch = 1,
dogshoot_count_max =1, dogshoot_count_max =1,
@ -97,7 +97,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
72000, 400,
2, 2,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
@ -107,7 +107,7 @@ mcl_mobs.register_arrow("mobs_mc:fireball", {
visual = "sprite", visual = "sprite",
visual_size = {x = 1, y = 1}, visual_size = {x = 1, y = 1},
textures = {"mcl_fire_fire_charge.png"}, textures = {"mcl_fire_fire_charge.png"},
velocity = 15, velocity = 5,
collisionbox = {-.5, -.5, -.5, .5, .5, .5}, collisionbox = {-.5, -.5, -.5, .5, .5, .5},
_is_fireball = true, _is_fireball = true,

View File

@ -237,7 +237,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX + 1, minetest.LIGHT_MAX + 1,
30, 30,
10000, 100,
3, 3,
water - 16, water - 16,
water) water)

View File

@ -80,25 +80,25 @@ mcl_mobs.register_mob("mobs_mc:guardian_elder", {
min = 1, min = 1,
max = 1, max = 1,
looting = "rare", looting = "rare",
looting_factor = 0.01 / 4,}, looting_factor = 0.0025,},
{name = "mcl_fishing:salmon_raw", {name = "mcl_fishing:salmon_raw",
chance = 160, chance = 160,
min = 1, min = 1,
max = 1, max = 1,
looting = "rare", looting = "rare",
looting_factor = 0.01 / 4,}, looting_factor = 0.0025,},
{name = "mcl_fishing:clownfish_raw", {name = "mcl_fishing:clownfish_raw",
chance = 160, chance = 160,
min = 1, min = 1,
max = 1, max = 1,
looting = "rare", looting = "rare",
looting_factor = 0.01 / 4,}, looting_factor = 0.0025,},
{name = "mcl_fishing:pufferfish_raw", {name = "mcl_fishing:pufferfish_raw",
chance = 160, chance = 160,
min = 1, min = 1,
max = 1, max = 1,
looting = "rare", looting = "rare",
looting_factor = 0.01 / 4,}, looting_factor = 0.0025,},
}, },
fly = true, fly = true,
makes_footstep_sound = false, makes_footstep_sound = false,

View File

@ -43,13 +43,13 @@ local hoglin = {
{name = "mobs_mcitems:leather", {name = "mobs_mcitems:leather",
chance = 1, chance = 1,
min = 0, min = 0,
max = 1,}, max = 2,
}, looting = "common",},
drops = {
{name = "mcl_mobitems:porkchop", {name = "mcl_mobitems:porkchop",
chance = 1, chance = 1,
min = 2, min = 2,
max = 4,}, max = 4,
looting = "common",},
}, },
animation = { animation = {
stand_speed = 7, stand_speed = 7,
@ -129,7 +129,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
6000, 200,
3, 3,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)

View File

@ -122,10 +122,10 @@ local horse = {
stand_speed = 25, stand_speed = 25,
stand_start = 0, stand_start = 0,
stand_end = 0, stand_end = 0,
walk_speed = 25, walk_speed = 100,
walk_start = 0, walk_start = 0,
walk_end = 40, walk_end = 40,
run_speed = 60, run_speed = 200,
run_start = 0, run_start = 0,
run_end = 40, run_end = 40,
}, },
@ -543,11 +543,6 @@ donkey.description = S("Donkey")
donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}} donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}}
donkey.spawn_in_group = 3 donkey.spawn_in_group = 3
donkey.spawn_in_group_min = 1 donkey.spawn_in_group_min = 1
donkey.animation = {
speed_normal = 25,
stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40,
}
donkey.sounds = { donkey.sounds = {
random = "mobs_mc_donkey_random", random = "mobs_mc_donkey_random",
damage = "mobs_mc_donkey_hurt", damage = "mobs_mc_donkey_hurt",
@ -609,7 +604,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 40,
4, 4,
mobs_mc.water_level+3, mobs_mc.water_level+3,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -632,7 +627,7 @@ mcl_mobs:spawn_specific(
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 10,
4, 4,
mobs_mc.water_level+3, mobs_mc.water_level+3,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -80,7 +80,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", {
}, },
fall_damage = 0, fall_damage = 0,
animation = { animation = {
stand_speed = 15, walk_speed = 15, run_speed = 25, punch_speed = 15, stand_speed = 15, walk_speed = 50, run_speed = 100, punch_speed = 15,
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_start = 0, walk_end = 40,
run_start = 0, run_end = 40, run_start = 0, run_end = 40,

View File

@ -102,13 +102,13 @@ mcl_mobs.register_mob("mobs_mc:llama", {
}, },
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_speed = 35, walk_start = 0, walk_end = 40, walk_speed = 100,
run_start = 0, run_end = 40, run_speed = 50, run_start = 0, run_end = 40, run_speed = 200,
}, },
child_animations = { child_animations = {
stand_start = 41, stand_end = 41, stand_start = 41, stand_end = 41,
walk_start = 41, walk_end = 81, walk_speed = 50, walk_start = 41, walk_end = 81, walk_speed = 200,
run_start = 41, run_end = 81, run_speed = 75, run_start = 41, run_end = 81, run_speed = 400,
}, },
follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" }, follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" },
view_range = 16, view_range = 16,
@ -291,7 +291,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 50,
5, 5,
mobs_mc.water_level+15, mobs_mc.water_level+15,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -63,14 +63,14 @@ local ocelot = {
}, },
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_speed = 40, walk_start = 0, walk_end = 40, walk_speed = 100,
run_start = 0, run_end = 40, run_speed = 50, run_start = 0, run_end = 40, run_speed = 200,
sit_start = 50, sit_end = 50, sit_start = 50, sit_end = 50,
}, },
child_animations = { child_animations = {
stand_start = 51, stand_end = 51, stand_start = 51, stand_end = 51,
walk_start = 51, walk_end = 91, walk_speed = 60, walk_start = 51, walk_end = 91, walk_speed = 200,
run_start = 51, run_end = 91, run_speed = 75, run_start = 51, run_end = 91, run_speed = 400,
sit_start = 101, sit_end = 101, sit_start = 101, sit_end = 101,
}, },
follow = follow, follow = follow,
@ -186,7 +186,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 300,
5, 5,
mobs_mc.water_level+15, mobs_mc.water_level+15,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -166,8 +166,8 @@ mcl_mobs.register_mob("mobs_mc:parrot", {
fly_speed = 50, fly_speed = 50,
stand_start = 0, stand_start = 0,
stand_end = 0, stand_end = 0,
fly_start = 30, fly_start = 130,
fly_end = 45, fly_end = 150,
walk_start = 0, walk_start = 0,
walk_end = 20, walk_end = 20,
-- TODO: actual walk animation -- TODO: actual walk animation
@ -235,7 +235,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
7, 7,
30000, 400,
1, 1,
mobs_mc.water_level+7, mobs_mc.water_level+7,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -258,7 +258,7 @@ mcl_mobs:spawn_specific(
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 100,
8, 8,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -71,14 +71,14 @@ local piglin = {
run_velocity = 2.8, run_velocity = 2.8,
drops = { drops = {
{name = "mcl_bows:crossbow", {name = "mcl_bows:crossbow",
chance = 10, chance = 11, -- 8.5% approximated
min = 1, min = 1,
max = 1,}, max = 1,},
}, },
animation = { animation = {
stand_speed = 30, stand_speed = 30,
walk_speed = 30, walk_speed = 100,
run_speed = 30, run_speed = 200,
stand_start = 0, stand_start = 0,
stand_end = 79, stand_end = 79,
walk_start = 168, walk_start = 168,
@ -200,9 +200,9 @@ sword_piglin.drops = {
sword_piglin.attack_type = "dogfight" sword_piglin.attack_type = "dogfight"
sword_piglin.animation = { sword_piglin.animation = {
stand_speed = 30, stand_speed = 30,
walk_speed = 30, walk_speed = 100,
punch_speed = 45, punch_speed = 45,
run_speed = 30, run_speed = 200,
stand_start = 0, stand_start = 0,
stand_end = 79, stand_end = 79,
walk_start = 168, walk_start = 168,
@ -288,8 +288,8 @@ local zombified_piglin = {
}, },
animation = { animation = {
stand_speed = 25, stand_speed = 25,
walk_speed = 25, walk_speed = 100,
run_speed = 50, run_speed = 200,
stand_start = 40, stand_start = 40,
stand_end = 80, stand_end = 80,
walk_start = 0, walk_start = 0,
@ -361,9 +361,9 @@ piglin_brute.textures = {"extra_mobs_piglin_brute.png", "default_tool_goldaxe.pn
piglin_brute.attack_type = "dogfight" piglin_brute.attack_type = "dogfight"
piglin_brute.animation = { piglin_brute.animation = {
stand_speed = 30, stand_speed = 30,
walk_speed = 30, walk_speed = 100,
punch_speed = 45, punch_speed = 45,
run_speed = 30, run_speed = 200,
stand_start = 0, stand_start = 0,
stand_end = 79, stand_end = 79,
walk_start = 168, walk_start = 168,
@ -397,7 +397,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
6000, 150,
3, 3,
mcl_vars.mg_lava_nether_max, mcl_vars.mg_lava_nether_max,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
@ -413,7 +413,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
6000, 150,
3, 3,
mcl_vars.mg_lava_nether_max, mcl_vars.mg_lava_nether_max,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
@ -429,7 +429,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
6000, 1000,
3, 3,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
@ -446,7 +446,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
100000, 50,
4, 4,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)

View File

@ -71,10 +71,11 @@ pillager = {
}, },
{ {
name = "mcl_bows:crossbow", name = "mcl_bows:crossbow",
chance = 100 / 8.5, chance = 11, -- 8.5% approximated
min = 1, min = 1,
max = 1, max = 1,
looting = "rare", looting = "rare",
looting_factor = 0.012,
}, },
}, },
animation = { animation = {
@ -82,8 +83,8 @@ pillager = {
unloaded_stand_start = 41, unloaded_stand_end = 60, unloaded_stand_start = 41, unloaded_stand_end = 60,
reload_stand_start = 61, reload_stand_end = 100, reload_stand_speed = 20, reload_stand_start = 61, reload_stand_end = 100, reload_stand_speed = 20,
stand_start = 101, stand_end = 109, stand_speed = 6, stand_start = 101, stand_end = 109, stand_speed = 6,
walk_start = 111, walk_end = 150, walk_speed = 30, walk_start = 111, walk_end = 150, walk_speed = 200,
run_start = 111, run_end = 150, run_speed = 50, run_start = 111, run_end = 150, run_speed = 400,
reload_run_start = 151, reload_run_end = 190, reload_run_speed = 20, reload_run_start = 151, reload_run_end = 190, reload_run_speed = 20,
die_start = 191, die_end = 192, die_speed = 15, die_start = 191, die_end = 192, die_speed = 15,
stand_unloaded_start = 40, stand_unloaded_end = 59, stand_unloaded_start = 40, stand_unloaded_end = 59,

View File

@ -64,10 +64,10 @@ mcl_mobs.register_mob("mobs_mc:polar_bear", {
distance = 16, distance = 16,
}, },
animation = { animation = {
speed_normal = 25, speed_run = 50, speed_normal = 25,
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_start = 0, walk_end = 40, walk_speed = 100,
run_start = 0, run_end = 40, run_start = 0, run_end = 40, run_speed = 200,
}, },
view_range = 16, view_range = 16,
@ -86,7 +86,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
7000, 50,
3, 3,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -47,20 +47,20 @@ local rabbit = {
runaway = true, runaway = true,
jump = true, jump = true,
drops = { drops = {
{name = "mcl_mobitems:rabbit", chance = 1, min = 0, max = 1, looting = "common",}, {name = "mcl_mobitems:rabbit", chance = 1, min = 1, max = 1, looting = "common",},
{name = "mcl_mobitems:rabbit_hide", chance = 1, min = 0, max = 1, looting = "common",}, {name = "mcl_mobitems:rabbit_hide", chance = 1, min = 0, max = 1, looting = "common",},
{name = "mcl_mobitems:rabbit_foot", chance = 10, min = 0, max = 1, looting = "rare", looting_factor = 0.03,}, {name = "mcl_mobitems:rabbit_foot", chance = 10, min = 1, max = 1, looting = "rare", looting_factor = 0.03,},
}, },
fear_height = 4, fear_height = 4,
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 20, walk_speed = 20, walk_start = 0, walk_end = 20, walk_speed = 100,
run_start = 0, run_end = 20, run_speed = 30, run_start = 0, run_end = 20, run_speed = 200,
}, },
child_animations = { child_animations = {
stand_start = 21, stand_end = 21, stand_start = 21, stand_end = 21,
walk_start = 21, walk_end = 41, walk_speed = 30, walk_start = 21, walk_end = 41, walk_speed = 200,
run_start = 21, run_end = 41, run_speed = 45, run_start = 21, run_end = 41, run_speed = 400,
}, },
-- Follow (yellow) dangelions, carrots and golden carrots -- Follow (yellow) dangelions, carrots and golden carrots
follow = { follow = {
@ -148,7 +148,7 @@ mcl_mobs:spawn_specific(
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 40,
8, 8,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -45,7 +45,8 @@ local salmon = {
{name = "mcl_bone_meal:bone_meal", {name = "mcl_bone_meal:bone_meal",
chance = 20, chance = 20,
min = 1, min = 1,
max = 1,}, max = 1,
looting = "rare",},
}, },
visual_size = {x=3, y=3}, visual_size = {x=3, y=3},
makes_footstep_sound = false, makes_footstep_sound = false,
@ -220,7 +221,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
4000, 260,
3, 3,
water-16, water-16,
water+1) water+1)

View File

@ -101,14 +101,14 @@ mcl_mobs.register_mob("mobs_mc:sheep", {
}, },
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_speed = 30, walk_start = 0, walk_end = 40, walk_speed = 80,
run_start = 0, run_end = 40, run_speed = 40, run_start = 0, run_end = 40, run_speed = 160,
eat_start = 40, eat_end = 80, eat_loop = false, eat_start = 40, eat_end = 80, eat_loop = false,
}, },
child_animations = { child_animations = {
stand_start = 81, stand_end = 81, stand_start = 81, stand_end = 81,
walk_start = 81, walk_end = 121, walk_speed = 45, walk_start = 81, walk_end = 121, walk_speed = 160,
run_start = 81, run_end = 121, run_speed = 60, run_start = 81, run_end = 121, run_speed = 320,
eat_start = 121, eat_start = 161, eat_loop = false, eat_start = 121, eat_start = 161, eat_loop = false,
}, },
follow = { "mcl_farming:wheat_item" }, follow = { "mcl_farming:wheat_item" },
@ -379,7 +379,7 @@ mcl_mobs:spawn_specific(
9, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 120,
3, 3,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
attack_type = "shoot", attack_type = "shoot",
shoot_interval = 0.5, shoot_interval = 6,
arrow = "mobs_mc:shulkerbullet", arrow = "mobs_mc:shulkerbullet",
shoot_offset = 0.5, shoot_offset = 0.5,
passive = false, passive = false,
@ -43,7 +43,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
hp_max = 30, hp_max = 30,
xp_min = 5, xp_min = 5,
xp_max = 5, xp_max = 5,
armor = 150, armor = 20,
collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5}, collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5},
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_shulker.b3d", mesh = "mobs_mc_shulker.b3d",
@ -51,7 +51,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
-- TODO: sounds -- TODO: sounds
-- TODO: Make shulker dye-able -- TODO: Make shulker dye-able
visual_size = {x=3, y=3}, visual_size = {x=3, y=3},
walk_chance = 0, walk_chance = 10,
knock_back = false, knock_back = false,
jump = false, jump = false,
can_despawn = false, can_despawn = false,
@ -59,21 +59,25 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
drops = { drops = {
{name = "mcl_mobitems:shulker_shell", {name = "mcl_mobitems:shulker_shell",
chance = 2, chance = 2,
min = 1, min = 0,
max = 1, max = 1,
looting = "rare", looting = "rare",
looting_factor = 0.0625}, looting_factor = 0.0625},
}, },
animation = { animation = {
stand_speed = 25, walk_speed = 0, run_speed = 50, punch_speed = 25, stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25,
speed_normal = 25, speed_run = 50, speed_normal = 25, speed_run = 50,
stand_start = 0, stand_end = 25, stand_start = 0, stand_end = 25,
walk_start = 25, walk_end = 45, walk_start = 45, walk_end = 65,
run_start = 45, run_end = 85, walk_loop = false,
run_start = 65, run_end = 85,
run_loop = false,
punch_start = 80, punch_end = 100, punch_start = 80, punch_end = 100,
}, },
view_range = 16, view_range = 16,
fear_height = 0, fear_height = 0,
walk_velocity = 0,
run_velocity = 0,
noyaw = true, noyaw = true,
do_custom = function(self,dtime) do_custom = function(self,dtime)
local pos = self.object:get_pos() local pos = self.object:get_pos()
@ -81,12 +85,13 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
self.object:set_yaw(0) self.object:set_yaw(0)
mcl_mobs:yaw(self, 0, 0, dtime) mcl_mobs:yaw(self, 0, 0, dtime)
end end
if self.state == "walk" or self.state == "stand" then
self.state = "stand"
self:set_animation("stand")
end
if self.state == "attack" then if self.state == "attack" then
self:set_animation("punch") self:set_animation("run")
self.armor = 0
elseif self.state == "stand" then
self.armor = 20
elseif self.state == "walk" or self.state == "run" then
self.armor = 0
end end
self.path.way = false self.path.way = false
self.look_at_players = false self.look_at_players = false
@ -149,6 +154,9 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
end end
end end
end, end,
on_attack = function(self, dtime)
self.shoot_interval = math.random(1, 6)
end,
}) })
-- bullet arrow (weapon) -- bullet arrow (weapon)
@ -156,27 +164,12 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", {
visual = "sprite", visual = "sprite",
visual_size = {x = 0.25, y = 0.25}, visual_size = {x = 0.25, y = 0.25},
textures = {"mobs_mc_shulkerbullet.png"}, textures = {"mobs_mc_shulkerbullet.png"},
velocity = 6, velocity = 5,
homing = true,
hit_player = function(self, player) hit_player = mcl_mobs.get_arrow_damage_func(4),
player:punch(self.object, 1.0, { hit_mob = mcl_mobs.get_arrow_damage_func(4),
full_punch_interval = 1.0,
damage_groups = {fleshy = 4},
}, nil)
end,
hit_mob = function(self, mob)
mob:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 4},
}, nil)
end,
hit_node = function(self, pos, node)
end
}) })
mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0) mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1) mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1)
--[[ --[[

View File

@ -55,7 +55,7 @@ local skeleton = {
max = 2, max = 2,
looting = "common",}, looting = "common",},
{name = "mcl_bows:bow", {name = "mcl_bows:bow",
chance = 100 / 8.5, chance = 11, -- 8.5%
min = 1, min = 1,
max = 1, max = 1,
looting = "rare",}, looting = "rare",},
@ -76,10 +76,10 @@ local skeleton = {
stand_speed = 15, stand_speed = 15,
stand_start = 0, stand_start = 0,
stand_end = 40, stand_end = 40,
walk_speed = 15, walk_speed = 45,
walk_start = 40, walk_start = 40,
walk_end = 60, walk_end = 60,
run_speed = 30, run_speed = 90,
shoot_start = 70, shoot_start = 70,
shoot_end = 90, shoot_end = 90,
jockey_start = 172, jockey_start = 172,
@ -299,7 +299,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
20, 20,
17000, 800,
2, 2,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -316,7 +316,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
10000, 800,
3, 3,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
@ -336,7 +336,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
20, 20,
19000, 1200,
2, 2,
mobs_mc.water_level, mobs_mc.water_level,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -71,10 +71,10 @@ mcl_mobs.register_mob("mobs_mc:witherskeleton", {
stand_speed = 15, stand_speed = 15,
walk_start = 40, walk_start = 40,
walk_end = 60, walk_end = 60,
walk_speed = 15, walk_speed = 45,
run_start = 40, run_start = 40,
run_end = 60, run_end = 60,
run_speed = 30, run_speed = 90,
shoot_start = 70, shoot_start = 70,
shoot_end = 90, shoot_end = 90,
punch_start = 110, punch_start = 110,
@ -116,7 +116,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
5000, 500,
5, 5,
mcl_vars.mg_nether_min, mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)

View File

@ -197,7 +197,7 @@ local slime_big = {
distance = 16, distance = 16,
}, },
damage = 4, damage = 4,
reach = 3, reach = 2.5,
armor = 100, armor = 100,
drops = {}, drops = {},
-- TODO: Fix animations -- TODO: Fix animations
@ -238,7 +238,7 @@ slime_small.xp_max = 2
slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51}
slime_small.visual_size = {x=6.25, y=6.25} slime_small.visual_size = {x=6.25, y=6.25}
slime_small.damage = 3 slime_small.damage = 3
slime_small.reach = 2.75 slime_small.reach = 2.25
slime_small.walk_velocity = 1.8 slime_small.walk_velocity = 1.8
slime_small.run_velocity = 1.8 slime_small.run_velocity = 1.8
slime_small.jump_height = 4.3 slime_small.jump_height = 4.3
@ -254,8 +254,8 @@ slime_tiny.xp_min = 1
slime_tiny.xp_max = 1 slime_tiny.xp_max = 1
slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505}
slime_tiny.visual_size = {x=3.125, y=3.125} slime_tiny.visual_size = {x=3.125, y=3.125}
slime_tiny.damage = 0 slime_tiny.damage = 1
slime_tiny.reach = 2.5 slime_tiny.reach = 2
slime_tiny.drops = { slime_tiny.drops = {
-- slimeball -- slimeball
{name = "mcl_mobitems:slimeball", {name = "mcl_mobitems:slimeball",
@ -321,7 +321,7 @@ cave_biomes,
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
12000, 1000,
4, 4,
cave_min, cave_min,
cave_max, cave_max,
@ -335,7 +335,7 @@ swampy_biomes,
0, 0,
swamp_light_max, swamp_light_max,
30, 30,
12000, 1000,
4, 4,
swamp_min, swamp_min,
swamp_max) swamp_max)
@ -348,7 +348,7 @@ cave_biomes,
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
8500, 1000,
4, 4,
cave_min, cave_min,
cave_max, cave_max,
@ -362,7 +362,7 @@ swampy_biomes,
0, 0,
swamp_light_max, swamp_light_max,
30, 30,
8500, 1000,
4, 4,
swamp_min, swamp_min,
swamp_max) swamp_max)
@ -375,7 +375,7 @@ cave_biomes,
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
10000, 1000,
4, 4,
cave_min, cave_min,
cave_max, cave_max,
@ -389,7 +389,7 @@ swampy_biomes,
0, 0,
swamp_light_max, swamp_light_max,
30, 30,
10000, 1000,
4, 4,
swamp_min, swamp_min,
swamp_max) swamp_max)
@ -418,12 +418,12 @@ local magma_cube_big = {
walk_velocity = 2.5, walk_velocity = 2.5,
run_velocity = 2.5, run_velocity = 2.5,
damage = 6, damage = 6,
reach = 3, reach = 2.35,
armor = 53, armor = 53,
drops = { drops = {
{name = "mcl_mobitems:magma_cream", {name = "mcl_mobitems:magma_cream",
chance = 4, chance = 1,
min = 1, min = 0,
max = 1,}, max = 1,},
}, },
-- TODO: Fix animations -- TODO: Fix animations
@ -466,7 +466,7 @@ magma_cube_small.xp_max = 2
magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51}
magma_cube_small.visual_size = {x=6.25, y=6.25} magma_cube_small.visual_size = {x=6.25, y=6.25}
magma_cube_small.damage = 3 magma_cube_small.damage = 3
magma_cube_small.reach = 2.75 magma_cube_small.reach = 2.1
magma_cube_small.walk_velocity = .8 magma_cube_small.walk_velocity = .8
magma_cube_small.run_velocity = 2.0 magma_cube_small.run_velocity = 2.0
magma_cube_small.jump_height = 6 magma_cube_small.jump_height = 6
@ -491,7 +491,7 @@ magma_cube_tiny.walk_velocity = 1.02
magma_cube_tiny.run_velocity = 1.02 magma_cube_tiny.run_velocity = 1.02
magma_cube_tiny.jump_height = 4 magma_cube_tiny.jump_height = 4
magma_cube_tiny.damage = 3 magma_cube_tiny.damage = 3
magma_cube_tiny.reach = 2.5 magma_cube_tiny.reach = 2
magma_cube_tiny.armor = 50 magma_cube_tiny.armor = 50
magma_cube_tiny.drops = {} magma_cube_tiny.drops = {}
magma_cube_tiny.spawn_small_alternative = nil magma_cube_tiny.spawn_small_alternative = nil
@ -512,7 +512,7 @@ magma_cube_biomes,
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 100,
4, 4,
nether_min, nether_min,
nether_max) nether_max)
@ -525,7 +525,7 @@ magma_cube_biomes,
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15500, 100,
4, 4,
nether_min, nether_min,
nether_max) nether_max)
@ -538,7 +538,7 @@ magma_cube_biomes,
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
16000, 100,
4, 4,
nether_min, nether_min,
nether_max) nether_max)

View File

@ -90,16 +90,14 @@ local spider = {
floats = 1, floats = 1,
drops = { drops = {
{name = "mcl_mobitems:string", chance = 1, min = 0, max = 2, looting = "common"}, {name = "mcl_mobitems:string", chance = 1, min = 0, max = 2, looting = "common"},
{name = "mcl_mobitems:spider_eye", chance = 3, min = 1, max = 1, looting = "common", looting_chance_function = function(lvl) {name = "mcl_mobitems:spider_eye", chance = 1, min = 0, max = 1, looting = "common",},
return 1 - 2 / (lvl + 3)
end},
}, },
specific_attack = { "player", "mobs_mc:iron_golem" }, specific_attack = { "player", "mobs_mc:iron_golem" },
fear_height = 4, fear_height = 4,
animation = { animation = {
stand_speed = 10, stand_speed = 10,
walk_speed = 25, walk_speed = 100,
run_speed = 50, run_speed = 200,
stand_start = 20, stand_start = 20,
stand_end = 40, stand_end = 40,
walk_start = 0, walk_start = 0,
@ -287,7 +285,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
17000, 1000,
2, 2,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -211,7 +211,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
5500, 80,
3, 3,
water-16, water-16,
water+1) water+1)

View File

@ -39,13 +39,13 @@ local strider = {
drops = { drops = {
{name = "mcl_mobsitems:string", {name = "mcl_mobsitems:string",
chance = 1, chance = 1,
min = 2, min = 0,
max = 5,}, max = 5,},
}, },
animation = { animation = {
stand_speed = 15, stand_speed = 15,
walk_speed = 15, walk_speed = 30,
run_speed = 30, run_speed = 60,
stand_start = 5, stand_start = 5,
stand_end = 5, stand_end = 5,
walk_start = 1, walk_start = 1,
@ -225,7 +225,7 @@ mcl_mobs:spawn_setup({
}, },
min_height = mcl_vars.mg_nether_min, min_height = mcl_vars.mg_nether_min,
max_height = mcl_vars.mg_nether_max, max_height = mcl_vars.mg_nether_max,
chance = 2000, chance = 200,
}) })
mcl_mobs:spawn_setup({ mcl_mobs:spawn_setup({
@ -241,7 +241,7 @@ mcl_mobs:spawn_setup({
}, },
min_height = mcl_vars.mg_nether_min, min_height = mcl_vars.mg_nether_min,
max_height = mcl_vars.mg_nether_max, max_height = mcl_vars.mg_nether_max,
chance = 100, chance = 20,
}) })
-- spawn eggs -- spawn eggs

View File

@ -90,7 +90,8 @@ local tropical_fish = {
{name = "mcl_bone_meal:bone_meal", {name = "mcl_bone_meal:bone_meal",
chance = 20, chance = 20,
min = 1, min = 1,
max = 1,}, max = 1,
looting = "rare",},
}, },
visual_size = {x=3, y=3}, visual_size = {x=3, y=3},
makes_footstep_sound = false, makes_footstep_sound = false,
@ -183,7 +184,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
4000, 750,
3, 3,
water-16, water-16,
water+1) water+1)

View File

@ -37,6 +37,7 @@ mcl_mobs.register_mob("mobs_mc:vex", {
walk_velocity = 3.2, walk_velocity = 3.2,
run_velocity = 5.9, run_velocity = 5.9,
attack_type = "dogfight", attack_type = "dogfight",
attack_frequency = 2,
sounds = { sounds = {
-- TODO: random -- TODO: random
death = "mobs_mc_vex_death", death = "mobs_mc_vex_death",
@ -63,10 +64,13 @@ mcl_mobs.register_mob("mobs_mc:vex", {
self.object:set_properties({textures=self.base_texture}) self.object:set_properties({textures=self.base_texture})
end end
else else
if self.base_texture[2] == "mobs_mc_vex_charging.png" then
self.base_texture[2] = "mobs_mc_vex.png"
end
if self.base_texture[1] ~= "default_tool_steelsword.png" then if self.base_texture[1] ~= "default_tool_steelsword.png" then
self.base_texture[1] = "default_tool_steelsword.png" self.base_texture[1] = "default_tool_steelsword.png"
self.object:set_properties({textures=self.base_texture})
end end
self.object:set_properties({textures=self.base_texture})
end end
-- Take constant damage if the vex' life clock ran out -- Take constant damage if the vex' life clock ran out

View File

@ -33,6 +33,7 @@ local PLAYER_SCAN_RADIUS = 4 -- scan radius for looking for nearby players
local RESETTLE_DISTANCE = 100 -- If a mob is transported this far from home, it gives up bed and job and resettles local RESETTLE_DISTANCE = 100 -- If a mob is transported this far from home, it gives up bed and job and resettles
local PATHFINDING = "gowp" local PATHFINDING = "gowp"
local VILLAGER_SEARCH_RADIUS = tonumber(minetest.settings:get("mcl_mobs_villager_search_radius")) or 20
--[=======[ TRADING ]=======] --[=======[ TRADING ]=======]
@ -793,13 +794,13 @@ local function find_closest_bed (self)
--local spawnable_bed={} --local spawnable_bed={}
--table.insert(spawnable_bed, "mcl_beds:bed_red_bottom") --table.insert(spawnable_bed, "mcl_beds:bed_red_bottom")
--local nn = minetest.find_nodes_in_area(vector.offset(p,-48,-48,-48),vector.offset(p,48,48,48), spawnable_bed) --local nn = minetest.find_nodes_in_area(vector.offset(p,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS),vector.offset(p,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS), spawnable_bed)
--if nn then --if nn then
-- mcl_log("Red beds: " .. #nn) -- mcl_log("Red beds: " .. #nn)
--end --end
local unclaimed_beds = {} local unclaimed_beds = {}
local nn2 = minetest.find_nodes_in_area(vector.offset(p,-48,-48,-48),vector.offset(p,48,48,48), {"group:bed"}) local nn2 = minetest.find_nodes_in_area(vector.offset(p,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS),vector.offset(p,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS), {"group:bed"})
if nn2 then if nn2 then
--mcl_log("All bed parts: " .. #nn2) --mcl_log("All bed parts: " .. #nn2)
@ -878,7 +879,7 @@ local function find_closest_bed (self)
end end
local function find_closest_unclaimed_block (p, requested_block_types) local function find_closest_unclaimed_block (p, requested_block_types)
local nn = minetest.find_nodes_in_area(vector.offset(p,-48,-48,-48),vector.offset(p,48,48,48), requested_block_types) local nn = minetest.find_nodes_in_area(vector.offset(p,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS),vector.offset(p,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS), requested_block_types)
local distance_to_closest_block = nil local distance_to_closest_block = nil
local closest_block = nil local closest_block = nil
@ -1372,7 +1373,7 @@ local function go_to_town_bell(self)
table.insert(looking_for_type, "mcl_bells:bell") table.insert(looking_for_type, "mcl_bells:bell")
local p = self.object:get_pos() local p = self.object:get_pos()
local nn = minetest.find_nodes_in_area(vector.offset(p,-48,-48,-48),vector.offset(p,48,48,48), looking_for_type) local nn = minetest.find_nodes_in_area(vector.offset(p,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS,-VILLAGER_SEARCH_RADIUS),vector.offset(p,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS,VILLAGER_SEARCH_RADIUS), looking_for_type)
--Ideally should check for closest available. It'll make pathing easier. --Ideally should check for closest available. It'll make pathing easier.
for _,n in pairs(nn) do for _,n in pairs(nn) do
@ -2335,7 +2336,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
20, 2,
4, 4,
mobs_mc.water_level+1, mobs_mc.water_level+1,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -38,10 +38,11 @@ mcl_mobs.register_mob("mobs_mc:evoker", {
} }, } },
makes_footstep_sound = true, makes_footstep_sound = true,
damage = 6, damage = 6,
walk_velocity = 0.2, walk_velocity = 1.0,
run_velocity = 1.4, run_velocity = 1.4,
group_attack = true, group_attack = true,
attack_type = "dogfight", attack_type = "dogfight",
attack_frequency = 15,
-- Summon vexes -- Summon vexes
custom_attack = function(self, to_attack) custom_attack = function(self, to_attack)
if not spawned_vexes[self] then spawned_vexes[self] = {} end if not spawned_vexes[self] then spawned_vexes[self] = {} end
@ -64,7 +65,6 @@ mcl_mobs.register_mob("mobs_mc:evoker", {
table.insert(spawned_vexes[self],ent) table.insert(spawned_vexes[self],ent)
end end
end, end,
shoot_interval = 15,
passive = false, passive = false,
drops = { drops = {
{name = "mcl_core:emerald", {name = "mcl_core:emerald",
@ -80,12 +80,17 @@ mcl_mobs.register_mob("mobs_mc:evoker", {
-- TODO: sounds -- TODO: sounds
animation = { animation = {
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_speed = 6, walk_start = 0, walk_end = 40, walk_speed =100,
run_start = 0, run_end = 40, run_speed = 24, run_start = 0, run_end = 40, run_speed = 140,
shoot_start = 142, shoot_end = 152, -- Magic arm swinging shoot_start = 142, shoot_end = 152, -- Magic arm swinging
}, },
view_range = 16, view_range = 16,
fear_height = 4, fear_height = 4,
on_spawn = function(self)
self.timer = 15
return true
end,
}) })
-- spawn eggs -- spawn eggs

View File

@ -49,10 +49,10 @@ mcl_mobs.register_mob("mobs_mc:illusioner", {
stand_speed = 25, stand_speed = 25,
stand_start = 40, stand_start = 40,
stand_end = 59, stand_end = 59,
walk_speed = 25, walk_speed = 100,
walk_start = 0, walk_start = 0,
walk_end = 40, walk_end = 40,
run_speed = 25, run_speed = 200,
shoot_start = 150, shoot_start = 150,
shoot_end = 170, shoot_end = 170,
die_speed = 15, die_speed = 15,

View File

@ -50,7 +50,7 @@ mcl_mobs.register_mob("mobs_mc:vindicator", {
max = 1, max = 1,
looting = "common",}, looting = "common",},
{name = "mcl_tools:axe_iron", {name = "mcl_tools:axe_iron",
chance = 100 / 8.5, chance = 11, --8.5% approximated
min = 1, min = 1,
max = 1, max = 1,
looting = "rare",}, looting = "rare",},
@ -60,10 +60,10 @@ mcl_mobs.register_mob("mobs_mc:vindicator", {
stand_speed = 25, stand_speed = 25,
stand_start = 40, stand_start = 40,
stand_end = 59, stand_end = 59,
walk_speed = 25, walk_speed = 100,
walk_start = 0, walk_start = 0,
walk_end = 40, walk_end = 40,
run_speed = 25, run_speed = 200,
punch_speed = 25, punch_speed = 25,
punch_start = 90, punch_start = 90,
punch_end = 110, punch_end = 110,

View File

@ -225,7 +225,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
4090, 50,
4, 4,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -224,7 +224,7 @@ mcl_mobs:spawn_specific(
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
9000, 80,
7, 7,
mobs_mc.water_level+3, mobs_mc.water_level+3,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -90,8 +90,8 @@ local zombie = {
drops = drops_zombie, drops = drops_zombie,
animation = { animation = {
stand_start = 40, stand_end = 49, stand_speed = 2, stand_start = 40, stand_end = 49, stand_speed = 2,
walk_start = 0, walk_end = 39, speed_normal = 25, walk_start = 0, walk_end = 39, walk_speed = 80,
run_start = 0, run_end = 39, speed_run = 50, run_start = 0, run_end = 39, run_speed = 150,
punch_start = 50, punch_end = 59, punch_speed = 20, punch_start = 50, punch_end = 59, punch_speed = 20,
}, },
ignited_by_sunlight = true, ignited_by_sunlight = true,
@ -118,8 +118,8 @@ baby_zombie.child = 1
baby_zombie.reach = 1 baby_zombie.reach = 1
baby_zombie.animation = { baby_zombie.animation = {
stand_start = 100, stand_end = 109, stand_speed = 2, stand_start = 100, stand_end = 109, stand_speed = 2,
walk_start = 60, walk_end = 99, speed_normal = 40, walk_start = 60, walk_end = 99, walk_speed = 150,
run_start = 60, run_end = 99, speed_run = 80, run_start = 60, run_end = 99, run_speed = 300,
punch_start = 109, punch_end = 119 punch_start = 109, punch_end = 119
} }
@ -243,7 +243,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
6000, 1000,
4, 4,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -332,7 +332,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
60000, 50,
4, 4,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -348,7 +348,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
6500, 2400,
4, 4,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
@ -362,7 +362,7 @@ mcl_mobs:spawn_specific(
0, 0,
7, 7,
30, 30,
65000, 120,
4, 4,
mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)

View File

@ -33,6 +33,15 @@ local bow_load = {}
-- Another player table, this one stores the wield index of the bow being charged -- Another player table, this one stores the wield index of the bow being charged
local bow_index = {} local bow_index = {}
-- define FOV modifier(s)
mcl_fovapi.register_modifier({
name = "bowcomplete",
fov_factor = 0.8,
time = 1,
reset_time = 0.3,
is_multiplier = true,
})
function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable)
local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity")
if power == nil then if power == nil then
@ -183,6 +192,9 @@ end
-- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow -- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow
local function reset_bow_state(player, also_reset_bows) local function reset_bow_state(player, also_reset_bows)
-- clear the FOV change from the player.
mcl_fovapi.remove_modifier(player, "bowcomplete") -- for the complete zoom in FOV Modifier.
bow_load[player:get_player_name()] = nil bow_load[player:get_player_name()] = nil
bow_index[player:get_player_name()] = nil bow_index[player:get_player_name()] = nil
if minetest.get_modpath("playerphysics") then if minetest.get_modpath("playerphysics") then
@ -314,6 +326,9 @@ controls.register_on_hold(function(player, key, time)
end end
bow_load[name] = minetest.get_us_time() bow_load[name] = minetest.get_us_time()
bow_index[name] = player:get_wield_index() bow_index[name] = player:get_wield_index()
-- begin Bow Zoom.
mcl_fovapi.apply_modifier(player, "bowcomplete")
else else
if player:get_wield_index() == bow_index[name] then if player:get_wield_index() == bow_index[name] then
if type(bow_load[name]) == "number" then if type(bow_load[name]) == "number" then

View File

@ -1,6 +1,6 @@
name = mcl_bows name = mcl_bows
author = Arcelmi author = Arcelmi
description = This mod adds bows and arrows for MineClone 2. description = This mod adds bows and arrows for MineClone 2.
depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields, mcl_fovapi
optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button

View File

@ -133,7 +133,11 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
if wielditem then if wielditem then
local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect")
if fire_aspect_level > 0 then if fire_aspect_level > 0 then
mcl_burning.set_on_fire(player, fire_aspect_level * 4) local player_pos = player:get_pos()
local hitter_pos = hitter:get_pos()
if vector.distance(hitter_pos, player_pos) <= 3 then
mcl_burning.set_on_fire(player, fire_aspect_level * 4)
end
end end
end end
end end
@ -276,15 +280,32 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool
if hitter then if hitter then
luaentity = hitter:get_luaentity() luaentity = hitter:get_luaentity()
end end
if hitter and hitter:is_player() then if hitter and hitter:is_player() and distance <= 3 then
local wielditem = hitter:get_wielded_item() local wielditem = hitter:get_wielded_item()
knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback")
-- add vertical lift to knockback
local v = player:get_velocity()
if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then
player:add_velocity({
x = 0,
y = 4.5,
z = 0
})
-- add minimum knockback
if knockback <= 1.5 then
knockback = knockback + 6
end
end
-- add player velocity to knockback -- add player velocity to knockback
local hv = hitter:get_velocity() local hv = hitter:get_velocity()
local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local dir_dot = (hv.x * dir.x) + (hv.z * dir.z)
if dir_dot > 0 then local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z))
knockback = knockback + dir_dot * 2 local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z))
if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then
knockback = knockback + hitter_mag * 0.375
end end
elseif hitter and hitter:is_player() and distance > 3 then
knockback = 0
elseif luaentity and luaentity._knockback then elseif luaentity and luaentity._knockback then
local kb = knockback + luaentity._knockback / 4 local kb = knockback + luaentity._knockback / 4
local punch_dir = dir local punch_dir = dir

View File

@ -17,6 +17,15 @@ minetest.register_craft({
} }
}) })
mcl_fovapi.register_modifier({
name = "spyglass",
fov_factor = 8,
time = 0.1,
reset_time = 0,
is_multiplier = false,
exclusive = true,
})
local spyglass_scope = {} local spyglass_scope = {}
local function add_scope(player) local function add_scope(player)
@ -37,7 +46,8 @@ local function remove_scope(player)
player:hud_remove(spyglass_scope[player]) player:hud_remove(spyglass_scope[player])
spyglass_scope[player] = nil spyglass_scope[player] = nil
player:hud_set_flags({wielditem = true}) player:hud_set_flags({wielditem = true})
player:set_fov(86.1) mcl_fovapi.remove_modifier(player, "spyglass") -- use the api to remove the FOV effect.
-- old code: player:set_fov(86.1)
end end
end end
@ -55,7 +65,8 @@ controls.register_on_hold(function(player, key, time)
if key ~= "RMB" then return end if key ~= "RMB" then return end
local wielditem = player:get_wielded_item() local wielditem = player:get_wielded_item()
if wielditem:get_name() == "mcl_spyglass:spyglass" then if wielditem:get_name() == "mcl_spyglass:spyglass" then
player:set_fov(8, false, 0.1) mcl_fovapi.apply_modifier(player, "spyglass") -- apply the FOV effect.
-- old code: player:set_fov(8, false, 0.1)
if spyglass_scope[player] == nil then if spyglass_scope[player] == nil then
add_scope(player) add_scope(player)
end end

View File

@ -1,4 +1,4 @@
name = mcl_spyglass name = mcl_spyglass
author = NO11 author = NO11
description = This mod adds a spyglass, which is an item that can be used for zooming in on specific locations. description = This mod adds a spyglass, which is an item that can be used for zooming in on specific locations.
depends = mcl_core, controls depends = mcl_core, controls, mcl_fovapi

View File

@ -83,7 +83,7 @@ if mg_name ~= "singlenode" then
if maxp.y < 0 then return end if maxp.y < 0 then return end
-- randomly try to build settlements -- randomly try to build settlements
if blockseed % 77 ~= 17 then return end if blockseed % 31 ~= 17 then return end
--minetest.log("Rng good. Generate attempt") --minetest.log("Rng good. Generate attempt")
-- needed for manual and automated settlement building -- needed for manual and automated settlement building

View File

@ -0,0 +1,46 @@
minetest.register_on_mods_loaded(function()
for name in pairs(minetest.registered_items) do
if name:find("bow") then
minetest.override_item(name, {
touch_controls = {
pointed_nothing = "short_dig_long_place",
pointed_node = "short_dig_long_place",
pointed_object = "short_dig_long_place",
},
})
end
end
for name in pairs(minetest.registered_items) do
if name:find("spyglass") then
minetest.override_item(name, {
touch_controls = {
pointed_nothing = "short_dig_long_place",
pointed_node = "short_dig_long_place",
pointed_object = "short_dig_long_place",
},
})
end
end
for name in pairs(minetest.registered_items) do
if name:find("rocket") then
minetest.override_item(name, {
touch_controls = {
pointed_nothing = "short_dig_long_place",
pointed_node = "short_dig_long_place",
pointed_object = "short_dig_long_place",
},
})
end
end
for name in pairs(minetest.registered_items) do
if name:find("hamburger") then
minetest.override_item(name, {
touch_controls = {
pointed_nothing = "short_dig_long_place",
pointed_node = "short_dig_long_place",
pointed_object = "short_dig_long_place",
},
})
end
end
end)

View File

@ -0,0 +1,82 @@
### FOV API
<!-- TOC -->
* [FOV API](#fov-api)
* [Description](#description)
* [Troubleshooting](#troubleshooting)
* [Modifier Definition](#modifier-definition-)
* [Global MCL_FOVAPI Tables](#global-mclfovapi-tables)
* [Namespaces](#namespaces)
* [Functions](#functions)
<!-- TOC -->
#### Description
This API defines and applies different Field Of View effects to players via MODIFIERS.
#### Troubleshooting
In the `init.lua` file for this module, there is a `DEBUG` variable at the top that will turn on logging.
Use it to see what is going on.
#### Modifier Definition
```lua
def = {
name = name,
fov_factor = fov_factor,
time = time,
reset_time = reset_time,
is_multiplier = is_multiplier,
exclusive = exclusive,
on_start = on_start,
on_end = on_end,
}
```
* Name: The name of the Modifier, used to identify the specific modifier. Case sensitive.
* FOV Factor: A float value defining the FOV to apply. Can be an absolute or percentage, depending on Exclusive and
Is_Multiplier.
* Time: A float value defining the number of seconds to take when applying the FOV Factor.
Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.)
* Reset Time: A float value defining the number of seconds to take when removing the FOV Factor.
Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Reset transition time.)
Defaults to `time` if not defined.
* Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage
of the current FOV. Defaults to `true` if not defined.
* Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this
is how the spy glass sets the FOV to be a specific value regardless of any other FOV effects applied. Defaults to
`false` if not defined.
* On Start: the `on_start` is a callback function `on_start(player)` that is called if defined. The parameter `player`
is a ref to the player that had the modifier applied. Called from `mcl_fovapi.apply_modifier` immediately after
the FOV Modifier has been applied.
* On End: the `on_end` is a callback function `on_end(player)` that is called if defined. The parameter `player`
is a ref to the player that had the modifier applied. Called from `mcl_fovapi.remove_modifier` immediately after
the FOV Modifier has been removed.
Note: passing incorrect values in the definition will have unintended consequences.
#### Global MCL_FOVAPI Tables
There are three tables that are accessible via the API. They are `registered_modifiers` and `applied_modifiers`.
`mcl_fovapi.registered_modifiers` has the definitions of all the registered FOV Modifiers. Indexed by Modifier Name.
And, `mcl_fovapi.applied_modifiers` is indexed by the Player Name. It contains the names of all the modifiers applied to the
player.
#### Namespaces
`mcl_fovapi` is the default API Namespace.
#### Functions
`mcl_fovapi.register_modifier(def)`
Used to register a new FOV Modifier for use. Must be called before applying said modifier to a player.
See Modifier Definition for what the parameters are.
`mcl_fovapi.apply_modifier(player, modifier_name)`
Used to apply a registered FOV modifier to a player. Takes a reference to the player and the modifier's name (string).
`mcl_fovapi.remove_modifier(player, modifier_name)`
Used to remove a specific FOV modifier from a Player. Takes a reference to the player and the modifier's name (string).
Removed immediately.
`mcl_fovapi.remove_all_modifiers(player)`
Used to remove all FOV modifiers from a Player. Takes a reference to the Player. FOV change is instantaneous.

View File

@ -0,0 +1,232 @@
---
--- Copyright 2023, Michieal.
--- License: GPL3. (Default Mineclone2 License)
--- Created by michieal.
--- DateTime: 12/2/23 5:47 AM
---
-- Locals (and cached)
local DEBUG = false -- debug constant for troubleshooting.
local pairs = pairs
-- Globals
mcl_fovapi = {}
mcl_fovapi.registered_modifiers = {}
mcl_fovapi.applied_modifiers = {}
minetest.register_on_joinplayer(function(player)
local player_name = player:get_player_name()
-- initialization
mcl_fovapi.applied_modifiers[player_name] = {}
end)
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
-- handle clean up
mcl_fovapi.applied_modifiers[player_name] = nil
end)
function mcl_fovapi.register_modifier(def)
if type(def.name) ~= "string" then
error("Modifier name must be a string")
end
if type(def.fov_factor) ~= "number" then
error("FOV factor must be a number")
end
if type(def.time) ~= "number" then
error("Transition time must be a number")
end
if def.reset_time ~= nil and type(def.reset_time) ~= "number" then
error("Reset time, if provided, must be a number")
end
if def.on_start ~= nil and type(def.on_start) ~= "function" then
error("Callback on_start must be a function")
end
if def.on_end ~= nil and type(def.on_end) ~= "function" then
error("Callback on_end must be a function")
end
local mdef = {}
mdef.fov_factor = def.fov_factor
mdef.time = def.time
mdef.reset_time = def.reset_time or def.time
if def.is_multiplier == false then mdef.is_multiplier = false
else mdef.is_multiplier = true end
if def.exclusive == true then mdef.exclusive = true
else mdef.exclusive = false end
mdef.on_start = def.on_start
mdef.on_end = def.on_end
if DEBUG then
minetest.log("FOV::Modifier Definition Registered:\n" .. dump(def))
end
mcl_fovapi.registered_modifiers[def.name] = mdef
end
minetest.register_on_respawnplayer(function(player)
mcl_fovapi.remove_all_modifiers(player)
end)
function mcl_fovapi.apply_modifier(player, modifier_name)
if not player or not modifier_name then
return
end
if mcl_fovapi.registered_modifiers[modifier_name] == nil then
return
end
local player_name = player:get_player_name()
if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player_name] and mcl_fovapi.applied_modifiers[player_name][modifier_name] then
return
end
for k, _ in pairs(mcl_fovapi.applied_modifiers[player_name]) do
if mcl_fovapi.registered_modifiers[k].exclusive == true then return end
end
local modifier = mcl_fovapi.registered_modifiers[modifier_name]
if modifier.on_start then
modifier.on_start(player)
end
mcl_fovapi.applied_modifiers[player_name][modifier_name] = true -- set the applied to be true.
if DEBUG then
minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player_name]))
end
if DEBUG then
minetest.log("FOV::Modifier applied to player:" .. player_name .. " modifier: " .. modifier_name)
end
-- modifier apply code.
if modifier.exclusive == true then
-- if exclusive, reset the player's fov, and apply the new fov.
if modifier.is_multiplier then
player:set_fov(0, false, 0)
end
player:set_fov(modifier.fov_factor, modifier.is_multiplier, modifier.time)
else
-- not exclusive? let's apply it in the mix.
local fov_factor, is_mult = player:get_fov()
if fov_factor == 0 then
fov_factor = 1
is_mult = true
end
if modifier.is_multiplier or is_mult then
fov_factor = fov_factor * modifier.fov_factor
else
fov_factor = (fov_factor + modifier.fov_factor) / 2
end
if modifier.is_multiplier and is_mult then
player:set_fov(fov_factor, true, modifier.time)
else
player:set_fov(fov_factor, false, modifier.time)
end
end
end
function mcl_fovapi.remove_modifier(player, modifier_name)
if not player or not modifier_name then
return
end
local player_name = player:get_player_name()
if not mcl_fovapi.applied_modifiers[player_name]
or not mcl_fovapi.applied_modifiers[player_name][modifier_name] then
return
end
if DEBUG then
minetest.log("FOV::Player: " .. player_name .. " modifier: " .. modifier_name .. "removed.")
end
mcl_fovapi.applied_modifiers[player_name][modifier_name] = nil
local modifier = mcl_fovapi.registered_modifiers[modifier_name]
-- check for other fov modifiers, and set them up, or reset to default.
local applied = {}
for k, _ in pairs(mcl_fovapi.applied_modifiers[player_name]) do
applied[k] = mcl_fovapi.registered_modifiers[k]
end
local elem = next
if elem(applied) == nil then
player:set_fov(0, false, modifier.reset_time)
return
end
local exc = false
for k, _ in pairs(applied) do
if applied[k].exclusive == true then
exc = applied[k]
break
end
end
-- handle exclusives.
if exc ~= false then
player:set_fov(exc.fov_factor, exc.is_multiplier, 0) -- we want this to be immediate.
else
-- handle normal fov modifiers.
local fov_factor = 1
local non_multiplier_added = false
for _, x in pairs(applied) do
if not x.is_multiplier then
if non_multiplier_added then
fov_factor = (fov_factor + x.fov_factor) / 2
else
non_multiplier_added = true
fov_factor = fov_factor * x.fov_factor
end
else
fov_factor = fov_factor * x.fov_factor
end
end
player:set_fov(fov_factor, not non_multiplier_added, modifier.reset_time)
end
if mcl_fovapi.registered_modifiers[modifier_name].on_end then
mcl_fovapi.registered_modifiers[modifier_name].on_end(player)
end
end
function mcl_fovapi.remove_all_modifiers(player)
if not player then
return
end
local player_name = player:get_player_name()
if DEBUG then
minetest.log("FOV::Player: " .. player_name .. " modifiers have been reset.")
end
for name, x in pairs(mcl_fovapi.applied_modifiers[player_name]) do
x = nil
if mcl_fovapi.registered_modifiers[name].on_end then
mcl_fovapi.registered_modifiers[name].on_end(player)
end
end
player:set_fov(0, false, 0)
end
--[[
Notes:
set_fov(fov, is_multiplier, transition_time): Sets player's FOV
fov: FOV value.
is_multiplier: Set to true if the FOV value is a multiplier. Defaults to false.
transition_time: If defined, enables smooth FOV transition. Interpreted as the time (in seconds) to reach target FOV.
If set to 0, FOV change is instantaneous. Defaults to 0.
Set fov to 0 to clear FOV override.
--]]

View File

@ -0,0 +1,4 @@
name = mcl_fovapi
author = Michieal, Herowl
description = An API for handling FOV changes.
depends = mcl_player

View File

@ -177,7 +177,7 @@ minetest.register_on_joinplayer(function(player)
player_textures[name] = { "character.png", "blank.png", "blank.png" } player_textures[name] = { "character.png", "blank.png", "blank.png" }
--player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
player:set_fov(86.1) -- see <https://minecraft.gamepedia.com/Options#Video_settings>>>> -- player:set_fov(86.1) -- see <https://minecraft.gamepedia.com/Options#Video_settings>>>>
end) end)
minetest.register_on_leaveplayer(function(player) minetest.register_on_leaveplayer(function(player)

View File

@ -663,6 +663,8 @@ minetest.register_on_joinplayer(function(player)
lastPos = nil, lastPos = nil,
swimDistance = 0, swimDistance = 0,
jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly
last_damage = 0,
invul_timestamp = 0,
} }
mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0}
@ -727,19 +729,35 @@ mcl_damage.register_modifier(function(obj, damage, reason)
end end
end, -200) end, -200)
-- damage invulnerability minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
mcl_damage.register_modifier(function(obj, damage, reason) -- attack reach limit
local invul = obj:get_meta():get_int("mcl_damage:invulnerable") if hitter and hitter:is_player() then
if invul > 0 then local player_pos = player:get_pos()
return 0 local hitter_pos = hitter:get_pos()
else if vector.distance(player_pos, hitter_pos) > 3 then
obj:get_meta():set_int("mcl_damage:invulnerable", 1) damage = 0
minetest.after(0.5, function() return damage
obj:get_meta():set_int("mcl_damage:invulnerable", 0) end
end)
return damage
end end
end, -1000) -- damage invulnerability
if hitter then
local name = player:get_player_name()
local time_now = minetest.get_us_time()
local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp
local time_diff = time_now - invul_timestamp
-- check for invulnerability time in microseconds (0.5 second)
if time_diff <= 500000 and time_diff >= 0 then
damage = damage - mcl_playerplus_internal[name].last_damage
if damage < 0 then
damage = 0
end
return damage
else
mcl_playerplus_internal[name].last_damage = damage
mcl_playerplus_internal[name].invul_timestamp = time_now
end
end
end)
minetest.register_on_respawnplayer(function(player) minetest.register_on_respawnplayer(function(player)
local pos = player:get_pos() local pos = player:get_pos()

View File

@ -64,40 +64,24 @@ local function cancelClientSprinting(name)
players[name].clientSprint = false players[name].clientSprint = false
end end
mcl_fovapi.register_modifier({
name = "sprint",
fov_factor = 1.1,
time = 0.15,
is_multiplier = true,
})
local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting)
if not sprinting and not mcl_sprint.is_sprinting(playerName) then return end if not sprinting and not mcl_sprint.is_sprinting(playerName) then return end
local player = minetest.get_player_by_name(playerName) local player = minetest.get_player_by_name(playerName)
local controls = player:get_player_control()
if players[playerName] then if players[playerName] then
players[playerName].sprinting = sprinting players[playerName].sprinting = sprinting
local fov_old = players[playerName].fov if sprinting then
local fov_new = fov_old playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED)
local fade_time = .15 mcl_fovapi.apply_modifier(player, "sprint")
if sprinting == true else
or controls.RMB playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint")
and string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") mcl_fovapi.remove_modifier(player, "sprint")
and player:get_wielded_item():get_name() ~= "mcl_bows:bow" then
if sprinting == true then
fov_new = math.min(players[playerName].fov + 0.05, 1.2)
else
fov_new = .7
players[playerName].fade_time = .3
end
if sprinting == true then
playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED)
end
elseif sprinting == false
and player:get_wielded_item():get_name() ~= "mcl_bows:bow_0"
and player:get_wielded_item():get_name() ~= "mcl_bows:bow_1"
and player:get_wielded_item():get_name() ~= "mcl_bows:bow_2" then
fov_new = math.max(players[playerName].fov - 0.05, 1.0)
if sprinting == false then
playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint")
end
end
if fov_new ~= fov_old then
players[playerName].fov = fov_new
player:set_fov(fov_new, true, fade_time)
end end
return true return true
end end

View File

@ -1,4 +1,5 @@
name = mcl_sprint name = mcl_sprint
author = GunshipPenguin author = GunshipPenguin
description = Allows the player to sprint by pressing the “Use” key (default: E). description = Allows the player to sprint by pressing the “AUX” key (default: E).
depends = mcl_playerinfo, playerphysics, mcl_hunger depends = mcl_playerinfo, playerphysics, mcl_hunger, mcl_fovapi
optional = mcl_bows

View File

@ -214,6 +214,10 @@ mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns
mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14 mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14
mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14 mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14
# How far should villagers search for jobs, beds and bell
# Larger values will have a larger performance impact (default:20)
mcl_mobs_villager_search_radius (Villager job/bed/bell search radius) int 20 0 256
[Audio] [Audio]
# Enable flame sound. # Enable flame sound.
flame_sound (Flame sound) bool true flame_sound (Flame sound) bool true