--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", hostile = true, neutral = false, 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", --hssssssssssss explosion_strength = 12, explosion_radius = 6, explosion_damage_radius = 8, explosiontimer_reset_radius = 6, reach = 3, 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 ~= 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) 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", { 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", --BOOM textures = { {"mobs_mc_creeper.png", "mobs_mc_creeper_charge.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", explosion_strength = 24, explosion_radius = 12, explosion_damage_radius = 18, explosiontimer_reset_radius = 10, reach = 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 ~= 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) 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)