Maintenance update.
parent
b4421f973e
commit
d5acd6d803
|
@ -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)
|
|
@ -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
|
||||
|
|
|
@ -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")
|
|
@ -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))
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 |
Loading…
Reference in New Issue