Maintenance update.

master
Kalabasa 2016-01-24 13:54:10 +08:00
parent b4421f973e
commit d5acd6d803
7 changed files with 144 additions and 25 deletions

122
mods/defense/debug.lua Normal file
View File

@ -0,0 +1,122 @@
minetest.register_chatcommand("debug", {
description = "Toggle Defense mod debug mode",
privs = {server=true},
func = function(name)
defense.debug = not defense.debug
if defense.debug then
regeneration.rate = 100
minetest.set_timeofday(0.3)
return true, "Debug mode activated"
else
regeneration.rate = defense.regeneration_rate
return true, "Debug mode deactivated"
end
end,
})
-- Pathfinder debugger
local path_interval = 3
local path_class = nil
local path_visit = nil
local path_visited = nil
local path_waiting = {}
local path_active = {}
local path_timer = 0
local path_count = 0
local path_directions = {
{x=0, y=0, z=0},
{x=0, y=-1, z=0},
{x=0, y=1, z=0},
{x=0, y=0, z=-1},
{x=1, y=0, z=0},
{x=-1, y=0, z=0},
{x=0, y=0, z=1},
}
minetest.register_chatcommand("debug_path", {
params = "[<class>]",
description = "Debug the pathfinder flow field",
privs = {server=true},
func = function(name, class)
if not defense.debug then
return false, "Debug mode required!"
end
if not class or class == "" then
path_class = nil
return true, "Pathfinder debug off"
else
if defense.pathfinder.classes[class] then
local pos = minetest.get_player_by_name(name):getpos()
pos = {
x = math.floor(pos.x + 0.5),
y = math.floor(pos.y + 0.5),
z = math.floor(pos.z + 0.5)
}
path_visited = {}
path_visit = Queue.new() Queue.push(path_visit, pos)
path_timer = path_interval
path_class = class
return true
else
return false, "Invalid class!"
end
end
end,
})
minetest.register_node("defense:debug_path", {
drawtype = "allfaces",
visual_scale = 1.0,
tiles = {"defense_debug_path.png"},
use_texture_alpha = true,
paramtype = "light",
sunlight_propagates = true,
walkable = false,
groups = {dig_immediate=3},
})
local function path_update()
for _=1,Queue.size(path_visit) do
local pos = Queue.pop(path_visit)
table.insert(path_waiting, pos)
path_visited[pos.x .. ":" .. pos.y .. ":" .. pos.z] = true
for _,dir in ipairs(path_directions) do
local nxt = vector.add(pos, dir)
if not path_visited[nxt.x .. ":" .. nxt.y .. ":" .. nxt.z] then
Queue.push(path_visit, nxt)
end
end
end
for _,pos in ipairs(path_active) do
minetest.remove_node(pos)
end
path_active = {}
for i=#path_waiting,1,-1 do
local pos = path_waiting[i]
local field = defense.pathfinder:get_field(path_class, pos)
if field and field.distance == path_count then
minetest.place_node(pos, {name="defense:debug_path"})
table.remove(path_waiting, i)
table.insert(path_active, pos)
end
end
path_count = path_count + 1
if path_count > 20 then
path_class = nil
end
end
minetest.register_globalstep(function(dtime)
if path_class then
path_timer = path_timer - dtime
if path_timer <= 0 then
path_timer = path_interval
path_update()
end
end
end)

View File

