forked from mtcontrib/mobs_monster
245 lines
5.9 KiB
Lua
245 lines
5.9 KiB
Lua
|
|
local S = mobs.intllib
|
|
|
|
local get_velocity = function(self)
|
|
|
|
local v = self.object:get_velocity()
|
|
|
|
-- sanity check
|
|
if not v then return 0 end
|
|
|
|
return (v.x * v.x + v.z * v.z) ^ 0.5
|
|
end
|
|
|
|
-- Spider by AspireMint (CC-BY-SA 3.0 license)
|
|
|
|
mobs:register_mob("mobs_monster:spider", {
|
|
--docile_by_day = true,
|
|
group_attack = true,
|
|
type = "monster",
|
|
passive = false,
|
|
attack_type = "dogfight",
|
|
reach = 2,
|
|
damage = 3,
|
|
hp_min = 10,
|
|
hp_max = 30,
|
|
armor = 200,
|
|
collisionbox = {-0.8, -0.5, -0.8, 0.8, 0, 0.8},
|
|
visual_size = {x = 1, y = 1},
|
|
visual = "mesh",
|
|
mesh = "mobs_spider.b3d",
|
|
textures = {
|
|
{"mobs_spider_mese.png"},
|
|
{"mobs_spider_orange.png"},
|
|
{"mobs_spider_snowy.png"},
|
|
{"mobs_spider_grey.png"},
|
|
{"mobs_spider_crystal.png"},
|
|
},
|
|
makes_footstep_sound = false,
|
|
sounds = {
|
|
random = "mobs_spider",
|
|
attack = "mobs_spider",
|
|
},
|
|
walk_velocity = 1,
|
|
run_velocity = 3,
|
|
jump = true,
|
|
view_range = 15,
|
|
floats = 0,
|
|
drops = {
|
|
{name = "farming:string", chance = 1, min = 0, max = 2},
|
|
},
|
|
water_damage = 5,
|
|
lava_damage = 5,
|
|
light_damage = 0,
|
|
animation = {
|
|
speed_normal = 15,
|
|
speed_run = 20,--15,
|
|
stand_start = 0,
|
|
stand_end = 0,
|
|
walk_start = 1,
|
|
walk_end = 21,
|
|
run_start = 1,
|
|
run_end = 21,
|
|
punch_start = 25,
|
|
punch_end = 45,
|
|
},
|
|
-- what kind of spider are we spawning?
|
|
on_spawn = function(self)
|
|
|
|
local pos = self.object:get_pos() ; pos.y = pos.y - 1
|
|
|
|
-- snowy spider
|
|
if minetest.find_node_near(pos, 1,
|
|
{"default:snow", "default:snowblock", "default:dirt_with_snow"}) then
|
|
self.base_texture = {"mobs_spider_snowy.png"}
|
|
self.object:set_properties({textures = self.base_texture})
|
|
self.docile_by_day = true
|
|
-- tarantula
|
|
elseif minetest.find_node_near(pos, 1,
|
|
{"default:dirt_with_rainforest_litter", "default:jungletree"}) then
|
|
self.base_texture = {"mobs_spider_orange.png"}
|
|
self.object:set_properties({textures = self.base_texture})
|
|
self.docile_by_day = true
|
|
-- grey spider
|
|
elseif minetest.find_node_near(pos, 1,
|
|
{"default:stone", "default:gravel"}) then
|
|
self.base_texture = {"mobs_spider_grey.png"}
|
|
self.object:set_properties({textures = self.base_texture})
|
|
-- mese spider
|
|
elseif minetest.find_node_near(pos, 1,
|
|
{"default:mese", "default:stone_with_mese"}) then
|
|
self.base_texture = {"mobs_spider_mese.png"}
|
|
self.object:set_properties({textures = self.base_texture})
|
|
elseif minetest.find_node_near(pos, 1,
|
|
{"ethereal:crystal_dirt", "ethereal:crystal_spike"}) then
|
|
self.base_texture = {"mobs_spider_crystal.png"}
|
|
self.object:set_properties({textures = self.base_texture})
|
|
self.docile_by_day = true
|
|
self.drops = {
|
|
{name = "farming:string", chance = 1, min = 0, max = 2},
|
|
{name = "ethereal:crystal_spike", chance = 15, min = 1, max = 2},
|
|
}
|
|
end
|
|
|
|
return true -- run only once, false/nil runs every activation
|
|
end,
|
|
|
|
-- custom function to make spiders climb vertical facings
|
|
do_custom = function(self, dtime)
|
|
|
|
-- quarter second timer
|
|
self.spider_timer = (self.spider_timer or 0) + dtime
|
|
if self.spider_timer < 0.25 then
|
|
return
|
|
end
|
|
self.spider_timer = 0
|
|
|
|
-- need to be stopped to go onwards
|
|
if get_velocity(self) > 0.5 then
|
|
self.disable_falling = nil
|
|
return
|
|
end
|
|
|
|
local pos = self.object:get_pos()
|
|
local yaw = self.object:get_yaw()
|
|
|
|
-- sanity check
|
|
if not yaw then return end
|
|
|
|
pos.y = pos.y + self.collisionbox[2] - 0.2
|
|
|
|
local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)
|
|
local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)
|
|
local nod = minetest.get_node_or_nil({
|
|
x = pos.x + dir_x,
|
|
y = pos.y + 0.5,
|
|
z = pos.z + dir_z
|
|
})
|
|
|
|
-- get current velocity
|
|
local v = self.object:get_velocity()
|
|
|
|
-- can only climb solid facings
|
|
if not nod or not minetest.registered_nodes[nod.name]
|
|
or not minetest.registered_nodes[nod.name].walkable then
|
|
self.disable_falling = nil
|
|
v.y = 0
|
|
self.object:set_velocity(v)
|
|
return
|
|
end
|
|
|
|
--print ("----", nod.name, self.disable_falling, dtime)
|
|
|
|
-- turn off falling if attached to facing
|
|
self.disable_falling = true
|
|
|
|
-- move up facing
|
|
v.x = 0 ; v.y = 0
|
|
v.y = self.jump_height
|
|
mobs:set_animation(self, "jump")
|
|
self.object:set_velocity(v)
|
|
end,
|
|
|
|
-- make spiders jump at you on attack
|
|
custom_attack = function(self, pos)
|
|
|
|
local vel = self.object:get_velocity()
|
|
|
|
self.object:set_velocity({
|
|
x = vel.x * self.run_velocity,
|
|
y = self.jump_height * 1.5,
|
|
z = vel.z * self.run_velocity
|
|
})
|
|
|
|
self.pausetimer = 0.5
|
|
|
|
return true -- continue rest of attack function
|
|
end
|
|
})
|
|
|
|
|
|
-- above ground spawn
|
|
mobs:spawn({
|
|
name = "mobs_monster:spider",
|
|
nodes = {
|
|
"default:dirt_with_rainforest_litter", "default:snowblock",
|
|
"default:snow", "ethereal:crystal_dirt", "ethereal:cold_dirt"
|
|
},
|
|
min_light = 0,
|
|
max_light = 8,
|
|
chance = 7000,
|
|
active_object_count = 1,
|
|
min_height = 25,
|
|
max_height = 31000,
|
|
})
|
|
|
|
-- below ground spawn
|
|
mobs:spawn({
|
|
name = "mobs_monster:spider",
|
|
nodes = {"default:stone_with_mese", "default:mese", "default:stone"},
|
|
min_light = 0,
|
|
max_light = 7,
|
|
chance = 7000,
|
|
active_object_count = 1,
|
|
min_height = -31000,
|
|
max_height = -40,
|
|
})
|
|
|
|
|
|
mobs:register_egg("mobs_monster:spider", S("Spider"), "mobs_cobweb.png", 1)
|
|
|
|
|
|
mobs:alias_mob("mobs_monster:spider2", "mobs_monster:spider") -- compatibility
|
|
mobs:alias_mob("mobs:spider", "mobs_monster:spider")
|
|
|
|
|
|
-- cobweb
|
|
minetest.register_node(":mobs:cobweb", {
|
|
description = S("Cobweb"),
|
|
drawtype = "plantlike",
|
|
visual_scale = 1.2,
|
|
tiles = {"mobs_cobweb.png"},
|
|
inventory_image = "mobs_cobweb.png",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
liquid_viscosity = 11,
|
|
liquidtype = "source",
|
|
liquid_alternative_flowing = "mobs:cobweb",
|
|
liquid_alternative_source = "mobs:cobweb",
|
|
liquid_renewable = false,
|
|
liquid_range = 0,
|
|
walkable = false,
|
|
groups = {snappy = 1, disable_jump = 1},
|
|
drop = "farming:string",
|
|
sounds = default.node_sound_leaves_defaults(),
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "mobs:cobweb",
|
|
recipe = {
|
|
{"farming:string", "", "farming:string"},
|
|
{"", "farming:string", ""},
|
|
{"farming:string", "", "farming:string"},
|
|
}
|
|
})
|