Update affects api, add jungle spider, other random minor updates

master
Brandon 2015-07-21 22:44:35 -05:00
parent 0a24b0b9b2
commit e827c4799b
18 changed files with 223 additions and 43 deletions

View File

@ -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

View File

@ -9,7 +9,11 @@ function affects.registerAffect( aDef )
if ( #aDef.stages < 1 ) then
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
@ -68,4 +72,11 @@ function affects.default_on_use(itemstack,player,pointed_thing)
end
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

View File

@ -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
@ -57,9 +57,4 @@ function applyAffect(name,affectid)
stage.custom.func(name,player,affectid)
end
end
end
function randomChance (percent)
math.randomseed( os.time() )
return percent >= math.random(1, 100)
end
end

View File

@ -7,6 +7,7 @@ affectsFile = minetest.get_worldpath().."/affects.txt"
affects._affects = {}
affects._affectedPlayers = {}
affects._removeOnDieAffects = {}
dofile(affectsPath.."/functions.lua")
dofile(affectsPath.."/api.lua")

View File

@ -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)

View File

@ -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

View File

@ -411,4 +411,9 @@ function default.get_file_contents(filename)
return ""
end
return t
end
end
function randomChance (percent)
math.randomseed( os.time() )
return percent >= math.random(1, 100)
end

View File

@ -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)

View File

@ -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)

View File

@ -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)
@ -161,12 +165,15 @@ function mobs:register_mob(name, def)
local an = ( d.x * p.x ) + ( d.z * p.z )
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
self.attack.player:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups = {fleshy=self.damage}
}, vec)
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
@ -677,9 +691,9 @@ function mobs:register_mob(name, def)
end,
on_punch = function(self, hitter, tflp, tool_capabilities, dir)
if tflp == nil then
tflp = 1
end
if tflp == nil then
tflp = 1
end
process_weapon(hitter,tflp,tool_capabilities)
local pos = self.object:getpos()
@ -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

View File

@ -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")

View File

@ -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,

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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()