@ -267,7 +267,7 @@ function director:get_day_count()
end
function director:save()
local file = assert(io.open(minetest.get_worldpath() .. "/defense.txt", "w"))
local file = assert(io.open(minetest.get_worldpath() .. "/defense_director_state.txt", "w"))
local data = {
intensity = self.intensity,
cooldown_timer = self.cooldown_timer,
@ -280,7 +280,7 @@ function director:save()
end
function director:load()
local file = io.open(minetest.get_worldpath() .. "/defense.txt", "r")
local file = io.open(minetest.get_worldpath() .. "/defense_director_state.txt", "r")
if file then
local data = minetest.deserialize(file:read("*all"))
if data then

View File

@ -1,21 +1,8 @@
defense = {}
defense.regeneration_rate = 0.2
defense.debug = false
minetest.register_chatcommand("debug", {
params = "",
description = "Toggle Defense debug mode",
privs = {server=true},
func = function(name, param)
defense.debug = not defense.debug
if defense.debug then
regeneration.rate = 100
minetest.set_timeofday(0.3)
else
regeneration.rate = 0.2
end
return true
end,
})
regeneration.rate = defense.regeneration_rate;
local modpath = minetest.get_modpath("defense")
local function dofile2(file)
@ -40,4 +27,6 @@ dofile2("mobs/unggoy.lua")
dofile2("mobs/aranay.lua")
dofile2("mobs/sarangay.lua")
dofile2("mobs/paniki.lua")
dofile2("mobs/botete.lua")
dofile2("mobs/botete.lua")
dofile2("debug.lua")

View File

@ -34,6 +34,8 @@ mobs.default_prototype = {
cache_find_nearest_player = nil,
}
local function vec_zero() return {x=0, y=0, z=0} end
function mobs.default_prototype:on_activate(staticdata)
self.object:set_armor_groups({fleshy = 100 - self.armor})
if self.movement ~= "air" then
@ -64,7 +66,7 @@ function mobs.default_prototype:on_step(dtime)
end
if self.movement == "crawl" then
if self:is_standing() then
self.object:setacceleration({x=0, y=0, z=0})
self.object:setacceleration(vec_zero())
else
self.object:setacceleration({x=0, y=mobs.gravity, z=0})
end
@ -190,7 +192,7 @@ function mobs.default_prototype:jump(direction)
direction.y = 0
direction = vector.normalize(direction)
else
direction = {x=0,y=0,z=0}
direction = vec_zero()
end
local v = self.object:getvelocity()
v.y = math.sqrt(2 * -mobs.gravity * (self.jump_height + 0.2))
@ -354,7 +356,7 @@ function mobs.move_method:air(dtime, destination)
end
self.object:setvelocity(vector.add(
vector.multiply(self.object:getvelocity(), t),
vector.multiply(vector.normalize(delta), speed * (1-t))
vector.multiply(dist > 0 and vector.normalize(delta) or vec_zero(), speed * (1-t))
))
if speed > self.move_speed * 0.04 then
@ -385,7 +387,7 @@ function mobs.move_method:ground(dtime, destination)
t = math.pow(0.4, dtime)
speed = speed * 0.9
end
local dir = vector.normalize(delta)
local dir = dist > 0 and vector.normalize(delta) or vec_zero()
local v2 = vector.add(
vector.multiply(v, t),
vector.multiply(dir, speed * (1-t))

View File

@ -54,7 +54,6 @@ defense.mobs.register_mob("defense:aranay", {
collisionbox = {-0.4,-0.01,-0.4, 0.4,0.8,0.4},
mesh = "defense_aranay_core.b3d",
makes_footstep_sound = true,
automatic_face_movement_dir = false,
animation = {
idle = {a=0, b=19, rate=20},
@ -96,7 +95,7 @@ defense.mobs.register_mob("defense:aranay", {
local abs_dot = math.abs(dot(dir, wall))
local up = vector.normalize(vector.add(wall, vector.multiply(dir, -abs_dot)))
local rot = calculate_rotation(dir, up)
self.rotation = vector.multiply(rot, -180/math.pi)
self.rotation = {x=0,y=math.pi/2,z=0}
end
self.proxy:set_attach(self.object, "", {x=0, y=0, z=0}, self.rotation)
end
@ -118,6 +117,7 @@ defense.mobs.register_mob("defense:aranay", {
if anim_prop then
self.current_animation = name
self.current_animation_end = self.timer + (anim_prop.b - anim_prop.a - 1) / anim_prop.rate
-- This is the diff line
self.proxy:set_animation({x=anim_prop.a, y=anim_prop.b}, anim_prop.rate, 0)
end
end,

View File

@ -145,10 +145,13 @@ defense.mobs.register_mob("defense:botete", {
on_step = function(self, dtime)
defense.mobs.default_prototype.on_step(self, dtime)
if self.last_attack_time + self.attack_interval * 0.5 < self.timer then
if self.last_attack_time + self.attack_interval * 0.5 < self.timer or self.last_attack_time + 0.5 > self.timer then
self:hunt()
elseif not self.destination then
self.destination = vector.add(self.object:getpos(), {x=math.random(-10,10), y=math.random(-5,6), z=math.random(-10,10)})
self.automatic_face_movement_dir = true
self.object:set_properties({automatic_face_movement_dir = self.automatic_face_movement_dir})
end
end,
@ -186,6 +189,9 @@ defense.mobs.register_mob("defense:botete", {
projectile:setvelocity(v)
self.object:setvelocity(vector.multiply(v, -0.4))
self.automatic_face_movement_dir = false
self.object:set_properties({automatic_face_movement_dir = self.automatic_face_movement_dir})
if math.random() < 0.1 then
self.attack_range = 4 + math.random() * 4
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B