master
Lean Rada 2015-01-20 00:24:37 +08:00
parent 158c5d2910
commit 2f3a2b1019
4 changed files with 42 additions and 18 deletions

View File

@ -56,7 +56,6 @@ director.spawn_list = {
director.intensity = 0.5
director.cooldown_timer = 3
local world_timer = 0
local spawn_timers = {}
local last_average_health = 1.0
local last_mob_count = 0
@ -91,8 +90,6 @@ function director:on_interval()
spawn_timers[k] = v - self.call_interval
end
end
world_timer = world_timer + self.call_interval
end
function director:spawn_monsters()
@ -239,7 +236,7 @@ end
function director:get_day_count()
local time_speed = minetest.setting_get("time_speed")
return math.floor(world_timer * time_speed / 86400)
return math.floor(minetest.get_gametime() * time_speed / 86400)
end
local last_call_time = 0
@ -257,7 +254,6 @@ function director:save()
intensity = self.intensity,
cooldown_timer = self.cooldown_timer,
spawn_timers = spawn_timers,
world_timer = world_timer,
last_average_health = last_average_health,
last_mob_count = last_mob_count,
}
@ -272,7 +268,6 @@ function director:load()
self.intensity = data.intensity
self.cooldown_timer = data.cooldown_timer
spawn_timers = data.spawn_timers
world_timer = data.world_timer
last_average_health = data.last_average_health
last_mob_count = data.last_mob_count
end

View File

@ -1,5 +1,5 @@
defense = {}
defense.debug = true
defense.debug = false
local modpath = minetest.get_modpath("defense")
local function dofile2(file)

View File

@ -121,7 +121,7 @@ function mobs.default_prototype:hunt()
if nearest.player then
local nearest_pos = nearest.player:getpos()
local dir = vector.direction(nearest_pos, self.object:getpos())
local r = math.max(0, self.attack_range - 0.3)
local r = math.max(0, self.attack_range - 0.5)
self.destination = vector.add(nearest_pos, vector.multiply(dir, r))
if nearest.distance <= self.attack_range then
self:do_attack(nearest.player)
@ -239,7 +239,7 @@ function mobs.move_method:air(dtime, destination)
local t
local v = self.object:getvelocity()
if vector.length(v) < self.move_speed * 1.5 then
t = math.pow(0.3, dtime)
t = math.pow(0.1, dtime)
else
t = math.pow(0.9, dtime)
speed = speed * 0.9

View File

@ -17,35 +17,64 @@ defense.mobs.register_mob("defense:paniki", {
movement = "air",
move_speed = 16,
attack_damage = 1,
attack_range = 1.5,
attack_range = 1.2,
attack_interval = 0.8,
rank = 0,
leader = nil,
last_hp = 3,
flee_timer = 0,
on_activate = function(self, staticdata)
defense.mobs.default_prototype.on_activate(self, staticdata)
self.rank = math.random()
minetest.after(1, function()
local pos = self.object:getpos()
local radius = 4
local greatest_paniki = self
local greatest_rank = self.rank
for _,o in pairs(minetest.get_objects_inside_radius(pos, radius)) do
if self.object ~= o then
local e = o:get_luaentity()
if e and e.name == self.name then
if greatest_rank < e.rank then
greatest_paniki = e
greatest_rank = e.rank
end
end
end
end
self.leader = greatest_paniki
end)
end,
on_step = function(self, dtime)
defense.mobs.default_prototype.on_step(self, dtime)
if self.flee_timer > 0 then
if self.flee_timer > 0 or (self.leader and self.leader.flee_timer > 0) then
local nearest = self:find_nearest_player()
local pos = self.object:getpos()
local delta = vector.subtract(pos, nearest.player:getpos())
local x = delta.x
delta.x = delta.x - delta.z * 0.4
delta.z = delta.z + x * 0.4
self.destination = vector.add(pos, delta)
if vector.length(delta) <= self.attack_range then
self:hunt()
if self.flee_timer > 0 then
self.flee_timer = self.flee_timer - dtime
end
self.flee_timer = self.flee_timer - dtime
else
self:hunt()
if self.object:get_hp() < self.last_hp then
self.flee_timer = math.random() * 2 / (self.object:get_hp() + 1)
self.last_hp = self.object:get_hp()
self.flee_timer = 0.5 + math.random() / (self.object:get_hp() + 1)
end
self.last_hp = self.object:get_hp()
end
end,
attack = function(self, obj)
defense.mobs.default_prototype.attack(self, obj)
self.object:set_hp(self.object:get_hp() + 1)
self.flee_timer = 0.1
if self.object:get_hp() < self.hp_max then
self.object:set_hp(self.object:get_hp() + 1)
end
self.flee_timer = 0.5 + math.random()
end,
})