mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-08-31 13:58:12 +02:00
5.2 is actually half of the estimated MC creeper defuse range, which is 10.4. The reason for this change is to balance the creeper in MCL2 where it fuses whilst moving making it more difficult than MC. In MC, the creeper does not move while fusing.
435 lines
11 KiB
Lua
435 lines
11 KiB
Lua
--License for code WTFPL and otherwise stated in readmes
|
|
|
|
local S = minetest.get_translator(minetest.get_current_modname())
|
|
|
|
--###################
|
|
--################### CREEPER
|
|
--###################
|
|
|
|
|
|
|
|
|
|
mobs:register_mob("mobs_mc:creeper", {
|
|
type = "monster",
|
|
spawn_class = "hostile",
|
|
hostile = true,
|
|
rotate = 270,
|
|
hp_min = 20,
|
|
hp_max = 20,
|
|
xp_min = 5,
|
|
xp_max = 5,
|
|
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3},
|
|
pathfinding = 1,
|
|
visual = "mesh",
|
|
mesh = "mobs_mc_creeper.b3d",
|
|
textures = {
|
|
{"mobs_mc_creeper.png",
|
|
"mobs_mc_empty.png"},
|
|
},
|
|
visual_size = {x=3, y=3},
|
|
sounds = {
|
|
attack = "tnt_ignite",
|
|
death = "mobs_mc_creeper_death",
|
|
damage = "mobs_mc_creeper_hurt",
|
|
fuse = "tnt_ignite",
|
|
explode = "tnt_explode",
|
|
distance = 16,
|
|
},
|
|
makes_footstep_sound = false,
|
|
walk_velocity = 1.05,
|
|
run_velocity = 2.1,
|
|
runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" },
|
|
attack_type = "explode",
|
|
eye_height = 1.25,
|
|
--hssssssssssss
|
|
|
|
explosion_strength = 3,
|
|
--explosion_radius = 3,
|
|
--explosion_damage_radius = 6,
|
|
--explosiontimer_reset_radius = 6,
|
|
reach = 3,
|
|
defuse_reach = 5.2,
|
|
explosion_timer = 0.3,
|
|
allow_fuse_reset = true,
|
|
stop_to_explode = true,
|
|
|
|
--head code
|
|
has_head = true,
|
|
head_bone = "head",
|
|
|
|
swap_y_with_x = true,
|
|
reverse_head_yaw = true,
|
|
|
|
head_bone_pos_y = 2.4,
|
|
head_bone_pos_z = 0,
|
|
|
|
head_height_offset = 1.1,
|
|
head_direction_offset = 0,
|
|
head_pitch_modifier = 0,
|
|
--end head code
|
|
|
|
-- Force-ignite creeper with flint and steel and explode after 1.5 seconds.
|
|
-- TODO: Make creeper flash after doing this as well.
|
|
-- TODO: Test and debug this code.
|
|
on_rightclick = function(self, clicker)
|
|
if self._forced_explosion_countdown_timer then
|
|
return
|
|
end
|
|
local item = clicker:get_wielded_item()
|
|
if item:get_name() == mobs_mc.items.flint_and_steel then
|
|
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
|
-- Wear tool
|
|
local wdef = item:get_definition()
|
|
item:add_wear(1000)
|
|
-- Tool break sound
|
|
if item:get_count() == 0 and wdef.sound and wdef.sound.breaks then
|
|
minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}, true)
|
|
end
|
|
clicker:set_wielded_item(item)
|
|
end
|
|
self._forced_explosion_countdown_timer = self.explosion_timer
|
|
minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}, true)
|
|
end
|
|
end,
|
|
do_custom = function(self, dtime)
|
|
if self._forced_explosion_countdown_timer then
|
|
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
|
|
if self._forced_explosion_countdown_timer <= 0 then
|
|
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
|
|
mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object)
|
|
end
|
|
end
|
|
end,
|
|
on_die = function(self, pos, cmi_cause)
|
|
-- Drop a random music disc when killed by skeleton or stray
|
|
if cmi_cause and cmi_cause.type == "punch" then
|
|
local luaentity = cmi_cause.puncher and cmi_cause.puncher:get_luaentity()
|
|
if luaentity and luaentity.name:find("arrow") then
|
|
local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity()
|
|
if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then
|
|
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)])
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
maxdrops = 2,
|
|
drops = {
|
|
{name = mobs_mc.items.gunpowder,
|
|
chance = 1,
|
|
min = 0,
|
|
max = 2,
|
|
looting = "common",},
|
|
|
|
-- Head
|
|
-- TODO: Only drop if killed by charged creeper
|
|
{name = mobs_mc.items.head_creeper,
|
|
chance = 200, -- 0.5%
|
|
min = 1,
|
|
max = 1,},
|
|
},
|
|
animation = {
|
|
speed_normal = 24,
|
|
speed_run = 48,
|
|
stand_start = 0,
|
|
stand_end = 23,
|
|
walk_start = 24,
|
|
walk_end = 49,
|
|
run_start = 24,
|
|
run_end = 49,
|
|
hurt_start = 110,
|
|
hurt_end = 139,
|
|
death_start = 140,
|
|
death_end = 189,
|
|
look_start = 50,
|
|
look_end = 108,
|
|
},
|
|
floats = 1,
|
|
fear_height = 4,
|
|
view_range = 16,
|
|
})
|
|
|
|
mobs:register_mob("mobs_mc:creeper_charged", {
|
|
description = S("Charged Creeper"),
|
|
type = "monster",
|
|
spawn_class = "hostile",
|
|
hostile = true,
|
|
hp_min = 20,
|
|
hp_max = 20,
|
|
xp_min = 5,
|
|
xp_max = 5,
|
|
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.69, 0.3},
|
|
pathfinding = 1,
|
|
visual = "mesh",
|
|
mesh = "mobs_mc_creeper.b3d",
|
|
|
|
--BOOM
|
|
|
|
textures = {
|
|
{"mobs_mc_creeper.png",
|
|
"mobs_mc_creeper_charge.png"},
|
|
},
|
|
visual_size = {x=3, y=3},
|
|
rotate = 270,
|
|
sounds = {
|
|
attack = "tnt_ignite",
|
|
death = "mobs_mc_creeper_death",
|
|
damage = "mobs_mc_creeper_hurt",
|
|
fuse = "tnt_ignite",
|
|
explode = "tnt_explode",
|
|
distance = 16,
|
|
},
|
|
makes_footstep_sound = false,
|
|
walk_velocity = 1.05,
|
|
run_velocity = 2.1,
|
|
runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" },
|
|
attack_type = "explode",
|
|
|
|
explosion_strength = 6,
|
|
--explosion_radius = 3,
|
|
--explosion_damage_radius = 6,
|
|
--explosiontimer_reset_radius = 3,
|
|
reach = 3,
|
|
defuse_reach = 5.2,
|
|
explosion_timer = 0.3,
|
|
allow_fuse_reset = true,
|
|
stop_to_explode = true,
|
|
|
|
-- Force-ignite creeper with flint and steel and explode after 1.5 seconds.
|
|
-- TODO: Make creeper flash after doing this as well.
|
|
-- TODO: Test and debug this code.
|
|
on_rightclick = function(self, clicker)
|
|
if self._forced_explosion_countdown_timer then
|
|
return
|
|
end
|
|
local item = clicker:get_wielded_item()
|
|
if item:get_name() == mobs_mc.items.flint_and_steel then
|
|
if not minetest.is_creative_enabled(clicker:get_player_name()) then
|
|
-- Wear tool
|
|
local wdef = item:get_definition()
|
|
item:add_wear(1000)
|
|
-- Tool break sound
|
|
if item:get_count() == 0 and wdef.sound and wdef.sound.breaks then
|
|
minetest.sound_play(wdef.sound.breaks, {pos = clicker:get_pos(), gain = 0.5}, true)
|
|
end
|
|
clicker:set_wielded_item(item)
|
|
end
|
|
self._forced_explosion_countdown_timer = self.explosion_timer
|
|
minetest.sound_play(self.sounds.attack, {pos = self.object:get_pos(), gain = 1, max_hear_distance = 16}, true)
|
|
end
|
|
end,
|
|
do_custom = function(self, dtime)
|
|
if self._forced_explosion_countdown_timer then
|
|
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
|
|
if self._forced_explosion_countdown_timer <= 0 then
|
|
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
|
|
mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { griefing = mobs_griefing, drop_chance = 1.0}, self.object)
|
|
end
|
|
end
|
|
end,
|
|
on_die = function(self, pos, cmi_cause)
|
|
-- Drop a random music disc when killed by skeleton or stray
|
|
if cmi_cause and cmi_cause.type == "punch" then
|
|
local luaentity = cmi_cause.puncher and cmi_cause.puncher:get_luaentity()
|
|
if luaentity and luaentity.name:find("arrow") then
|
|
local shooter_luaentity = luaentity._shooter and luaentity._shooter:get_luaentity()
|
|
if shooter_luaentity and (shooter_luaentity.name == "mobs_mc:skeleton" or shooter_luaentity.name == "mobs_mc:stray") then
|
|
minetest.add_item({x=pos.x, y=pos.y+1, z=pos.z}, mobs_mc.items.music_discs[math.random(1, #mobs_mc.items.music_discs)])
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
maxdrops = 2,
|
|
drops = {
|
|
{name = mobs_mc.items.gunpowder,
|
|
chance = 1,
|
|
min = 0,
|
|
max = 2,
|
|
looting = "common",},
|
|
|
|
-- Head
|
|
-- TODO: Only drop if killed by charged creeper
|
|
{name = mobs_mc.items.head_creeper,
|
|
chance = 200, -- 0.5%
|
|
min = 1,
|
|
max = 1,},
|
|
},
|
|
animation = {
|
|
speed_normal = 24,
|
|
speed_run = 48,
|
|
stand_start = 0,
|
|
stand_end = 23,
|
|
walk_start = 24,
|
|
walk_end = 49,
|
|
run_start = 24,
|
|
run_end = 49,
|
|
hurt_start = 110,
|
|
hurt_end = 139,
|
|
death_start = 140,
|
|
death_end = 189,
|
|
look_start = 50,
|
|
look_end = 108,
|
|
},
|
|
floats = 1,
|
|
fear_height = 4,
|
|
view_range = 16,
|
|
--Having trouble when fire is placed with lightning
|
|
fire_resistant = true,
|
|
glow = 3,
|
|
})
|
|
|
|
mobs:spawn_specific(
|
|
"mobs_mc:creeper",
|
|
"overworld",
|
|
"ground",
|
|
{
|
|
"Mesa",
|
|
"FlowerForest",
|
|
"Swampland",
|
|
"Taiga",
|
|
"ExtremeHills",
|
|
"Jungle",
|
|
"Savanna",
|
|
"BirchForest",
|
|
"MegaSpruceTaiga",
|
|
"MegaTaiga",
|
|
"ExtremeHills+",
|
|
"Forest",
|
|
"Plains",
|
|
"Desert",
|
|
"ColdTaiga",
|
|
"MushroomIsland",
|
|
"IcePlainsSpikes",
|
|
"SunflowerPlains",
|
|
"IcePlains",
|
|
"RoofedForest",
|
|
"ExtremeHills+_snowtop",
|
|
"MesaPlateauFM_grasstop",
|
|
"JungleEdgeM",
|
|
"ExtremeHillsM",
|
|
"JungleM",
|
|
"BirchForestM",
|
|
"MesaPlateauF",
|
|
"MesaPlateauFM",
|
|
"MesaPlateauF_grasstop",
|
|
"MesaBryce",
|
|
"JungleEdge",
|
|
"SavannaM",
|
|
"FlowerForest_beach",
|
|
"Forest_beach",
|
|
"StoneBeach",
|
|
"ColdTaiga_beach_water",
|
|
"Taiga_beach",
|
|
"Savanna_beach",
|
|
"Plains_beach",
|
|
"ExtremeHills_beach",
|
|
"ColdTaiga_beach",
|
|
"Swampland_shore",
|
|
"MushroomIslandShore",
|
|
"JungleM_shore",
|
|
"Jungle_shore",
|
|
"MesaPlateauFM_sandlevel",
|
|
"MesaPlateauF_sandlevel",
|
|
"MesaBryce_sandlevel",
|
|
"Mesa_sandlevel",
|
|
"RoofedForest_ocean",
|
|
"JungleEdgeM_ocean",
|
|
"BirchForestM_ocean",
|
|
"BirchForest_ocean",
|
|
"IcePlains_deep_ocean",
|
|
"Jungle_deep_ocean",
|
|
"Savanna_ocean",
|
|
"MesaPlateauF_ocean",
|
|
"ExtremeHillsM_deep_ocean",
|
|
"Savanna_deep_ocean",
|
|
"SunflowerPlains_ocean",
|
|
"Swampland_deep_ocean",
|
|
"Swampland_ocean",
|
|
"MegaSpruceTaiga_deep_ocean",
|
|
"ExtremeHillsM_ocean",
|
|
"JungleEdgeM_deep_ocean",
|
|
"SunflowerPlains_deep_ocean",
|
|
"BirchForest_deep_ocean",
|
|
"IcePlainsSpikes_ocean",
|
|
"Mesa_ocean",
|
|
"StoneBeach_ocean",
|
|
"Plains_deep_ocean",
|
|
"JungleEdge_deep_ocean",
|
|
"SavannaM_deep_ocean",
|
|
"Desert_deep_ocean",
|
|
"Mesa_deep_ocean",
|
|
"ColdTaiga_deep_ocean",
|
|
"Plains_ocean",
|
|
"MesaPlateauFM_ocean",
|
|
"Forest_deep_ocean",
|
|
"JungleM_deep_ocean",
|
|
"FlowerForest_deep_ocean",
|
|
"MushroomIsland_ocean",
|
|
"MegaTaiga_ocean",
|
|
"StoneBeach_deep_ocean",
|
|
"IcePlainsSpikes_deep_ocean",
|
|
"ColdTaiga_ocean",
|
|
"SavannaM_ocean",
|
|
"MesaPlateauF_deep_ocean",
|
|
"MesaBryce_deep_ocean",
|
|
"ExtremeHills+_deep_ocean",
|
|
"ExtremeHills_ocean",
|
|
"MushroomIsland_deep_ocean",
|
|
"Forest_ocean",
|
|
"MegaTaiga_deep_ocean",
|
|
"JungleEdge_ocean",
|
|
"MesaBryce_ocean",
|
|
"MegaSpruceTaiga_ocean",
|
|
"ExtremeHills+_ocean",
|
|
"Jungle_ocean",
|
|
"RoofedForest_deep_ocean",
|
|
"IcePlains_ocean",
|
|
"FlowerForest_ocean",
|
|
"ExtremeHills_deep_ocean",
|
|
"MesaPlateauFM_deep_ocean",
|
|
"Desert_ocean",
|
|
"Taiga_ocean",
|
|
"BirchForestM_deep_ocean",
|
|
"Taiga_deep_ocean",
|
|
"JungleM_ocean",
|
|
"FlowerForest_underground",
|
|
"JungleEdge_underground",
|
|
"StoneBeach_underground",
|
|
"MesaBryce_underground",
|
|
"Mesa_underground",
|
|
"RoofedForest_underground",
|
|
"Jungle_underground",
|
|
"Swampland_underground",
|
|
"MushroomIsland_underground",
|
|
"BirchForest_underground",
|
|
"Plains_underground",
|
|
"MesaPlateauF_underground",
|
|
"ExtremeHills_underground",
|
|
"MegaSpruceTaiga_underground",
|
|
"BirchForestM_underground",
|
|
"SavannaM_underground",
|
|
"MesaPlateauFM_underground",
|
|
"Desert_underground",
|
|
"Savanna_underground",
|
|
"Forest_underground",
|
|
"SunflowerPlains_underground",
|
|
"ColdTaiga_underground",
|
|
"IcePlains_underground",
|
|
"IcePlainsSpikes_underground",
|
|
"MegaTaiga_underground",
|
|
"Taiga_underground",
|
|
"ExtremeHills+_underground",
|
|
"JungleM_underground",
|
|
"ExtremeHillsM_underground",
|
|
"JungleEdgeM_underground",
|
|
},
|
|
0,
|
|
7,
|
|
20,
|
|
16500,
|
|
2,
|
|
mobs_mc.spawn_height.overworld_min,
|
|
mobs_mc.spawn_height.overworld_max)
|
|
|
|
-- spawn eggs
|
|
mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0)
|