1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2025-06-28 06:11:47 +02:00

Many tweaks

- Delete item frame from « homedecor_modpack » (i use Itemframes from
Carbone)
- Add « builtin_falling » mod
- Update « mobs » mod
- Update « irc » mod, it works now
This commit is contained in:
Ombridride
2014-11-05 22:02:36 +01:00
parent f3de8c2709
commit 18bac5fc8d
13 changed files with 727 additions and 258 deletions

View File

@ -19,7 +19,7 @@ function mobs:register_mob(name, def)
light_damage = def.light_damage,
water_damage = def.water_damage,
lava_damage = def.lava_damage,
disable_fall_damage = def.disable_fall_damage,
fall_damage = def.fall_damage or true,
drops = def.drops,
armor = def.armor,
drawtype = def.drawtype,
@ -88,7 +88,7 @@ function mobs:register_mob(name, def)
local v = self.object:getvelocity()
return (v.x^2 + v.z^2)^(0.5)
end,
--[[
in_fov = function(self,pos)
-- checks if POS is in self's FOV
local yaw = self.object:getyaw()
@ -112,7 +112,7 @@ function mobs:register_mob(name, def)
return true
end
end,
]]
set_animation = function(self, type)
if not self.animation then
return
@ -194,7 +194,7 @@ function mobs:register_mob(name, def)
-- drop egg
if self.animaltype == "clucky" then
if math.random(1, 1000) <= 1
if math.random(1, 1500) < 2
and minetest.get_node(self.object:getpos()).name == "air"
and self.state == "stand" then
minetest.set_node(self.object:getpos(), {name="mobs:egg"})
@ -208,12 +208,26 @@ function mobs:register_mob(name, def)
end
local x = math.sin(yaw) * -2
local z = math.cos(yaw) * 2
self.object:setacceleration({x=x, y=-10, z=z})
-- self.object:setacceleration({x=x, y=-10, z=z})
-- else
-- self.object:setacceleration({x=0, y=-10, z=0})
-- end
-- Mobs float in water now, to revert uncomment previous 4 lines and remove following block of 12
if minetest.get_item_group(minetest.get_node(self.object:getpos()).name, "water") ~= 0 then
self.object:setacceleration({x = x, y = 1.5, z = z})
else
self.object:setacceleration({x = x, y = -10, z = z}) -- 14.5
end
else
self.object:setacceleration({x=0, y=-10, z=0})
if minetest.get_item_group(minetest.get_node(self.object:getpos()).name, "water") ~= 0 then
self.object:setacceleration({x = 0, y = 1.5, z = 0})
else
self.object:setacceleration({x = 0, y = -10, z = 0}) -- 14.5
end
end
if self.disable_fall_damage and self.object:getvelocity().y == 0 then
-- fall damage
if self.fall_damage and self.object:getvelocity().y == 0 then
if not self.old_y then
self.old_y = self.object:getpos().y
else
@ -246,7 +260,7 @@ function mobs:register_mob(name, def)
end
self.timer = 0
end
if self.sounds and self.sounds.random and math.random(1, 100) <= 1 then
minetest.sound_play(self.sounds.random, {object = self.object})
end
@ -254,7 +268,7 @@ function mobs:register_mob(name, def)
local do_env_damage = function(self)
local pos = self.object:getpos()
local n = minetest.get_node(pos)
if self.light_damage and self.light_damage ~= 0
and pos.y>0
and minetest.get_node_light(pos)
@ -263,16 +277,16 @@ function mobs:register_mob(name, def)
and minetest.get_timeofday() < 0.8
then
self.object:set_hp(self.object:get_hp()-self.light_damage)
if self.object:get_hp() == 0 then
if self.object:get_hp() < 1 then
self.object:remove()
end
end
if self.water_damage and self.water_damage ~= 0 and
minetest.get_item_group(n.name, "water") ~= 0
then
self.object:set_hp(self.object:get_hp()-self.water_damage)
if self.object:get_hp() == 0 then
if self.object:get_hp() < 1 then
self.object:remove()
end
end
@ -281,7 +295,7 @@ function mobs:register_mob(name, def)
minetest.get_item_group(n.name, "lava") ~= 0
then
self.object:set_hp(self.object:get_hp()-self.lava_damage)
if self.object:get_hp() == 0 then
if self.object:get_hp() < 1 then
self.object:remove()
end
end
@ -320,7 +334,7 @@ function mobs:register_mob(name, def)
p.y = p.y + 1
sp.y = sp.y + 1 -- aim higher to make looking up hills more realistic
local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5
if dist < self.view_range and self.in_fov(self,p) then
if dist < self.view_range then -- and self.in_fov(self,p) then
if minetest.line_of_sight(sp,p,2) == true then
self.do_attack(self,player,dist)
break
@ -442,7 +456,7 @@ function mobs:register_mob(name, def)
self.set_animation(self, "walk")
end
elseif self.state == "walk" then
if math.random(1, 100) <= 30 then
if math.random(1, 100) < 31 then
self.object:setyaw(self.object:getyaw()+((math.random(0,360)-180)/180*math.pi))
end
if self.jump and self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0 then
@ -452,7 +466,7 @@ function mobs:register_mob(name, def)
end
self:set_animation("walk")
self.set_velocity(self, self.walk_velocity)
if math.random(1, 100) <= 30 then
if math.random(1, 100) < 31 then
self.set_velocity(self, 0)
self.state = "stand"
self:set_animation("stand")
@ -518,7 +532,7 @@ function mobs:register_mob(name, def)
full_punch_interval=1.0,
damage_groups = {fleshy=self.damage}
}, vec)
if self.attack.player:get_hp() <= 0 then
if self.attack.player:get_hp() < 1 then
self.state = "stand"
self:set_animation("stand")
end
@ -560,7 +574,7 @@ function mobs:register_mob(name, def)
self.object:setyaw(yaw)
self.set_velocity(self, 0)
if self.timer > self.shoot_interval and math.random(1, 100) <= 60 then
if self.timer > self.shoot_interval and math.random(1, 100) < 61 then
self.timer = 0
self:set_animation("punch")
@ -574,7 +588,7 @@ function mobs:register_mob(name, def)
local obj = minetest.add_entity(p, self.arrow)
local amount = (vec.x^2+vec.y^2+vec.z^2)^0.5
local v = obj:get_luaentity().velocity
vec.y = vec.y + self.shoot_offset -- 2
vec.y = vec.y + self.shoot_offset -- was +1, this way shoot aim is accurate
vec.x = vec.x*v/amount
vec.y = vec.y*v/amount
vec.z = vec.z*v/amount
@ -613,7 +627,7 @@ function mobs:register_mob(name, def)
self.object:set_properties(tmp.textures)
end]]
end
if self.lifetimer <= 0 and not self.tamed and self.type ~= "npc" then
if self.lifetimer < 1 and not self.tamed and self.type ~= "npc" then
self.object:remove()
end
end,
@ -632,8 +646,8 @@ function mobs:register_mob(name, def)
process_weapon(hitter,tflp,tool_capabilities)
local pos = self.object:getpos()
if self.object:get_hp() <= 0 then
if hitter and hitter:is_player() and hitter:get_inventory() then
if self.object:get_hp() < 1 then
if hitter and hitter:is_player() then -- and hitter:get_inventory() then
for _,drop in ipairs(self.drops) do
if math.random(1, drop.chance) == 1 then
local d = ItemStack(drop.name.." "..math.random(drop.min, drop.max))
@ -697,7 +711,7 @@ function mobs:register_mob(name, def)
end
--blood_particles
--[[
if self.blood_amount > 0 and pos then
local p = pos
p.y = p.y + self.blood_offset
@ -719,7 +733,7 @@ function mobs:register_mob(name, def)
self.blood_texture --texture
)
end
]]--
-- knock back effect, adapted from blockmen's pyramids mod
-- https://github.com/BlockMen/pyramids
local kb = self.knock_back
@ -738,7 +752,7 @@ function mobs:register_mob(name, def)
self.object:setvelocity({x=dir.x*kb,y=ykb,z=dir.z*kb})
self.pause_timer = r
--[[
-- attack puncher and call other mobs for help
if self.passive == false then
if self.state ~= "attack" then
@ -755,6 +769,7 @@ function mobs:register_mob(name, def)
end
end
end
]]--
end,
})
@ -777,15 +792,14 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o
end
pos.y = pos.y+1
if not minetest.get_node_light(pos) then
return
end
if minetest.get_node_light(pos) > max_light then
return
end
if minetest.get_node_light(pos) < min_light then
if not minetest.get_node_light(pos)
or minetest.get_node_light(pos) > max_light
or minetest.get_node_light(pos) < min_light then
--print ("LIGHT", name)
return
end
if pos.y > max_height then
return
end
@ -805,11 +819,8 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o
max_dist = {x=33000,z=33000}
end
if math.abs(pos.x) < min_dist.x or math.abs(pos.z) < min_dist.z then
return
end
if math.abs(pos.x) > max_dist.x or math.abs(pos.z) > max_dist.z then
if math.abs(pos.x) < min_dist.x or math.abs(pos.z) < min_dist.z
or math.abs(pos.x) > max_dist.x or math.abs(pos.z) > max_dist.z then
return
end
@ -846,6 +857,7 @@ function mobs:register_arrow(name, def)
on_step = function(self, dtime)
local pos = self.object:getpos()
--if minetest.get_node(self.object:getpos()).name ~= "air" then
if minetest.registered_nodes[minetest.get_node(self.object:getpos()).name].walkable then
self.hit_node(self, pos, node)
self.object:remove()

