174a3a2968
The solution was to move the creeper explosions to originate from the center of the creepers collisionbox and not its entity position.
131 lines
3.7 KiB
Lua
131 lines
3.7 KiB
Lua
--License for code WTFPL and otherwise stated in readmes
|
|
|
|
local S = minetest.get_translator("mobs_mc")
|
|
|
|
--###################
|
|
--################### CREEPER
|
|
--###################
|
|
|
|
|
|
|
|
|
|
mobs:register_mob("mobs_mc:creeper", {
|
|
type = "monster",
|
|
spawn_class = "hostile",
|
|
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"},
|
|
},
|
|
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 = true,
|
|
walk_velocity = 1.05,
|
|
run_velocity = 2.1,
|
|
runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" },
|
|
attack_type = "explode",
|
|
|
|
explosion_strength = 3,
|
|
reach = 4,
|
|
explosion_timer = 1.5,
|
|
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 ~= nil 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 ~= nil then
|
|
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
|
|
if self._forced_explosion_countdown_timer <= 0 then
|
|
mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength)
|
|
self.object:remove()
|
|
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:spawn_specific("mobs_mc:creeper", mobs_mc.spawn.solid, {"air"}, 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)
|