Update affects api, add jungle spider, other random minor updates
parent
0a24b0b9b2
commit
e827c4799b
|
@ -23,9 +23,19 @@ local function adventuretest_respawnplayer(player)
|
|||
energy.respawnplayer(player)
|
||||
hunger.update_hunger(player, 20)
|
||||
sethome_respawnplayer(player)
|
||||
affects.player_died(player)
|
||||
return true
|
||||
end
|
||||
minetest.register_on_respawnplayer(adventuretest_respawnplayer)
|
||||
|
||||
local function adventuretest_die_player(player)
|
||||
bones_on_dieplayer(player)
|
||||
skills_on_dieplayer(player)
|
||||
return true
|
||||
end
|
||||
|
||||
minetest.register_on_dieplayer(adventuretest_die_player)
|
||||
|
||||
local function adventuretest_dignode(pos, node, digger)
|
||||
--print("on_dignode")
|
||||
-- going to try to consolidate all on_dignode calls here so there is only one function call
|
||||
|
|
|
@ -10,6 +10,10 @@ function affects.registerAffect( aDef )
|
|||
return false
|
||||
end
|
||||
|
||||
if aDef.removeOnDeath ~= nil then
|
||||
table.insert(affects._removeOnDieAffects,aDef.affectid)
|
||||
end
|
||||
|
||||
-- TODO add more checks here to ensure the affect definition won't crash the server
|
||||
|
||||
affects._affects[aDef.affectid] = aDef
|
||||
|
@ -69,3 +73,10 @@ function affects.default_on_use(itemstack,player,pointed_thing)
|
|||
return itemstack
|
||||
end
|
||||
|
||||
function affects.player_died(player)
|
||||
local name = player:get_player_name()
|
||||
for _,a in ipairs(affects._removeOnDieAffects) do
|
||||
affects.removeAffect(name,a)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
function applyAffect(name,affectid)
|
||||
minetest.log("action","Applying affect "..affectid.." on "..name)
|
||||
whoison.updateStats(name)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local oStage = affects._affectedPlayers[name][affectid].stage
|
||||
local stageChange = false
|
||||
minetest.log("action","Applying affect "..affectid.." stage " .. tostring(oStage) .. " on "..name)
|
||||
-- see if they need advanced into the next stage
|
||||
if ( affects._affectedPlayers[name][affectid].nextStage < whoison.getTimeOnline(name) ) then
|
||||
local nextStageNum = affects._affectedPlayers[name][affectid].stage + 1
|
||||
|
@ -58,8 +58,3 @@ function applyAffect(name,affectid)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
function randomChance (percent)
|
||||
math.randomseed( os.time() )
|
||||
return percent >= math.random(1, 100)
|
||||
end
|
||||
|
|
|
@ -7,6 +7,7 @@ affectsFile = minetest.get_worldpath().."/affects.txt"
|
|||
|
||||
affects._affects = {}
|
||||
affects._affectedPlayers = {}
|
||||
affects._removeOnDieAffects = {}
|
||||
|
||||
dofile(affectsPath.."/functions.lua")
|
||||
dofile(affectsPath.."/api.lua")
|
||||
|
|
|
@ -146,6 +146,7 @@ minetest.register_on_dieplayer(function (player)
|
|||
if ( #events > 0 ) then
|
||||
arena.die(player)
|
||||
end
|
||||
return true
|
||||
end)
|
||||
|
||||
function string:split(sep)
|
||||
|
|
|
@ -197,7 +197,7 @@ function dump_bones(pos)
|
|||
default.dump_inv(pos,"main")
|
||||
end
|
||||
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
function bones_on_dieplayer (player)
|
||||
if minetest.setting_getbool("creative_mode") or minetest.check_player_privs(player:get_player_name(),{immortal=true}) then
|
||||
player:set_hp(20)
|
||||
return
|
||||
|
@ -264,4 +264,4 @@ minetest.register_on_dieplayer(function(player)
|
|||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(10)
|
||||
end)
|
||||
end
|
||||
|
|
|
@ -412,3 +412,8 @@ function default.get_file_contents(filename)
|
|||
end
|
||||
return t
|
||||
end
|
||||
|
||||
function randomChance (percent)
|
||||
math.randomseed( os.time() )
|
||||
return percent >= math.random(1, 100)
|
||||
end
|
||||
|
|
|
@ -104,6 +104,7 @@ local affect_tired = {
|
|||
physics.adjust_physics(player,{speed=0.6})
|
||||
minetest.chat_send_player(name,"You don't feel as tired anymore",false)
|
||||
end,
|
||||
removeOnDeath = true,
|
||||
}
|
||||
|
||||
affects.registerAffect(affect_tired)
|
||||
|
@ -147,6 +148,7 @@ minetest.register_chatcommand("stand",{
|
|||
if player_sleephuds[name] ~= nil then
|
||||
player:hud_remove(player_sleephuds[name])
|
||||
player_sleephuds[name] = nil
|
||||
|
||||
end
|
||||
physics.unfreeze_player(name)
|
||||
end,
|
||||
|
@ -156,7 +158,7 @@ function energy.respawnplayer(player)
|
|||
local name = player:get_player_name()
|
||||
player_energy[name] = 20
|
||||
player_lastpos[name] = player:getpos()
|
||||
affects.removeAffect(name,"tired")
|
||||
--affects.removeAffect(name,"tired")
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(function (player)
|
||||
|
|
|
@ -40,8 +40,8 @@ minetest.register_on_newplayer(function(player)
|
|||
spawnplayer(player)
|
||||
end)
|
||||
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
spawnplayer(player)
|
||||
return true
|
||||
end)
|
||||
--minetest.register_on_respawnplayer(function(player)
|
||||
--spawnplayer(player)
|
||||
--return true
|
||||
--end)
|
||||
|
||||
|
|
|
@ -27,6 +27,8 @@ function mobs:register_mob(name, def)
|
|||
on_rightclick = def.on_rightclick,
|
||||
type = def.type,
|
||||
attack_type = def.attack_type,
|
||||
attack_range = def.attack_range or 2,
|
||||
attack_function = def.attack_function or nil,
|
||||
arrow = def.arrow,
|
||||
arrow_offset = def.arrow_offset or 1,
|
||||
shoot_interval = def.shoot_interval,
|
||||
|
@ -40,7 +42,7 @@ function mobs:register_mob(name, def)
|
|||
attacks_monsters = def.attacks_monsters or false,
|
||||
group_attack = def.group_attack or false,
|
||||
step = def.step or 0,
|
||||
fov = def.fov or 120,
|
||||
fov = def.fov or 165,
|
||||
passive = def.passive or false,
|
||||
recovery_time = def.recovery_time or 0.5,
|
||||
knock_back = def.knock_back or 3,
|
||||
|
@ -147,10 +149,12 @@ function mobs:register_mob(name, def)
|
|||
|
||||
in_fov = function(self,pos)
|
||||
-- checks if POS is in self's FOV
|
||||
|
||||
local yaw = self.object:getyaw()
|
||||
if self.drawtype == "side" then
|
||||
yaw = yaw+(math.pi/2)
|
||||
end
|
||||
|
||||
local vx = math.sin(yaw)
|
||||
local vz = math.cos(yaw)
|
||||
local ds = math.sqrt(vx^2 + vz^2)
|
||||
|
@ -162,11 +166,14 @@ function mobs:register_mob(name, def)
|
|||
|
||||
local a = math.deg( math.acos( an ) )
|
||||
|
||||
return true
|
||||
--[[
|
||||
if a > ( self.fov / 2 ) then
|
||||
return false
|
||||
else
|
||||
return true
|
||||
end
|
||||
]]
|
||||
end,
|
||||
|
||||
set_animation = function(self, type)
|
||||
|
@ -367,11 +374,15 @@ 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
|
||||
--print("Dist "..tostring(dist) .. " < " .. tostring(self.view_range) .. " in_fov " .. tostring(self.in_fov(self,p)))
|
||||
if dist < self.view_range and self.in_fov(self,p) then
|
||||
if minetest.line_of_sight(sp,p,2) == true then
|
||||
self.do_attack(self,player,dist)
|
||||
break
|
||||
else
|
||||
--print("no line of site")
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -505,7 +516,6 @@ function mobs:register_mob(name, def)
|
|||
end
|
||||
elseif self.state == "attack" and self.attack_type == "dogfight" then
|
||||
if not self.attack.player or not self.attack.player:getpos() then
|
||||
print("stop attacking")
|
||||
self.state = "stand"
|
||||
self:set_animation("stand")
|
||||
return
|
||||
|
@ -533,7 +543,7 @@ function mobs:register_mob(name, def)
|
|||
yaw = yaw+math.pi
|
||||
end
|
||||
self.object:setyaw(yaw)
|
||||
if self.attack.dist > 2 then
|
||||
if self.attack.dist > self.attack_range then
|
||||
if not self.v_start then
|
||||
self.v_start = true
|
||||
self.set_velocity(self, self.run_velocity)
|
||||
|
@ -560,10 +570,14 @@ function mobs:register_mob(name, def)
|
|||
if self.sounds and self.sounds.attack then
|
||||
minetest.sound_play(self.sounds.attack, {object = self.object})
|
||||
end
|
||||
if self.attack_function ~= nil then
|
||||
self.attack_function(self,self.attack.player)
|
||||
else
|
||||
self.attack.player:punch(self.object, 1.0, {
|
||||
full_punch_interval=1.0,
|
||||
damage_groups = {fleshy=self.damage}
|
||||
}, vec)
|
||||
end
|
||||
if self.attack.player:get_hp() <= 0 then
|
||||
self.state = "stand"
|
||||
self:set_animation("stand")
|
||||
|
@ -643,7 +657,7 @@ function mobs:register_mob(name, def)
|
|||
self.object:setacceleration({x=0, y=-10, z=0})
|
||||
self.state = "stand"
|
||||
self.object:setvelocity({x=0, y=self.object:getvelocity().y, z=0})
|
||||
self.object:setyaw(math.random(1, 360)/180*math.pi)
|
||||
self.object:setyaw(((math.random(0,360)-270)/180*math.pi))
|
||||
if self.type == "monster" and minetest.setting_getbool("only_peaceful_mobs") then
|
||||
self.object:remove()
|
||||
end
|
||||
|
@ -769,7 +783,7 @@ function mobs:register_mob(name, def)
|
|||
self.do_attack(self,hitter,1)
|
||||
end
|
||||
-- alert other NPCs to the attack
|
||||
local inradius = minetest.get_objects_inside_radius(hitter:getpos(),5)
|
||||
local inradius = minetest.get_objects_inside_radius(hitter:getpos(),10)
|
||||
for _, oir in pairs(inradius) do
|
||||
local obj = oir:get_luaentity()
|
||||
if obj then
|
||||
|
@ -942,6 +956,7 @@ function mobs:face_pos(self,pos)
|
|||
yaw = yaw+math.pi
|
||||
end
|
||||
self.object:setyaw(yaw)
|
||||
--print("Yaw "..tostring(yaw))
|
||||
return yaw
|
||||
end
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ dofile(minetest.get_modpath("mobs").."/monsters/dungeonmaster.lua")
|
|||
dofile(minetest.get_modpath("mobs").."/monsters/oerkki.lua")
|
||||
dofile(minetest.get_modpath("mobs").."/monsters/sandmonster.lua")
|
||||
dofile(minetest.get_modpath("mobs").."/monsters/spider.lua")
|
||||
dofile(minetest.get_modpath("mobs").."/monsters/jungle_spider.lua")
|
||||
dofile(minetest.get_modpath("mobs").."/monsters/stonemonster.lua")
|
||||
dofile(minetest.get_modpath("mobs").."/monsters/treemonster.lua")
|
||||
dofile(minetest.get_modpath("mobs").."/monsters/yeti.lua")
|
||||
|
|
|
@ -127,6 +127,7 @@ mobs:register_mob("mobs:barbarian_archer", {
|
|||
light_damage = 0,
|
||||
on_rightclick = nil,
|
||||
attack_type = "shoot",
|
||||
attack_range = 15,
|
||||
arrow_offset = 1.2,
|
||||
arrow = "throwing:arrow_entity",
|
||||
shoot_interval = 2.2,
|
||||
|
|
|
@ -0,0 +1,143 @@
|
|||
mobs:register_mob("mobs:jungle_spider",{
|
||||
type = "monster",
|
||||
hp_min = 15,
|
||||
hp_max = 40,
|
||||
exp_min = 3,
|
||||
exp_max = 20,
|
||||
collisionbox = {-0.5, 0, -0.5, 0.4, 0.4, 0.4},
|
||||
textures = {"mobs_jungle_spider.png"},
|
||||
visual_size = {x=3,y=3},
|
||||
visual = "mesh",
|
||||
mesh = "mobs_spider.x",
|
||||
makes_footstep_sound = false,
|
||||
view_range = 15,
|
||||
walk_velocity = 1.3,
|
||||
run_velocity = 4.2,
|
||||
armor = 200,
|
||||
damage = 1,
|
||||
drops = {
|
||||
{name = "farming:string",
|
||||
chance = 70,
|
||||
min = 3,
|
||||
max = 6,},
|
||||
},
|
||||
light_resistant = false,
|
||||
drawtype = "front",
|
||||
water_damage = 5,
|
||||
lava_damage = 5,
|
||||
light_damage = 0,
|
||||
on_rightclick = nil,
|
||||
attack_type = "dogfight",
|
||||
animation = {
|
||||
speed_normal = 15,
|
||||
speed_run = 18,
|
||||
stand_start = 1,
|
||||
stand_end = 1,
|
||||
walk_start = 20,
|
||||
walk_end = 40,
|
||||
run_start = 20,
|
||||
run_end = 40,
|
||||
punch_start = 50,
|
||||
punch_end = 90,
|
||||
},
|
||||
jump = true,
|
||||
sounds = {attack = "mobs_slash_attack",},
|
||||
step = 1,
|
||||
blood_amount = 14,
|
||||
blood_offset = 0.1,
|
||||
attack_function = function(self, target)
|
||||
self.attack.player:punch(self.object, 1.0, {
|
||||
full_punch_interval=1.0,
|
||||
damage_groups = {fleshy=self.damage}
|
||||
}, vec)
|
||||
if randomChance(40) then
|
||||
-- poison the player
|
||||
affects.affectPlayer(target:get_player_name(),"spider_poison")
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
local spider_poison = {
|
||||
affectid = "spider_poison",
|
||||
name = "Jungle Spider Poison",
|
||||
stages = {
|
||||
{
|
||||
-- delay from being poisoned until it starts hurting
|
||||
time = 900,
|
||||
},
|
||||
{
|
||||
time = 120,
|
||||
physics = { speed = -0.25 },
|
||||
custom = { chance=40, func = function(name, player, affectid)
|
||||
local y = player:get_look_yaw()
|
||||
local ny = y;
|
||||
if randomChance(50) then
|
||||
ny = ny * -0.15
|
||||
else
|
||||
ny = ny * 0.15
|
||||
end
|
||||
player:set_look_yaw(ny)
|
||||
end}
|
||||
},
|
||||
{
|
||||
time = 480,
|
||||
--physics = { speed = -0.5 },
|
||||
custom = { chance=85, func = function(name, player, affectid)
|
||||
local y = player:get_look_yaw()
|
||||
local ny = y;
|
||||
if randomChance(50) then
|
||||
ny = ny * -0.3
|
||||
else
|
||||
ny = ny * 0.3
|
||||
end
|
||||
player:set_look_yaw(ny)
|
||||
local h = hunger[name].lvl
|
||||
h = h - 2
|
||||
hunger.update_hunger(player,h)
|
||||
player_energy[name] = player_energy[name] - 2
|
||||
end
|
||||
},
|
||||
},
|
||||
{
|
||||
time = 720,
|
||||
custom = { chance=95, func = function(name, player, affectid)
|
||||
local y = player:get_look_yaw()
|
||||
local ny = y;
|
||||
if randomChance(50) then
|
||||
ny = ny * -0.5
|
||||
else
|
||||
ny = ny * 0.5
|
||||
end
|
||||
player:set_look_yaw(ny)
|
||||
local h = hunger[name].lvl
|
||||
h = h - 4
|
||||
hunger.update_hunger(player,h)
|
||||
player_energy[name] = player_energy[name] - 4
|
||||
player:set_breath(-2)
|
||||
if randomChance(40) then
|
||||
pass_out(name,player)
|
||||
end
|
||||
end
|
||||
},
|
||||
},
|
||||
},
|
||||
onremove = function(name, player, affectid)
|
||||
physics.adjust_physics(player,{speed=0.25})
|
||||
minetest.chat_send_player(name,"You are feeling much better",false)
|
||||
end,
|
||||
removeOnDeath = true,
|
||||
}
|
||||
|
||||
affects.registerAffect(spider_poison)
|
||||
|
||||
function pass_out(name)
|
||||
physics.freeze_player(name)
|
||||
minetest.after(25,come_to,name)
|
||||
end
|
||||
|
||||
function come_to(name)
|
||||
physics.unfreeze_player(name)
|
||||
end
|
||||
|
||||
mobs:register_spawn("mobs:jungle_spider", {"default:jungleleaves", "default:junglegrass"}, 22, -1, 5000, 4, 31000)
|
||||
mobs:register_spawn("mobs:jungle_spider", {"default:jungleleaves", "default:junglegrass"}, 7, -1, 2000, 6, 31000)
|
|
@ -46,5 +46,5 @@ mobs:register_mob("mobs:spider",{
|
|||
blood_amount = 22,
|
||||
blood_offset = 0.1,
|
||||
})
|
||||
mobs:register_spawn("mobs:spider", {"default:leaves", "default:jungleleaves", "mg:savannaleaves"}, 22, -1, 7000, 4, 31000)
|
||||
mobs:register_spawn("mobs:spider", {"default:leaves", "default:jungleleaves", "mg:savannaleaves"}, 7, -1, 3000, 6, 31000)
|
||||
mobs:register_spawn("mobs:spider", {"default:leaves", "mg:savannaleaves"}, 22, -1, 7000, 4, 31000)
|
||||
mobs:register_spawn("mobs:spider", {"default:leaves", "mg:savannaleaves"}, 7, -1, 3000, 6, 31000)
|
|
@ -56,4 +56,4 @@ mobs:register_mob("mobs:tree_monster", {
|
|||
},
|
||||
step = 0.5,
|
||||
})
|
||||
mobs:register_spawn("mobs:tree_monster", {"default:leaves", "default:jungleleaves"}, 3, -1, 7000, 3, 31000)
|
||||
mobs:register_spawn("mobs:tree_monster", {"default:leaves", "default:jungleleaves"}, 5, -1, 5000, 3, 31000)
|
Binary file not shown.
After Width: | Height: | Size: 6.1 KiB |
|
@ -1,4 +1,3 @@
|
|||
local prev_physics = {}
|
||||
local food_poisoning = {
|
||||
affectid = "food_poisoning",
|
||||
name = "Food Poisoning",
|
||||
|
@ -75,22 +74,18 @@ local food_poisoning = {
|
|||
onremove = function(name, player, affectid)
|
||||
physics.adjust_physics(player,{speed=0.2})
|
||||
minetest.chat_send_player(name,"You are feeling much better",false)
|
||||
end
|
||||
|
||||
end,
|
||||
removeOnDeath = true,
|
||||
}
|
||||
|
||||
function puke_physics(player)
|
||||
local name = player:get_player_name()
|
||||
prev_physics[name] = physics.get_player_physics(name)
|
||||
player:set_physics_override({speed=0.01, jump=0})
|
||||
physics.freeze_player(name)
|
||||
end
|
||||
|
||||
function puke_reset(player)
|
||||
local name = player:get_player_name()
|
||||
if prev_physics[name] ~= nil then
|
||||
player:set_physics_override(prev_physics[name])
|
||||
prev_physics[name] = nil
|
||||
end
|
||||
physics.unfreeze_player(name)
|
||||
end
|
||||
|
||||
affects.registerAffect(food_poisoning)
|
|
@ -179,12 +179,12 @@ minetest.register_chatcommand("skills", {
|
|||
end,
|
||||
})
|
||||
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
function skills_on_dieplayer (player)
|
||||
local name = player:get_player_name()
|
||||
local level = skills.get_player_level(name)
|
||||
local decrease = level.exp * -0.1
|
||||
print(tostring(decrease))
|
||||
skills.add_exp(name,decrease)
|
||||
end)
|
||||
end
|
||||
|
||||
skills.initialize()
|
Loading…
Reference in New Issue