View File

@ -61,6 +61,7 @@ mobs:register_mob("mobs:dungeon_master", {
},
jump = true,
step = 0.5,
shoot_offset = 0,
blood_texture = "mobs_blood.png",
})
mobs:register_spawn("mobs:dungeon_master", {"default:stone"}, 2, -1, 6000, 1, -70)

View File

@ -0,0 +1,105 @@
-- Dungeon Master (This one spits out fireballs at you)
mobs:register_mob("mobs:dungeon_master", {
type = "monster",
hp_min = 45,
hp_max = 55,
collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.6, 0.7},
visual = "mesh",
mesh = "mobs_dungeon_master.x",
textures = {"mobs_dungeon_master.png"},
visual_size = {x=8, y=8},
makes_footstep_sound = true,
view_range = 16,
walk_velocity = 1,
run_velocity = 3,
damage = 12,
drops = {
{name = "default:mese_crystal_fragment",
chance = 1,
min = 1,
max = 3,},
{name = "default:diamond",
chance = 5,
min = 1,
max = 3,},
{name = "default:mese_crystal",
chance = 2,
min = 1,
max = 3,},
{name = "default:diamond_block",
chance = 30,
min = 1,
max = 1,},
{name = "maptools:silver_coin",
chance = 1,
min = 1,
max = 5,},
},
armor = 60,
drawtype = "front",
water_damage = 1,
lava_damage = 1,
light_damage = 0,
on_rightclick = nil,
attack_type = "shoot",
arrow = "mobs:fireball",
shoot_interval = 2.5,
sounds = {
attack = "mobs_fireball",
},
animation = {
stand_start = 0,
stand_end = 19,
walk_start = 20,
walk_end = 35,
punch_start = 36,
punch_end = 48,
speed_normal = 15,
speed_run = 15,
},
jump = true,
step = 0.5,
blood_texture = "mobs_blood.png",
})
mobs:register_spawn("mobs:dungeon_master", {"default:stone"}, 2, -1, 6000, 1, -70)
-- Fireball (weapon)
mobs:register_arrow("mobs:fireball", {
visual = "sprite",
visual_size = {x=1, y=1},
textures = {"mobs_fireball.png"},
velocity = 5,
-- direct hit, no fire... just plenty of pain
hit_player = function(self, player)
local s = self.object:getpos()
local p = player:getpos()
player:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups = {fleshy=8},
}, 0) -- {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z})
end,
-- node hit, bursts into flame (cannot blast through obsidian)
hit_node = function(self, pos, node)
for dx=-1,1 do
for dy=-1,1 do
for dz=-1,1 do
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
local n = minetest.env:get_node(p).name
if n ~= "default:obsidian" and n ~= "ethereal:obsidian_brick" then
if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) <= 30 then
minetest.env:set_node(p, {name="fire:basic_flame"})
else
minetest.env:set_node(p, {name="air"})
end
end
end
end
end
end
})

