- Optimized event based regrowth algorithm - entities will be more compact instead of purely random in case of failure.
- Excluded non-craftable structures from the structure check, i.e. entities can spawn near beehives/ancient statues/mermhouses now.
This commit is contained in:
parent
dfa3e57bc9
commit
0e019aff63
@ -71,7 +71,7 @@ local config_table =
|
|||||||
{"spiderden","Spider Den",REGROWTH_TYPE.EVENT, 6},
|
{"spiderden","Spider Den",REGROWTH_TYPE.EVENT, 6},
|
||||||
{"catcoonden","Hollow Stump",REGROWTH_TYPE.EVENT, 4},
|
{"catcoonden","Hollow Stump",REGROWTH_TYPE.EVENT, 4},
|
||||||
{"rabbithouse","Rabbit Hutch",REGROWTH_TYPE.EVENT, 4},
|
{"rabbithouse","Rabbit Hutch",REGROWTH_TYPE.EVENT, 4},
|
||||||
{"monkeypods","Splumonkey Pod",REGROWTH_TYPE.EVENT, 4},
|
{"monkeybarrel","Splumonkey Pod",REGROWTH_TYPE.EVENT, 4},
|
||||||
{"slurtlehole", "Slurtle Mound", REGROWTH_TYPE.EVENT, 4},
|
{"slurtlehole", "Slurtle Mound", REGROWTH_TYPE.EVENT, 4},
|
||||||
{"tallbirdnest", "Tallbird Nest", REGROWTH_TYPE.EVENT, 4},
|
{"tallbirdnest", "Tallbird Nest", REGROWTH_TYPE.EVENT, 4},
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ local config_table =
|
|||||||
{"spiderden","Spider Den",REGROWTH_TYPE.EVENT, 6},
|
{"spiderden","Spider Den",REGROWTH_TYPE.EVENT, 6},
|
||||||
{"catcoonden","Hollow Stump",REGROWTH_TYPE.EVENT, 4},
|
{"catcoonden","Hollow Stump",REGROWTH_TYPE.EVENT, 4},
|
||||||
{"rabbithouse","Rabbit Hutch",REGROWTH_TYPE.EVENT, 4},
|
{"rabbithouse","Rabbit Hutch",REGROWTH_TYPE.EVENT, 4},
|
||||||
{"monkeypods","Splumonkey Pod",REGROWTH_TYPE.EVENT, 4},
|
{"monkeybarrel","Splumonkey Pod",REGROWTH_TYPE.EVENT, 4},
|
||||||
{"slurtlehole", "Slurtle Mound", REGROWTH_TYPE.EVENT, 4},
|
{"slurtlehole", "Slurtle Mound", REGROWTH_TYPE.EVENT, 4},
|
||||||
{"tallbirdnest", "Tallbird Nest", REGROWTH_TYPE.EVENT, 4},
|
{"tallbirdnest", "Tallbird Nest", REGROWTH_TYPE.EVENT, 4},
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ return Class(function(self, inst)
|
|||||||
assert(inst.ismastersim, "event_regrowth should not exist on client")
|
assert(inst.ismastersim, "event_regrowth should not exist on client")
|
||||||
|
|
||||||
require "map/terrain"
|
require "map/terrain"
|
||||||
|
require "wrpp_util"
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
--[[ Constants ]]
|
--[[ Constants ]]
|
||||||
@ -18,18 +19,11 @@ return Class(function(self, inst)
|
|||||||
local DEBUG = false
|
local DEBUG = false
|
||||||
local DEBUG_TELE = false
|
local DEBUG_TELE = false
|
||||||
local UPDATE_PERIOD = 9
|
local UPDATE_PERIOD = 9
|
||||||
local BASE_RADIUS = 20
|
|
||||||
local EXCLUDE_RADIUS = 2
|
|
||||||
local JITTER_RADIUS = 6
|
local JITTER_RADIUS = 6
|
||||||
local TOTAL_RADIUS = 1000
|
local MAX_RADIUS = 1000
|
||||||
local MIN_PLAYER_DISTANCE = 40
|
local INC_RADIUS = BASE_RADIUS / 2
|
||||||
local THREADS_PER_BATCH = 3
|
local THREADS_PER_BATCH = 3
|
||||||
local THREADS_PER_BATCH_HOOK = 5
|
local THREADS_PER_BATCH_HOOK = 5
|
||||||
local REGROW_STATUS = {
|
|
||||||
SUCCESS = 0,
|
|
||||||
FAILED = 1,
|
|
||||||
CACHE = 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
--[[ Member variables ]]
|
--[[ Member variables ]]
|
||||||
@ -53,104 +47,46 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
local position = ent:GetPosition()
|
local position = ent:GetPosition()
|
||||||
|
|
||||||
entity_list[ent.prefab][#entity_list[ent.prefab]+1] = {position = position, interval = regrowth_table[ent.prefab].interval, remove=false}
|
entity_list[ent.prefab][#entity_list[ent.prefab]+1] =
|
||||||
|
{
|
||||||
|
position = position,
|
||||||
|
interval = regrowth_table[ent.prefab].interval,
|
||||||
|
remove=false,
|
||||||
|
retry = 0
|
||||||
|
}
|
||||||
ent:RemoveEventCallback("onremove", EntityDeathEventHandler, nil)
|
ent:RemoveEventCallback("onremove", EntityDeathEventHandler, nil)
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] ", ent.prefab, " was removed at ", position)
|
print("[EventRegrowth] " .. ent.prefab .. " was removed at " .. GetPosStr(position))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function TestForRegrow(x, y, z, tile)
|
local function GetRandomLocation(x, y, z, r)
|
||||||
|
|
||||||
if IsAnyPlayerInRange(x,y,z, MIN_PLAYER_DISTANCE, nil) then
|
|
||||||
return REGROW_STATUS.CACHE
|
|
||||||
end
|
|
||||||
|
|
||||||
local ents = TheSim:FindEntities(x,y,z, BASE_RADIUS, nil, nil, { "structure", "wall" })
|
|
||||||
if #ents > 0 then
|
|
||||||
-- No regrowth around players and their bases
|
|
||||||
return REGROW_STATUS.FAILED
|
|
||||||
end
|
|
||||||
|
|
||||||
local ents = TheSim:FindEntities(x,y,z, EXCLUDE_RADIUS)
|
|
||||||
if #ents > 0 then
|
|
||||||
-- Too dense
|
|
||||||
return REGROW_STATUS.CACHE
|
|
||||||
end
|
|
||||||
|
|
||||||
if not (inst.Map:CanPlantAtPoint(x, y, z)) then
|
|
||||||
return REGROW_STATUS.CACHE
|
|
||||||
end
|
|
||||||
|
|
||||||
if inst.Map:GetTileAtPoint(x, y, z) ~= tile then
|
|
||||||
-- keep things in their biome (more or less)
|
|
||||||
return REGROW_STATUS.CACHE
|
|
||||||
end
|
|
||||||
|
|
||||||
return REGROW_STATUS.SUCCESS
|
|
||||||
end
|
|
||||||
|
|
||||||
-- duplicate of canregrow in natural regrowth
|
|
||||||
local function CanRegrow(x, y, z, prefab)
|
|
||||||
|
|
||||||
if IsAnyPlayerInRange(x,y,z, MIN_PLAYER_DISTANCE, nil) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local ents = TheSim:FindEntities(x,y,z, EXCLUDE_RADIUS)
|
|
||||||
if #ents > 0 then
|
|
||||||
-- Too dense
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local ents = TheSim:FindEntities(x,y,z, BASE_RADIUS, nil, nil, { "structure", "wall" })
|
|
||||||
if #ents > 0 then
|
|
||||||
-- Don't spawn inside bases
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
if not (inst.Map:CanPlantAtPoint(x, y, z) and
|
|
||||||
inst.Map:CanPlacePrefabFilteredAtPoint(x, y, z, prefab))
|
|
||||||
or (RoadManager ~= nil and RoadManager:IsOnRoad(x, 0, z)) then
|
|
||||||
-- Not ground we can grow on
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function GetRandomLocation(x, y, z, radius)
|
|
||||||
local theta = math.random() * 2 * PI
|
local theta = math.random() * 2 * PI
|
||||||
local radius = math.random() * radius
|
local radius = math.random() * r
|
||||||
local x = x + radius * math.cos(theta)
|
local x = x + radius * math.cos(theta)
|
||||||
local z = z - radius * math.sin(theta)
|
local z = z - radius * math.sin(theta)
|
||||||
return x,y,z
|
return x,y,z
|
||||||
end
|
end
|
||||||
|
|
||||||
local function TryRegrowth(prefab, product, position)
|
local function TryRegrowth(prefab, product, position, rand_radius)
|
||||||
local x,y,z = GetRandomLocation(position.x,position.y,position.z,JITTER_RADIUS)
|
local x,y,z = GetRandomLocation(position.x,position.y,position.z, rand_radius)
|
||||||
|
|
||||||
local orig_tile = inst.Map:GetTileAtPoint(x,y,z)
|
local orig_tile = inst.Map:GetTileAtPoint(x,y,z)
|
||||||
local status = TestForRegrow(x,y,z, orig_tile)
|
local status = TestRegrowthByTile(x,y,z, orig_tile)
|
||||||
|
|
||||||
if status == REGROW_STATUS.CACHE then
|
if status == REGROW_STATUS.CACHE then
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Cached a ",product," for prefab ",prefab," at ", x, ",", y,",",z)
|
print("[EventRegrowth] Cached a product " .. product .. " at ".. GetCoordStr(x,y,z) .. " for prefab " .. prefab .. " at " .. GetPosStr(position) .. " with rand radius ".. rand_radius)
|
||||||
end
|
end
|
||||||
return false
|
return REGROW_STATUS.CACHE
|
||||||
end
|
end
|
||||||
|
|
||||||
if status == REGROW_STATUS.FAILED then
|
if status == REGROW_STATUS.FAILED then
|
||||||
-- for the failed case, we want to try spawning at a random location
|
if DEBUG then
|
||||||
x,y,z = GetRandomLocation(position.x,position.y,position.z,TOTAL_RADIUS)
|
print("[EventRegrowth] Failed to spawn a product " .. product .. " at " .. GetCoordStr(x,y,z) .. " for prefab " .. prefab .. " at " .. GetPosStr(position) .. " with rand radius " .. rand_radius)
|
||||||
|
|
||||||
if not CanRegrow(x,y,z, product) then
|
|
||||||
-- if cannot regrow, return CACHE status
|
|
||||||
if DEBUG then
|
|
||||||
print("[EventRegrowth] Failed to spawn a ",product," for prefab ",prefab," at ", x, ",", y,",",z)
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
return REGROW_STATUS.FAILED
|
||||||
end
|
end
|
||||||
|
|
||||||
local instance = SpawnPrefab(product)
|
local instance = SpawnPrefab(product)
|
||||||
@ -159,7 +95,7 @@ return Class(function(self, inst)
|
|||||||
instance:ListenForEvent("onremove", EntityDeathEventHandler, nil)
|
instance:ListenForEvent("onremove", EntityDeathEventHandler, nil)
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Spawned a ",product," for prefab ",prefab," at ", x, ",", y,",",z)
|
print("[EventRegrowth] Spawned a product " .. product .. " at " .. GetCoordStr(x,y,z) .. " for prefab " .. prefab .. " at " .. GetPosStr(position) .. " with rand radius " .. rand_radius)
|
||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG_TELE then
|
if DEBUG_TELE then
|
||||||
@ -168,7 +104,7 @@ return Class(function(self, inst)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return REGROW_STATUS.SUCCESS
|
||||||
end
|
end
|
||||||
|
|
||||||
local function HookEntities(prefab)
|
local function HookEntities(prefab)
|
||||||
@ -184,7 +120,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Hooked ", count, " ",prefab)
|
print("[EventRegrowth] Hooked " .. count .. " " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -215,7 +151,7 @@ return Class(function(self, inst)
|
|||||||
|
|
||||||
if interval == nil then
|
if interval == nil then
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] WARNING: interval for ", prefab, " is null. Using default.")
|
print("[EventRegrowth] WARNING: interval for prefab " .. prefab .. " is null. Using default.")
|
||||||
end
|
end
|
||||||
interval = 480
|
interval = 480
|
||||||
end
|
end
|
||||||
@ -232,7 +168,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Registered ", product ," for ", prefab, " with interval ", interval)
|
print("[EventRegrowth] Registered product " .. product .. " for prefab " .. prefab .. " with interval " .. interval)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -248,10 +184,21 @@ return Class(function(self, inst)
|
|||||||
--[[ Update ]]
|
--[[ Update ]]
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
local function RegrowPrefabTask(prefab, data)
|
local function RegrowPrefabTask(prefab, data)
|
||||||
local success = TryRegrowth(prefab, regrowth_table[prefab].product, data.position)
|
local rand_radius = JITTER_RADIUS + data.retry * INC_RADIUS
|
||||||
if success then
|
if rand_radius > MAX_RADIUS then
|
||||||
|
rand_radius = MAX_RADIUS
|
||||||
|
end
|
||||||
|
|
||||||
|
local success = TryRegrowth(prefab, regrowth_table[prefab].product, data.position, rand_radius)
|
||||||
|
|
||||||
|
if success == REGROW_STATUS.SUCCESS then
|
||||||
data.remove = true
|
data.remove = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if success == REGROW_STATUS.FAILED then
|
||||||
|
-- only increase radius when there are structures nearby
|
||||||
|
data.retry = data.retry + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function self:LongUpdate(dt)
|
function self:LongUpdate(dt)
|
||||||
@ -275,7 +222,7 @@ return Class(function(self, inst)
|
|||||||
if entity_list[prefab][i].remove then
|
if entity_list[prefab][i].remove then
|
||||||
-- handle expired objects first
|
-- handle expired objects first
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Removed ", i, "th" , prefab, " at ", entity_list[prefab][i].position, " from entity list - successfully respawned")
|
print("[EventRegrowth] Removed prefab " .. prefab .. " at ".. GetPosStr(entity_list[prefab][i].position) .." from the entity list.")
|
||||||
end
|
end
|
||||||
table.remove(entity_list[prefab], i)
|
table.remove(entity_list[prefab], i)
|
||||||
else
|
else
|
||||||
@ -288,7 +235,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth]", prefab, " at ", entity_list[prefab][i].position, " has interval ", entity_list[prefab][i].interval )
|
print("[EventRegrowth] Prefab " .. prefab .. " at " .. GetPosStr(entity_list[prefab][i].position) .. " has interval " .. entity_list[prefab][i].interval )
|
||||||
end
|
end
|
||||||
|
|
||||||
if entity_list[prefab][i].interval == 0 then
|
if entity_list[prefab][i].interval == 0 then
|
||||||
@ -322,10 +269,21 @@ return Class(function(self, inst)
|
|||||||
-- could be nil (set in the event loop)
|
-- could be nil (set in the event loop)
|
||||||
data.entities[prefab] = {}
|
data.entities[prefab] = {}
|
||||||
for i = 1, #entity_list[prefab] do
|
for i = 1, #entity_list[prefab] do
|
||||||
data.entities[prefab][#data.entities[prefab] + 1] = {interval = entity_list[prefab][i].interval, position = entity_list[prefab][i].position, remove = entity_list[prefab][i].remove}
|
data.entities[prefab][#data.entities[prefab] + 1] =
|
||||||
|
{
|
||||||
|
interval = entity_list[prefab][i].interval,
|
||||||
|
position =
|
||||||
|
{
|
||||||
|
x = entity_list[prefab][i].position.x,
|
||||||
|
y = entity_list[prefab][i].position.y,
|
||||||
|
z = entity_list[prefab][i].position.z
|
||||||
|
},
|
||||||
|
remove = entity_list[prefab][i].remove,
|
||||||
|
retry = entity_list[prefab][i].retry
|
||||||
|
}
|
||||||
end
|
end
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Saved ", #data.entities[prefab]," entities for ", prefab)
|
print("[EventRegrowth] Saved " .. #data.entities[prefab] .. " entities for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -337,10 +295,21 @@ return Class(function(self, inst)
|
|||||||
if entity_list[prefab] == nil then
|
if entity_list[prefab] == nil then
|
||||||
entity_list[prefab] = {}
|
entity_list[prefab] = {}
|
||||||
for i = 1, #data.entities[prefab] do
|
for i = 1, #data.entities[prefab] do
|
||||||
entity_list[prefab][#entity_list[prefab] + 1] = {interval = data.entities[prefab][i].interval, position = data.entities[prefab][i].position, remove = data.entities[prefab][i].remove}
|
entity_list[prefab][#entity_list[prefab] + 1] =
|
||||||
|
{
|
||||||
|
interval = data.entities[prefab][i].interval,
|
||||||
|
position =
|
||||||
|
{
|
||||||
|
x = data.entities[prefab][i].position.x,
|
||||||
|
y = data.entities[prefab][i].position.y,
|
||||||
|
z = data.entities[prefab][i].position.z
|
||||||
|
},
|
||||||
|
remove = (data.entities[prefab][i].remove == nil) and false or data.entities[prefab][i].remove,
|
||||||
|
retry = (data.entities[prefab][i].retry == nil) and 0 or data.entities[prefab][i].retry
|
||||||
|
}
|
||||||
end
|
end
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[EventRegrowth] Loaded ", #entity_list[prefab]," entities for ", prefab)
|
print("[EventRegrowth] Loaded " .. #entity_list[prefab] .. " entities for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -11,6 +11,7 @@ return Class(function(self, inst)
|
|||||||
assert(inst.ismastersim, "natural_regrowth should not exist on client")
|
assert(inst.ismastersim, "natural_regrowth should not exist on client")
|
||||||
|
|
||||||
require "map/terrain"
|
require "map/terrain"
|
||||||
|
require "wrpp_util"
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
--[[ Constants ]]
|
--[[ Constants ]]
|
||||||
@ -18,9 +19,6 @@ return Class(function(self, inst)
|
|||||||
local DEBUG = false
|
local DEBUG = false
|
||||||
local DEBUG_TELE = false
|
local DEBUG_TELE = false
|
||||||
local UPDATE_PERIOD = 11
|
local UPDATE_PERIOD = 11
|
||||||
local BASE_RADIUS = 20
|
|
||||||
local EXCLUDE_RADIUS = 2
|
|
||||||
local MIN_PLAYER_DISTANCE = 40
|
|
||||||
local THREADS_PER_BATCH = 3
|
local THREADS_PER_BATCH = 3
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
--[[ Member variables ]]
|
--[[ Member variables ]]
|
||||||
@ -39,35 +37,8 @@ return Class(function(self, inst)
|
|||||||
--[[ Private member functions ]]
|
--[[ Private member functions ]]
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
local function CanRegrow(x, y, z, prefab)
|
|
||||||
|
|
||||||
if IsAnyPlayerInRange(x,y,z, MIN_PLAYER_DISTANCE, nil) then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local ents = TheSim:FindEntities(x,y,z, EXCLUDE_RADIUS)
|
|
||||||
if #ents > 0 then
|
|
||||||
-- Too dense
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local ents = TheSim:FindEntities(x,y,z, BASE_RADIUS, nil, nil, { "structure", "wall" })
|
|
||||||
if #ents > 0 then
|
|
||||||
-- Don't spawn inside bases
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
if not (inst.Map:CanPlantAtPoint(x, y, z) and
|
|
||||||
inst.Map:CanPlacePrefabFilteredAtPoint(x, y, z, prefab))
|
|
||||||
or (RoadManager ~= nil and RoadManager:IsOnRoad(x, 0, z)) then
|
|
||||||
-- Not ground we can grow on
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
local function TryRegrowth(x, y, z , prefab, product)
|
local function TryRegrowth(x, y, z , prefab, product)
|
||||||
if CanRegrow(x,0,z, product) then
|
if TestRegrowthByPrefab(x,0,z, product) == REGROW_STATUS.SUCCESS then
|
||||||
local instance = SpawnPrefab(product)
|
local instance = SpawnPrefab(product)
|
||||||
|
|
||||||
if instance ~= nil then
|
if instance ~= nil then
|
||||||
@ -75,7 +46,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Spawned a ",product," for prefab ",prefab," at ", "(", x,0,z, ")")
|
print("[NaturalRegrowth] Spawned a product " .. product .. " at " .. GetCoordStr(x,0,z) .. " for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG_TELE then
|
if DEBUG_TELE then
|
||||||
@ -85,7 +56,7 @@ return Class(function(self, inst)
|
|||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Failed to spawn a ",product," for prefab ",prefab," at ", "(", x,0,z, ")")
|
print("[NaturalRegrowth] Failed to spawn a product " .. product .. " at " .. GetCoordStr(x,0,z) .. " for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
@ -107,7 +78,7 @@ return Class(function(self, inst)
|
|||||||
|
|
||||||
if area_data[prefab] ~= nil then
|
if area_data[prefab] ~= nil then
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Already populated ", prefab)
|
print("[NaturalRegrowth] Already populated prefab " .. prefab)
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -129,7 +100,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Populated ", area_data[prefab] == nil and 0 or #area_data[prefab], " areas for ", prefab)
|
print("[NaturalRegrowth] Populated " .. (area_data[prefab] == nil and 0 or #area_data[prefab]) .. " areas for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -155,13 +126,13 @@ return Class(function(self, inst)
|
|||||||
|
|
||||||
if interval == nil then
|
if interval == nil then
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] WARNING: interval for ", prefab, " is null. Using default.")
|
print("[NaturalRegrowth] WARNING: interval for prefab " .. prefab .. " is null. Using default.")
|
||||||
end
|
end
|
||||||
interval = 480
|
interval = 480
|
||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Registered ", product, " for prefab " ,prefab, " with interval ", interval)
|
print("[NaturalRegrowth] Registered product " .. product .. " for prefab " .. prefab .. " with interval " .. interval)
|
||||||
end
|
end
|
||||||
regrowth_table[prefab] = {product = product, interval = interval}
|
regrowth_table[prefab] = {product = product, interval = interval}
|
||||||
|
|
||||||
@ -184,15 +155,6 @@ return Class(function(self, inst)
|
|||||||
--[[ Update ]]
|
--[[ Update ]]
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
-- duplicate of event_regrowth
|
|
||||||
local function GetRandomLocation(x, y, z, radius)
|
|
||||||
local theta = math.random() * 2 * PI
|
|
||||||
local radius = math.random() * radius
|
|
||||||
local x = x + radius * math.cos(theta)
|
|
||||||
local z = z - radius * math.sin(theta)
|
|
||||||
return x,y,z
|
|
||||||
end
|
|
||||||
|
|
||||||
local function RegrowPrefabTask(areas, prefab)
|
local function RegrowPrefabTask(areas, prefab)
|
||||||
local success = false
|
local success = false
|
||||||
local rand = math.random(1, #areas)
|
local rand = math.random(1, #areas)
|
||||||
@ -240,7 +202,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth]", prefab, " has interval ", intervals[prefab])
|
print("[NaturalRegrowth] Prefab " .. prefab .. " has interval " .. intervals[prefab])
|
||||||
end
|
end
|
||||||
|
|
||||||
if intervals[prefab] == 0 then
|
if intervals[prefab] == 0 then
|
||||||
@ -274,7 +236,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Saved ", #data.areas[prefab]," areas for ", prefab)
|
print("[NaturalRegrowth] Saved " .. #data.areas[prefab] .. " areas for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for prefab, interval in pairs(intervals) do
|
for prefab, interval in pairs(intervals) do
|
||||||
@ -282,7 +244,7 @@ return Class(function(self, inst)
|
|||||||
-- it can be set to nil in the event loop
|
-- it can be set to nil in the event loop
|
||||||
data.intervals[prefab] = interval
|
data.intervals[prefab] = interval
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Saved interval ", data.intervals[prefab]," for ", prefab)
|
print("[NaturalRegrowth] Saved interval " .. data.intervals[prefab] .. " for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -298,7 +260,7 @@ return Class(function(self, inst)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Loaded", #area_data[prefab]," areas for ", prefab)
|
print("[NaturalRegrowth] Loaded" .. #area_data[prefab] .. " areas for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -306,7 +268,7 @@ return Class(function(self, inst)
|
|||||||
for prefab, interval in pairs(data.intervals) do
|
for prefab, interval in pairs(data.intervals) do
|
||||||
intervals[prefab] = interval
|
intervals[prefab] = interval
|
||||||
if DEBUG then
|
if DEBUG then
|
||||||
print("[NaturalRegrowth] Loaded interval ", intervals[prefab]," for ", prefab)
|
print("[NaturalRegrowth] Loaded interval " .. intervals[prefab] .. " for prefab " .. prefab)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
114
src/scripts/wrpp_util.lua
Normal file
114
src/scripts/wrpp_util.lua
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
EXCLUDE_TAGS =
|
||||||
|
{
|
||||||
|
"statue", -- marble stuff on the ground, ancient statues
|
||||||
|
"hive", --spiderden, wasphive, beehive
|
||||||
|
}
|
||||||
|
|
||||||
|
EXCLUDE_PREFABS =
|
||||||
|
{
|
||||||
|
catcoonden = 1,
|
||||||
|
ancient_altar = 1,
|
||||||
|
ancient_altar_broken = 1,
|
||||||
|
houndmound = 1,
|
||||||
|
mermhouse = 1,
|
||||||
|
pigtorch = 1,
|
||||||
|
mermhead = 1,
|
||||||
|
pighead = 1,
|
||||||
|
pandoraschest = 1,
|
||||||
|
minotaurchest = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
BASE_RADIUS = 20
|
||||||
|
EXCLUDE_RADIUS = 2
|
||||||
|
MIN_PLAYER_DISTANCE = 40
|
||||||
|
|
||||||
|
REGROW_STATUS =
|
||||||
|
{
|
||||||
|
SUCCESS = 0,
|
||||||
|
FAILED = 1,
|
||||||
|
CACHE = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
local function TestStructures(x, y, z, radius)
|
||||||
|
local ents = TheSim:FindEntities(x,y,z, BASE_RADIUS, nil, EXCLUDE_TAGS, { "structure", "wall" })
|
||||||
|
|
||||||
|
for i, v in ipairs(ents) do
|
||||||
|
if EXCLUDE_PREFABS[v.prefab] == nil then
|
||||||
|
-- if we cannot find it from the exclude table, then it is a structure and we failed the test
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function TestPlayers(x, y, z, radius)
|
||||||
|
return not IsAnyPlayerInRange(x,y,z, MIN_PLAYER_DISTANCE, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function TestEntities(x, y, z, radius)
|
||||||
|
local ents = TheSim:FindEntities(x,y,z, EXCLUDE_RADIUS)
|
||||||
|
return not (#ents > 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestRegrowthByTile(x, y, z, tile)
|
||||||
|
|
||||||
|
if not TestPlayers(x,y,z, MIN_PLAYER_DISTANCE) then
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
if not TestStructures(x, y, z, BASE_RADIUS) then
|
||||||
|
-- No regrowth around players and their bases
|
||||||
|
return REGROW_STATUS.FAILED
|
||||||
|
end
|
||||||
|
|
||||||
|
if not TestEntities(x,y,z, EXCLUDE_RADIUS) then
|
||||||
|
-- Too dense
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
if not (TheWorld.Map:CanPlantAtPoint(x, y, z)) then
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
if TheWorld.Map:GetTileAtPoint(x, y, z) ~= tile then
|
||||||
|
-- keep things in their biome (more or less)
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
return REGROW_STATUS.SUCCESS
|
||||||
|
end
|
||||||
|
|
||||||
|
function TestRegrowthByPrefab(x, y, z, prefab)
|
||||||
|
|
||||||
|
if not TestPlayers(x,y,z, MIN_PLAYER_DISTANCE) then
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
if not TestStructures(x, y, z, BASE_RADIUS) then
|
||||||
|
-- No regrowth around players and their bases
|
||||||
|
return REGROW_STATUS.FAILED
|
||||||
|
end
|
||||||
|
|
||||||
|
if not TestEntities(x,y,z, EXCLUDE_RADIUS) then
|
||||||
|
-- Too dense
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
if not (TheWorld.Map:CanPlantAtPoint(x, y, z) and
|
||||||
|
TheWorld.Map:CanPlacePrefabFilteredAtPoint(x, y, z, prefab))
|
||||||
|
or (RoadManager ~= nil and RoadManager:IsOnRoad(x, 0, z)) then
|
||||||
|
-- Not ground we can grow on
|
||||||
|
return REGROW_STATUS.CACHE
|
||||||
|
end
|
||||||
|
|
||||||
|
return REGROW_STATUS.SUCCESS
|
||||||
|
end
|
||||||
|
|
||||||
|
function GetPosStr(pos)
|
||||||
|
return "( " .. pos.x .. " , " .. pos.y .. " , ".. pos.z .. " )"
|
||||||
|
end
|
||||||
|
|
||||||
|
function GetCoordStr(x,y,z)
|
||||||
|
return "( " .. x .. " , " .. y .. " , ".. z .. " )"
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user