diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua new file mode 100644 index 0000000..f8199f2 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -0,0 +1,410 @@ +--License for code WTFPL and otherwise stated in readmes + +local S = minetest.get_translator("mobs_mc") + +--################### +--################### CREEPER +--################### + + + + +mcl_mobs:register_mob("mobs_mc:creeper", { + type = "monster", + spawn_class = "hostile", + spawn_in_group = 1, + 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", + head_swivel = "Head_Control", + bone_eye_height = 2.35, + curiosity = 2, + 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 = true, + walk_velocity = 1.05, + run_velocity = 2.1, + runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, + attack_type = "explode", + + --hssssssssssss + + explosion_strength = 3, + explosion_radius = 3.5, + explosion_damage_radius = 3.5, + explosiontimer_reset_radius = 6, + reach = 3, + explosion_timer = 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() == "mcl_fire: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 + mcl_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}, "mcl_jukebox:record_" .. math.random(9)) + end + end + end + end, + maxdrops = 2, + drops = { + {name = "mcl_mobitems:gunpowder", + chance = 1, + min = 0, + max = 2, + looting = "common",}, + + -- Head + -- TODO: Only drop if killed by charged creeper + {name = "mcl_heads: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, +}) + +mcl_mobs:register_mob("mobs_mc:creeper_charged", { + description = S("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", + + --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 = true, + walk_velocity = 1.05, + run_velocity = 2.1, + runaway_from = { "mobs_mc:ocelot", "mobs_mc:cat" }, + attack_type = "explode", + + explosion_strength = 6, + explosion_radius = 8, + explosion_damage_radius = 8, + explosiontimer_reset_radius = 6, + reach = 3, + 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() == "mcl_fire: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 + mcl_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}, "mcl_jukebox:record_" .. math.random(9)) + end + end + end + end, + maxdrops = 2, + drops = { + {name = "mcl_mobitems:gunpowder", + chance = 1, + min = 0, + max = 2, + looting = "common",}, + + -- Head + -- TODO: Only drop if killed by charged creeper + {name = "mcl_heads: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, +}) + +mcl_mobs:spawn_specific( +"mobs_mc:creeper", +"overworld", +"ground", +{ +"Mesa", +"FlowerForest", +"Swampland", +"Taiga", +"ExtremeHills", +"Jungle", +"Savanna", +"BirchForest", +"MegaSpruceTaiga", +"MegaTaiga", +"ExtremeHills+", +"Forest", +"Plains", +"Desert", +"ColdTaiga", +"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", +"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", +"MegaTaiga_ocean", +"StoneBeach_deep_ocean", +"IcePlainsSpikes_deep_ocean", +"ColdTaiga_ocean", +"SavannaM_ocean", +"MesaPlateauF_deep_ocean", +"MesaBryce_deep_ocean", +"ExtremeHills+_deep_ocean", +"ExtremeHills_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", +"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, +mcl_vars.mg_overworld_min, +mcl_vars.mg_overworld_max) + +-- spawn eggs +mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "#0da70a", "#000000", 0) diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg new file mode 100644 index 0000000..01f7afa Binary files /dev/null and b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_creeper_hurt.ogg differ