diff --git a/README.md b/README.md index b3187a8..0b2f079 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,13 +22,8 @@ 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, - pvpCenters = { - { centerPos = VECTOR, overrideCutoff = NUMBER }, - ... - }, zones = { { cornerA = VECTOR, cornerB = VECTOR }, ... @@ -40,12 +35,8 @@ 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,12 +53,10 @@ 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 ` +- 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) diff --git a/lua/cfc_random_spawn/configs/gm_blesmont.lua b/lua/cfc_random_spawn/configs/gm_blesmont.lua index a4428da..bb90fdd 100644 --- a/lua/cfc_random_spawn/configs/gm_blesmont.lua +++ b/lua/cfc_random_spawn/configs/gm_blesmont.lua @@ -1,11 +1,5 @@ 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..94a7840 100644 --- a/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua +++ b/lua/cfc_random_spawn/configs/gm_bluehills_test3.lua @@ -1,9 +1,5 @@ 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..6ec5e92 100644 --- a/lua/cfc_random_spawn/configs/gm_city25.lua +++ b/lua/cfc_random_spawn/configs/gm_city25.lua @@ -1,14 +1,5 @@ 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..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,12 +1,5 @@ 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..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,13 +1,5 @@ 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..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,14 +1,5 @@ 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..c2cc8bb 100644 --- a/lua/cfc_random_spawn/configs/gm_freespace_13.lua +++ b/lua/cfc_random_spawn/configs/gm_freespace_13.lua @@ -1,9 +1,5 @@ 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..32f0817 100644 --- a/lua/cfc_random_spawn/configs/gm_heartland.lua +++ b/lua/cfc_random_spawn/configs/gm_heartland.lua @@ -1,17 +1,5 @@ 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..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,19 +1,5 @@ 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..b4f200c 100644 --- a/lua/cfc_random_spawn/configs/gm_obselisk.lua +++ b/lua/cfc_random_spawn/configs/gm_obselisk.lua @@ -1,12 +1,5 @@ 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..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,13 +1,5 @@ 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..2c05116 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 spawnColorActiveCenter = Color( 0, 255, 255 ) local centerActiveColor = Color( 0, 50, 255 ) local centerActiveRangeColor = Color( 75, 0, 255 ) local zoneUnconfirmedColor = Color( 255, 0, 255 ) @@ -22,7 +20,6 @@ local spawnTable = {} local zoneCornerA = nil local zoneCornerB = nil local activeCenter = nil -local centerCutoffDefault = 3000 local function roundVector( vec, idp ) @@ -38,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,9 +66,9 @@ 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 + 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 ) @@ -85,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] @@ -118,12 +125,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 +136,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 +199,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 @@ -356,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 @@ -369,16 +315,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,13 +364,4 @@ local function clearAll( _, _, args ) print( "Cleared all spawns!" ) end -concommand.Add( "cfc_spawneditor_clearall", clearAll, _, "Clears all spawn points and pvp centers. Dangerous." ) - - -net.Receive( "CFC_SpawnEditor_ActiveCenter", 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 4df5013..d03720a 100755 --- a/lua/cfc_random_spawn/module/sv_player_spawning.lua +++ b/lua/cfc_random_spawn/module/sv_player_spawning.lua @@ -6,10 +6,9 @@ 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 +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 @@ -44,12 +43,6 @@ local spawnTraceRequest = { local CurTime = CurTime 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 +56,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 +66,6 @@ local function loadZones() spawn.zoneID = fallbackZoneID end - for _, pvpCenter in ipairs( pvpCenters ) do - pvpCenter.zoneID = fallbackZoneID - end - return end @@ -101,34 +74,28 @@ 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 + 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 IGNORE_BUILDERS = CFCRandomSpawn.Config.IGNORE_BUILDERS - loadPvpCenters() loadZones() end @@ -249,7 +216,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 @@ -257,8 +224,8 @@ local function spawnsInsidePvpCenterCached( spawns ) if cachedSpawnsInsideCenter and nextSpawnsInsideCenterCache > CurTime() then return cachedSpawnsInsideCenter end nextSpawnsInsideCenterCache = CurTime() + 7.5 - local center = CFCRandomSpawn.mostPopularCenter - local sortedSpawns = spawnsSortedByDistTo( center.centerPos, spawns, CENTER_CUTOFF_SQR, center.zoneID ) + local center = CFCRandomSpawn.activePvpCenter + local sortedSpawns = spawnsSortedByDistTo( center.centerPos, spawns, CENTER_RADIUS_SQR, center.zoneID ) cachedSpawnsInsideCenter = {} for i = 1, SELECTION_SIZE do @@ -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 ) @@ -413,43 +364,19 @@ 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 --- 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 +local function updateActivePvpCenter( measurablePlayers ) + 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_RADIUS = activePvpCenter.radius or DEFAULT_CENTER_RADIUS + CENTER_RADIUS_SQR = activePvpCenter.radiusSqr or DEFAULT_CENTER_RADIUS_SQR -- Network to editors local editors = CFCRandomSpawn.EditingPlayers @@ -464,19 +391,15 @@ 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.Send( editors ) + CFCRandomSpawn.syncActivePvpCenter() end function CFCRandomSpawn.getOptimalSpawnPos() local measurablePlayers = getMeasurablePlayers() local allLivingPlys = getLivingPlayers() - if not CFCRandomSpawn.mostPopularCenter then - updatePopularCenter( measurablePlayers ) + if not CFCRandomSpawn.activePvpCenter then + updateActivePvpCenter( measurablePlayers ) end local spawnsInsideCenter = spawnsInsidePvpCenterCached( customSpawnsForMap ) @@ -488,6 +411,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 +426,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 ) + updateActivePvpCenter( 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." ) diff --git a/lua/cfc_random_spawn/module/sv_spawns_editor.lua b/lua/cfc_random_spawn/module/sv_spawns_editor.lua index ee6ee09..0e0464e 100644 --- a/lua/cfc_random_spawn/module/sv_spawns_editor.lua +++ b/lua/cfc_random_spawn/module/sv_spawns_editor.lua @@ -1,16 +1,30 @@ 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 {} +function CFCRandomSpawn.syncActivePvpCenter() + local activePvpCenter = CFCRandomSpawn.activePvpCenter + if not activePvpCenter then return end + + net.Start( "CFC_SpawnEditor_SyncActivePvpCenter" ) + net.WriteVector( activePvpCenter.centerPos ) + net.WriteFloat( activePvpCenter.radius ) + net.WriteUInt( activePvpCenter.zoneID, 10 ) + net.Send( CFCRandomSpawn.EditingPlayers ) +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 + CFCRandomSpawn.syncActivePvpCenter() + net.Start( "CFC_SpawnEditor_SendSpawnPoints" ) net.WriteTable( customSpawnConfigForMap ) net.Send( ply ) 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.