diff --git a/mods/ENTITIES/mobs_mc/init.lua b/mods/ENTITIES/mobs_mc/init.lua index eb8021d96..395816221 100644 --- a/mods/ENTITIES/mobs_mc/init.lua +++ b/mods/ENTITIES/mobs_mc/init.lua @@ -155,4 +155,6 @@ dofile(path .. "/glow_squid.lua") dofile(path .. "/piglin.lua") dofile(path .. "/hoglin+zoglin.lua") dofile(path .. "/turtle.lua") + dofile(path .. "/bee.lua") +dofile(path .. "/strider.lua") diff --git a/mods/ENTITIES/mobs_mc/models/extra_mobs_strider.b3d b/mods/ENTITIES/mobs_mc/models/extra_mobs_strider.b3d new file mode 100644 index 000000000..72f4e254e Binary files /dev/null and b/mods/ENTITIES/mobs_mc/models/extra_mobs_strider.b3d differ diff --git a/mods/ENTITIES/mobs_mc/strider.lua b/mods/ENTITIES/mobs_mc/strider.lua new file mode 100644 index 000000000..a38955370 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/strider.lua @@ -0,0 +1,248 @@ +--MCmobs v0.4 +--maikerumine +--made for MC like Survival game +--License for code WTFPL and otherwise stated in readmes + +local S = minetest.get_translator("mobs_mc") + +--################### +--################### STRIDER +--################### + + +local strider = { + type = "animal", + passive = true, + spawn_class = "passive", + hp_min = 20, + hp_max = 20, + xp_min = 9, + xp_max = 9, + armor = {fleshy = 90}, + attack_type = "dogfight", + damage = 2, + reach = 2, + collisionbox = {-.6, -0.01, -.6, .6, 1.94, .6}, + visual = "mesh", + mesh = "extra_mobs_strider.b3d", + textures = { { + "extra_mobs_strider.png", + } }, + visual_size = {x=3, y=3}, + sounds = { + }, + jump = true, + makes_footstep_sound = true, + walk_velocity = 2, + run_velocity = 4, + runaway = true, + drops = { + {name = "mcl_mobsitems:string", + chance = 1, + min = 2, + max = 5,}, + }, + animation = { + stand_speed = 15, + walk_speed = 15, + run_speed = 30, + stand_start = 5, + stand_end = 5, + walk_start = 1, + walk_end = 20, + }, + lava_damage = 0, + fire_damage = 0, + light_damage = 0, + water_damage = 5, + fear_height = 4, + view_range = 16, + fire_resistant = true, + floats_on_lava = 1, + floats = 0, + do_custom = function(self, dtime) + + if minetest.find_node_near(self.object:get_pos(), 2, "mcl_core:lava_source") ~= nil or minetest.find_node_near(self.object:get_pos(), 2, "mcl_core:lava_flowing") ~= nil or minetest.find_node_near(self.object:get_pos(), 2, "mcl_nether:nether_lava_source") ~= nil or minetest.find_node_near(self.object:get_pos(), 2, "mcl_nether:nether_lava_flowing") ~= nil then + self.walk_velocity = 2 + self.run_velocity = 4 + self.base_texture[1] = "extra_mobs_strider.png" + self.shaking = false + else + self.base_texture[1] = "extra_mobs_strider_cold.png" + self.walk_velocity = .5 + self.run_velocity = 1 + self.shaking = true + end + + self.object:set_properties({textures=self.base_texture, shaking=self.shaking, run_velocity=self.run_velocity, walk_velocity=self.walk_velocity}) + + -- set needed values if not already present + if not self.v2 then + self.v2 = 0 + self.max_speed_forward = 8 + self.max_speed_reverse = 4 + self.accel = 2 + self.terrain_type = 3 + self.driver_attach_at = {x = 0, y = 5.5, z = -1.75} + self.driver_eye_offset = {x = 0, y = 10, z = 0} + self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} + end + + -- if driver present allow control of horse + if self.driver then + + mobs.drive(self, "walk", "stand", false, dtime) + + return false -- skip rest of mob functions + end + + return true + end, + + on_die = function(self, pos) + + -- drop saddle when horse is killed while riding + -- also detach from horse properly + if self.driver then + mobs.detach(self.driver, {x = 1, y = 0, z = 1}) + end + end, + + on_rightclick = function(self, clicker) + if not clicker or not clicker:is_player() then + return + end + + local wielditem = clicker:get_wielded_item() + + local controlitem = "" + if minetest.get_modpath("mcl_mobitems") then + controlitem = "mcl_mobitems_warped_fungus_stick:warped_fungus_stick" + else + controlitem = mobs_mc.items.carrot_on_a_stick + end + if wielditem:get_name() ~= controlitem then + if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end + end + + if self.child then + return + end + + local item = clicker:get_wielded_item() + if item:get_name() == "mcl_mobitems:saddle" and self.saddle ~= "yes" then + self.base_texture = { + "extra_mobs_strider.png", + "mobs_mc_pig_saddle.png", -- saddle + } + self.object:set_properties({ + textures = self.base_texture + }) + self.saddle = "yes" + self.tamed = true + self.drops = { + {name = "mcl_mobitems:string", + chance = 1, + min = 1, + max = 3,}, + {name = "mcl_mobitems:saddle", + chance = 1, + min = 1, + max = 1,}, + } + if not minetest.is_creative_enabled(clicker:get_player_name()) then + local inv = clicker:get_inventory() + local stack = inv:get_stack("main", clicker:get_wield_index()) + stack:take_item() + inv:set_stack("main", clicker:get_wield_index(), stack) + end + minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=8, pos=self.object:get_pos()}, true) + return + end + + -- Mount or detach player + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then + -- Detach if already attached + mobs.detach(clicker, {x=1, y=0, z=0}) + return + + elseif not self.driver and self.saddle == "yes" and wielditem:get_name() == controlitem then + -- Ride pig if it has a saddle and player uses a carrot on a stick + + mobs.attach(self, clicker) + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + + local inv = self.driver:get_inventory() + -- 26 uses + if wielditem:get_wear() > 63000 then + -- Break carrot on a stick + local def = wielditem:get_definition() + if def.sounds and def.sounds.breaks then + minetest.sound_play(def.sounds.breaks, {pos = clicker:get_pos(), max_hear_distance = 8, gain = 0.5}, true) + end + wielditem = {name = mobs_mc.items.fishing_rod, count = 1} + else + wielditem:add_wear(2521) + end + inv:set_stack("main",self.driver:get_wield_index(), wielditem) + end + return + end + end, +} + +mcl_mobs:register_mob("mobs_mc:strider", strider) + +-- Baby strider. + +local baby_strider = table.copy(strider) +baby_strider.collisionbox = {-.3, -0.01, -.3, .3, 0.94, .3} +baby_strider.xp_min = 13 +baby_strider.xp_max = 13 +baby_strider.visual_size = {x=strider.visual_size.x/2, y=strider.visual_size.y/2} +textures = { { + "extra_mobs_strider.png", + "extra_mobs_trans.png", +} } +baby_strider.walk_velocity = 1.2 +baby_strider.run_velocity = 2.4 +baby_strider.child = 1 + +mcl_mobs:register_mob("mobs_mc:baby_strider", baby_strider) + +-- Regular spawning in the Nether + +mcl_mobs:spawn_setup({ + name = "mobs_mc:strider", + type_of_spawning = "lava", + dimension = "nether", + biomes = { + "Nether" + }, + min_height = mcl_vars.mg_nether_min, + max_height = mcl_vars.mg_nether_max, + chance = 2000, + check_position = function(pos) + return minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name:find("lava") + end +}) + +mcl_mobs:spawn_setup({ + name = "mobs_mc:baby_strider", + type_of_spawning = "lava", + dimension = "nether", + biomes = { + "Nether" + }, + min_height = mcl_vars.mg_nether_min, + max_height = mcl_vars.mg_nether_max, + chance = 100, + check_position = function(pos) + return minetest.get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name:find("lava") + end +}) + +-- spawn eggs +mcl_mobs:register_egg("mobs_mc:strider", S("Strider"), "#000000", "#FF0000", 0) diff --git a/mods/ENTITIES/mobs_mc/textures/extra_mobs_strider.png b/mods/ENTITIES/mobs_mc/textures/extra_mobs_strider.png new file mode 100644 index 000000000..5039afe36 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/extra_mobs_strider.png differ diff --git a/mods/ENTITIES/mobs_mc/textures/extra_mobs_strider_cold.png b/mods/ENTITIES/mobs_mc/textures/extra_mobs_strider_cold.png new file mode 100644 index 000000000..ecf6bbb90 Binary files /dev/null and b/mods/ENTITIES/mobs_mc/textures/extra_mobs_strider_cold.png differ