From fbb647fa92816c014d1de32252e422a38f6b884d Mon Sep 17 00:00:00 2001 From: StrawWagen <64710817+StrawWagen@users.noreply.github.com> Date: Wed, 25 Mar 2026 12:51:11 -0700 Subject: [PATCH 1/5] Nuke manual center functionality rename some timers and functions aswell --- README.md | 11 +- lua/cfc_random_spawn/configs/gm_blesmont.lua | 5 - .../configs/gm_bluehills_test3.lua | 3 - lua/cfc_random_spawn/configs/gm_city25.lua | 8 -- .../configs/gm_construct_in_flatgrass.lua | 6 - .../configs/gm_excess_construct_13.lua | 7 -- .../configs/gm_excess_island_night.lua | 8 -- .../configs/gm_freespace_13.lua | 3 - lua/cfc_random_spawn/configs/gm_heartland.lua | 11 -- .../configs/gm_mobenix_v3_final.lua | 13 -- lua/cfc_random_spawn/configs/gm_obselisk.lua | 6 - .../configs/gm_trainconstruct2.lua | 59 --------- .../configs/gm_tubeway_circuit_v1.lua | 7 -- .../configs/gm_ultrabox_optimized.lua | 113 ------------------ .../module/cl_spawns_editor.lua | 77 +----------- .../module/sv_player_spawning.lua | 105 +++------------- 16 files changed, 22 insertions(+), 420 deletions(-) delete mode 100644 lua/cfc_random_spawn/configs/gm_trainconstruct2.lua delete mode 100644 lua/cfc_random_spawn/configs/gm_ultrabox_optimized.lua diff --git a/README.md b/README.md index b3187a8..650cc53 100644 --- a/README.md +++ b/README.md @@ -25,10 +25,6 @@ Adding spawnpoints is done as follows: centerCutoff = NUMBER, centerUpdateInterval = NUMBER, dynamicCenterStartingPos = VECTOR, - pvpCenters = { - { centerPos = VECTOR, overrideCutoff = NUMBER }, - ... - }, zones = { { cornerA = VECTOR, cornerB = VECTOR }, ... @@ -42,10 +38,7 @@ Adding spawnpoints is done as follows: Where - `centerCutoff` overrides `DEFAULT_CENTER_CUTOFF` for this map. - `centerUpdateInterval` overrides `CENTER_UPDATE_INTERVAL` for this map. - - `dynamicCenterStartingPos` defines the position to use for locating the dynamic pvp center (requies zero manual pvp centers) when no active combat is happening. Best positioned at the 'natural spawn area' of the map, as this is guaranteed to happen on initial map load. Defaults to `Vector( 0, 0, 0 )`. - - **pvpCenters**: defines one or more central positions where pvp most often takes place around, with the first one being the fallback if there are no pvpers. If none are defined, will default to the average position of all spawnpoints for this map. - - `centerPos` is the position for the pvp center. - - `overrideCutoff` overrides the map/default cutoff value for obtaining the average player position near this specific pvp center, useful for maps with many centers that vary heavily in size. + - `dynamicCenterStartingPos` defines the position to use for locating the dynamic pvp center when no active combat is happening. Best positioned at the 'natural spawn area' of the map, as this is guaranteed to happen on initial map load. Defaults to `Vector( 0, 0, 0 )`. - **zones**: defines boxes that separate spawns into groups. Except in rare cases, spawns will only be chosen if they are in the same zone as the currently active pvp center. Any spawns not contained by a zone will be added to a default group. - `cornerA` is the first corner of the zone. - `cornerB` is the second corner of the zone. @@ -62,10 +55,8 @@ To enable this tool run `cfc_spawneditor_toggle` in console. Features: - To add / remove spawns `cfc_spawneditor_spawnadd` / `cfc_spawneditor_spawndel` -- To add / remove pvp centers `cfc_spawneditor_centeradd` / `cfc_spawneditor_centerdel` - To mark / cancel / add / remove zones `cfc_spawneditor_zonea` and `cfc_spawneditor_zoneb` / `cfc_spawneditor_zonecancel` / `cfc_spawneditor_zoneadd` / `cfc_spawneditor_zonedel` - Zones will be previewed in magenta, then turn cyan when confirmed. -- To change the cutoff radius for the current map `cfc_spawneditor_cutoff` - To export the current map's spawnpoints to console use `cfc_spawneditor_export`, you can then paste this into sv_config.lua - To change the update interval for pvp centers temporarily for debugging, use `cfc_spawneditor_center_interval ` diff --git a/lua/cfc_random_spawn/configs/gm_blesmont.lua b/lua/cfc_random_spawn/configs/gm_blesmont.lua index a4428da..de8503d 100644 --- a/lua/cfc_random_spawn/configs/gm_blesmont.lua +++ b/lua/cfc_random_spawn/configs/gm_blesmont.lua @@ -1,11 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_blesmont"] = { centerCutoff = nil, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( 7050, -7530, 8 ), overrideCutoff = 4000 }, - { centerPos = Vector( 10429, -8922, 9 ), overrideCutoff = 4000 }, - { centerPos = Vector( 3386, -8406, 8 ), overrideCutoff = 4000 } - }, spawnpoints = { { spawnPos = Vector( 6925, -7964, 3 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, { spawnPos = Vector( 7336, -7815, 3 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua b/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua index a94d487..58cb2da 100644 --- a/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua +++ b/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua @@ -1,9 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_bluehills_test3"] = { centerCutoff = 2000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( 292, -1, 265 ), overrideCutoff = nil } - }, spawnpoints = { { spawnPos = Vector( 1104.6744384766, 131.18112182617, 64.03125 ) }, { spawnPos = Vector( 385.55798339844, 157.09564208984, 64.03125 ) }, diff --git a/lua/cfc_random_spawn/configs/gm_city25.lua b/lua/cfc_random_spawn/configs/gm_city25.lua index c08382a..f624774 100644 --- a/lua/cfc_random_spawn/configs/gm_city25.lua +++ b/lua/cfc_random_spawn/configs/gm_city25.lua @@ -1,14 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_city25"] = { centerCutoff = 3000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( 7, -1340, 101 ), overrideCutoff = 3000 }, - { centerPos = Vector( -3786, -3121, 92 ), overrideCutoff = 4000 }, - { centerPos = Vector( -899, -6346, 109 ), overrideCutoff = 3000 }, - { centerPos = Vector( 2892, -5823, 101 ), overrideCutoff = 3000 }, - { centerPos = Vector( -2008, -7467, 94 ), overrideCutoff = 4000 }, - { centerPos = Vector( 4600, -7998, 91 ), overrideCutoff = 4000 } - }, spawnpoints = { { spawnPos = Vector( 599, -1308, 83 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, { spawnPos = Vector( 598, -1878, 83 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua b/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua index 9b8b271..93a9ec3 100644 --- a/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua +++ b/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua @@ -1,12 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_construct_in_flatgrass"] = { centerCutoff = nil, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( 1831, -873, -8567 ), overrideCutoff = 3250 }, - { centerPos = Vector( -932, -2738, -8167 ), overrideCutoff = 2250 }, - { centerPos = Vector( -2897, -3955, -8157 ), overrideCutoff = 2250 }, - { centerPos = Vector( -2959, 3392, -8507 ), overrideCutoff = 2250 } - }, spawnpoints = { { spawnPos = Vector( 1968, -1050, -8577 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, { spawnPos = Vector( 1986, -843, -8577 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua b/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua index fa9f889..f468a84 100644 --- a/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua +++ b/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua @@ -1,13 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_excess_construct_13"] = { centerCutoff = 2000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( -3196, -828, 857 ), overrideCutoff = 3250 }, - { centerPos = Vector( 155, 1709, 252 ), overrideCutoff = 2250 }, - { centerPos = Vector( 2858, 95, 260 ), overrideCutoff = 3250 }, - { centerPos = Vector( 2768, 2097, 66 ), overrideCutoff = 2250 }, - { centerPos = Vector( -13672, 4044, 832 ), overrideCutoff = 3250 } - }, spawnpoints = { { spawnPos = Vector( -3225, -568, 683 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, { spawnPos = Vector( -2793, -720, 419 ), spawnAngle = Angle( 0, -45, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_excess_island_night.lua b/lua/cfc_random_spawn/configs/gm_excess_island_night.lua index b6c8ad0..5969b02 100644 --- a/lua/cfc_random_spawn/configs/gm_excess_island_night.lua +++ b/lua/cfc_random_spawn/configs/gm_excess_island_night.lua @@ -1,14 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_excess_island_night"] = { centerCutoff = nil, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( 251, -2425, 48 ), overrideCutoff = 2250 }, - { centerPos = Vector( 3568, -1319, 247 ), overrideCutoff = 1250 }, - { centerPos = Vector( 3542, -4542, 155 ), overrideCutoff = 2250 }, - { centerPos = Vector( 424, 1786, 247 ), overrideCutoff = 1250 }, - { centerPos = Vector( -2233, 1916, 261 ), overrideCutoff = 2250 }, - { centerPos = Vector( 4175, 2640, 244 ), overrideCutoff = 3250 } - }, spawnpoints = { { spawnPos = Vector( 176, -2657, 11 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, { spawnPos = Vector( 170, -2271, 11 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_freespace_13.lua b/lua/cfc_random_spawn/configs/gm_freespace_13.lua index 5ae1e3a..5ac4fc6 100644 --- a/lua/cfc_random_spawn/configs/gm_freespace_13.lua +++ b/lua/cfc_random_spawn/configs/gm_freespace_13.lua @@ -1,9 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_freespace_13"] = { centerCutoff = 3000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( -2374, -40, -14580 ), overrideCutoff = nil } - }, spawnpoints = { { spawnPos = Vector( -1313, 25, -14566 ), spawnAngle = Angle( 0, 180, 0 ), pvp = true }, { spawnPos = Vector( -3040, 223, -14566 ), spawnAngle = Angle( 0, -45, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_heartland.lua b/lua/cfc_random_spawn/configs/gm_heartland.lua index 425a693..df0be6e 100644 --- a/lua/cfc_random_spawn/configs/gm_heartland.lua +++ b/lua/cfc_random_spawn/configs/gm_heartland.lua @@ -1,17 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_heartland"] = { centerCutoff = 3000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( -18, -437, 36 ), overrideCutoff = 2250 }, - { centerPos = Vector( -2933, 444, 137 ), overrideCutoff = 2250 }, - { centerPos = Vector( -25, 3166, 25 ), overrideCutoff = 2800 }, - { centerPos = Vector( -3900, 2314, 101 ), overrideCutoff = 2250 }, - { centerPos = Vector( 4026, 2408, 101 ), overrideCutoff = 2250 }, - { centerPos = Vector( -3073, 3625, 1602 ), overrideCutoff = 1000 }, - { centerPos = Vector( 1641, 5494, -123 ), overrideCutoff = 2250 }, - { centerPos = Vector( -6533, 3447, 190 ), overrideCutoff = 2250 }, - { centerPos = Vector( -7682, 11888, 97 ), overrideCutoff = 2250 } - }, spawnpoints = { { spawnPos = Vector( 594, -351, 28 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, { spawnPos = Vector( -614, -347, 29 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua b/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua index 51adb1e..6369901 100644 --- a/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua +++ b/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua @@ -1,19 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_mobenix_v3_final"] = { centerCutoff = 4500, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( -9412, -2020, 10445 ), overrideCutoff = 3000 }, - { centerPos = Vector( -384, 1271, -204 ), overrideCutoff = 3000 }, - { centerPos = Vector( 3248, 2223, -321 ), overrideCutoff = 3000 }, - { centerPos = Vector( -1072, 11970, 1086 ), overrideCutoff = 4000 }, - { centerPos = Vector( 5202, -10829, 136 ), overrideCutoff = 4000 }, - { centerPos = Vector( 8003, 3930, -315 ), overrideCutoff = 4000 }, - { centerPos = Vector( 8497, -9219, 95 ), overrideCutoff = 3000 }, - { centerPos = Vector( 10257, -342, -210 ), overrideCutoff = 4000 }, - { centerPos = Vector( 8164, 9508, -443 ), overrideCutoff = 4000 }, - { centerPos = Vector( 11528, -6996, -210 ), overrideCutoff = 4000 }, - { centerPos = Vector( 15346, -8156, -461 ), overrideCutoff = 3000 } - }, spawnpoints = { { spawnPos = Vector( -9124, -1747, 10384 ), spawnAngle = Angle( 0, 179, 0 ), pvp = true }, { spawnPos = Vector( -9687, -1744, 10384 ), spawnAngle = Angle( 0, -1, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_obselisk.lua b/lua/cfc_random_spawn/configs/gm_obselisk.lua index 0dcdca5..5f12d18 100644 --- a/lua/cfc_random_spawn/configs/gm_obselisk.lua +++ b/lua/cfc_random_spawn/configs/gm_obselisk.lua @@ -1,12 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_obselisk"] = { centerCutoff = 3000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( -3981, -762, -1344 ), overrideCutoff = 3000 }, - { centerPos = Vector( -5558, 56, -1344 ), overrideCutoff = 3000 }, - { centerPos = Vector( -1693, -673, -1344 ), overrideCutoff = 3000 }, - { centerPos = Vector( 2904, -588, -2624 ), overrideCutoff = 3000 } - }, spawnpoints = { { spawnPos = Vector( -3680, -349, -1334 ), spawnAngle = Angle( 0, 45, 0 ), pvp = true }, { spawnPos = Vector( -4513, -350, -1334 ), spawnAngle = Angle( 0, 135, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_trainconstruct2.lua b/lua/cfc_random_spawn/configs/gm_trainconstruct2.lua deleted file mode 100644 index 6a847ea..0000000 --- a/lua/cfc_random_spawn/configs/gm_trainconstruct2.lua +++ /dev/null @@ -1,59 +0,0 @@ -CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_trainconstruct2"] = { - centerCutoff = 3000, - centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( -4403, -276, -320 ), overrideCutoff = 3000 }, - { centerPos = Vector( -2532, 443, 16 ), overrideCutoff = 3000 }, - { centerPos = Vector( 217, 25, 8 ), overrideCutoff = 3000 }, - { centerPos = Vector( 2742, -2042, 16 ), overrideCutoff = 3000 }, - { centerPos = Vector( 7323, -1997, 16 ), overrideCutoff = 3000 }, - { centerPos = Vector( 10192, -1729, 16 ), overrideCutoff = 3000 } - }, - spawnpoints = { - { spawnPos = Vector( -6152, -153, 26 ), spawnAngle = Angle( 0, 45, 0 ), pvp = true }, - { spawnPos = Vector( -6156, 1370, 26 ), spawnAngle = Angle( 0, -45, 0 ), pvp = true }, - { spawnPos = Vector( -5792, 1568, 26 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( -5441, -139, 26 ), spawnAngle = Angle( 0, 45, 0 ), pvp = true }, - { spawnPos = Vector( -5333, -308, -310 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( -5402, -1242, -310 ), spawnAngle = Angle( 0, 34, 0 ), pvp = true }, - { spawnPos = Vector( -5334, -1342, -567 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, - { spawnPos = Vector( -3813, 292, -310 ), spawnAngle = Angle( 0, -89, 0 ), pvp = true }, - { spawnPos = Vector( -3807, 1569, 26 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( -3404, -780, -311 ), spawnAngle = Angle( 0, 135, 0 ), pvp = true }, - { spawnPos = Vector( -3056, 417, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( -3110, -326, -310 ), spawnAngle = Angle( 0, -135, 0 ), pvp = true }, - { spawnPos = Vector( -2962, 428, -230 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, - { spawnPos = Vector( -2962, 836, -230 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, - { spawnPos = Vector( -2967, -196, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( -2966, -174, -230 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, - { spawnPos = Vector( -3088, -751, -311 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( -2911, 1246, 26 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( -1973, -421, -542 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( -1801, -180, 26 ), spawnAngle = Angle( 0, 105, 0 ), pvp = true }, - { spawnPos = Vector( -937, 609, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( -816, 599, 458 ), spawnAngle = Angle( 0, 45, 0 ), pvp = true }, - { spawnPos = Vector( -329, 1052, 10 ), spawnAngle = Angle( 0, 180, 0 ), pvp = true }, - { spawnPos = Vector( 157, -321, 18 ), spawnAngle = Angle( 0, 45, 0 ), pvp = true }, - { spawnPos = Vector( 595, 117, 18 ), spawnAngle = Angle( 0, -135, 0 ), pvp = true }, - { spawnPos = Vector( 520, -1817, 26 ), spawnAngle = Angle( 0, -20, 0 ), pvp = true }, - { spawnPos = Vector( 1094, -1265, 10 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, - { spawnPos = Vector( 1517, -833, 10 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( 2203, -145, 22 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( 2742, -2905, 26 ), spawnAngle = Angle( 0, 180, 0 ), pvp = true }, - { spawnPos = Vector( 2856, -2714, 282 ), spawnAngle = Angle( 0, 135, 0 ), pvp = true }, - { spawnPos = Vector( 3045, -2613, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( 4618, -1349, 26 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( 5079, -2614, 26 ), spawnAngle = Angle( 0, 91, 0 ), pvp = true }, - { spawnPos = Vector( 5801, -1354, 26 ), spawnAngle = Angle( 0, -89, 0 ), pvp = true }, - { spawnPos = Vector( 6813, -1340, 26 ), spawnAngle = Angle( 0, -89, 0 ), pvp = true }, - { spawnPos = Vector( 7127, -2618, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( 7813, -1342, 26 ), spawnAngle = Angle( 0, -89, 0 ), pvp = true }, - { spawnPos = Vector( 8850, -744, 26 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, - { spawnPos = Vector( 9231, -2598, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( 10401, -1303, 10 ), spawnAngle = Angle( 0, -135, 0 ), pvp = true }, - { spawnPos = Vector( 10233, -2606, 26 ), spawnAngle = Angle( 0, 135, 0 ), pvp = true }, - { spawnPos = Vector( 10339, -2138, 26 ), spawnAngle = Angle( 0, 135, 0 ), pvp = true }, - { spawnPos = Vector( 10618, -2050, 26 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, - { spawnPos = Vector( 11630, -1668, 26 ), spawnAngle = Angle( 0, -135, 0 ), pvp = true } - } -} diff --git a/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua b/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua index baa2c6d..ca113a4 100644 --- a/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua +++ b/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua @@ -1,13 +1,6 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_tubeway_circuit_v1"] = { centerCutoff = 3000, centerUpdateInterval = nil, - pvpCenters = { - { centerPos = Vector( 3865, 2426, 0 ), overrideCutoff = 3000 }, - { centerPos = Vector( 1209, 2068, 0 ), overrideCutoff = 3000 }, - { centerPos = Vector( 3749, -922, 0 ), overrideCutoff = 3000 }, - { centerPos = Vector( 5380, -1812, 2048 ), overrideCutoff = 3000 }, - { centerPos = Vector( 9717, -1560, -4994 ), overrideCutoff = 3000 } - }, spawnpoints = { { spawnPos = Vector( 4338, 2662, 10 ), spawnAngle = Angle( 0, 178, 0 ), pvp = true }, { spawnPos = Vector( 2828, 2683, 10 ), spawnAngle = Angle( 0, -2, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_ultrabox_optimized.lua b/lua/cfc_random_spawn/configs/gm_ultrabox_optimized.lua deleted file mode 100644 index ab6137e..0000000 --- a/lua/cfc_random_spawn/configs/gm_ultrabox_optimized.lua +++ /dev/null @@ -1,113 +0,0 @@ -CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_ultrabox_optimized"] = { - pvpCenters = { - }, - spawnpoints = { - { spawnPos = Vector( 7037, -3038, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7713, -3043, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 8221, -3545, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 8226, -3036, 203 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 6086, -3637, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 6092, -3961, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 6090, -2934, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 7778, -4694, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 7766, -2018, 203 ), spawnAngle = Angle( 0, -45, 0 ) }, - { spawnPos = Vector( 8222, -4703, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 8220, -2019, 203 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 6076, -2158, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 7771, -5241, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 6077, -4926, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 8224, -5228, 203 ), spawnAngle = Angle( 0, 180, 0 ) }, - { spawnPos = Vector( 7775, -5650, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 6088, -5567, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 7784, -5940, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 8226, -5926, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 6075, -6075, 203 ), spawnAngle = Angle( 0, 135, 0 ) }, - { spawnPos = Vector( 7775, -6320, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 7477, -6622, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7767, -6614, 203 ), spawnAngle = Angle( 0, -45, 0 ) }, - { spawnPos = Vector( 4887, -6084, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 7197, -7073, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 7967, -7073, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 4653, -6085, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 8232, -7078, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 9184, -6694, 203 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 6086, -7077, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 9636, -6759, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 9179, -7074, 203 ), spawnAngle = Angle( 0, 45, 0 ) }, - { spawnPos = Vector( 5042, -7096, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 3581, -6085, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 4071, -7064, 192 ), spawnAngle = Angle( 0, 45, 0 ) }, - { spawnPos = Vector( 9627, -7711, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 2520, -1855, 192 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 2952, -6086, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 9190, -8147, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 2881, -682, 192 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 2348, -1752, 192 ), spawnAngle = Angle( 0, 45, 0 ) }, - { spawnPos = Vector( 9628, -8227, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 2529, -1017, 192 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 1828, -2534, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7769, -9039, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 1748, -2345, 192 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 9627, -8659, 203 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 7384, -9185, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7023, -9202, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 8221, -9179, 203 ), spawnAngle = Angle( 0, -89, 0 ) }, - { spawnPos = Vector( 6171, -9205, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 5807, -9184, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 9179, -9060, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 9035, -9191, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 1707, -6079, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 7052, -9624, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 7412, -9628, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 4899, -9160, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 9633, -9179, 203 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 7932, -9632, 203 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 8156, -9630, 203 ), spawnAngle = Angle( 0, 45, 0 ) }, - { spawnPos = Vector( 6200, -9634, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 998, -2525, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 5603, -9632, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 10181, -9189, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 4247, -9159, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 4858, -9615, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 684, -2837, 192 ), spawnAngle = Angle( 0, 45, 0 ) }, - { spawnPos = Vector( 10767, -9188, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7051, -10211, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 10976, -9175, 328 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 6182, -10208, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 4513, -9717, 192 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 11189, -9185, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 5580, -10207, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7204, -10570, 192 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 4515, -10032, 192 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 8171, -10603, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 4707, -10205, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 3974, -10218, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 4267, -10352, 562 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 12247, -9188, 192 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 7261, -11093, 192 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 8153, -11103, 203 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 7473, -11308, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 7912, -11316, 203 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 3180, -10203, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 2974, -10221, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 1995, -10222, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 1703, -10206, 192 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 11375, -11314, 320 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 11314, -11387, 320 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 11292, -11716, 320 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 11928, -11374, 320 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 11916, -11802, 320 ), spawnAngle = Angle( 0, 135, 0 ) }, - { spawnPos = Vector( 11364, -12165, 456 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 11920, -12170, 456 ), spawnAngle = Angle( 0, -135, 0 ) }, - { spawnPos = Vector( 11392, -12738, 456 ), spawnAngle = Angle( 0, 45, 0 ) }, - { spawnPos = Vector( 12593, -12255, 456 ), spawnAngle = Angle( 0, -90, 0 ) }, - { spawnPos = Vector( 12042, -12726, 456 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 12129, -12812, 456 ), spawnAngle = Angle( 0, 0, 0 ) }, - { spawnPos = Vector( 12847, -12487, 456 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 12879, -12794, 456 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 12438, -13050, 456 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 12357, -13133, 456 ), spawnAngle = Angle( 0, -180, 0 ) }, - { spawnPos = Vector( 7184, -3500, 192 ), spawnAngle = Angle( 0, 90, 0 ) }, - { spawnPos = Vector( 3829, -6219, 364 ), spawnAngle = Angle( 0, 45, 0 ) }, - }, -} diff --git a/lua/cfc_random_spawn/module/cl_spawns_editor.lua b/lua/cfc_random_spawn/module/cl_spawns_editor.lua index 6c5616e..6f48195 100644 --- a/lua/cfc_random_spawn/module/cl_spawns_editor.lua +++ b/lua/cfc_random_spawn/module/cl_spawns_editor.lua @@ -1,7 +1,5 @@ local spawnColor = Color( 0, 255, 0 ) local spawnColorActiveCenter = Color( 0, 180, 255 ) -local centerPointColor = Color( 255, 0, 0 ) -local centerRangeColor = Color( 255, 145, 0 ) local centerActiveColor = Color( 0, 50, 255 ) local centerActiveRangeColor = Color( 75, 0, 255 ) local zoneUnconfirmedColor = Color( 255, 0, 255 ) @@ -59,7 +57,7 @@ local function sendConfigChangesToServer() net.SendToServer() end -local function drawPvPCenter( center, pointColor, rangeColor, radius ) +local function drawActiveCenter( center, pointColor, rangeColor, radius ) local pos = center.centerPos local cutoff = spawnTable.centerCutoff or centerCutoffDefault @@ -118,12 +116,6 @@ hook.Add( "PostDrawTranslucentRenderables", "CFC_SpawnEditor_DrawSpawnPoints", f end end - if spawnTable.pvpCenters then - for _, center in ipairs( spawnTable.pvpCenters ) do - drawPvPCenter( center, centerPointColor, centerRangeColor, 40 ) - end - end - if spawnTable.zones then for _, zone in ipairs( spawnTable.zones ) do render.DrawWireframeBox( emptyVector, emptyAngle, zone.cornerA, zone.cornerB, zoneConfirmedColor, false ) @@ -135,7 +127,7 @@ hook.Add( "PostDrawTranslucentRenderables", "CFC_SpawnEditor_DrawSpawnPoints", f end if activeCenter then - drawPvPCenter( activeCenter, centerActiveColor, centerActiveRangeColor, 50 ) + drawActiveCenter( activeCenter, centerActiveColor, centerActiveRangeColor, 50 ) end end ) @@ -198,57 +190,6 @@ end concommand.Add( "cfc_spawneditor_spawndel", removeSpawn, _, "Removes the nearest spawn point" ) -local function addPvpCenter( ply ) - if not canRunCommand() then return end - if not spawnTable.pvpCenters then spawnTable.pvpCenters = {} end - - table.insert( spawnTable.pvpCenters, { centerPos = ply:GetPos() } ) - sendConfigChangesToServer() -end - -concommand.Add( "cfc_spawneditor_centeradd", addPvpCenter, _, "Adds a pvp center at your location" ) - -local function removePvpCenter( ply ) - if not canRunCommand() then return end - if not spawnTable.pvpCenters then spawnTable.pvpCenters = {} end - - local nearPos = ply:GetPos() - local pvpCenters = spawnTable.pvpCenters - - table.sort( pvpCenters, function( a, b ) - return nearPos:DistToSqr( a.centerPos ) < nearPos:DistToSqr( b.centerPos ) - end ) - - if spawnTable.pvpCenters[1].centerPos:DistToSqr( ply:GetPos() ) > minDeletionRange then - print( "You are too far away from the nearest pvp center, please move closer to it." ) - return - end - - table.remove( spawnTable.pvpCenters, 1 ) - sendConfigChangesToServer() -end - -concommand.Add( "cfc_spawneditor_centerdel", removePvpCenter, _, "Removes the nearest pvp center" ) - -local function setCenterCutoff( _, _, args ) - if not canRunCommand() then return end - if not spawnTable.pvpCenters then spawnTable.pvpCenters = {} end - - local cutoff = tonumber( args[1] ) - if not cutoff then - print( "Please provide a number for the cutoff." ) - return - end - - if spawnTable.centerCutoff then - print( "Overwriting old cutoff of " .. spawnTable.centerCutoff ) - end - spawnTable.centerCutoff = cutoff - sendConfigChangesToServer() -end - -concommand.Add( "cfc_spawneditor_cutoff", setCenterCutoff, _, "Sets the cutoff for pvp centers, requires a number." ) - local function markZoneA( ply, _, _, argsStr ) if not canRunCommand() then return end @@ -369,16 +310,6 @@ local function printSpawnTable() mainString = mainString .. tab .. string.format( "dynamicCenterStartingPos = Vector( %s, %s, %s ),\n", vec.x, vec.y, vec.z ) end - if istable( spawnTable.pvpCenters ) then - mainString = mainString .. tab .. "pvpCenters = {\n" - for _, center in ipairs( spawnTable.pvpCenters ) do - mainString = mainString .. tab .. tab .. "{ " - mainString = mainString .. string.format( "centerPos = Vector( %s, %s, %s )", center.centerPos.x, center.centerPos.y, center.centerPos.z ) - mainString = mainString .. " },\n" - end - mainString = mainString .. tab .. "},\n" - end - if istable( spawnTable.zones ) then mainString = mainString .. tab .. "zones = {\n" for _, zone in ipairs( spawnTable.zones ) do @@ -428,10 +359,10 @@ local function clearAll( _, _, args ) print( "Cleared all spawns!" ) end -concommand.Add( "cfc_spawneditor_clearall", clearAll, _, "Clears all spawn points and pvp centers. Dangerous." ) +concommand.Add( "cfc_spawneditor_clearall", clearAll, _, "Clears all spawn points. Dangerous." ) -net.Receive( "CFC_SpawnEditor_ActiveCenter", function() +net.Receive( "CFC_SpawnEditor_ActivePvpCenter", function() activeCenter = { centerPos = net.ReadVector(), centerCutoff = net.ReadFloat(), diff --git a/lua/cfc_random_spawn/module/sv_player_spawning.lua b/lua/cfc_random_spawn/module/sv_player_spawning.lua index 4df5013..593dad1 100755 --- a/lua/cfc_random_spawn/module/sv_player_spawning.lua +++ b/lua/cfc_random_spawn/module/sv_player_spawning.lua @@ -6,7 +6,6 @@ local mapHasCustomSpawns = next( customSpawnConfigForMap ) local customSpawnsForMap = customSpawnConfigForMap.spawnpoints or {} local zonesForMap = customSpawnConfigForMap.zones or {} -local pvpCenters = customSpawnConfigForMap.pvpCenters or {} local DEFAULT_CENTER_CUTOFF = customSpawnConfigForMap.centerCutoff or CFCRandomSpawn.Config.DEFAULT_CENTER_CUTOFF local DEFAULT_CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF ^ 2 local CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF_SQR @@ -46,11 +45,6 @@ local Vector = Vector util.AddNetworkString( "CFC_SpawnEditor_ActiveCenter" ) - -local function defaultPvpCenter() - return pvpCenters[1] -end - local function getZoneForPos( pos ) if noZones then return NO_ZONE_ID end @@ -63,22 +57,6 @@ local function getZoneForPos( pos ) return fallbackZoneID end -local function loadPvpCenters() - if not pvpCenters or not defaultPvpCenter() then - CFCRandomSpawn.doDynamicCenters = true - end - - for _, centerData in pairs( pvpCenters ) do - local overrideCutoff = centerData.overrideCutoff - - if overrideCutoff then - centerData.overrideCutoffSqr = overrideCutoff ^ 2 - end - end - - CFCRandomSpawn.mostPopularCenter = defaultPvpCenter() -end - local function loadZones() noZones = table.IsEmpty( zonesForMap ) @@ -89,10 +67,6 @@ local function loadZones() spawn.zoneID = fallbackZoneID end - for _, pvpCenter in ipairs( pvpCenters ) do - pvpCenter.zoneID = fallbackZoneID - end - return end @@ -101,25 +75,19 @@ local function loadZones() for _, spawn in ipairs( customSpawnsForMap ) do spawn.zoneID = getZoneForPos( spawn.spawnPos ) end - - for _, pvpCenter in ipairs( pvpCenters ) do - pvpCenter.zoneID = getZoneForPos( pvpCenters.centerPos ) - end end -loadPvpCenters() loadZones() -local mostPopularCenter = CFCRandomSpawn.mostPopularCenter +local activePvpCenter = CFCRandomSpawn.activePvpCenter function CFCRandomSpawn.refreshMapInfo() - mostPopularCenter = CFCRandomSpawn.mostPopularCenter + activePvpCenter = CFCRandomSpawn.activePvpCenter customSpawnConfigForMap = CFCRandomSpawn.Config.CUSTOM_SPAWNS[game.GetMap()] mapHasCustomSpawns = next( customSpawnConfigForMap ) if not mapHasCustomSpawns then return end customSpawnsForMap = customSpawnConfigForMap.spawnpoints or {} - pvpCenters = customSpawnConfigForMap.pvpCenters or {} DEFAULT_CENTER_CUTOFF = customSpawnConfigForMap.centerCutoff or CFCRandomSpawn.Config.DEFAULT_CENTER_CUTOFF DEFAULT_CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF ^ 2 CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF_SQR @@ -128,7 +96,6 @@ function CFCRandomSpawn.refreshMapInfo() CENTER_UPDATE_INTERVAL = customSpawnConfigForMap.centerUpdateInterval or CFCRandomSpawn.Config.CENTER_UPDATE_INTERVAL IGNORE_BUILDERS = CFCRandomSpawn.Config.IGNORE_BUILDERS - loadPvpCenters() loadZones() end @@ -257,7 +224,7 @@ local function spawnsInsidePvpCenterCached( spawns ) if cachedSpawnsInsideCenter and nextSpawnsInsideCenterCache > CurTime() then return cachedSpawnsInsideCenter end nextSpawnsInsideCenterCache = CurTime() + 7.5 - local center = CFCRandomSpawn.mostPopularCenter + local center = CFCRandomSpawn.activePvpCenter local sortedSpawns = spawnsSortedByDistTo( center.centerPos, spawns, CENTER_CUTOFF_SQR, center.zoneID ) cachedSpawnsInsideCenter = {} @@ -344,22 +311,6 @@ local function getPlyAvg( plys, fallbackPos ) return avgSum / #plys end --- Players within the point's radius each provide a score of 1, while players outside the radius provide a score that falls off quadratically -local function getPlayerPopularityFromPoint( point, plys, radiusSqr ) - local totalScore = 0 - radiusSqr = radiusSqr or DEFAULT_CENTER_CUTOFF_SQR - - for _, ply in pairs( plys ) do - local plyDistanceSqr = ( ply:GetPos():DistToSqr( point ) ) - - if plyDistanceSqr < radiusSqr then plyDistanceSqr = radiusSqr end - - totalScore = totalScore + radiusSqr / plyDistanceSqr - end - - return totalScore -end - local function getDynamicPvpCenter( measurablePlayers ) local playersAveragePos = getPlyAvg( measurablePlayers, DYNAMIC_CENTER_FALLBACK ) @@ -419,37 +370,13 @@ local function getDynamicPvpCenter( measurablePlayers ) return dynamicPvpCenter end --- Gets the most populated pvp center via the electron force model, to eliminate outliers -local function getMostPopulatedCenter( plys ) - local bestScore = -1 - local bestCenter = { centerPos = Vector() } - - if not pvpCenters[2] then return defaultPvpCenter() end -- No need to make extra calculations if there's only one pvp center - if not plys or not plys[1] then return defaultPvpCenter() end -- Use the first pvp center as the primary one if there are no pvpers - - for _, center in ipairs( pvpCenters ) do - local score = getPlayerPopularityFromPoint( center.centerPos, plys, center.overrideCutoffSqr ) - - if score > bestScore then - bestScore = score - bestCenter = center - end - end - - return bestCenter -end - local function updatePopularCenter( measurablePlayers ) - if CFCRandomSpawn.doDynamicCenters then - mostPopularCenter = getDynamicPvpCenter( measurablePlayers ) - else - mostPopularCenter = getMostPopulatedCenter( measurablePlayers ) - end + activePvpCenter = getDynamicPvpCenter( measurablePlayers ) - CFCRandomSpawn.mostPopularCenter = mostPopularCenter + CFCRandomSpawn.activePvpCenter = activePvpCenter - CENTER_CUTOFF = mostPopularCenter.overrideCutoff or DEFAULT_CENTER_CUTOFF - CENTER_CUTOFF_SQR = mostPopularCenter.overrideCutoffSqr or DEFAULT_CENTER_CUTOFF_SQR + CENTER_CUTOFF = activePvpCenter.overrideCutoff or DEFAULT_CENTER_CUTOFF + CENTER_CUTOFF_SQR = activePvpCenter.overrideCutoffSqr or DEFAULT_CENTER_CUTOFF_SQR -- Network to editors local editors = CFCRandomSpawn.EditingPlayers @@ -464,10 +391,10 @@ local function updatePopularCenter( measurablePlayers ) if not next( editors ) then return end - net.Start( "CFC_SpawnEditor_ActiveCenter" ) - net.WriteVector( mostPopularCenter.centerPos ) - net.WriteFloat( mostPopularCenter.centerCutoff or DEFAULT_CENTER_CUTOFF ) - net.WriteUInt( mostPopularCenter.zoneID, 10 ) + net.Start( "CFC_SpawnEditor_ActivePvpCenter" ) + net.WriteVector( activePvpCenter.centerPos ) + net.WriteFloat( activePvpCenter.centerCutoff or DEFAULT_CENTER_CUTOFF ) + net.WriteUInt( activePvpCenter.zoneID, 10 ) net.Send( editors ) end @@ -475,7 +402,7 @@ function CFCRandomSpawn.getOptimalSpawnPos() local measurablePlayers = getMeasurablePlayers() local allLivingPlys = getLivingPlayers() - if not CFCRandomSpawn.mostPopularCenter then + if not CFCRandomSpawn.activePvpCenter then updatePopularCenter( measurablePlayers ) end @@ -488,6 +415,8 @@ end function CFCRandomSpawn.handlePlayerSpawn( ply ) if not mapHasCustomSpawns then return end if not ( ply and IsValid( ply ) ) then return end + + -- TODO: make this a hook if IsValid( ply.LinkedSpawnPoint ) then return end local optimalSpawnPosition, optimalSpawnAngles = CFCRandomSpawn.getOptimalSpawnPos() @@ -501,16 +430,16 @@ end hook.Add( "PlayerSpawn", "CFC_RandomSpawn_ChooseOptimalSpawnpoint", CFCRandomSpawn.handlePlayerSpawn ) -timer.Create( "CFC_RandomSpawn_CalculateMostPopularPvpCenter", CENTER_UPDATE_INTERVAL, 0, function() +timer.Create( "CFC_RandomSpawn_CalculateActivePvpCenter", CENTER_UPDATE_INTERVAL, 0, function() if not mapHasCustomSpawns then return end local measurablePlayers = getMeasurablePlayers() updatePopularCenter( measurablePlayers ) end ) -concommand.Add( "cfc_spawneditor_center_interval", function( ply, _, args ) +concommand.Add( "cfc_spawneditor_pvpcenter_update_interval", function( ply, _, args ) if IsValid( ply ) and not ply:IsAdmin() then return end if #args == 0 then return end - timer.Adjust( "CFC_RandomSpawn_CalculateMostPopularPvpCenter", tonumber( args[1] ), 0 ) + timer.Adjust( "CFC_RandomSpawn_CalculateActivePvpCenter", tonumber( args[1] ), 0 ) end, nil, "Sets the update interval for pvp centers. Lasts until the next map change." ) From a123f524463631e6210d5c876c06db601048aaf2 Mon Sep 17 00:00:00 2001 From: StrawWagen <64710817+StrawWagen@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:13:53 -0700 Subject: [PATCH 2/5] network active pvp center on editing start and a name tweak --- lua/cfc_random_spawn/module/sv_player_spawning.lua | 12 ++++-------- lua/cfc_random_spawn/module/sv_spawns_editor.lua | 13 +++++++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lua/cfc_random_spawn/module/sv_player_spawning.lua b/lua/cfc_random_spawn/module/sv_player_spawning.lua index 593dad1..b01246e 100755 --- a/lua/cfc_random_spawn/module/sv_player_spawning.lua +++ b/lua/cfc_random_spawn/module/sv_player_spawning.lua @@ -370,7 +370,7 @@ local function getDynamicPvpCenter( measurablePlayers ) return dynamicPvpCenter end -local function updatePopularCenter( measurablePlayers ) +local function updateActivePvpCenter( measurablePlayers ) activePvpCenter = getDynamicPvpCenter( measurablePlayers ) CFCRandomSpawn.activePvpCenter = activePvpCenter @@ -391,11 +391,7 @@ local function updatePopularCenter( measurablePlayers ) if not next( editors ) then return end - net.Start( "CFC_SpawnEditor_ActivePvpCenter" ) - net.WriteVector( activePvpCenter.centerPos ) - net.WriteFloat( activePvpCenter.centerCutoff or DEFAULT_CENTER_CUTOFF ) - net.WriteUInt( activePvpCenter.zoneID, 10 ) - net.Send( editors ) + syncActivePvpCenter() end function CFCRandomSpawn.getOptimalSpawnPos() @@ -403,7 +399,7 @@ function CFCRandomSpawn.getOptimalSpawnPos() local allLivingPlys = getLivingPlayers() if not CFCRandomSpawn.activePvpCenter then - updatePopularCenter( measurablePlayers ) + updateActivePvpCenter( measurablePlayers ) end local spawnsInsideCenter = spawnsInsidePvpCenterCached( customSpawnsForMap ) @@ -434,7 +430,7 @@ timer.Create( "CFC_RandomSpawn_CalculateActivePvpCenter", CENTER_UPDATE_INTERVAL if not mapHasCustomSpawns then return end local measurablePlayers = getMeasurablePlayers() - updatePopularCenter( measurablePlayers ) + updateActivePvpCenter( measurablePlayers ) end ) concommand.Add( "cfc_spawneditor_pvpcenter_update_interval", function( ply, _, args ) diff --git a/lua/cfc_random_spawn/module/sv_spawns_editor.lua b/lua/cfc_random_spawn/module/sv_spawns_editor.lua index ee6ee09..2eace6b 100644 --- a/lua/cfc_random_spawn/module/sv_spawns_editor.lua +++ b/lua/cfc_random_spawn/module/sv_spawns_editor.lua @@ -5,12 +5,25 @@ util.AddNetworkString( "CFC_SpawnEditor_SetEditing" ) CFCRandomSpawn.EditingPlayers = CFCRandomSpawn.EditingPlayers or {} +local function syncActivePvpCenter() + local activePvpCenter = CFCRandomSpawn.activePvpCenter + if not activePvpCenter then return end + + net.Start( "CFC_SpawnEditor_ActivePvpCenter" ) + net.WriteVector( activePvpCenter.centerPos ) + net.WriteFloat( activePvpCenter.centerCutoff or DEFAULT_CENTER_CUTOFF ) + net.WriteUInt( activePvpCenter.zoneID, 10 ) + net.Send( editors ) +end + net.Receive( "CFC_SpawnEditor_RequestSpawnPoints", function( _, ply ) if not ply:IsAdmin() then return end local customSpawnConfigForMap = CFCRandomSpawn.Config.CUSTOM_SPAWNS[game.GetMap()] if not customSpawnConfigForMap then return end + syncActivePvpCenter() + net.Start( "CFC_SpawnEditor_SendSpawnPoints" ) net.WriteTable( customSpawnConfigForMap ) net.Send( ply ) From 62bb1e8724dd638d2aff4992ad6cff09c90ea7e2 Mon Sep 17 00:00:00 2001 From: StrawWagen <64710817+StrawWagen@users.noreply.github.com> Date: Fri, 27 Mar 2026 13:17:20 -0700 Subject: [PATCH 3/5] Simplify center radius code Actually test and fix syncActivePvpCenter --- README.md | 4 +-- lua/cfc_random_spawn/configs/gm_blesmont.lua | 1 - .../configs/gm_bluehills_test3.lua | 1 - lua/cfc_random_spawn/configs/gm_city25.lua | 1 - .../configs/gm_construct_in_flatgrass.lua | 1 - .../configs/gm_excess_construct_13.lua | 1 - .../configs/gm_excess_island_night.lua | 1 - .../configs/gm_freespace_13.lua | 1 - lua/cfc_random_spawn/configs/gm_heartland.lua | 1 - .../configs/gm_mobenix_v3_final.lua | 1 - lua/cfc_random_spawn/configs/gm_obselisk.lua | 1 - .../configs/gm_tubeway_circuit_v1.lua | 1 - .../module/cl_spawns_editor.lua | 32 ++++++++----------- .../module/sv_player_spawning.lua | 27 ++++++++-------- .../module/sv_spawns_editor.lua | 11 ++++--- lua/cfc_random_spawn/sv_config.lua | 2 +- 16 files changed, 36 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 650cc53..d0d8884 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Clone or download this repository into your `garrysmod/addons` folder and restar ## Usage Instructions The config for this addon is located in the `cfc_random_spawn/lua/cfc_random_spawn/sv_config.lua` file. Here you will find 2 config constants, and the spawn points table structure. The constants are as follows: -- `DEFAULT_CENTER_CUTOFF` `(default 3000)` - Default cutoff range from the most popular pvp center, where players further away from this will be ignored. The system tries to place you closest to everyone else. +- `DEFAULT_CENTER_RADIUS` `(default 3000)` - Default cutoff range from the most popular pvp center, where players further away from this will be ignored. The system tries to place you closest to everyone else. - `CLOSENESS_LIMIT` `(default 400)` - Will not choose spawnpoints that are within this many units of a valid player (i.e. a living pvper). 0 to disable. - `SELECTION_SIZE` `(default 8)` - Max number of 'ideal' spawnpoints to select from randomly. - `CENTER_UPDATE_INTERVAL` `(default 60)` - The gap (in seconds) between each center popularity update. If set to 0, will update on every respawn. @@ -22,7 +22,6 @@ Adding spawnpoints is done as follows: - Create an entry to the `CUSTOM_SPAWNS` table for the map of your choosing, as follows: ```lua CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_bluehills_test3"] = { - centerCutoff = NUMBER, centerUpdateInterval = NUMBER, dynamicCenterStartingPos = VECTOR, zones = { @@ -36,7 +35,6 @@ Adding spawnpoints is done as follows: } ``` Where - - `centerCutoff` overrides `DEFAULT_CENTER_CUTOFF` for this map. - `centerUpdateInterval` overrides `CENTER_UPDATE_INTERVAL` for this map. - `dynamicCenterStartingPos` defines the position to use for locating the dynamic pvp center when no active combat is happening. Best positioned at the 'natural spawn area' of the map, as this is guaranteed to happen on initial map load. Defaults to `Vector( 0, 0, 0 )`. - **zones**: defines boxes that separate spawns into groups. Except in rare cases, spawns will only be chosen if they are in the same zone as the currently active pvp center. Any spawns not contained by a zone will be added to a default group. diff --git a/lua/cfc_random_spawn/configs/gm_blesmont.lua b/lua/cfc_random_spawn/configs/gm_blesmont.lua index de8503d..bb90fdd 100644 --- a/lua/cfc_random_spawn/configs/gm_blesmont.lua +++ b/lua/cfc_random_spawn/configs/gm_blesmont.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_blesmont"] = { - centerCutoff = nil, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 6925, -7964, 3 ), spawnAngle = Angle( 0, 90, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua b/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua index 58cb2da..94a7840 100644 --- a/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua +++ b/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_bluehills_test3"] = { - centerCutoff = 2000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 1104.6744384766, 131.18112182617, 64.03125 ) }, diff --git a/lua/cfc_random_spawn/configs/gm_city25.lua b/lua/cfc_random_spawn/configs/gm_city25.lua index f624774..6ec5e92 100644 --- a/lua/cfc_random_spawn/configs/gm_city25.lua +++ b/lua/cfc_random_spawn/configs/gm_city25.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_city25"] = { - centerCutoff = 3000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 599, -1308, 83 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua b/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua index 93a9ec3..b8b5796 100644 --- a/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua +++ b/lua/cfc_random_spawn/configs/gm_construct_in_flatgrass.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_construct_in_flatgrass"] = { - centerCutoff = nil, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 1968, -1050, -8577 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua b/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua index f468a84..f7fc3f6 100644 --- a/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua +++ b/lua/cfc_random_spawn/configs/gm_excess_construct_13.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_excess_construct_13"] = { - centerCutoff = 2000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( -3225, -568, 683 ), spawnAngle = Angle( 0, 0, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_excess_island_night.lua b/lua/cfc_random_spawn/configs/gm_excess_island_night.lua index 5969b02..edc68b6 100644 --- a/lua/cfc_random_spawn/configs/gm_excess_island_night.lua +++ b/lua/cfc_random_spawn/configs/gm_excess_island_night.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_excess_island_night"] = { - centerCutoff = nil, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 176, -2657, 11 ), spawnAngle = Angle( 0, -90, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_freespace_13.lua b/lua/cfc_random_spawn/configs/gm_freespace_13.lua index 5ac4fc6..c2cc8bb 100644 --- a/lua/cfc_random_spawn/configs/gm_freespace_13.lua +++ b/lua/cfc_random_spawn/configs/gm_freespace_13.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_freespace_13"] = { - centerCutoff = 3000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( -1313, 25, -14566 ), spawnAngle = Angle( 0, 180, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_heartland.lua b/lua/cfc_random_spawn/configs/gm_heartland.lua index df0be6e..32f0817 100644 --- a/lua/cfc_random_spawn/configs/gm_heartland.lua +++ b/lua/cfc_random_spawn/configs/gm_heartland.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_heartland"] = { - centerCutoff = 3000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 594, -351, 28 ), spawnAngle = Angle( 0, -180, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua b/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua index 6369901..9ed5256 100644 --- a/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua +++ b/lua/cfc_random_spawn/configs/gm_mobenix_v3_final.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_mobenix_v3_final"] = { - centerCutoff = 4500, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( -9124, -1747, 10384 ), spawnAngle = Angle( 0, 179, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_obselisk.lua b/lua/cfc_random_spawn/configs/gm_obselisk.lua index 5f12d18..b4f200c 100644 --- a/lua/cfc_random_spawn/configs/gm_obselisk.lua +++ b/lua/cfc_random_spawn/configs/gm_obselisk.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_obselisk"] = { - centerCutoff = 3000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( -3680, -349, -1334 ), spawnAngle = Angle( 0, 45, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua b/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua index ca113a4..57ec17a 100644 --- a/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua +++ b/lua/cfc_random_spawn/configs/gm_tubeway_circuit_v1.lua @@ -1,5 +1,4 @@ CFCRandomSpawn.Config.CUSTOM_SPAWNS["gm_tubeway_circuit_v1"] = { - centerCutoff = 3000, centerUpdateInterval = nil, spawnpoints = { { spawnPos = Vector( 4338, 2662, 10 ), spawnAngle = Angle( 0, 178, 0 ), pvp = true }, diff --git a/lua/cfc_random_spawn/module/cl_spawns_editor.lua b/lua/cfc_random_spawn/module/cl_spawns_editor.lua index 6f48195..2c05116 100644 --- a/lua/cfc_random_spawn/module/cl_spawns_editor.lua +++ b/lua/cfc_random_spawn/module/cl_spawns_editor.lua @@ -1,5 +1,5 @@ local spawnColor = Color( 0, 255, 0 ) -local spawnColorActiveCenter = Color( 0, 180, 255 ) +local spawnColorActiveCenter = Color( 0, 255, 255 ) local centerActiveColor = Color( 0, 50, 255 ) local centerActiveRangeColor = Color( 75, 0, 255 ) local zoneUnconfirmedColor = Color( 255, 0, 255 ) @@ -20,7 +20,6 @@ local spawnTable = {} local zoneCornerA = nil local zoneCornerB = nil local activeCenter = nil -local centerCutoffDefault = 3000 local function roundVector( vec, idp ) @@ -36,6 +35,16 @@ net.Receive( "CFC_SpawnEditor_SendSpawnPoints", function() spawnTable = net.ReadTable() end ) + +net.Receive( "CFC_SpawnEditor_SyncActivePvpCenter", function() + activeCenter = { + centerPos = net.ReadVector(), + radius = net.ReadFloat(), + zoneID = net.ReadUInt( 10 ), + } +end ) + + local function canRunCommand() local ply = LocalPlayer() if not ply:IsAdmin() then @@ -59,7 +68,7 @@ end local function drawActiveCenter( center, pointColor, rangeColor, radius ) local pos = center.centerPos - local cutoff = spawnTable.centerCutoff or centerCutoffDefault + local cutoff = center.radius if cutoff > LocalPlayer():GetPos():Distance( pos ) then render.DrawLine( pos - Vector( 0, 0, cutoff ), pos + Vector( 0, 0, cutoff ), pointColor, true ) @@ -83,7 +92,7 @@ hook.Add( "PostDrawTranslucentRenderables", "CFC_SpawnEditor_DrawSpawnPoints", f -- Cace active center stuff if activeCenter then activeCenterPos = activeCenter.centerPos - activeCenterCutoff = activeCenter.centerCutoff or centerCutoffDefault + activeCenterCutoff = activeCenter.radius if spawnTable.zones then local zone = spawnTable.zones[activeCenter.zoneID] @@ -297,10 +306,6 @@ local function printSpawnTable() local mainString = string.format( [[CFCRandomSpawn.Config.CUSTOM_SPAWNS["%s"] = {%s]], game.GetMap(), "\n" ) - if spawnTable.centerCutoff then - mainString = mainString .. tab .. "centerCutoff = " .. spawnTable.centerCutoff .. ",\n" - end - if spawnTable.centerUpdateInterval then mainString = mainString .. tab .. "centerUpdateInterval = " .. spawnTable.centerUpdateInterval .. ",\n" end @@ -359,13 +364,4 @@ local function clearAll( _, _, args ) print( "Cleared all spawns!" ) end -concommand.Add( "cfc_spawneditor_clearall", clearAll, _, "Clears all spawn points. Dangerous." ) - - -net.Receive( "CFC_SpawnEditor_ActivePvpCenter", function() - activeCenter = { - centerPos = net.ReadVector(), - centerCutoff = net.ReadFloat(), - zoneID = net.ReadUInt( 10 ), - } -end ) +concommand.Add( "cfc_spawneditor_clearall", clearAll, _, "Clears all spawn points. Dangerous." ) \ No newline at end of file diff --git a/lua/cfc_random_spawn/module/sv_player_spawning.lua b/lua/cfc_random_spawn/module/sv_player_spawning.lua index b01246e..2e1c155 100755 --- a/lua/cfc_random_spawn/module/sv_player_spawning.lua +++ b/lua/cfc_random_spawn/module/sv_player_spawning.lua @@ -6,9 +6,9 @@ local mapHasCustomSpawns = next( customSpawnConfigForMap ) local customSpawnsForMap = customSpawnConfigForMap.spawnpoints or {} local zonesForMap = customSpawnConfigForMap.zones or {} -local DEFAULT_CENTER_CUTOFF = customSpawnConfigForMap.centerCutoff or CFCRandomSpawn.Config.DEFAULT_CENTER_CUTOFF -local DEFAULT_CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF ^ 2 -local CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF_SQR +local DEFAULT_CENTER_RADIUS = CFCRandomSpawn.Config.DEFAULT_CENTER_RADIUS +local DEFAULT_CENTER_RADIUS_SQR = DEFAULT_CENTER_RADIUS ^ 2 +local CENTER_RADIUS_SQR = DEFAULT_CENTER_RADIUS_SQR local DYNAMIC_CENTER_FALLBACK = customSpawnConfigForMap.dynamicCenterStartingPos or Vector() local SELECTION_SIZE = CFCRandomSpawn.Config.SELECTION_SIZE local CLOSENESS_LIMIT = CFCRandomSpawn.Config.CLOSENESS_LIMIT ^ 2 @@ -88,9 +88,10 @@ function CFCRandomSpawn.refreshMapInfo() if not mapHasCustomSpawns then return end customSpawnsForMap = customSpawnConfigForMap.spawnpoints or {} - DEFAULT_CENTER_CUTOFF = customSpawnConfigForMap.centerCutoff or CFCRandomSpawn.Config.DEFAULT_CENTER_CUTOFF - DEFAULT_CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF ^ 2 - CENTER_CUTOFF_SQR = DEFAULT_CENTER_CUTOFF_SQR + DEFAULT_CENTER_RADIUS = CFCRandomSpawn.Config.DEFAULT_CENTER_RADIUS + DEFAULT_CENTER_RADIUS_SQR = DEFAULT_CENTER_RADIUS ^ 2 + CENTER_RADIUS = DEFAULT_CENTER_RADIUS + CENTER_RADIUS_SQR = CENTER_RADIUS ^ 2 SELECTION_SIZE = CFCRandomSpawn.Config.SELECTION_SIZE CLOSENESS_LIMIT = CFCRandomSpawn.Config.CLOSENESS_LIMIT ^ 2 CENTER_UPDATE_INTERVAL = customSpawnConfigForMap.centerUpdateInterval or CFCRandomSpawn.Config.CENTER_UPDATE_INTERVAL @@ -216,7 +217,7 @@ local function getSpawnsInZone( spawns, zoneID ) return filteredSpawns end --- Get the first SELECTION_SIZE spawns that are closest to nearPos and are within range of CENTER_CUTOFF_SQR +-- Get the first SELECTION_SIZE spawns that are closest to nearPos and are within range of CENTER_RADIUS_SQR local cachedSpawnsInsideCenter = nil local nextSpawnsInsideCenterCache = 0 @@ -225,7 +226,7 @@ local function spawnsInsidePvpCenterCached( spawns ) nextSpawnsInsideCenterCache = CurTime() + 7.5 local center = CFCRandomSpawn.activePvpCenter - local sortedSpawns = spawnsSortedByDistTo( center.centerPos, spawns, CENTER_CUTOFF_SQR, center.zoneID ) + local sortedSpawns = spawnsSortedByDistTo( center.centerPos, spawns, CENTER_RADIUS_SQR, center.zoneID ) cachedSpawnsInsideCenter = {} for i = 1, SELECTION_SIZE do @@ -364,8 +365,8 @@ local function getDynamicPvpCenter( measurablePlayers ) end end - dynamicPvpCenter.overrideCutoff = math.sqrt( dynamicCenterSizeSqr ) - dynamicPvpCenter.overrideCutoffSqr = dynamicCenterSizeSqr + dynamicPvpCenter.radius = math.sqrt( dynamicCenterSizeSqr ) + dynamicPvpCenter.radiusSqr = dynamicCenterSizeSqr return dynamicPvpCenter end @@ -375,8 +376,8 @@ local function updateActivePvpCenter( measurablePlayers ) CFCRandomSpawn.activePvpCenter = activePvpCenter - CENTER_CUTOFF = activePvpCenter.overrideCutoff or DEFAULT_CENTER_CUTOFF - CENTER_CUTOFF_SQR = activePvpCenter.overrideCutoffSqr or DEFAULT_CENTER_CUTOFF_SQR + CENTER_RADIUS = activePvpCenter.radius or DEFAULT_CENTER_RADIUS + CENTER_RADIUS_SQR = activePvpCenter.radiusSqr or DEFAULT_CENTER_RADIUS_SQR -- Network to editors local editors = CFCRandomSpawn.EditingPlayers @@ -391,7 +392,7 @@ local function updateActivePvpCenter( measurablePlayers ) if not next( editors ) then return end - syncActivePvpCenter() + CFCRandomSpawn.syncActivePvpCenter() end function CFCRandomSpawn.getOptimalSpawnPos() diff --git a/lua/cfc_random_spawn/module/sv_spawns_editor.lua b/lua/cfc_random_spawn/module/sv_spawns_editor.lua index 2eace6b..0e0464e 100644 --- a/lua/cfc_random_spawn/module/sv_spawns_editor.lua +++ b/lua/cfc_random_spawn/module/sv_spawns_editor.lua @@ -1,19 +1,20 @@ util.AddNetworkString( "CFC_SpawnEditor_SendSpawnPoints" ) util.AddNetworkString( "CFC_SpawnEditor_RequestSpawnPoints" ) util.AddNetworkString( "CFC_SpawnEditor_UpdateSpawnPoints" ) +util.AddNetworkString( "CFC_SpawnEditor_SyncActivePvpCenter" ) util.AddNetworkString( "CFC_SpawnEditor_SetEditing" ) CFCRandomSpawn.EditingPlayers = CFCRandomSpawn.EditingPlayers or {} -local function syncActivePvpCenter() +function CFCRandomSpawn.syncActivePvpCenter() local activePvpCenter = CFCRandomSpawn.activePvpCenter if not activePvpCenter then return end - net.Start( "CFC_SpawnEditor_ActivePvpCenter" ) + net.Start( "CFC_SpawnEditor_SyncActivePvpCenter" ) net.WriteVector( activePvpCenter.centerPos ) - net.WriteFloat( activePvpCenter.centerCutoff or DEFAULT_CENTER_CUTOFF ) + net.WriteFloat( activePvpCenter.radius ) net.WriteUInt( activePvpCenter.zoneID, 10 ) - net.Send( editors ) + net.Send( CFCRandomSpawn.EditingPlayers ) end net.Receive( "CFC_SpawnEditor_RequestSpawnPoints", function( _, ply ) @@ -22,7 +23,7 @@ net.Receive( "CFC_SpawnEditor_RequestSpawnPoints", function( _, ply ) if not customSpawnConfigForMap then return end - syncActivePvpCenter() + CFCRandomSpawn.syncActivePvpCenter() net.Start( "CFC_SpawnEditor_SendSpawnPoints" ) net.WriteTable( customSpawnConfigForMap ) diff --git a/lua/cfc_random_spawn/sv_config.lua b/lua/cfc_random_spawn/sv_config.lua index 5c870fd..1957583 100755 --- a/lua/cfc_random_spawn/sv_config.lua +++ b/lua/cfc_random_spawn/sv_config.lua @@ -1,4 +1,4 @@ -CFCRandomSpawn.Config.DEFAULT_CENTER_CUTOFF = 3000 -- Default cutoff range from the most popular pvp center, where players further away from this will be ignored. The system tries to place you closest to everyone else. +CFCRandomSpawn.Config.DEFAULT_CENTER_RADIUS = 3000 -- Default cutoff range from the most popular pvp center, where players further away from this will be ignored. The system tries to place you closest to everyone else. CFCRandomSpawn.Config.CLOSENESS_LIMIT = 300 -- Will not choose spawnpoints that are within this many units of a valid player (i.e. a living pvper). CFCRandomSpawn.Config.SELECTION_SIZE = 16 -- Max number of 'ideal' spawnpoints to select from randomly. CFCRandomSpawn.Config.CENTER_UPDATE_INTERVAL = 120 -- The gap (in seconds) between each center popularity update. If set to 0, will update on every respawn. From ea57f9013a5616208477ebefd15a1f248eda47ff Mon Sep 17 00:00:00 2001 From: StrawWagen <64710817+StrawWagen@users.noreply.github.com> Date: Fri, 27 Mar 2026 17:55:17 -0700 Subject: [PATCH 4/5] Update lua/cfc_random_spawn/module/sv_player_spawning.lua Co-authored-by: legokidlogan <26103433+legokidlogan@users.noreply.github.com> --- lua/cfc_random_spawn/module/sv_player_spawning.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/cfc_random_spawn/module/sv_player_spawning.lua b/lua/cfc_random_spawn/module/sv_player_spawning.lua index 2e1c155..d03720a 100755 --- a/lua/cfc_random_spawn/module/sv_player_spawning.lua +++ b/lua/cfc_random_spawn/module/sv_player_spawning.lua @@ -43,7 +43,6 @@ local spawnTraceRequest = { local CurTime = CurTime local Vector = Vector -util.AddNetworkString( "CFC_SpawnEditor_ActiveCenter" ) local function getZoneForPos( pos ) if noZones then return NO_ZONE_ID end From 21393d327e4f2f0e7e5d46a43e56191eed7171b8 Mon Sep 17 00:00:00 2001 From: StrawWagen <64710817+StrawWagen@users.noreply.github.com> Date: Fri, 27 Mar 2026 17:55:24 -0700 Subject: [PATCH 5/5] Update README.md Co-authored-by: legokidlogan <26103433+legokidlogan@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d0d8884..0b2f079 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Features: - To mark / cancel / add / remove zones `cfc_spawneditor_zonea` and `cfc_spawneditor_zoneb` / `cfc_spawneditor_zonecancel` / `cfc_spawneditor_zoneadd` / `cfc_spawneditor_zonedel` - Zones will be previewed in magenta, then turn cyan when confirmed. - To export the current map's spawnpoints to console use `cfc_spawneditor_export`, you can then paste this into sv_config.lua -- To change the update interval for pvp centers temporarily for debugging, use `cfc_spawneditor_center_interval ` +- To change the update interval for pvp centers temporarily for debugging, use `cfc_spawneditor_pvpcenter_update_interval ` Visual appearance: ![image](https://user-images.githubusercontent.com/69946827/190715330-645c7701-953d-452e-aa52-9908e479eecf.png)