--MCmobs v0.2 --maikerumine --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes --dofile(minetest.get_modpath("mobs").."/api.lua") ------------------------- --KPGMOBS HORSE ------------------------- --By: KrupnovPavel --Tweaked by: maikerumine local function is_ground(pos) local nn = minetest.get_node(pos).name return minetest.get_item_group(nn, "solid") ~= 0 end local function get_sign(i) if i == 0 then return 0 else return i/math.abs(i) end end local function get_velocity(v, yaw, y) local x = math.cos(yaw)*v local z = math.sin(yaw)*v return {x=x, y=y, z=z} end local function get_v(v) return math.sqrt(v.x^2+v.z^2) end local function merge(a, b) if type(a) == 'table' and type(b) == 'table' then for k,v in pairs(b) do if type(v)=='table' and type(a[k] or false)=='table' then merge(a[k],v) else a[k]=v end end end return a end -- HORSE go go goooo :) local horse = { physical = true, collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, visual = "mesh", stepheight = 1.1, visual_size = {x=1,y=1}, mesh = "mobs_horseh1.x", driver = nil, v = 0, on_rightclick = function(self, clicker) if not clicker or not clicker:is_player() then return end if self.driver and clicker == self.driver then self.driver = nil clicker:set_detach() elseif not self.driver then self.driver = clicker clicker:set_attach(self.object, "", {x=0,y=11,z=0}, {x=0,y=0,z=0}) self.object:setyaw(clicker:get_look_yaw()) end end, on_activate = function(self, staticdata, dtime_s) self.object:set_armor_groups({immortal=1}) print (self.texture, self.jmp) end, on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, direction) if puncher and puncher:is_player() then self.object:remove() end end, on_step = function(self, dtime) self.v = get_v(self.object:getvelocity())*get_sign(self.v) if self.driver then local ctrl = self.driver:get_player_control() if ctrl.up then self.v = self.v + self.jmp end if ctrl.down then self.v = self.v-0.1 end if ctrl.left then self.object:setyaw(self.object:getyaw()+math.pi/120+dtime*math.pi/120) end if ctrl.right then self.object:setyaw(self.object:getyaw()-math.pi/120-dtime*math.pi/120) end if ctrl.jump then local p = self.object:getpos() p.y = p.y-0.5 if is_ground(p) then local pos = self.object:getpos() pos.y = math.floor(pos.y)+4 self.object:setpos(pos) self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), 0)) end end end local s = get_sign(self.v) self.v = self.v - 0.02*s if s ~= get_sign(self.v) then self.object:setvelocity({x=0, y=0, z=0}) self.v = 0 return end if math.abs(self.v) > 4.5 then self.v = 4.5*get_sign(self.v) end local p = self.object:getpos() p.y = p.y-0.5 if not is_ground(p) then if minetest.registered_nodes[minetest.get_node(p).name].walkable then self.v = 0 end self.object:setacceleration({x=0, y=-10, z=0}) self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)) else p.y = p.y+1 if is_ground(p) then self.object:setacceleration({x=0, y=3, z=0}) local y = self.object:getvelocity().y if y > 2 then y = 2 end if y < 0 then self.object:setacceleration({x=0, y=10, z=0}) end self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), y)) else self.object:setacceleration({x=0, y=0, z=0}) if math.abs(self.object:getvelocity().y) < 1 then local pos = self.object:getpos() pos.y = math.floor(pos.y)+0.5 self.object:setpos(pos) self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), 0)) else self.object:setvelocity(get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y)) end end end end, } --END HORSE -- backup table local hbak = horse -- Brown Horse local hrs = { textures = {"mobs_horseh1.png"}, jmp = 2, } minetest.register_entity("mobs_mc:horseh1", merge(hrs, horse)) -- White Horse horse = hbak local peg = { textures = {"mobs_horsepegh1.png"}, jmp = 2, } minetest.register_entity("mobs_mc:horsepegh1", merge(peg, horse)) -- Black Horse horse = hbak local ara = { textures = {"mobs_horsearah1.png"}, jmp = 3, } minetest.register_entity("mobs_mc:horsearah1", merge(ara, horse)) mobs:register_mob("mobs_mc:horse", { type = "animal", hp_min = 5, hp_max = 10, collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, textures = { {"mobs_horseh.png"}, }, visual = "mesh", mesh = "mobs_horse.x", makes_footstep_sound = true, walk_velocity = 1, armor = 200, drops = { {name = "mcl_mobitems:leather", chance = 1, min = 0, max = 2,}, }, drawtype = "front", lava_damage = minetest.registered_nodes["mcl_core:lava_source"].damage_per_second, light_damage = 0, fear_height = 6, animation = { speed_normal = 15, stand_start = 25, stand_end = 75, walk_start = 75, walk_end = 100, }, follow = "mcl_farming:wheat_item", view_range = 5, on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() if tool:get_name() == "mcl_mobitems:saddle" then clicker:get_inventory():remove_item("main", "mcl_mobitems:saddle") local pos = self.object:getpos() self.object:remove() minetest.add_entity(pos, "mobs_mc:horseh1") end end, }) mobs:register_mob("mobs_mc:horse2", { type = "animal", hp_min = 15, hp_max = 30, collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, textures = { {"mobs_horsepegh.png"}, }, visual = "mesh", mesh = "mobs_horse.x", makes_footstep_sound = true, walk_velocity = 1, armor = 200, drops = { {name = "mcl_mobitems:leather", chance = 1, min = 0, max = 2,}, }, drawtype = "front", lava_damage = minetest.registered_nodes["mcl_core:lava_source"].damage_per_second, light_damage = 0, fear_height = 6, animation = { speed_normal = 15, stand_start = 25, stand_end = 75, walk_start = 75, walk_end = 100, }, follow = "mcl_farming:wheat_item", view_range = 5, on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() if tool:get_name() == "mcl_mobitems:saddle" then clicker:get_inventory():remove_item("main", "mcl_mobitems:saddle") local pos = self.object:getpos() self.object:remove() minetest.add_entity(pos, "mobs_mc:horsepegh1") end end, }) mobs:register_mob("mobs_mc:horse3", { type = "animal", hp_min = 15, hp_max = 30, collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, textures = { {"mobs_horsearah.png"}, }, visual = "mesh", mesh = "mobs_horse.x", makes_footstep_sound = true, walk_velocity = 1, armor = 100, drops = { {name = "mcl_mobitems:leather", chance = 1, min = 0, max = 2,}, }, drawtype = "front", lava_damage = minetest.registered_nodes["mcl_core:lava_source"].damage_per_second, light_damage = 0, fear_height = 6, animation = { speed_normal = 15, stand_start = 25, stand_end = 75, walk_start = 75, walk_end = 100, }, follow = "mcl_farming:wheat_item", view_range = 5, on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() if tool:get_name() == "mcl_mobitems:saddle" then clicker:get_inventory():remove_item("main", "mcl_mobitems:saddle") local pos = self.object:getpos() self.object:remove() minetest.add_entity(pos, "mobs_mc:horsearah1") end end, }) mobs:register_spawn("mobs_mc:horse", {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, 20, 9, 21000, 1, 12) mobs:register_spawn("mobs_mc:horse2", {"mcl_core:dirt_with_grass", "mcl_core:dirt"}, 20, 9, 23000, 1, 31000) mobs:register_spawn("mobs_mc:horse3", {"mcl_core:sand", "mcl_core:redsand"}, 20, 9, 17000, 1, 5) -- spawn eggs -- KPV wild horse spawn eggs mobs:register_egg("mobs_mc:horse", "Spawn Brown Horse", "spawn_egg_horse.png", 0) mobs:register_egg("mobs_mc:horse2", "Spawn White Horse", "spawn_egg_horse_white.png", 0) mobs:register_egg("mobs_mc:horse3", "Spawn Arabic Horse", "spawn_egg_horse_arabic.png", 0) if minetest.setting_get("log_mods") then minetest.log("action", "MC Horse loaded") end