View File

@ -1,4 +1,4 @@
-- Mob Api (5th Sep 2014)
-- Mob Api (15th Oct 2014)
dofile(minetest.get_modpath("mobs").."/api.lua")

View File

@ -63,6 +63,7 @@ mobs:register_mob("mobs:mese_monster", {
},
jump = true,
step = 1,
shoot_offset = 2,
blood_texture = "default_mese_crystal_fragment.png",
})
mobs:register_spawn("mobs:mese_monster", {"default:stone", "nether:netherrack"}, 3, -1, 4000, 1, -20)

View File

@ -0,0 +1,90 @@
--= Mese Monster by Zeg9
-- 9 mese crystal fragments = 1 mese crystal
minetest.register_craft({
output = "default:mese_crystal",
recipe = {
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
{"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"},
}
})
-- Mese Monster
mobs:register_mob("mobs:mese_monster", {
type = "monster",
hp_min = 15,
hp_max = 30,
collisionbox = {-0.5, -1.5, -0.5, 0.5, 0.5, 0.5},
visual = "mesh",
mesh = "zmobs_mese_monster.x",
textures = {"zmobs_mese_monster.png"},
visual_size = {x=1, y=1},
makes_footstep_sound = true,
view_range = 16,
walk_velocity = 1,
run_velocity = 3,
damage = 7,
drops = {
{name = "default:mese_crystal",
chance = 9,
min = 1,
max = 3,},
{name = "default:mese_crystal_fragment",
chance = 1,
min = 1,
max = 9,},
{name = "maptools:silver_coin",
chance = 2,
min = 1,
max = 2,},
},
light_resistant = true,
armor = 80,
drawtype = "front",
water_damage = 0,
lava_damage = 0,
light_damage = 0,
attack_type = "shoot",
arrow = "mobs:mese_arrow",
shoot_interval = .5,
animation = {
speed_normal = 15,
speed_run = 15,
stand_start = 0,
stand_end = 14,
walk_start = 15,
walk_end = 38,
run_start = 40,
run_end = 63,
punch_start = 15, -- 40
punch_end = 38, -- 63
},
jump = true,
step = 1,
blood_texture = "default_mese_crystal_fragment.png",
})
mobs:register_spawn("mobs:mese_monster", {"default:stone", "nether:netherrack"}, 3, -1, 4000, 1, -20)
-- Mese Monster Crystal Shards (weapon)
mobs:register_arrow("mobs:mese_arrow", {
visual = "sprite",
visual_size = {x=.5, y=.5},
textures = {"default_mese_crystal_fragment.png"},
velocity = 5,
hit_player = function(self, player)
local s = self.object:getpos()
local p = player:getpos()
player:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups = {fleshy=1},
}, 0) -- {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z})
end,
hit_node = function(self, pos, node)
end
})