From 71b6671cd4bd66052e16c3d748e05e107344c4a8 Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Wed, 28 Feb 2024 23:18:41 -0800 Subject: [PATCH] Fix round manager and add more presets. Add more spawns for mechz. Add spawns for zombie_dog. Add zombie counter for debugging. --- zm_ai_pack/maps/mp/zm_prison.d3dbsp | 843 +++++++++++++++++- zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc | 1 - .../scripts/zm/zm_ai_pack/_round_manager.gsc | 147 +-- zm_ai_pack/scripts/zm/zm_ai_pack/_utility.gsc | 122 +++ .../zm/zm_ai_pack/mixed_presets/_default.gsc | 14 + .../zm_ai_pack/mixed_variants/_dog_wave.gsc | 75 ++ .../zm/zm_ai_pack/mixed_variants/_random.gsc | 80 ++ .../scripts/zm/zm_ai_pack/rounds/_mechz.gsc | 23 +- .../scripts/zm/zm_ai_pack/rounds/_mixed.gsc | 113 +-- .../scripts/zm/zm_ai_pack/rounds/_normal.gsc | 21 +- .../scripts/zm/zm_ai_pack/rounds/_timed.gsc | 0 .../zm/zm_ai_pack/rounds/_zombie_dog.gsc | 71 +- .../rounds/mixed_presets/_default.gsc | 9 - .../rounds/mixed_variants/_random.gsc | 19 - .../scripts/zm/zm_ai_pack_mod_debug_main.gsc | 58 +- zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc | 4 +- zm_ai_pack/zone_source/mod.zone | 5 + 17 files changed, 1323 insertions(+), 282 deletions(-) create mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc create mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_dog_wave.gsc create mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc create mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_timed.gsc delete mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_presets/_default.gsc delete mode 100644 zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_variants/_random.gsc diff --git a/zm_ai_pack/maps/mp/zm_prison.d3dbsp b/zm_ai_pack/maps/mp/zm_prison.d3dbsp index 77c569b..a440885 100644 --- a/zm_ai_pack/maps/mp/zm_prison.d3dbsp +++ b/zm_ai_pack/maps/mp/zm_prison.d3dbsp @@ -21419,4 +21419,845 @@ "origin" "-1738.67 -3596.65 -8447.88" "classname" "script_struct" "angles" "0 0 0" -} \ No newline at end of file +} +{ +"targetname" "zone_cafetaria_spawner" +"script_noteworthy" "mechz_location" +"origin" "2725.03 9658.48 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cafetaria_end_spawner" +"script_noteworthy" "mechz_location" +"origin" "3205.23 9663.14 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "mechz_location" +"origin" "881.517 9143.41 1547.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "mechz_location" +"origin" "890.802 9675.04 1545.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_spawner" +"script_noteworthy" "mechz_location" +"origin" "3287.12 9337.17 1528.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_roof_spawner" +"script_noteworthy" "mechz_location" +"origin" "3484.44 9768.23 1534.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_roof_spawner" +"script_noteworthy" "mechz_location" +"origin" "4047.44 9466.48 1528.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_spawner" +"script_noteworthy" "mechz_location" +"origin" "3058.97 9841.8 1560.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_barber_spawner" +"script_noteworthy" "mechz_location" +"origin" "1484.82 9130.33 1343.37" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_barber_spawner" +"script_noteworthy" "mechz_location" +"origin" "355.249 9088.17 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_barber_spawner" +"script_noteworthy" "mechz_location" +"origin" "882.351 9322.25 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "mechz_location" +"origin" "570.376 8618.54 832.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "mechz_location" +"origin" "328.585 8148.19 684.903" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "mechz_location" +"origin" "729.112 8642.57 502.9" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "mechz_location" +"origin" "86.2749 8503.08 340.77" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_spawner" +"script_noteworthy" "mechz_location" +"origin" "-100.741 7516.88 72.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_spawner" +"script_noteworthy" "mechz_location" +"origin" "351.15 7907.94 72.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_building_spawner" +"script_noteworthy" "mechz_location" +"origin" "147.058 7128.03 72.9407" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_building_spawner" +"script_noteworthy" "mechz_location" +"origin" "-460.282 7023.72 64.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_spawner" +"script_noteworthy" "mechz_location" +"origin" "-264.551 6028.64 -8.69766" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "mechz_location" +"origin" "-928.747 9361.24 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "mechz_location" +"origin" "-949.515 8998.29 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "mechz_location" +"origin" "-981.735 8648.42 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_start_spawners" +"script_noteworthy" "mechz_location" +"origin" "1045.63 10582.1 1344.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_start_spawners" +"script_noteworthy" "mechz_location" +"origin" "1405.83 10593.9 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "mechz_location" +"origin" "2918.04 9452.32 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_infirmary_spawner" +"script_noteworthy" "mechz_location" +"origin" "3714.47 9357.89 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "mechz_location" +"origin" "-1011.61 -3441.96 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "mechz_location" +"origin" "-1111.55 -3744.06 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"classname" "actor_zombie_dog" +"model" "zombie_wolf" +"export" "1" +"spawnflags" "17" +"origin" "100 0 -500" +"script_noteworthy" "zombie_dog_spawner" +} +{ +"targetname" "zone_start_spawners" +"script_noteworthy" "zombie_dog_location" +"origin" "1736.31 10639.9 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_start_spawners" +"script_noteworthy" "zombie_dog_location" +"origin" "2036.6 10351.8 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_start_spawners" +"script_noteworthy" "zombie_dog_location" +"origin" "1183.63 10527.4 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_library_spawners" +"script_noteworthy" "zombie_dog_location" +"origin" "402.293 10629.5 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "882.824 9982.29 1344.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "402.382 10227.2 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "968.15 10195.3 1344.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "730.142 9733.42 1442.41" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "873.7 9978.59 1440.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "904.37 9443.14 1440.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "1051.31 9671.24 1545.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "850.545 8910.55 1544.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_gondola_dock_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "999.076 8433.01 1544.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "1287.83 9624.33 1544.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2167.42 9611.81 1558.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2162.94 9286.91 1558.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2600.03 9309.99 1528.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2583.17 9929 1560.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2927.24 9817.08 1560.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3282.58 9291.64 1528.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3478.58 9776.94 1534.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3889.84 9735.01 1528.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_infirmary_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "4194.48 9484.51 1534.24" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_infirmary_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3857.55 9331.99 1712.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3587.77 9344.71 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3268.26 9351.12 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3011.81 9305.99 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2431.73 9321.52 1711.35" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2257.53 9511.04 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2265.02 10022 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2551.71 9759.74 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2917.61 10016.3 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3417.27 10029.8 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_roof_infirmary_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3907.33 10006 1704.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cafetaria_end_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3285.19 9950.46 1339.91" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cafetaria_end_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "3221.19 9602.3 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cafetaria_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2773.16 9362.9 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cafetaria_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2353.91 9643.4 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_east_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "2065.13 9895.34 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_east_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "1470.51 9663.33 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_east_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "1689.01 9141.98 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_barber_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "1069.96 9137.75 1443.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_barber_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "555.685 9218.82 1440.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_warden_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-387.737 9116.65 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_citadel_warden" +"script_noteworthy" "zombie_dog_location" +"origin" "174.117 8739.28 1136.01" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_citadel_warden" +"script_noteworthy" "zombie_dog_location" +"origin" "735.943 9006.16 1128.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_citadel" +"script_noteworthy" "zombie_dog_location" +"origin" "417.32 9599.52 1104.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_citadel" +"script_noteworthy" "zombie_dog_location" +"origin" "724.651 10004.8 1128.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_shower" +"script_noteworthy" "zombie_dog_location" +"origin" "1678.52 10359.1 1144.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_shower" +"script_noteworthy" "zombie_dog_location" +"origin" "2075.71 10346.1 1144.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_shower" +"script_noteworthy" "zombie_dog_location" +"origin" "2101.07 9696.64 1144.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_shower" +"script_noteworthy" "zombie_dog_location" +"origin" "1919.88 9097.18 1144.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_shower" +"script_noteworthy" "zombie_dog_location" +"origin" "1646.06 9566.59 1144.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_cellblock_west_barber_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "1516.68 9217.38 1341.21" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-499.962 9419.59 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-1015.08 9472.75 1340.32" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-1040.77 8931.18 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-1035.42 8563.19 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_warden_office_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-548.046 8786.22 1336.13" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "566.468 8547.15 832.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "66.8536 8538.57 796.524" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "379.85 8231.31 676.772" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "607.649 8536.06 513.143" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "302.276 8628.75 395.893" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_stairs_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "55.957 8303.36 298.466" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "432.359 7889.63 64.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "49.2319 7662.62 64.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_building_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "311.608 7147.19 95.7652" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "citadel_basement_building_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-508.615 7000.74 64.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_studio_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "59.2196 6820.04 64.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_studio_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-447.706 6434.78 72.125" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "330.199 6214.2 45.868" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-597.664 6130.49 -36.3894" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-872.353 5753.49 -67.7443" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-1237.16 5251.97 -65.7902" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_puzzle_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-1379.6 5556.6 -71.875" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "-375.256 5612.04 -71.875" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_gondola_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "681.673 6798.12 210.434" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "zone_dock_gondola_spawner" +"script_noteworthy" "zombie_dog_location" +"origin" "710.27 6558.34 209.353" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-1782.82 -3272.03 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-1781.43 -3503.55 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-1697.8 -3826.63 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-1376.12 -3869.49 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-1241.28 -3674.41 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-1050.41 -3441.63 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-797.884 -3876.34 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-495.026 -3836.23 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-503.895 -3649.14 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-539.342 -3403.96 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} +{ +"targetname" "spawner_golden_gate_bridge" +"script_noteworthy" "zombie_dog_location" +"origin" "-796.16 -3409.1 -8447.88" +"classname" "script_struct" +"angles" "0 0 0" +} diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc index 53c3200..76d6944 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc @@ -1392,7 +1392,6 @@ get_priority_item_for_brutus( zone_name, do_secondary_zone_checks ) if ( !isDefined( int_objects ) ) { - print( "int_objects is undefined" ); continue; } diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc index 67ad5a9..0505163 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/_round_manager.gsc @@ -4,6 +4,8 @@ #include maps\mp\zombies\_zm; +#include scripts\zm\zm_ai_pack\_utility; + main() { set_dvar_if_unset( "rm_min_rounds_before_special_round", 3 ); @@ -17,7 +19,7 @@ main() set_dvar_if_unset( "rm_forced_special_variant", "" ); set_dvar_if_unset( "rm_allowed_mixed_rounds_presets", "default" ); - set_dvar_if_unset( "rm_allowed_mixed_rounds_variants", "random" ); + set_dvar_if_unset( "rm_allowed_mixed_round_variants", "random" ); set_dvar_if_unset( "rm_forced_mixed_rounds_preset", "" ); set_dvar_if_unset( "rm_forced_mixed_rounds_variant", "" ); @@ -35,6 +37,10 @@ main() level.normal_round.current_data.round_type = ""; level.normal_round.current_data.variant = ""; + register_ai_spawning_func( "normal", scripts\zm\zm_ai_pack\rounds\_normal::spawn_single_normal_zombie ); + register_ai_spawning_func( "zombie_dog", scripts\zm\zm_ai_pack\rounds\_zombie_dog::spawn_single_zombie_dog ); + register_ai_spawning_func( "mechz", scripts\zm\zm_ai_pack\rounds\_mechz::spawn_single_mechz ); + scripts\zm\zm_ai_pack\rounds\_zombie_dog::main(); scripts\zm\zm_ai_pack\rounds\_mechz::main(); @@ -93,13 +99,24 @@ main() scripts\zm\zm_ai_pack\rounds\_mixed::round_next ); register_mixed_round_preset( "default", - scripts\zm\zm_ai_pack\rounds\mixed_presets\_default::preset_chance ); + scripts\zm\zm_ai_pack\mixed_presets\_default::preset_chance, + scripts\zm\zm_ai_pack\mixed_presets\_default::round_start ); register_mixed_round_preset_variant( "default", "random", - scripts\zm\zm_ai_pack\rounds\mixed_variants\_random::spawning_random, - scripts\zm\zm_ai_pack\rounds\mixed_variants\_random::spawning_chance, - scripts\zm\zm_ai_pack\rounds\mixed_variants\_random::spawning_limit, - scripts\zm\zm_ai_pack\rounds\mixed_variants\_random::spawning_cooldown ); + scripts\zm\zm_ai_pack\mixed_variants\_random::spawning_random, + scripts\zm\zm_ai_pack\mixed_variants\_random::spawning_chance, + scripts\zm\zm_ai_pack\mixed_variants\_random::spawning_limit, + scripts\zm\zm_ai_pack\mixed_variants\_random::spawning_cooldown, + scripts\zm\zm_ai_pack\mixed_variants\_random::spawning_round_start ); + + register_mixed_round_preset_variant( "default", "dog_wave", + scripts\zm\zm_ai_pack\mixed_variants\_dog_wave::spawning_dog_wave, + scripts\zm\zm_ai_pack\mixed_variants\_dog_wave::spawning_chance, + scripts\zm\zm_ai_pack\mixed_variants\_dog_wave::spawning_limit, + scripts\zm\zm_ai_pack\mixed_variants\_dog_wave::spawning_cooldown, + scripts\zm\zm_ai_pack\mixed_variants\_dog_wave::spawning_round_start); + + scripts\zm\zm_ai_pack\mixed_variants\_random::main(); //Future variants // random - random ais, true_random - random ais + random behavior and stats // elemental? @@ -108,58 +125,6 @@ main() // several default presets to cycle through } -register_special_round( round_type, variant_type, round_spawning_func, round_wait_func, round_max_func, round_start_func, between_round_over_func, round_chance_func, next_instance_func ) -{ - if ( !isDefined( level.round_manager_special_rounds ) ) - { - level.round_manager_special_rounds = []; - } - - if ( !isDefined( level.round_manager_special_rounds[ round_type ] ) ) - { - level.round_manager_special_rounds[ round_type ] = []; - } - - s = sys::spawnstruct(); - s.spawning_func = round_spawning_func; - s.wait_func = round_wait_func; - s.max_func = round_max_func; - s.start_func = round_start_func; - s.between_round_over_func = between_round_over_func; - s.chance_func = round_chance_func; - s.next_instance_func = next_instance_func; - s.active = false; - level.round_manager_special_rounds[ round_type ][ variant_type ] = s; -} - -register_mixed_round_preset( preset_type, preset_chance_func ) -{ - if ( !isDefined( level.round_manager_mixed_round_presets ) ) - { - level.round_manager_mixed_round_presets = []; - } - - if ( !isDefined( level.round_manager_mixed_round_presets[ preset_type ] ) ) - { - level.round_manager_mixed_round_presets[ preset_type ] = sys::spawnstruct(); - level.round_manager_mixed_round_presets[ preset_type ].variants = []; - } - - level.round_manager_mixed_round_presets[ preset_type ].chance_func = preset_chance_func; -} - -register_mixed_round_preset_variant( preset_type, variant_type, spawning_func, spawning_chance_func, spawning_limit_per_round_func, spawning_cooldown_func ) -{ - assert( isdefined( level.round_manager_mixed_round_presets[ preset_type ] ) ); - - s = sys::spawnstruct(); - s.spawning_func = spawning_func; - s.chance_func = spawning_chance_func; - s.limit_per_round_func = spawning_limit_per_round_func; - s.cooldown_func = spawning_cooldown_func; - level.round_manager_mixed_round_presets[ preset_type ].variants[ variant_type ] = s; -} - should_do_special_round() { if ( getDvar( "rm_forced_special_round" ) != "" && getdvar( "rm_forced_special_variant" ) ) @@ -222,8 +187,7 @@ determine_current_round_type() { if ( !isDefined( level.round_manager_special_rounds[ forced_special_round ] ) || !isDefined( level.round_manager_special_rounds[ forced_special_round ][ forced_variant ] ) ) { - print( "Round Manager ERROR: Can't set special round and variant to " + forced_special_round + " and " + forced_variant + " because it wasn't registered" ); - assert( false ); + assertmsg( "Round Manager ERROR: Can't set special round and variant to " + forced_special_round + " and " + forced_variant + " because it wasn't registered" ); } else { @@ -315,36 +279,6 @@ determine_current_round_type() } } -get_zombie_dog_array() -{ - return getaispeciesarray( level.zombie_team, "zombie_dog" ); -} - -get_zombie_dog_count() -{ - return get_zombie_dog_array().size; -} - -get_mechz_array() -{ - zombies = getaiarray( level.zombie_team ); - mechz = []; - for ( i = 0; i < zombies.size; i++ ) - { - if ( isdefined( zombies[ i ].animname ) && zombies[ i ].animname == "mechz_zombie" ) - { - mechz[ mechz.size ] = zombies[ i ]; - } - } - - return mechz; -} - -get_mechz_count() -{ - return get_mechz_array().size; -} - round_think_override( restart ) { if ( !isdefined( restart ) ) @@ -421,6 +355,10 @@ round_think_override( restart ) while ( level.zombie_spawn_locations.size <= 0 ) wait 0.1; +/# + while ( getdvarint( #"zombie_cheat" ) == 2 || getdvarint( #"zombie_cheat" ) >= 4 ) + wait 1; +#/ level.round_manager_special_rounds[ current_round_data.round_type ][ current_round_data.variant ].active = true; level [[ round_manager_inst.max_func ]](); @@ -510,8 +448,7 @@ determine_mixed_round_preset() { if ( !isDefined( level.round_manager_mixed_round_presets[ forced_preset ] ) ) { - print( "Round Manager ERROR: Can't set preset to " + forced_preset + " because it wasn't registered" ); - assert( false ); + assertmsg( "Round Manager ERROR: Can't set preset to " + forced_preset + " because it wasn't registered" ); } else { @@ -521,7 +458,7 @@ determine_mixed_round_preset() allowed_presets_string = getDvar( "rm_allowed_mixed_rounds_presets" ); - allowed_presets_keys = strok( allowed_presets_string, " " ); + allowed_presets_keys = strtok( allowed_presets_string, " " ); max_iterations = 50; current_iterations = 0; @@ -552,12 +489,11 @@ pick_mixed_round_preset_variant( variants ) { forced_variant = getdvar( "rm_forced_mixed_rounds_variant" ); - if ( forced_preset != "" ) + if ( forced_variant != "" ) { if ( !isDefined( variants[ forced_variant ] ) ) { - print( "Round Manager ERROR: Can't set preset to " + forced_preset + " because it wasn't registered" ); - assert( false ); + assertmsg( "Round Manager ERROR: Can't set preset to " + forced_variant + " because it wasn't registered" ); } else { @@ -565,7 +501,7 @@ pick_mixed_round_preset_variant( variants ) } } - allowed_variants_string = getdvar( "rm_allowed_mixed_rounds_variants" ); + allowed_variants_string = getdvar( "rm_allowed_mixed_round_variants" ); pick_from_allowed_variants_pool = allowed_variants_string != ""; @@ -589,8 +525,9 @@ pick_mixed_round_preset_variant( variants ) possible_variants = array_randomize( allowed_variants_keys ); for ( i = 0; i < possible_variants.size; i++ ) { - if ( [[ variants[ possible_variants[ i ] ].chance_func ]]() ) + if ( [[ variants[ possible_variants[ i ] ].chance_func ]]() && possible_variants[ i ] [[ variants[ possible_variants[ i ] ].cooldown_func ]]() ) { + variants[ possible_variants[ i ] ].last_time = gettime(); return variants[ possible_variants[ i ] ]; } } @@ -599,7 +536,21 @@ pick_mixed_round_preset_variant( variants ) if ( current_iterations >= max_iterations ) { + variants[ possible_variants[ 0 ] ].last_time = gettime(); return variants[ possible_variants[ 0 ] ]; } } +} + +set_starting_properties_for_ai( starting_properties_struct ) +{ + if ( !isdefined( starting_properties_struct ) ) + { + return; + } + + if ( isdefined( starting_properties_struct.health ) ) + { + self.custom_starting_health = starting_properties_struct.health; + } } \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/_utility.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/_utility.gsc index e69de29..937e86e 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/_utility.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/_utility.gsc @@ -0,0 +1,122 @@ +#include maps\mp\zombies\_zm_utility; +#include common_scripts\utility; +#include maps\mp\_utility; + +register_special_round( round_type, variant_type, round_spawning_func, round_wait_func, round_max_func, round_start_func, between_round_over_func, round_chance_func, next_instance_func ) +{ + if ( !isDefined( level.round_manager_special_rounds ) ) + { + level.round_manager_special_rounds = []; + } + + if ( !isDefined( level.round_manager_special_rounds[ round_type ] ) ) + { + level.round_manager_special_rounds[ round_type ] = []; + } + + s = sys::spawnstruct(); + s.spawning_func = round_spawning_func; + s.wait_func = round_wait_func; + s.max_func = round_max_func; + s.start_func = round_start_func; + s.between_round_over_func = between_round_over_func; + s.chance_func = round_chance_func; + s.next_instance_func = next_instance_func; + s.active = false; + level.round_manager_special_rounds[ round_type ][ variant_type ] = s; +} + +register_mixed_round_preset( preset_type, preset_chance_func, preset_round_start_func ) +{ + if ( !isDefined( level.round_manager_mixed_round_presets ) ) + { + level.round_manager_mixed_round_presets = []; + } + + if ( !isDefined( level.round_manager_mixed_round_presets[ preset_type ] ) ) + { + level.round_manager_mixed_round_presets[ preset_type ] = sys::spawnstruct(); + level.round_manager_mixed_round_presets[ preset_type ].variants = []; + } + + level.round_manager_mixed_round_presets[ preset_type ].chance_func = preset_chance_func; + level.round_manager_mixed_round_presets[ preset_type ].start_func = preset_round_start_func; +} + +register_mixed_round_preset_variant( preset_type, variant_type, spawning_func, spawning_chance_func, spawning_limit, spawning_cooldown_func, spawning_round_start_func ) +{ + assert( isdefined( level.round_manager_mixed_round_presets[ preset_type ] ) ); + + s = sys::spawnstruct(); + s.spawning_func = spawning_func; + s.chance_func = spawning_chance_func; + s.limit = spawning_limit; + s.cooldown_func = spawning_cooldown_func; + s.start_func = spawning_round_start_func; + s.last_time = 0; + s.preset_type = preset_type; + s.variant_type = variant_type; + level.round_manager_mixed_round_presets[ preset_type ].variants[ variant_type ] = s; +} + +register_ai_spawning_func( aitype, spawning_func ) +{ + if ( !isdefined( level.round_manager_aitype_spawning_funcs ) ) + { + level.round_manager_aitype_spawning_funcs = []; + } + + level.round_manager_aitype_spawning_funcs[ aitype ] = spawning_func; +} + +get_zombie_dog_array() +{ + return getaispeciesarray( level.zombie_team, "zombie_dog" ); +} + +get_zombie_dog_count() +{ + return get_zombie_dog_array().size; +} + +get_mechz_array() +{ + zombies = getaiarray( level.zombie_team ); + mechz = []; + for ( i = 0; i < zombies.size; i++ ) + { + if ( isdefined( zombies[ i ].animname ) && zombies[ i ].animname == "mechz_zombie" ) + { + mechz[ mechz.size ] = zombies[ i ]; + } + } + + return mechz; +} + +get_mechz_count() +{ + return get_mechz_array().size; +} + +get_all_ai_array() +{ + return getaispeciesarray( level.zombie_team, "all" ); +} + +get_all_ai_count() +{ + return get_all_ai_array().size; +} + +wait_for_free_ai_slot( func ) +{ + while ( level.zombie_total <= 0 || isdefined( func ) && [[ func ]]() >= level.zombie_ai_limit ) + wait 0.1; + + while ( get_current_actor_count() >= level.zombie_actor_limit ) + { + clear_all_corpses(); + wait 0.1; + } +} diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc new file mode 100644 index 0000000..51e3779 --- /dev/null +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_presets/_default.gsc @@ -0,0 +1,14 @@ +main() +{ + +} + +preset_chance() +{ + return true; +} + +round_start() +{ + level.round_manager_spawn_count = 0; +} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_dog_wave.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_dog_wave.gsc new file mode 100644 index 0000000..208d565 --- /dev/null +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_dog_wave.gsc @@ -0,0 +1,75 @@ +#include maps\mp\zombies\_zm_utility; +#include common_scripts\utility; +#include maps\mp\_utility; + +#include scripts\zm\zm_ai_pack\_utility; + +main() +{ + set_dvar_if_unset( "rm_mixed_preset_default_dog_wave_variant_spawn_limit_min", 6 ); + set_dvar_if_unset( "rm_mixed_preset_default_dog_wave_variant_spawn_limit_max", 12 ); +} + +spawning_dog_wave() +{ + level.round_manager_dog_wave_count++; + players = sys::getplayers(); + + max_dogs_in_wave = 12; + if ( players.size == 1 ) + { + max_dogs_in_wave = 6; + } + + while ( get_all_ai_count() > ( level.zombie_ai_limit - max_dogs_in_wave ) && level.zombie_total > 0 ) + { + wait 0.5; + } + + spawned_dog_count = 0; + max_dogs_in_wave = min( level.zombie_total, max_dogs_in_wave ); + while ( ( spawned_dog_count < max_dogs_in_wave ) && level.zombie_total > 0 ) + { + wait_for_free_ai_slot( ::get_all_ai_count ); + ai = level [[ level.round_manager_aitype_spawning_funcs[ "zombie_dog" ] ]](); + if ( ai ) + { + spawned_dog_count++; + level.round_manager_spawn_count++; + } + wait( level.zombie_vars["zombie_spawn_delay"] ); + } + level.round_manager_dog_wave_count++; + level.round_manager_guaranteed_dog_wave_time = getTime() + ( 80000 * level.round_manager_dog_wave_count ); + wait( level.zombie_vars["zombie_spawn_delay"] ); +} + +spawning_chance() +{ + chance_of_dog_wave = 0; + chance_of_dog_wave -= ( level.round_manager_dog_wave_count * 1000 ); + + chance_of_dog_wave += ( level.round_manager_spawn_count * randomintrange( 5, 10 ) ); + + should_spawn_dog_wave_random = chance_of_dog_wave >= 1000; + should_spawn_guaranteed_dog_wave = ( ( level.round_manager_guaranteed_dog_wave_time + 80000 ) <= getTime() ); + + return should_spawn_dog_wave_random || should_spawn_guaranteed_dog_wave; +} + +spawning_limit() +{ + return level.players.size <= 1 ? getdvarint( "rm_mixed_preset_default_dog_wave_variant_spawn_limit_min" ) : getdvarint( "rm_mixed_preset_default_dog_wave_variant_spawn_limit_max" ); +} + +spawning_cooldown() +{ + return true; +} + +spawning_round_start() +{ + level.round_manager_guaranteed_dog_wave_time = level.round_start_time; + level.round_manager_dog_wave_count = 0; + level.round_manager_chance_of_dog_wave = 0; +} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc new file mode 100644 index 0000000..8d64598 --- /dev/null +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/mixed_variants/_random.gsc @@ -0,0 +1,80 @@ +#include maps\mp\zombies\_zm_utility; +#include common_scripts\utility; +#include maps\mp\_utility; + +#include scripts\zm\zm_ai_pack\_utility; + +main() +{ + set_dvar_if_unset( "rm_mixed_preset_default_random_variant_allowed_aitypes", "normal zombie_dog mechz" ); + set_dvar_if_unset( "rm_mixed_preset_default_random_variant_wave_spawn_limit", 24 ); + set_dvar_if_unset( "rm_mixed_preset_default_random_variant_wave_spawn_cooldown", 1 ); + + set_dvar_if_unset( "rm_mixed_preset_default_random_variant_mechz_spawn_chance_1000", 5 ); + set_dvar_if_unset( "rm_mixed_preset_default_random_variant_zombie_dog_spawn_chance_1000", 200 ); +} + +spawning_random() +{ + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); +/# + level endon( "kill_round" ); +#/ + mechz_spawn_chance = getdvarint( "rm_mixed_preset_default_random_variant_mechz_spawn_chance_1000" ); + zombie_dog_chance = getdvarint( "rm_mixed_preset_default_random_variant_zombie_dog_spawn_chance_1000" ); + + count = 0; + for (;;) + { + wait_for_free_ai_slot( ::get_all_ai_count ); + ai = undefined; + random_number = randomint( 1000 ); + if ( random_number < mechz_spawn_chance ) + { + ai = [[ level.round_manager_aitype_spawning_funcs[ "mechz" ] ]](); + } + else if ( random_number < zombie_dog_chance ) + { + ai = [[ level.round_manager_aitype_spawning_funcs[ "zombie_dog" ] ]](); + } + else + { + ai = [[ level.round_manager_aitype_spawning_funcs[ "normal" ] ]](); + } + + if ( isdefined( ai ) ) + { + count++; + level.round_manager_spawn_count++; + } + + if ( count >= spawning_limit() ) + { + return; + } + + wait( level.zombie_vars["zombie_spawn_delay"] ); + } +} + +spawning_chance() +{ + return true; +} + +spawning_limit() +{ + return getdvarint( "rm_mixed_preset_default_random_variant_wave_spawn_limit" ); +} + +spawning_cooldown() +{ + return ( self.last_time + ( getdvarint( "rm_mixed_preset_default_random_variant_wave_spawn_cooldown" ) * 1000 ) ) <= gettime(); +} + +spawning_round_start() +{ + +} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc index 72015db..f8f3208 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mechz.gsc @@ -5,6 +5,7 @@ #include maps\mp\zombies\_zm_ai_mechz; #include scripts\zm\zm_ai_pack\_round_manager; +#include scripts\zm\zm_ai_pack\_utility; main() { @@ -17,8 +18,8 @@ main() set_dvar_if_unset( "rm_mechz_rush_min_round", 45 ); set_dvar_if_unset( "rm_mechz_rush_min_spawn_wait", 1.5 ); set_dvar_if_unset( "rm_mechz_rush_max_spawn_wait", 2.5 ); - set_dvar_if_unset( "rm_mechz_rush_max_mechz_alive", 24 ); - set_dvar_if_unset( "rm_mechz_rush_max_mechz_round", 24 ); + set_dvar_if_unset( "rm_mechz_rush_max_mechz_alive", 12 ); + set_dvar_if_unset( "rm_mechz_rush_max_mechz_round", 12 ); set_dvar_if_unset( "rm_mechz_rush_max_health_multiplier", 0.5 ); } @@ -45,11 +46,7 @@ round_spawning() if ( level.intermission ) return; - -/# - if ( getdvarint( #"zombie_cheat" ) == 2 || getdvarint( #"zombie_cheat" ) >= 4 ) - return; -#/ + round_spawning_common(); for (;;) @@ -188,7 +185,9 @@ round_spawning_rush() while ( level.zombie_mechz_locations.size < 1 ) wait( randomfloatrange( 5.0, 10.0 ) ); - ai = spawn_single_mechz( int( level.mechz_health * getdvarfloat( "rm_mechz_rush_max_health_multiplier" ) ) ); + starting_properties = sys::spawnstruct(); + starting_properties.health = int( level.mechz_health * getdvarfloat( "rm_mechz_rush_max_health_multiplier" ) ); + ai = spawn_single_mechz( starting_properties ); if ( level.mechz_left_to_spawn == 0 ) level thread maps\mp\zombies\_zm_ai_mechz::response_to_air_raid_siren_vo(); @@ -233,13 +232,11 @@ round_next_rush() } } -spawn_single_mechz( starting_health ) +spawn_single_mechz( starting_properties ) { ai = spawn_zombie( level.mechz_spawners[0] ); - if ( isdefined( starting_health ) ) - { - ai.custom_starting_health = starting_health; - } + + ai scripts\zm\zm_ai_pack\_round_manager::set_starting_properties_for_ai( starting_properties ); ai thread maps\mp\zombies\_zm_ai_mechz::mechz_spawn(); if ( isdefined( ai ) ) diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mixed.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mixed.gsc index 78e2542..d7d3446 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mixed.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_mixed.gsc @@ -4,6 +4,8 @@ #include maps\mp\zombies\_zm; +#include scripts\zm\zm_ai_pack\_utility; + round_spawning() { level endon( "intermission" ); @@ -16,11 +18,6 @@ round_spawning() if ( level.intermission ) return; -/# - if ( getdvarint( #"zombie_cheat" ) == 2 || getdvarint( #"zombie_cheat" ) >= 4 ) - return; -#/ - if ( level.zombie_spawn_locations.size < 1 ) { /# @@ -33,33 +30,20 @@ round_spawning() if ( level.round_number < 10 || level.speed_change_max > 0 ) level thread zombie_speed_up(); - - mixed_spawns = 0; - old_spawn = undefined; - - spawning_preset = scripts\zm\zm_ai_pack\_round_manager::determine_mixed_round_preset(); - + while ( true ) { - while ( get_current_zombie_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) - wait 0.1; + spawning_variant = scripts\zm\zm_ai_pack\_round_manager::pick_mixed_round_preset_variant( level.round_manager_spawning_preset.variants ); - while ( get_current_actor_count() >= level.zombie_actor_limit ) + if ( isdefined( spawning_variant ) ) { - clear_all_corpses(); - wait 0.1; + if ( getdvarint( "zm_ai_pack_debug" ) > 0 ) + { + print( "Round Manager: Running mixed preset <" + spawning_variant.preset_type + "> variant <" + spawning_variant.variant_type + ">" ); + } + level [[ spawning_variant.spawning_func ]](); } - flag_wait( "spawn_zombies" ); - - while ( level.zombie_spawn_locations.size <= 0 ) - wait 0.1; - - run_custom_ai_spawn_checks(); - - ai = scripts\zm\zm_ai_pack\rounds\_normal::spawn_single_normal_zombie(); - - wait( level.zombie_vars["zombie_spawn_delay"] ); wait_network_frame(); } } @@ -84,7 +68,7 @@ round_wait() if ( isdefined( level.is_ghost_round_started ) && [[ level.is_ghost_round_started ]]() ) should_wait = 1; else - should_wait = get_current_zombie_count() > 0 || level.zombie_total > 0 || level.intermission; + should_wait = get_all_ai_count() > 0 || level.zombie_total > 0 || level.intermission; if ( !should_wait ) return; @@ -131,7 +115,16 @@ round_max() round_start() { - + level.round_manager_spawning_preset = scripts\zm\zm_ai_pack\_round_manager::determine_mixed_round_preset(); + + level [[ level.round_manager_spawning_preset.start_func ]](); + + variants = level.round_manager_spawning_preset.variants; + variant_keys = getarraykeys( level.round_manager_spawning_preset.variants ); + for ( i = 0; i < variant_keys.size; i++ ) + { + level [[ variants[ variant_keys[ i ] ].start_func ]](); + } } round_over() @@ -147,68 +140,4 @@ round_chance() round_next() { return level.round_number + 1; -} - -special_dog_spawn( spawners, num_to_spawn ) -{ - dogs = getaispeciesarray( "all", "zombie_dog" ); - - if ( isdefined( dogs ) && dogs.size >= 9 ) - return false; - - if ( !isdefined( num_to_spawn ) ) - num_to_spawn = 1; - - spawn_point = undefined; - count = 0; - - while ( count < num_to_spawn ) - { - players = sys::getplayers(); - favorite_enemy = get_favorite_enemy(); - - if ( isdefined( spawners ) ) - { - spawn_point = spawners[randomint( spawners.size )]; - ai = spawn_zombie( spawn_point ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_point thread dog_spawn_fx( ai ); - count++; - flag_set( "dog_clips" ); - } - } - else if ( isdefined( level.dog_spawn_func ) ) - { - spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy ); - ai = spawn_zombie( level.dog_spawners[0] ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_loc thread dog_spawn_fx( ai, spawn_loc ); - count++; - flag_set( "dog_clips" ); - } - } - else - { - spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy ); - ai = spawn_zombie( level.dog_spawners[0] ); - - if ( isdefined( ai ) ) - { - ai.favoriteenemy = favorite_enemy; - spawn_point thread dog_spawn_fx( ai, spawn_point ); - count++; - flag_set( "dog_clips" ); - } - } - - waiting_for_next_dog_spawn( count, num_to_spawn ); - } - - return true; } \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_normal.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_normal.gsc index 45031a3..da42545 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_normal.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_normal.gsc @@ -4,6 +4,8 @@ #include maps\mp\zombies\_zm; +#include scripts\zm\zm_ai_pack\_utility; + round_spawning() { level endon( "intermission" ); @@ -13,18 +15,10 @@ round_spawning() level endon( "kill_round" ); #/ - if ( level.intermission ) - return; - -/# - if ( getdvarint( #"zombie_cheat" ) == 2 || getdvarint( #"zombie_cheat" ) >= 4 ) - return; -#/ - if ( level.zombie_spawn_locations.size < 1 ) { /# - assertmsg( "No active spawners in the map. Check to see if the zone is active and if it's pointing to spawners." ); + assertmsg( "No active spawn locations in the zone. Check to see if the zone is active and if it's pointing to spawners." ); #/ return; } @@ -39,7 +33,7 @@ round_spawning() while ( true ) { - while ( get_current_zombie_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) + while ( get_current_zombie_count() >= level.zombie_ai_limit || level.zombie_total <= 0 || level.intermission ) wait 0.1; while ( get_current_actor_count() >= level.zombie_actor_limit ) @@ -57,7 +51,7 @@ round_spawning() ai = spawn_single_normal_zombie(); - wait( level.zombie_vars["zombie_spawn_delay"] ); + wait( level.zombie_vars[ "zombie_spawn_delay" ] ); wait_network_frame(); } } @@ -171,9 +165,10 @@ default_max_zombie_func( max_num ) return max; } -spawn_single_normal_zombie() +spawn_single_normal_zombie( starting_properties_struct ) { ai = undefined; + old_spawn = undefined; spawn_point = level.zombie_spawn_locations[randomint( level.zombie_spawn_locations.size )]; @@ -217,6 +212,8 @@ spawn_single_normal_zombie() level.zombie_total--; ai thread round_spawn_failsafe(); } + + ai scripts\zm\zm_ai_pack\_round_manager::set_starting_properties_for_ai( starting_properties_struct ); return ai; } \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_timed.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_timed.gsc new file mode 100644 index 0000000..e69de29 diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_zombie_dog.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_zombie_dog.gsc index 86213fb..45db3ab 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_zombie_dog.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/_zombie_dog.gsc @@ -5,6 +5,7 @@ #include maps\mp\zombies\_zm_ai_dogs; #include scripts\zm\zm_ai_pack\_round_manager; +#include scripts\zm\zm_ai_pack\_utility; main() { @@ -12,9 +13,9 @@ main() set_dvar_if_unset( "rm_dog_rush_min_round", 20 ); set_dvar_if_unset( "rm_dog_rush_round_chance", 10 ); - set_dvar_if_unset( "rm_dog_rush_max_dogs_alive", 24 ); - set_dvar_if_unset( "rm_dog_rush_max_dogs_round", 128 ); - set_dvar_if_unset( "rm_dog_rush_max_dogs_round_per_player", 8 ); + set_dvar_if_unset( "rm_dog_rush_max_dogs_alive_per_player", 6 ); + set_dvar_if_unset( "rm_dog_rush_max_dogs_round", 64 ); + set_dvar_if_unset( "rm_dog_rush_max_dogs_round_per_player", 4 ); set_dvar_if_unset( "rm_dog_rush_max_dogs_round_base", 24 ); set_dvar_if_unset( "rm_dog_rush_max_dogs_round_number_multiplier", 0.1 ); set_dvar_if_unset( "rm_dog_rush_max_spawn_wait", 0.5 ); @@ -23,28 +24,18 @@ main() round_spawning() { - level endon( "end_of_round" ); level endon( "intermission" ); - level.dog_targets = sys::getplayers(); - - for ( i = 0; i < level.dog_targets.size; i++ ) - level.dog_targets[i].hunted_by = 0; - + level endon( "end_of_round" ); + level endon( "restart_round" ); /# level endon( "kill_round" ); - - if ( getdvarint( #"zombie_cheat" ) == 2 || getdvarint( #"zombie_cheat" ) >= 4 ) - return; #/ - if ( level.intermission ) - return; - count = 0; max = level.zombie_total; while ( true ) { - while ( get_zombie_dog_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) + while ( get_zombie_dog_count() >= level.zombie_ai_limit || level.zombie_total <= 0 || level.intermission ) wait 0.1; for ( num_player_valid = get_number_of_valid_players(); get_zombie_dog_count() >= num_player_valid * 2; num_player_valid = get_number_of_valid_players() ) @@ -86,6 +77,10 @@ round_max() round_start() { + level.dog_targets = sys::getplayers(); + for ( i = 0; i < level.dog_targets.size; i++ ) + level.dog_targets[i].hunted_by = false; + level.music_round_override = 1; maps\mp\zombies\_zm_ai_dogs::dog_round_start(); @@ -94,7 +89,12 @@ round_start() players = sys::getplayers(); array_thread( players, maps\mp\zombies\_zm_ai_dogs::play_dog_round ); wait 1; - playsoundatposition( game["zmbdialog"]["prefix"] + "_event_dogstart_0", ( 0, 0, 0 ) ); + prefix = "vox_zmba"; + if ( !level.sndannouncerisrich || level.script == "zm_prison" || level.script == "zm_tomb" ) + { + prefix = "vox_zmba_sam"; + } + playsoundatposition( prefix + "_event_dogstart_0", ( 0, 0, 0 ) ); wait 6; } @@ -139,26 +139,16 @@ round_spawning_rush() { level endon( "end_of_round" ); level endon( "intermission" ); - level.dog_targets = sys::getplayers(); - - for ( i = 0; i < level.dog_targets.size; i++ ) - level.dog_targets[i].hunted_by = 0; - /# level endon( "kill_round" ); - - if ( getdvarint( #"zombie_cheat" ) == 2 || getdvarint( #"zombie_cheat" ) >= 4 ) - return; #/ - if ( level.intermission ) - return; - count = 0; max = level.zombie_total; while ( true ) { - while ( get_zombie_dog_count() >= level.zombie_ai_limit || get_zombie_dog_count() >= getdvarint( "rm_dog_rush_max_dogs_alive" ) || level.zombie_total <= 0 ) + while ( get_zombie_dog_count() >= level.zombie_ai_limit || get_zombie_dog_count() >= ( getdvarint( "rm_dog_rush_max_dogs_alive_per_player" ) * level.players.size ) + || level.zombie_total <= 0 || level.intermission ) wait 0.1; count = spawn_zombie_dog( count ); @@ -175,7 +165,7 @@ round_max_rush() dog_max += players.size * getdvarint( "rm_dog_rush_max_dogs_round_per_player" ); - dog_max *= int( level.round_number * getdvarfloat( "rm_dog_rush_max_dogs_round_number_multiplier" ) ); + //dog_max *= int( level.round_number * getdvarfloat( "rm_dog_rush_max_dogs_round_number_multiplier" ) ); max = getdvarint( "rm_dog_rush_max_dogs_round" ); if ( dog_max > max ) @@ -247,9 +237,22 @@ waiting_for_next_dog_spawn_rush( count, max ) spawn_zombie_dog( count ) { - players = sys::getplayers(); + ai = spawn_single_zombie_dog(); + + if ( isdefined( ai ) ) + { + count++; + } + + return count; +} + +spawn_single_zombie_dog( starting_properties_struct ) +{ favorite_enemy = maps\mp\zombies\_zm_ai_dogs::get_favorite_enemy(); + ai = undefined; + if ( isdefined( level.dog_spawn_func ) ) { spawn_loc = [[ level.dog_spawn_func ]]( level.dog_spawners, favorite_enemy ); @@ -260,7 +263,6 @@ spawn_zombie_dog( count ) ai.favoriteenemy = favorite_enemy; spawn_loc thread maps\mp\zombies\_zm_ai_dogs::dog_spawn_fx( ai, spawn_loc ); level.zombie_total--; - count++; } } else @@ -273,12 +275,13 @@ spawn_zombie_dog( count ) ai.favoriteenemy = favorite_enemy; spawn_point thread maps\mp\zombies\_zm_ai_dogs::dog_spawn_fx( ai, spawn_point ); level.zombie_total--; - count++; flag_set( "dog_clips" ); } } - return count; + ai scripts\zm\zm_ai_pack\_round_manager::set_starting_properties_for_ai( starting_properties_struct ); + + return ai; } dog_spawn_sumpf_logic( dog_array, favorite_enemy ) diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_presets/_default.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_presets/_default.gsc deleted file mode 100644 index 9e426d2..0000000 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_presets/_default.gsc +++ /dev/null @@ -1,9 +0,0 @@ -main() -{ - -} - -preset_chance() -{ - return true; -} diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_variants/_random.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_variants/_random.gsc deleted file mode 100644 index d18865c..0000000 --- a/zm_ai_pack/scripts/zm/zm_ai_pack/rounds/mixed_variants/_random.gsc +++ /dev/null @@ -1,19 +0,0 @@ -spawning_random() -{ - -} - -spawning_chance() -{ - -} - -spawning_limit() -{ - -} - -spawning_cooldown() -{ - -} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc index 7633994..37b2b3a 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_debug_main.gsc @@ -20,6 +20,8 @@ init() } level.zone_hud_y_offset = y; + level.location_hud_y_offset = y - 20; + level thread command_thread(); level thread on_player_connect(); level thread draw_zombie_spawn_locations(); @@ -101,6 +103,11 @@ on_player_connect() level waittill( "connected", player ); player thread zone_hud(); player thread location_hud(); + player thread zombie_counter_hud(); + if ( getdvarint( "zm_ai_pack_debug" ) > 0 ) + { + level.zombie_vars[ "zombie_intermission_time" ] = 0.05; + } } } @@ -230,6 +237,52 @@ location_hud() } } +zombie_counter_hud() +{ + self endon( "disconnect" ); + + x = 5; + y = level.location_hud_y_offset - 20; + + text_hud = self new_debug_hud( x, y ); + text_hud settext( "Zombies Left: " ); + x += 75; + current_hud = self new_debug_hud( x, y ); + x += 20; + plus_hud = self new_debug_hud( x, y ); + plus_hud settext( " + " ); + x += 20; + total_hud = self new_debug_hud( x, y ); + + flag_wait( "initial_blackscreen_passed" ); + + while ( !isdefined( level.zombie_total ) ) + { + wait 1; + } + for (;;) + { + while ( getDvarInt( "zm_ai_pack_debug" ) <= 0 ) + { + text_hud.alpha = 0; + current_hud.alpha = 0; + plus_hud.alpha = 0; + total_hud.alpha = 0; + wait 1; + } + + text_hud.alpha = 1; + current_hud.alpha = 1; + plus_hud.alpha = 1; + total_hud.alpha = 1; + + current_hud setvalue( get_current_zombie_count() ); + total_hud setvalue( level.zombie_total ); + + wait 0.05; + } +} + draw_zombie_spawn_location_box( origin, color, vec = ( 20, 20, 40 ) ) { box( origin + ( 0, 0, 20 ), vec * -1, vec, 0, color, 1.0 ); @@ -457,6 +510,8 @@ draw_nodes() draw_node_data( node, color, type ); throttle_count++; } + + nodes = undefined; wait 0.05; } } @@ -495,4 +550,5 @@ print_entities() print( "**************" ); } print( "Listed " + ents.size + " entities" ); -} \ No newline at end of file +} + diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc index ef475e8..dfa0bad 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc @@ -51,7 +51,7 @@ main() level.ai_data[ "mechz" ].init = maps\mp\zombies\_zm_ai_mechz::init; level.ai_data[ "mechz" ].should_execute = level.script != "zm_tomb"; level.ai_data[ "zombie_dog" ] = sys::spawnstruct(); - level.ai_data[ "zombie_dog" ].main = maps\mp\zombies\_zm_ai_dogs::init; + level.ai_data[ "zombie_dog" ].init = maps\mp\zombies\_zm_ai_dogs::init; level.ai_data[ "zombie_dog" ].should_execute = level.gametype != "zstandard" ; keys = getArrayKeys( level.ai_data ); @@ -183,7 +183,7 @@ dotraverse_teleport( no_powerups ) startnode = self getnegotiationstartnode(); if ( !isdefined( endnode ) || !isdefined( startnode ) ) { - print( "dotraverse_teleport() missing endnode or startnode" ); + assertmsg( "dotraverse_teleport() missing endnode or startnode" ); return; } diff --git a/zm_ai_pack/zone_source/mod.zone b/zm_ai_pack/zone_source/mod.zone index 8db8c54..9d82a60 100644 --- a/zm_ai_pack/zone_source/mod.zone +++ b/zm_ai_pack/zone_source/mod.zone @@ -77,8 +77,13 @@ script,scripts/zm/zm_ai_pack/rounds/_leaper.gsc script,scripts/zm/zm_ai_pack/rounds/_mechz.gsc script,scripts/zm/zm_ai_pack/rounds/_mixed.gsc script,scripts/zm/zm_ai_pack/rounds/_normal.gsc +script,scripts/zm/zm_ai_pack/rounds/_timed.gsc script,scripts/zm/zm_ai_pack/rounds/_zombie_dog.gsc +script,scripts/zm/zm_ai_pack/mixed_presets/_default.gsc +script,scripts/zm/zm_ai_pack/mixed_variants/_dog_wave.gsc +script,scripts/zm/zm_ai_pack/mixed_variants/_random.gsc + script,sys.gsc script,pluto_sys.gsc