From 5959c9e84ad5da758f519dd4bf99dab80a1948ea Mon Sep 17 00:00:00 2001 From: secXsQuared Date: Sat, 27 Jan 2018 19:44:49 -0500 Subject: [PATCH] Beta Release. --- modicon.tex | Bin 16402 -> 0 bytes modicon.xml | 3 - modinfo.lua | 98 +++++++++++++++- modmain.lua | 83 ++++++------- scripts/components/event_regrowth.lua | 55 +++++---- scripts/components/natural_regrowth.lua | 147 ++++++++++++++++-------- 6 files changed, 265 insertions(+), 121 deletions(-) delete mode 100644 modicon.tex delete mode 100644 modicon.xml diff --git a/modicon.tex b/modicon.tex deleted file mode 100644 index 01e48fa5bafbf3e38b54b92bcdde6320df509aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16402 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 Vvs_&(BwJHr;7=-ema=@wV8N{L-z)l0t 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 Zzm~s5`T1Ah?@s;g&h!~mmvF!D{~sbPVR--m diff --git a/modicon.xml b/modicon.xml deleted file mode 100644 index 122e546..0000000 --- a/modicon.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/modinfo.lua b/modinfo.lua index a65c70c..9b751b2 100644 --- a/modinfo.lua +++ b/modinfo.lua @@ -1,15 +1,103 @@ name = "Advanced World Regrowth" -description = "Advanced world regrowth" +description = "Advanced world regrowth including caves!\nSee the Steam Workshop page for more information." author = "lolo" -version = "1.0.0" +version = "0.1.0" forumthread = "" api_version = 10 -icon_atlas = "modicon.xml" -icon = "modicon.tex" +--icon_atlas = "modicon.xml" +--icon = "modicon.tex" all_clients_require_mod = false client_only_mod = false -dst_compatible = true \ No newline at end of file +dst_compatible = true + +-- Configuration Generation +local config_table = +{ + {"evergreen","Evergreen","Natural"}, + {"deciduoustree","Birchnut Tree","Natural"}, + {"marsh_tree","Spiky Tree","Natural"}, + {"twiggytree","Twiggy Tree","Natural"}, + {"marbletree","Marble Tree","Event-based"}, + {"livingtree","Totally Normal Tree","Event-based"}, + + {"berrybush","Berry Bush","Natural"}, + {"berrybush2","Spiky Berry Bush","Natural"}, + {"berrybush_juicy","Juicy Berry Bush","Natural"}, + + {"carrot_planted","Carrot","Natural"}, + {"flower","Flower","Natural"}, + {"flower_evil","Evil Flower","Event-based"}, + {"blue_mushroom","Blue Mushroom","Natural"}, + {"red_mushroom","Red Mushroom","Natural"}, + {"green_mushroom","Green Mushroom","Natural"}, + {"cactus","Cactus","Natural"}, + {"mandrake","Mandrake","Event-based"}, + + {"reeds","Reeds","Natural"}, + {"sapling","Sapling","Natural"}, + {"grass","Grass","Natural"}, + {"marsh_bush","Spiky Bush","Natural"}, + + {"rock1","Boulder","Natural"}, + {"rock2","Gold Vein","Natural"}, + {"rock_flintless","Flintless Boulder","Natural"}, + {"rock_moon","Moon Rock","Natural"}, + + {"stalagmite","Stalagmite","Natural"}, + {"stalagmite_tall","Tall Stalagmite","Natural"}, + + {"beehive","Beehive","Event-based"}, + {"wasphive","Killer Bee Hive","Event-based"}, + {"houndmound","Hound Mound","Event-based"}, + {"pighouse","Pig House","Event-based"}, + {"mermhouse","Rundown House","Event-based"}, + {"spiderden","Spider Den","Event-based"}, + {"catcoonden","Hollow Stump","Event-based"}, + {"rabbithouse","Rabbit Hutch","Event-based"}, + {"monkeypods","Splumonkey Pod","Event-based"}, + {"slurtlehole", "Slurtle Mound", "Event-based"}, + + {"fireflies","Fireflies","Event-based"}, + {"tentacle","Tentacle","Event-based"}, + {"knight","Clockwork Knight","Event-based"}, + {"bishop","Clockwork Bishop","Event-based"}, + {"rook","Clockwork Rook","Event-based"}, + {"knight_nightmare","Damaged Knight","Event-based"}, + {"bishop_nightmare","Damaged Bishop","Event-based"}, + {"rook_nightmare","Damaged Rook","Event-based"}, + + {"ruins_statue_mage","Ancient Mage Statue","Event-based"}, + {"ruins_statue_mage_nogem","Gemless Ancient Mage Statue","Event-based"}, + {"ruins_statue_head","Ancient Head Statue","Event-based"}, + {"ruins_statue_head_nogem", "Gemless Ancient Head Statue", "Event-based"} +} + +local config_options = {} + +for i = 1, #config_table do + local entry = + { + name = config_table[i][1], + label = config_table[i][2], + hover = config_table[i][3], + options = + { + { + description = "Disabled", + data = false + }, + { + description = "Enabled", + data = true + } + }, + default = true + } + config_options[#config_options+1] = entry +end + +configuration_options = config_options \ No newline at end of file diff --git a/modmain.lua b/modmain.lua index 8b210f8..006601c 100644 --- a/modmain.lua +++ b/modmain.lua @@ -24,75 +24,76 @@ end local natural = { - --plants - berrybush = 1440, - berrybush2 = 1440, - berrybush_juicy = 1440, + berrybush = 1451, + berrybush2 = 1429, + berrybush_juicy = 1429, carrot_planted = 240, - evergreen = 30, - deciduoustree = 30, + evergreen = 251, + deciduoustree = 251, marsh_tree = 480, - twiggytree = 480, - flower = 240, - flower_evil = 480, - grass = 240, - blue_mushroom = 240, + twiggytree = 491, + flower = 229, + grass = 229, + blue_mushroom = 251, red_mushroom = 240, green_mushroom = 240, reeds = 480, sapling = 240, marsh_bush = 480, - cactus = 480, - rock1 = 240, + cactus = 479, + rock1 = 229, rock2 = 240, - rock_flintless = 240, - marbletree=1440, + rock_flintless = 251, rock_moon = 480, - stalagmite = 240, + stalagmite = 489, stalagmite_tall = 240, } local event = { - houndbone = 960, - pighead = 960, - marblepillar = 1440, - livingtree = 960, - mandrake = 960, - beehive = 480, - wasphive = 960, - houndmound = 1440, + flower_evil = 480, + marbletree= 960, + livingtree = 969, + mandrake = 969, + beehive = 489, + wasphive = 969, + houndmound = 1449, pighouse = 960, mermhouse = 960, - spiderden = 960, - molehill = 960, - catcoonden = 960, - tentacle = 480, - rabbithole = 480, - fireflies = 480, - knight = 23, - bishop = 9, - rook = 34, - knight_nightmare = 1440, + spiderden = 1431, + catcoonden = 951, + tentacle = 489, + rabbithole = 471, + fireflies = 471, + knight = 1431, + bishop = 1431, + rook = 1449, + knight_nightmare = 1449, bishop_nightmare = 1440, rook_nightmare = 1440, - monkeypods = 1440, - ruins_statue_mage = 960, - ruins_statue_mage_nogem = 960, + monkeypods = 951, + ruins_statue_mage = 969, + ruins_statue_mage_nogem = 969, ruins_statue_head = 960, - ruins_statue_head_nogem = 960, - rabbithouse = 960 + ruins_statue_head_nogem = 951, + rabbithouse = 951, + slurtlehole = 951 } AddComponentPostInit("natural_regrowth", function(component) for prefab, time in pairs(natural) do - component:RegisterRegrowth(prefab, prefab, time) + if GetModConfigData(prefab) then + component:RegisterRegrowth(prefab, prefab, time) + end end + component:FinishModConfig() end) AddComponentPostInit("event_regrowth", function(component) for prefab, time in pairs(event) do - component:RegisterRegrowth(prefab, prefab, time) + if GetModConfigData(prefab) then + component:RegisterRegrowth(prefab, prefab, time) + end end component:FinishModConfig() end) diff --git a/scripts/components/event_regrowth.lua b/scripts/components/event_regrowth.lua index a86c0f5..0020057 100644 --- a/scripts/components/event_regrowth.lua +++ b/scripts/components/event_regrowth.lua @@ -15,17 +15,17 @@ return Class(function(self, inst) -------------------------------------------------------------------------- --[[ Constants ]] -------------------------------------------------------------------------- - local DEBUG = true + local DEBUG = false local DEBUG_TELE = false - local UPDATE_PERIOD = 11 + local UPDATE_PERIOD = 9 local BASE_RADIUS = 20 local EXCLUDE_RADIUS = 3 local JITTER_RADIUS = 6 local TOTAL_RADIUS = 1000 local MIN_PLAYER_DISTANCE = 40 - local THREADS_PER_BATCH = 5 -- since we retry a lot, we reduce the # of threads to guarantee performance - local THREADS_PER_BATCH_HOOK = 5 + local THREADS_PER_BATCH = 3 + local THREADS_PER_BATCH_HOOK = 2 local REGROW_STATUS = { SUCCESS = 0, FAILED = 1, @@ -54,7 +54,7 @@ return Class(function(self, inst) end local position = ent:GetPosition() - table.insert(entity_list[ent.prefab], {position = position, interval = regrowth_table[ent.prefab].interval}) + entity_list[ent.prefab][#entity_list[ent.prefab]+1] = {position = position, interval = regrowth_table[ent.prefab].interval} ent:RemoveEventCallback("onremove", EntityDeathEventHandler, nil) if DEBUG then @@ -63,24 +63,25 @@ return Class(function(self, inst) end local function TestForRegrow(x, y, z, tile) + + 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 + if #ents > 0 then -- No regrowth around players and their bases return REGROW_STATUS.FAILED end - - if inst.Map:GetTileAtPoint(x, y, z) ~= tile then - -- keep things in their biome (more or less) - return REGROW_STATUS.CACHE - end - + local ents = TheSim:FindEntities(x,y,z, EXCLUDE_RADIUS) if #ents > 0 then -- Too dense return REGROW_STATUS.CACHE end - if IsAnyPlayerInRange(x,y,z, MIN_PLAYER_DISTANCE, nil) then + if inst.Map:GetTileAtPoint(x, y, z) ~= tile then + -- keep things in their biome (more or less) return REGROW_STATUS.CACHE end @@ -211,6 +212,7 @@ return Class(function(self, inst) product = product, interval = interval } + HookEntities(prefab) end @@ -230,9 +232,9 @@ return Class(function(self, inst) -------------------------------------------------------------------------- --[[ Update ]] -------------------------------------------------------------------------- - local function RegrowPrefabTask(prefab) + local function RegrowPrefabTask(prefab, position) for i = #entity_list[prefab],1,-1 do - local success = TryRegrowth(prefab, regrowth_table[prefab].product, entity_list[prefab][i].position) + local success = TryRegrowth(prefab, regrowth_table[prefab].product, position) if success then -- remove from the list if it's success or failed @@ -273,7 +275,7 @@ return Class(function(self, inst) if entity_list[prefab][i].interval == 0 then -- different threads - inst:DoTaskInTime(delay, function() RegrowPrefabTask(prefab) end) + inst:DoTaskInTime(delay, function() RegrowPrefabTask(prefab, entity_list[prefab][i].position) end) -- try not to flood the server with threads count = count + 1 @@ -296,9 +298,15 @@ return Class(function(self, inst) entities = {} } for prefab in pairs(entity_list) do - data.entities[prefab] = {} - for i = 1, #entity_list[prefab] do - table.insert(data.entities[prefab], {interval = entity_list[prefab][i].interval, position = entity_list[prefab][i].position}) + if entity_list[prefab] ~= nil then + -- could be nil (set in the event loop) + data.entities[prefab] = {} + 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} + end + if DEBUG then + print("[EventRegrowth] Saved ", #data.entities[prefab]," entities for ", prefab) + end end end return data @@ -308,9 +316,12 @@ return Class(function(self, inst) for prefab in pairs(data.entities) do if entity_list[prefab] == nil then entity_list[prefab] = {} - end - for i = 1, #data.entities[prefab] do - table.insert(entity_list[prefab], {interval = data.entities[prefab][i].interval, position = data.entities[prefab][i].position}) + 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} + end + if DEBUG then + print("[EventRegrowth] Loaded ", #entity_list[prefab]," entities for ", prefab) + end end end end diff --git a/scripts/components/natural_regrowth.lua b/scripts/components/natural_regrowth.lua index 75ab353..dbb288a 100644 --- a/scripts/components/natural_regrowth.lua +++ b/scripts/components/natural_regrowth.lua @@ -8,7 +8,7 @@ return Class(function(self, inst) - assert(inst.ismastersim, "natrual_regrowth should not exist on client") + assert(inst.ismastersim, "natural_regrowth should not exist on client") require "map/terrain" @@ -17,11 +17,11 @@ return Class(function(self, inst) -------------------------------------------------------------------------- local DEBUG = false local DEBUG_TELE = false - local UPDATE_PERIOD = 9 + local UPDATE_PERIOD = 11 local BASE_RADIUS = 20 local EXCLUDE_RADIUS = 3 local MIN_PLAYER_DISTANCE = 40 - local THREADS_PER_BATCH = 5 + local THREADS_PER_BATCH = 3 -------------------------------------------------------------------------- --[[ Member variables ]] -------------------------------------------------------------------------- @@ -33,6 +33,7 @@ return Class(function(self, inst) local regrowth_table = {} local area_data = {} local intervals = {} + local regrowth_table_populated_by_mod = false -------------------------------------------------------------------------- --[[ Private member functions ]] @@ -65,18 +66,7 @@ return Class(function(self, inst) return true end - local function TryRegrowth(area, prefab, product) - if inst.topology.nodes[area] == nil then - return false - end - - local points_x, points_y = inst.Map:GetRandomPointsForSite(inst.topology.nodes[area].x, inst.topology.nodes[area].y, inst.topology.nodes[area].poly, 1) - if #points_x < 1 or #points_y < 1 then - return false - end - local x = points_x[1] - local z = points_y[1] - + local function TryRegrowth(x, y, z , prefab, product) if CanRegrow(x,0,z, product) then local instance = SpawnPrefab(product) @@ -85,7 +75,7 @@ return Class(function(self, inst) end if DEBUG then - print("[NaturalRegrowth] Spawned a ",product," for prefab ",prefab," at ", "(", x,0,z, ")", " in ", area) + print("[NaturalRegrowth] Spawned a ",product," for prefab ",prefab," at ", "(", x,0,z, ")") end if DEBUG_TELE then @@ -95,7 +85,7 @@ return Class(function(self, inst) return true else if DEBUG then - print("[NaturalRegrowth] Failed to spawn a ",product," for prefab ",prefab," at ", "(", x,0,z, ")", " in ", area) + print("[NaturalRegrowth] Failed to spawn a ",product," for prefab ",prefab," at ", "(", x,0,z, ")") end return false end @@ -111,12 +101,18 @@ return Class(function(self, inst) local function PopulateAreaData(prefab) if inst.generated == nil then - -- Still starting up, not ready yet. + -- Still starting up + return + end + + if area_data[prefab] ~= nil then + if DEBUG then + print("[NaturalRegrowth] Already populated ", prefab) + end return end -- PrintDensities() - for area, densities in pairs(inst.generated.densities) do if densities[prefab] ~= nil then for id, v in ipairs(inst.topology.ids) do @@ -125,7 +121,7 @@ return Class(function(self, inst) area_data[prefab] = {} end - table.insert(area_data[prefab], id) + area_data[prefab][#area_data[prefab] + 1] = id break end end @@ -147,6 +143,10 @@ return Class(function(self, inst) -------------------------------------------------------------------------- --[[ Public member functions ]] -------------------------------------------------------------------------- + + function self:FinishModConfig() + regrowth_table_populated_by_mod = true + end function self:RegisterRegrowth(prefab, product, interval) if DEBUG then @@ -173,9 +173,32 @@ return Class(function(self, inst) --[[ 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 success = false local rand = math.random(1, #areas) - local success = TryRegrowth(areas[rand], prefab, regrowth_table[prefab].product) + local area = areas[rand] + + if inst.topology.nodes[area] == nil then + return false + end + + local points_x, points_y = inst.Map:GetRandomPointsForSite(inst.topology.nodes[area].x, inst.topology.nodes[area].y, inst.topology.nodes[area].poly, 1) + + if #points_x < 1 or #points_y < 1 then + return false + end + + success = TryRegrowth(points_x[1], 0, points_y[1], prefab, regrowth_table[prefab].product) + if success then -- success, reset the timer intervals[prefab] = regrowth_table[prefab] == nil and nil or regrowth_table[prefab].interval @@ -183,35 +206,42 @@ return Class(function(self, inst) end function self:LongUpdate(dt) + + if not regrowth_table_populated_by_mod then + -- do nothing if the table is not fully initialized + -- in case we accidentally drop some saved entities due to the respawn_table[prefab] == nil check + return + end + local count = 0 local delay = 0 + + -- area data because we only care about stuff that can naturally spawn for prefab in pairs(area_data) do - local areas = area_data[prefab] - - if regrowth_table[prefab] == nil then - area_data[prefab] = nil - intervals[prefab] = nil - else - if intervals[prefab] > UPDATE_PERIOD then - intervals[prefab] = intervals[prefab] - UPDATE_PERIOD + if regrowth_table[prefab] == nil or area_data[prefab] == nil then + -- if regrowth table didn't register, or the entity doesn't have a natural density, do nothing + intervals[prefab] = nil else - intervals[prefab] = 0 - end - - if DEBUG then - print("[NaturalRegrowth]", prefab, " has interval ", intervals[prefab]) - end + if intervals[prefab] > UPDATE_PERIOD then + intervals[prefab] = intervals[prefab] - UPDATE_PERIOD + else + intervals[prefab] = 0 + end + + if DEBUG then + print("[NaturalRegrowth]", prefab, " has interval ", intervals[prefab]) + end - if intervals[prefab] == 0 then - -- use multiple threads? In the future a threadpool maybe? - inst:DoTaskInTime(delay, function() RegrowPrefabTask(areas,prefab) end) - -- try not to flood the server with threads - count = count + 1 - if math.fmod( count,THREADS_PER_BATCH ) == 0 then - delay = delay + 1 + if intervals[prefab] == 0 then + -- use multiple threads? In the future a threadpool maybe? + inst:DoTaskInTime(delay, function() RegrowPrefabTask(area_data[prefab], prefab) end) + -- try not to flood the server with threads + count = count + 1 + if math.fmod( count,THREADS_PER_BATCH ) == 0 then + delay = delay + 1 + end end end - end end end @@ -228,27 +258,44 @@ return Class(function(self, inst) data.areas[prefab] = {} for i = 1, #area_data[prefab] do - table.insert(data.areas[prefab], area_data[prefab][i]) + data.areas[prefab][#data.areas[prefab] + 1] = area_data[prefab][i] + end + + if DEBUG then + print("[NaturalRegrowth] Saved ", #data.areas[prefab]," areas for ", prefab) end end for prefab, interval in pairs(intervals) do - data.intervals[prefab] = interval + if interval ~= nil then + -- it can be set to nil in the event loop + data.intervals[prefab] = interval + if DEBUG then + print("[NaturalRegrowth] Saved interval ", data.intervals[prefab]," for ", prefab) + end + end end return data end function self:OnLoad(data) for prefab in pairs(data.areas) do - if area_data[prefab] == nil then - area_data[prefab] = {} - end - for i = 1, #data.areas[prefab] do - table.insert(area_data[prefab], data.areas[prefab][i]) + if area_data[prefab] == nil then + area_data[prefab] = {} + for i = 1, #data.areas[prefab] do + area_data[prefab][#area_data[prefab] + 1] = data.areas[prefab][i] + end + + if DEBUG then + print("[NaturalRegrowth] Loaded", #area_data[prefab]," areas for ", prefab) + end end end for prefab, interval in pairs(data.intervals) do intervals[prefab] = interval + if DEBUG then + print("[NaturalRegrowth] Loaded interval ", intervals[prefab]," for ", prefab) + end end end