diff --git a/BotMissions/BEREZINO_AI1.c b/BotMissions/BEREZINO_AI1.c new file mode 100644 index 0000000..292d279 --- /dev/null +++ b/BotMissions/BEREZINO_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_BEREZINO_AI1: MissionBase +{ + + void BotGroupMission_BEREZINO_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "12433.6 8.29782 9514.96"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/BEREZINO_AI2.c b/BotMissions/BEREZINO_AI2.c new file mode 100644 index 0000000..b62c5ab --- /dev/null +++ b/BotMissions/BEREZINO_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_BEREZINO_AI2: MissionBase +{ + + void BotGroupMission_BEREZINO_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "12800.9 5.96536 10167"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/CERNAYA_AI1.c b/BotMissions/CERNAYA_AI1.c new file mode 100644 index 0000000..fa7c621 --- /dev/null +++ b/BotMissions/CERNAYA_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_CERNAYA_AI1: MissionBase +{ + + void BotGroupMission_CERNAYA_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "12113 95.3387 13696.2"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 3; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/CERNAYA_AI2.c b/BotMissions/CERNAYA_AI2.c new file mode 100644 index 0000000..40faa43 --- /dev/null +++ b/BotMissions/CERNAYA_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_CERNAYA_AI2: MissionBase +{ + + void BotGroupMission_CERNAYA_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "12150.9 93.3948 13863.4"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 3; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/KARMANOVKA_AI1.c b/BotMissions/KARMANOVKA_AI1.c new file mode 100644 index 0000000..43a26fb --- /dev/null +++ b/BotMissions/KARMANOVKA_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_KARMANOVKA_AI1: MissionBase +{ + + void BotGroupMission_KARMANOVKA_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "12801.1 99.4634 14685.9"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/KRASNOSTAV_AI1.c b/BotMissions/KRASNOSTAV_AI1.c new file mode 100644 index 0000000..96f3894 --- /dev/null +++ b/BotMissions/KRASNOSTAV_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_KRASNOSTAV_AI1: MissionBase +{ + + void BotGroupMission_KRASNOSTAV_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "11873.4 140.14 12555.4"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 3; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/KRASNOSTAV_AI2.c b/BotMissions/KRASNOSTAV_AI2.c new file mode 100644 index 0000000..b389a90 --- /dev/null +++ b/BotMissions/KRASNOSTAV_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_KRASNOSTAV_AI2: MissionBase +{ + + void BotGroupMission_KRASNOSTAV_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "11180.1 197.023 12250.6"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 3; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/NOVAYA_AI1.c b/BotMissions/NOVAYA_AI1.c new file mode 100644 index 0000000..f6282d1 --- /dev/null +++ b/BotMissions/NOVAYA_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_NOVAYA_AI1: MissionBase +{ + + void BotGroupMission_NOVAYA_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "3392.02 195.989 12977.9"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/NOVAYA_AI2.c b/BotMissions/NOVAYA_AI2.c new file mode 100644 index 0000000..41d71a9 --- /dev/null +++ b/BotMissions/NOVAYA_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_NOVAYA_AI2: MissionBase +{ + + void BotGroupMission_NOVAYA_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "3497.45 220.141 12513.7"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/NOVODMITROVSK_AI1.c b/BotMissions/NOVODMITROVSK_AI1.c new file mode 100644 index 0000000..6dd4d28 --- /dev/null +++ b/BotMissions/NOVODMITROVSK_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_NOVODMITROVSK_AI1: MissionBase +{ + + void BotGroupMission_NOVODMITROVSK_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "11643.4 36.921 143563.8"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 2; // assign the minimum number of bots + int BotSolderCountMax = 4; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/NOVODMITROVSK_AI2.c b/BotMissions/NOVODMITROVSK_AI2.c new file mode 100644 index 0000000..e1562f0 --- /dev/null +++ b/BotMissions/NOVODMITROVSK_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_NOVODMITROVSK_AI2: MissionBase +{ + + void BotGroupMission_NOVODMITROVSK_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "11547.1 58.5597 14763.2"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 2; // assign the minimum number of bots + int BotSolderCountMax = 4; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/NOVODMITROVSK_AI3.c b/BotMissions/NOVODMITROVSK_AI3.c new file mode 100644 index 0000000..244b7ee --- /dev/null +++ b/BotMissions/NOVODMITROVSK_AI3.c @@ -0,0 +1,445 @@ +class BotGroupMission_NOVODMITROVSK_AI3: MissionBase +{ + + void BotGroupMission_NOVODMITROVSK_AI3() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "10851.5 58.8202 14462.3"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 2; // assign the minimum number of bots + int BotSolderCountMax = 4; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/NOVY_AI1.c b/BotMissions/NOVY_AI1.c new file mode 100644 index 0000000..0e936cf --- /dev/null +++ b/BotMissions/NOVY_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_NOVY_AI1: MissionBase +{ + + void BotGroupMission_NOVY_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "7034.28 295.931 7671.95"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionC1.c b/BotMissions/Original/BotGroupMissionC1.c new file mode 100644 index 0000000..af9b2dc --- /dev/null +++ b/BotMissions/Original/BotGroupMissionC1.c @@ -0,0 +1,361 @@ +class BotGroupMissionC1: MissionBase +{ + + void BotGroupMissionC1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "7852.263672 6.132144 3174.178955"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 3; // assign the minimum number of bots + int BotSolderCountMax = 4; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = false; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 100; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + int m_SpeedPatrol = 3; // Setting the movement speed while patrolling (min = 1 max = 3) + + + int m_TargetDist = 100; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Add the top of the clothes + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Add pants + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Add boots + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Add the Backpack + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Add Vest + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Add a helmet or headgear + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionC2.c b/BotMissions/Original/BotGroupMissionC2.c new file mode 100644 index 0000000..d123eb6 --- /dev/null +++ b/BotMissions/Original/BotGroupMissionC2.c @@ -0,0 +1,362 @@ +class BotGroupMissionC2: MissionBase +{ + + void BotGroupMissionC2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "10524.090820 6.012439 2254.700928"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 3; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 1100; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = false; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = true; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 100; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitC2() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C2 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC2); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersC2() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot()) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC2); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC2, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC2, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionC3.c b/BotMissions/Original/BotGroupMissionC3.c new file mode 100644 index 0000000..fc0034e --- /dev/null +++ b/BotMissions/Original/BotGroupMissionC3.c @@ -0,0 +1,361 @@ +class BotGroupMissionC3: MissionBase +{ + + void BotGroupMissionC3() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "13458.015625 6.142386 6240.619629"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 3; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 1100; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = false; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = true; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 100; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitC3() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C3 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC3); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersC3() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot()) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC3); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC3, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC3, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionC4.c b/BotMissions/Original/BotGroupMissionC4.c new file mode 100644 index 0000000..b63d584 --- /dev/null +++ b/BotMissions/Original/BotGroupMissionC4.c @@ -0,0 +1,362 @@ +class BotGroupMissionC4: MissionBase +{ + + void BotGroupMissionC4() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "12903.678711 6.002323 10089.592773"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 3; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 1100; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = false; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = true; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 100; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitC4() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C4 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC4); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersC4() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot()) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC4); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC4, 5000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC4, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionKab.c b/BotMissions/Original/BotGroupMissionKab.c new file mode 100644 index 0000000..4f10758 --- /dev/null +++ b/BotMissions/Original/BotGroupMissionKab.c @@ -0,0 +1,361 @@ +class BotGroupMissionKab: MissionBase +{ + + void BotGroupMissionKab() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "4541.687500 317.593628 8324.727539"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 2; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 150; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = false; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = false; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = false; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = false; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 30; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitKab(SurvivorBotBase m_Bot) + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots VMC = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitKab); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersKab() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersKab); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitKab, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersKab, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } + +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionNWA.c b/BotMissions/Original/BotGroupMissionNWA.c new file mode 100644 index 0000000..278e465 --- /dev/null +++ b/BotMissions/Original/BotGroupMissionNWA.c @@ -0,0 +1,363 @@ +class BotGroupMissionNWA: MissionBase +{ + + void BotGroupMissionNWA() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "4271.261719 338.812531 10975.101563"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 3; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 5; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 1100; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = true; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = false; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 100; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 2; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + int m_TargetDist = 200; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("4269.994629 339.012421 10917.826172"); + m_BotSolder.AddCheckpoint("4474.135254 339.012421 10557.146484"); + m_BotSolder.AddCheckpoint("4321.004883 339.012390 10459.886719"); + m_BotSolder.AddCheckpoint("4113.722656 339.012451 10837.003906"); + m_BotSolder.AddCheckpoint("4081.802979 339.012451 10801.938477"); + m_BotSolder.AddCheckpoint("4775.959961 338.970398 9591.289063"); + m_BotSolder.AddCheckpoint("5074.371582 339.012421 9760.172852"); + m_BotSolder.AddCheckpoint("5042.200195 339.012390 9880.341797"); + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitNWA() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots NWA = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitNWA); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersNWA() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersNWA); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitNWA, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersNWA, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not spawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionPav.c b/BotMissions/Original/BotGroupMissionPav.c new file mode 100644 index 0000000..a14f3a1 --- /dev/null +++ b/BotMissions/Original/BotGroupMissionPav.c @@ -0,0 +1,418 @@ +class BotGroupMissionPav: MissionBase +{ + + void BotGroupMissionPav() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "2126.428467 91.449623 3342.416016"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 3; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 3; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 5; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 500; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = false; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = false; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 15; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + m_BotSolder.AddCheckpoint("1681.035522 451.784302 14278.791016"); + m_BotSolder.AddCheckpoint("1668.385742 451.730408 14268.739258"); + m_BotSolder.AddCheckpoint("1653.012695 451.784302 14245.443359"); + m_BotSolder.AddCheckpoint("1662.009521 451.784302 14220.044922"); + m_BotSolder.AddCheckpoint("1668.885010 451.730408 14177.100586"); + m_BotSolder.AddCheckpoint("1678.905029 451.784302 14134.460938"); + m_BotSolder.AddCheckpoint("1687.656250 451.784302 14097.293945"); + m_BotSolder.AddCheckpoint("1691.055054 451.728760 14072.710938"); + m_BotSolder.AddCheckpoint("1697.563721 450.094635 14019.088867"); + m_BotSolder.AddCheckpoint("1701.266235 448.636108 13981.079102"); + m_BotSolder.AddCheckpoint("1709.151733 448.368225 13969.950195"); + m_BotSolder.AddCheckpoint("1726.191772 447.882568 13954.740234"); + m_BotSolder.AddCheckpoint("1734.303101 447.342072 13945.562500"); + m_BotSolder.AddCheckpoint("1736.849487 447.158569 13939.061523"); + m_BotSolder.AddCheckpoint("1803.257568 436.318970 13812.399414"); + m_BotSolder.AddCheckpoint("1802.478149 435.682281 13794.238281"); + m_BotSolder.AddCheckpoint("1764.742676 434.271759 13667.715820"); + m_BotSolder.AddCheckpoint("1753.983521 434.111572 13660.847656"); + m_BotSolder.AddCheckpoint("1697.765381 433.031982 13621.431641"); + m_BotSolder.AddCheckpoint("1625.751953 437.192169 13583.775391"); + m_BotSolder.AddCheckpoint("1615.443726 437.193420 13582.367188"); + m_BotSolder.AddCheckpoint("1586.155762 439.010864 13609.286133"); + m_BotSolder.AddCheckpoint("1566.816040 441.081787 13643.261719"); + m_BotSolder.AddCheckpoint("1554.550049 441.587372 13645.919922"); + m_BotSolder.AddCheckpoint("1533.254028 440.683624 13646.856445"); + m_BotSolder.AddCheckpoint("1470.583130 444.685120 13679.353516"); + m_BotSolder.AddCheckpoint("1448.422729 446.229736 13681.502930"); + m_BotSolder.AddCheckpoint("1397.534424 448.255707 13663.409180"); + m_BotSolder.AddCheckpoint("1377.747681 448.799530 13661.333984"); + m_BotSolder.AddCheckpoint("1356.402222 451.658264 13669.961914"); + m_BotSolder.AddCheckpoint("1339.632813 454.855988 13690.362305"); + m_BotSolder.AddCheckpoint("1311.232178 457.548615 13730.733398"); + m_BotSolder.AddCheckpoint("1368.332275 455.560181 13762.721680"); + m_BotSolder.AddCheckpoint("1389.098022 453.795563 13785.572266"); + m_BotSolder.AddCheckpoint("1394.411499 451.237183 13801.572266"); + m_BotSolder.AddCheckpoint("1398.934204 451.644989 13828.162109"); + m_BotSolder.AddCheckpoint("1419.962524 456.061951 13891.482422"); + m_BotSolder.AddCheckpoint("1409.579224 458.430359 13947.408203"); + m_BotSolder.AddCheckpoint("1421.006104 459.254517 13993.981445"); + m_BotSolder.AddCheckpoint("1422.121094 459.807831 14022.114258"); + m_BotSolder.AddCheckpoint("1388.509277 462.222443 14044.217773"); + m_BotSolder.AddCheckpoint("1388.548340 462.354797 14044.183594"); + m_BotSolder.AddCheckpoint("1333.772217 463.948151 14062.096680"); + m_BotSolder.AddCheckpoint("1350.346069 465.658081 14107.701172"); + m_BotSolder.AddCheckpoint("1461.509521 459.874268 14133.793945"); + m_BotSolder.AddCheckpoint("1503.123291 455.995056 14137.425781"); + m_BotSolder.AddCheckpoint("1554.196045 452.867004 14107.243164"); + m_BotSolder.AddCheckpoint("1574.911743 452.540283 14100.198242"); + m_BotSolder.AddCheckpoint("1629.664673 451.792175 14197.793945"); + m_BotSolder.AddCheckpoint("1636.238647 451.792175 14221.260742"); + m_BotSolder.AddCheckpoint("1671.278564 451.792175 14275.020508"); + m_BotSolder.AddCheckpoint("1645.910522 451.807617 14315.247070"); + m_BotSolder.AddCheckpoint("1669.397339 451.792175 14331.668945"); + m_BotSolder.AddCheckpoint("1685.370361 451.792175 14341.243164"); + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitPav() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots Pavlovo = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + + if (!Bot_Ar.IsAlive()) + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitPav); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersPav() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersPav); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitPav, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersPav, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not spawned!"); + return false; + } + } + +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionTisy.c b/BotMissions/Original/BotGroupMissionTisy.c new file mode 100644 index 0000000..e4238ed --- /dev/null +++ b/BotMissions/Original/BotGroupMissionTisy.c @@ -0,0 +1,415 @@ +class BotGroupMissionTisy: MissionBase +{ + + void BotGroupMissionTisy() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "1664.315552 453.742462 14263.407227"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 2; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 1100; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = true; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = false; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 100; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + m_BotSolder.AddCheckpoint("1681.035522 451.784302 14278.791016"); + m_BotSolder.AddCheckpoint("1668.385742 451.730408 14268.739258"); + m_BotSolder.AddCheckpoint("1653.012695 451.784302 14245.443359"); + m_BotSolder.AddCheckpoint("1662.009521 451.784302 14220.044922"); + m_BotSolder.AddCheckpoint("1668.885010 451.730408 14177.100586"); + m_BotSolder.AddCheckpoint("1678.905029 451.784302 14134.460938"); + m_BotSolder.AddCheckpoint("1687.656250 451.784302 14097.293945"); + m_BotSolder.AddCheckpoint("1691.055054 451.728760 14072.710938"); + m_BotSolder.AddCheckpoint("1697.563721 450.094635 14019.088867"); + m_BotSolder.AddCheckpoint("1701.266235 448.636108 13981.079102"); + m_BotSolder.AddCheckpoint("1709.151733 448.368225 13969.950195"); + m_BotSolder.AddCheckpoint("1726.191772 447.882568 13954.740234"); + m_BotSolder.AddCheckpoint("1734.303101 447.342072 13945.562500"); + m_BotSolder.AddCheckpoint("1736.849487 447.158569 13939.061523"); + m_BotSolder.AddCheckpoint("1803.257568 436.318970 13812.399414"); + m_BotSolder.AddCheckpoint("1802.478149 435.682281 13794.238281"); + m_BotSolder.AddCheckpoint("1764.742676 434.271759 13667.715820"); + m_BotSolder.AddCheckpoint("1753.983521 434.111572 13660.847656"); + m_BotSolder.AddCheckpoint("1697.765381 433.031982 13621.431641"); + m_BotSolder.AddCheckpoint("1625.751953 437.192169 13583.775391"); + m_BotSolder.AddCheckpoint("1615.443726 437.193420 13582.367188"); + m_BotSolder.AddCheckpoint("1586.155762 439.010864 13609.286133"); + m_BotSolder.AddCheckpoint("1566.816040 441.081787 13643.261719"); + m_BotSolder.AddCheckpoint("1554.550049 441.587372 13645.919922"); + m_BotSolder.AddCheckpoint("1533.254028 440.683624 13646.856445"); + m_BotSolder.AddCheckpoint("1470.583130 444.685120 13679.353516"); + m_BotSolder.AddCheckpoint("1448.422729 446.229736 13681.502930"); + m_BotSolder.AddCheckpoint("1397.534424 448.255707 13663.409180"); + m_BotSolder.AddCheckpoint("1377.747681 448.799530 13661.333984"); + m_BotSolder.AddCheckpoint("1356.402222 451.658264 13669.961914"); + m_BotSolder.AddCheckpoint("1339.632813 454.855988 13690.362305"); + m_BotSolder.AddCheckpoint("1311.232178 457.548615 13730.733398"); + m_BotSolder.AddCheckpoint("1368.332275 455.560181 13762.721680"); + m_BotSolder.AddCheckpoint("1389.098022 453.795563 13785.572266"); + m_BotSolder.AddCheckpoint("1394.411499 451.237183 13801.572266"); + m_BotSolder.AddCheckpoint("1398.934204 451.644989 13828.162109"); + m_BotSolder.AddCheckpoint("1419.962524 456.061951 13891.482422"); + m_BotSolder.AddCheckpoint("1409.579224 458.430359 13947.408203"); + m_BotSolder.AddCheckpoint("1421.006104 459.254517 13993.981445"); + m_BotSolder.AddCheckpoint("1422.121094 459.807831 14022.114258"); + m_BotSolder.AddCheckpoint("1388.509277 462.222443 14044.217773"); + m_BotSolder.AddCheckpoint("1388.548340 462.354797 14044.183594"); + m_BotSolder.AddCheckpoint("1333.772217 463.948151 14062.096680"); + m_BotSolder.AddCheckpoint("1350.346069 465.658081 14107.701172"); + m_BotSolder.AddCheckpoint("1461.509521 459.874268 14133.793945"); + m_BotSolder.AddCheckpoint("1503.123291 455.995056 14137.425781"); + m_BotSolder.AddCheckpoint("1554.196045 452.867004 14107.243164"); + m_BotSolder.AddCheckpoint("1574.911743 452.540283 14100.198242"); + m_BotSolder.AddCheckpoint("1629.664673 451.792175 14197.793945"); + m_BotSolder.AddCheckpoint("1636.238647 451.792175 14221.260742"); + m_BotSolder.AddCheckpoint("1671.278564 451.792175 14275.020508"); + m_BotSolder.AddCheckpoint("1645.910522 451.807617 14315.247070"); + m_BotSolder.AddCheckpoint("1669.397339 451.792175 14331.668945"); + m_BotSolder.AddCheckpoint("1685.370361 451.792175 14341.243164"); + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnit() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots Tisy = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnit); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayers() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayers); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnit, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayers, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionTroick.c b/BotMissions/Original/BotGroupMissionTroick.c new file mode 100644 index 0000000..f3387ad --- /dev/null +++ b/BotMissions/Original/BotGroupMissionTroick.c @@ -0,0 +1,367 @@ +class BotGroupMissionTroick: MissionBase +{ + + void BotGroupMissionTroick() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "7928.453613 337.658356 14597.561523"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 2; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 700; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = true; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = false; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = false; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 50; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("7908.396484 337.337708 14612.336914"); + m_BotSolder.AddCheckpoint("7906.007324 338.781555 14654.738281"); + m_BotSolder.AddCheckpoint("7927.181152 339.171600 14657.208008"); + m_BotSolder.AddCheckpoint("7926.386230 338.485382 14639.730469"); + m_BotSolder.AddCheckpoint("7937.773926 338.512451 14638.373047"); + m_BotSolder.AddCheckpoint("7943.151855 338.512451 14626.012695"); + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + + // Ôóíêöèÿ ñïàâíà áîòà (òóò íè÷åãî íå ìåíÿåì!!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitTroick() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots Troick = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitTroick); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersTroick() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersTroick); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitTroick, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersTroick, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } + +} \ No newline at end of file diff --git a/BotMissions/Original/BotGroupMissionZel.c b/BotMissions/Original/BotGroupMissionZel.c new file mode 100644 index 0000000..9abe4ee --- /dev/null +++ b/BotMissions/Original/BotGroupMissionZel.c @@ -0,0 +1,413 @@ +class BotGroupMissionZel: MissionBase +{ + + void BotGroupMissionZel() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Êîíôèãè áîòîâ + vector BotSpawnPoint = "2491.912842 193.367706 5081.337891"; // çàäàåì òî÷êó ñïàâíà áîòà + + int m_botAcuracy = 10; // Íàñòðîéêà ìåòêîñòè áîòà (÷åì âûøå ÷èñëî, òåì ÷àùå áîò ïðîìàçûâàåò) + + int BotSolderCountMin = 2; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åññòâî áîòîâ + int BotSolderCountMax = 4; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åññòâî áîòîâ + + int botLootCountMin = 5; // íàçíà÷àåì ìèíèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + int botLootCountMax = 15; // íàçíà÷àåì ìàêñèìàëüíîå êîëè÷åñòâî ëóòà ó áîòà + + float Zone_Radius = 500; // Ðàäèóñ òðèããåðà íà èãðîêà äëÿ ïîÿâëåíèÿ áîòîâ + + bool isUseCheckPoints = false; // çàäàåì èñïîëüçóþòñÿ ëè ÷åêïîíèíòû true - èñïîëüçóþòñÿ, fslse - íå èñïîëüçóþòñÿ + bool isBotKaratist = false; // Çàäàåì áóäóò ëè áîòû ñ îðóæèåì èëè áóäóò äðàòñÿ êóëàêàìè, ïî óìîë÷àíèþ îíè ñ îðóæèåì, åñëè íóæíû áåç îãíåñòðåëà ïðîïèøè true + bool onRespawnBot = false; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåñïàâíà áîòà (true - âêëþ÷åíî, fslse - âûêëþ÷åíî) + bool canUseTrigger = true; // Èñïîëüçîâàòü òðèããåð (true - âêëþ÷åíî, fslse - âûêëþ÷åíî), åñëè íå èñïîëüçóåòñÿ òðèããåð áîòû ñïàâíÿòñÿ ñðàçó ïîñëå çàïóñêà ñåðâåðà + bool useKilFeed = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå îïîâåùåíèÿ ïðè óáèéñòâå áîòà + bool m_Frendly = true; // Äðóæåëþáèå :) âêëþ÷åíèå èëè îòêëþ÷åíèå. Åñëè âêëþ÷åíî òî áîòû âàñ íå áóäóò àòàêîâàòü ïîêà âû íà íåãî íå íàïàäåòå, åñëè àòàêóåòå áîòà òî ñòàíåòå äëÿ âñåõ áîòîâ âðàãîì. + bool onVoice = true; // Âêëþ÷åíèå èëè îòêëþ÷åíèå ãîëîñà áîòà (âêëþ÷åíèå ýòîãî ïàðàìåòðà âûçûâàåò áîëüøå íàãðóçêè íà ñåðâåð) + int m_spawnBotRadius = 30; // Ðàäèóñ ñïàâíà áîòîâ íà òåðèòîðèå, öåíòðîì òåðèòîðèè ÿâëÿåòñÿ êîîðäèíàòà óêàçàííàÿ â BotSpawnPoint + int m_SpeedPatrol = 3; // Óñòàíîâêà ñêîðîñòè ïåðåäâèæåíèÿ ïðè ïàòðóëèðîâàíèè (min = 1 max = 3) + + int m_TargetDist = 100; // Çàäàåì ðàñòîÿíèå â ìåòðàõ íà êîòîðîì áîò âèäèò öåëü. + + bool canBotSpawned = true; // Íå èçìåíÿòü!!!!!!! + + // ------------------------------- êîíåö êîíôèãà ------------------------------------------ // + + + // Ìàññèâû ñ ëóòîì è îäåæäîé + // Åñëè êàêîéòî òèï íå íóæåí ïðîñòî îñòàâëÿåì ïóñòûå êîâû÷êè ïðèìåð ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"GorkaEJacket_Autumn", "GorkaEJacket_Flat", "GorkaEJacket_PautRev", "GorkaEJacket_Summer"}; //Äîáàâëÿåì âåðõ îäåæäû + ref TStringArray Jeans = {"GorkaPants_Autumn", "GorkaPants_Flat", "GorkaPants_PautRev", "GorkaPants_Summer"}; //Äîáàâëÿåì øòàíû + ref TStringArray Shoes = {"TTSKOBoots", "WorkingBoots_Beige", "CombatBoots_Beige", "CombatBoots_Black", "CombatBoots_Brown"}; //Äîáàâëÿåì áîòèíêè + ref TStringArray BackPack = {"CoyoteBag_Brown", "CoyoteBag_Green", "HuntingBag", "TortillaBag", "WaterproofBag_Green"}; //Äîáàâëÿåì Ðþêçàê + ref TStringArray Vest = {"HighCapacityVest_Black", "HighCapacityVest_Olive", "HuntingVest", "PlateCarrierVest", "UKAssVest_Camo"}; //Äîáàâëÿåì ðàçãðóçêó + ref TStringArray Helm = {"GorkaHelmet", "Mich2001Helmet", "MotoHelmet_Black", "PumpkinHelmet", "SkateHelmet_Black"}; //Äîáàâëÿåì øëåì èëè ãîëîâíîé óáîð + ref TStringArray Gloves = {"WorkingGloves_Beige", "WorkingGloves_Black", "NBCGlovesGray", "OMNOGloves_Brown", "SurgicalGloves_Blue"}; //Äîáàâëÿåì ïåð÷àòêè + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt"}; //Äîáàâëÿåì äîïîëíèòåëüíûé ýëåìåíò îäåæäû, ýòî ìîæåò áûòü âñ¸ ÷òî óãîäíî :) + + ref TStringArray RandomLoot = {"SardinesCan", "SodaCan_Cola", "SodaCan_Kvass", "Rice", "Rope", "Screwdriver", "AmmoBox_545x39_20Rnd"}; //Äîáàâëÿåì â ìàñèâ ëþáîé ëóò, êîëè÷åñòâî íå îãðàíè÷åíî + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Äîáàâëÿåì õîëîäíîå îðóæèå + + // -------------------------------- êîíåö ìàññèâîâ ëóòà -------------------------------------------------------// + + EntityAI itemEnt; // Íå èçìåíÿòü!!!! + + // Ôóíêöèÿ ñîçäàíèÿ ÷åêïîèíòîâ (ïðîïèñûâàåì ÷åêïîèíòû òóò) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Ýòó ñòðîêó íå òðîãàåì! + + m_BotSolder.AddCheckpoint("1724.632080 451.730408 14298.412109"); + m_BotSolder.AddCheckpoint("1681.035522 451.784302 14278.791016"); + m_BotSolder.AddCheckpoint("1668.385742 451.730408 14268.739258"); + m_BotSolder.AddCheckpoint("1653.012695 451.784302 14245.443359"); + m_BotSolder.AddCheckpoint("1662.009521 451.784302 14220.044922"); + m_BotSolder.AddCheckpoint("1668.885010 451.730408 14177.100586"); + m_BotSolder.AddCheckpoint("1678.905029 451.784302 14134.460938"); + m_BotSolder.AddCheckpoint("1687.656250 451.784302 14097.293945"); + m_BotSolder.AddCheckpoint("1691.055054 451.728760 14072.710938"); + m_BotSolder.AddCheckpoint("1697.563721 450.094635 14019.088867"); + m_BotSolder.AddCheckpoint("1701.266235 448.636108 13981.079102"); + m_BotSolder.AddCheckpoint("1709.151733 448.368225 13969.950195"); + m_BotSolder.AddCheckpoint("1726.191772 447.882568 13954.740234"); + m_BotSolder.AddCheckpoint("1734.303101 447.342072 13945.562500"); + m_BotSolder.AddCheckpoint("1736.849487 447.158569 13939.061523"); + m_BotSolder.AddCheckpoint("1803.257568 436.318970 13812.399414"); + m_BotSolder.AddCheckpoint("1802.478149 435.682281 13794.238281"); + m_BotSolder.AddCheckpoint("1764.742676 434.271759 13667.715820"); + m_BotSolder.AddCheckpoint("1753.983521 434.111572 13660.847656"); + m_BotSolder.AddCheckpoint("1697.765381 433.031982 13621.431641"); + m_BotSolder.AddCheckpoint("1625.751953 437.192169 13583.775391"); + m_BotSolder.AddCheckpoint("1615.443726 437.193420 13582.367188"); + m_BotSolder.AddCheckpoint("1586.155762 439.010864 13609.286133"); + m_BotSolder.AddCheckpoint("1566.816040 441.081787 13643.261719"); + m_BotSolder.AddCheckpoint("1554.550049 441.587372 13645.919922"); + m_BotSolder.AddCheckpoint("1533.254028 440.683624 13646.856445"); + m_BotSolder.AddCheckpoint("1470.583130 444.685120 13679.353516"); + m_BotSolder.AddCheckpoint("1448.422729 446.229736 13681.502930"); + m_BotSolder.AddCheckpoint("1397.534424 448.255707 13663.409180"); + m_BotSolder.AddCheckpoint("1377.747681 448.799530 13661.333984"); + m_BotSolder.AddCheckpoint("1356.402222 451.658264 13669.961914"); + m_BotSolder.AddCheckpoint("1339.632813 454.855988 13690.362305"); + m_BotSolder.AddCheckpoint("1311.232178 457.548615 13730.733398"); + m_BotSolder.AddCheckpoint("1368.332275 455.560181 13762.721680"); + m_BotSolder.AddCheckpoint("1389.098022 453.795563 13785.572266"); + m_BotSolder.AddCheckpoint("1394.411499 451.237183 13801.572266"); + m_BotSolder.AddCheckpoint("1398.934204 451.644989 13828.162109"); + m_BotSolder.AddCheckpoint("1419.962524 456.061951 13891.482422"); + m_BotSolder.AddCheckpoint("1409.579224 458.430359 13947.408203"); + m_BotSolder.AddCheckpoint("1421.006104 459.254517 13993.981445"); + m_BotSolder.AddCheckpoint("1422.121094 459.807831 14022.114258"); + m_BotSolder.AddCheckpoint("1388.509277 462.222443 14044.217773"); + m_BotSolder.AddCheckpoint("1388.548340 462.354797 14044.183594"); + m_BotSolder.AddCheckpoint("1333.772217 463.948151 14062.096680"); + m_BotSolder.AddCheckpoint("1350.346069 465.658081 14107.701172"); + m_BotSolder.AddCheckpoint("1461.509521 459.874268 14133.793945"); + m_BotSolder.AddCheckpoint("1503.123291 455.995056 14137.425781"); + m_BotSolder.AddCheckpoint("1554.196045 452.867004 14107.243164"); + m_BotSolder.AddCheckpoint("1574.911743 452.540283 14100.198242"); + m_BotSolder.AddCheckpoint("1629.664673 451.792175 14197.793945"); + m_BotSolder.AddCheckpoint("1636.238647 451.792175 14221.260742"); + m_BotSolder.AddCheckpoint("1671.278564 451.792175 14275.020508"); + m_BotSolder.AddCheckpoint("1645.910522 451.807617 14315.247070"); + m_BotSolder.AddCheckpoint("1669.397339 451.792175 14331.668945"); + m_BotSolder.AddCheckpoint("1685.370361 451.792175 14341.243164"); + } + // ---------------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ ÷åêïîèíòîâ -------------------------------------- / + + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // Ôóíêöèÿ ñîçäàíèÿ îðóæèÿ äëÿ áîòà (òóò ìîæíî äîáàâèòü 7 âìäîâ îðóæèÿ, âïèñûâàåì ïî ñâîåìó óñìîòðåíèþ) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //îðóæèå + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Îáâåñ1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Îáâåñ2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Îáâåñ3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Îáîéìà + break; + //Îáâåñû äîáîâëÿåì ïî íåîáõîäèìîñòè, ìàãàçèíû äëÿ îðóæèÿ âûäàþòñÿ àâòîìàòè÷åñêè åñëè îíè íå íàçíà÷åíû â ðó÷íóþ + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ñîçäàíèÿ îðóæèÿ ------------------------------------- // + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,100); + itemEnt.SetHealth("","",rndHlt); + } + } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- Êîíåö ôóíêöèè ñïàâíà áîòà ------------------------------------- // + + // ----------------------------- Ôóíêöèÿ ðåñïàâíà áîòîâ ----------------------------------------// + private void respawnBotUnitZel() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots Zelenogorsk = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitZel); + m_botRemoved = false; + } + } + } + } + // ----------------------------- Êîíåö ôóíêöèè ----------------------------------------// + + + + + // Ôóíêöèÿ ñïàâíà ãðóïïû áîòîâ + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- Êîíåö ôóíêöèè ñïàâíà ãðóïïû --------------------------------------- // + + // Ôóíêöèÿ òðèããåðà íà èãðîêà + void TriggerPlayersZel() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersZel); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitZel, 60000, true); + } + } + } + } + // --------------------------------------- Êîíåö ôóíêöèè òðèããåðà --------------------------------------- // + + // Ýòó ôóíêöèþ âûçûâàåì â initBotMissions.c + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersZel, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/PUSTOSKKA_AI1.c b/BotMissions/PUSTOSKKA_AI1.c new file mode 100644 index 0000000..d3a7811 --- /dev/null +++ b/BotMissions/PUSTOSKKA_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_PUSTOSKKA_AI1: MissionBase +{ + + void BotGroupMission_PUSTOSKKA_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "3048.44 312.137 7859.27"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/STARY_AI1.c b/BotMissions/STARY_AI1.c new file mode 100644 index 0000000..dc9eea8 --- /dev/null +++ b/BotMissions/STARY_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_STARY_AI1: MissionBase +{ + + void BotGroupMission_STARY_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "6105.67 301.141 7712.44"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/SVETLOJARSK_AI1.c b/BotMissions/SVETLOJARSK_AI1.c new file mode 100644 index 0000000..6efa585 --- /dev/null +++ b/BotMissions/SVETLOJARSK_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_SVETLOJARSK_AI1: MissionBase +{ + + void BotGroupMission_SVETLOJARSK_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "13826.1 19.8318 13307"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/SVETLOJARSK_AI2.c b/BotMissions/SVETLOJARSK_AI2.c new file mode 100644 index 0000000..7c9014b --- /dev/null +++ b/BotMissions/SVETLOJARSK_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_SVETLOJARSK_AI2: MissionBase +{ + + void BotGroupMission_SVETLOJARSK_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "13984 3.43051 13492.3"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/SVETLOJARSK_AI3.c b/BotMissions/SVETLOJARSK_AI3.c new file mode 100644 index 0000000..4053a1c --- /dev/null +++ b/BotMissions/SVETLOJARSK_AI3.c @@ -0,0 +1,445 @@ +class BotGroupMission_SVETLOJARSK_AI3: MissionBase +{ + + void BotGroupMission_SVETLOJARSK_AI3() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "14072.6 9.4294 13135.3"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/VYBORAIR_AI1.c b/BotMissions/VYBORAIR_AI1.c new file mode 100644 index 0000000..120a5c6 --- /dev/null +++ b/BotMissions/VYBORAIR_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_VYBORAIR_AI1: MissionBase +{ + + void BotGroupMission_VYBORAIR_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "4201.55 338.551 11033"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/VYBORAIR_AI2.c b/BotMissions/VYBORAIR_AI2.c new file mode 100644 index 0000000..2afc7e2 --- /dev/null +++ b/BotMissions/VYBORAIR_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_VYBORAIR_AI2: MissionBase +{ + + void BotGroupMission_VYBORAIR_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "4479.32 339.013 10837.3"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/VYBORAIR_AI3.c b/BotMissions/VYBORAIR_AI3.c new file mode 100644 index 0000000..8fd4e3c --- /dev/null +++ b/BotMissions/VYBORAIR_AI3.c @@ -0,0 +1,445 @@ +class BotGroupMission_VYBORAIR_AI3: MissionBase +{ + + void BotGroupMission_VYBORAIR_AI3() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "4639.27 339.14 10420.5"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/VYBORAIR_AI4.c b/BotMissions/VYBORAIR_AI4.c new file mode 100644 index 0000000..92cc504 --- /dev/null +++ b/BotMissions/VYBORAIR_AI4.c @@ -0,0 +1,445 @@ +class BotGroupMission_VYBORAIR_AI4: MissionBase +{ + + void BotGroupMission_VYBORAIR_AI4() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "4844.06 339.189 10388.3"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/VYBORAIR_AI5.c b/BotMissions/VYBORAIR_AI5.c new file mode 100644 index 0000000..1a8e49a --- /dev/null +++ b/BotMissions/VYBORAIR_AI5.c @@ -0,0 +1,445 @@ +class BotGroupMission_VYBORAIR_AI5: MissionBase +{ + + void BotGroupMission_VYBORAIR_AI5() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "4484.58 339.14 9597.23"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/VYBOR_AI1.c b/BotMissions/VYBOR_AI1.c new file mode 100644 index 0000000..a47ffa1 --- /dev/null +++ b/BotMissions/VYBOR_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_VYBOR_AI1: MissionBase +{ + + void BotGroupMission_VYBOR_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "3802.67 311.141 88939.75"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/ZELENOGORSK_AI1.c b/BotMissions/ZELENOGORSK_AI1.c new file mode 100644 index 0000000..c2dab90 --- /dev/null +++ b/BotMissions/ZELENOGORSK_AI1.c @@ -0,0 +1,445 @@ +class BotGroupMission_ZELENOGORSK_AI1: MissionBase +{ + + void BotGroupMission_ZELENOGORSK_AI1() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "2486.24 190.34 5152.9"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file diff --git a/BotMissions/ZELENOGORSK_AI2.c b/BotMissions/ZELENOGORSK_AI2.c new file mode 100644 index 0000000..6dabb7e --- /dev/null +++ b/BotMissions/ZELENOGORSK_AI2.c @@ -0,0 +1,445 @@ +class BotGroupMission_ZELENOGORSK_AI2: MissionBase +{ + + void BotGroupMission_ZELENOGORSK_AI2() { StartMissionAI(); } + + AIWorld world = GetGame().GetWorld().GetAIWorld(); + + // Bot configs + vector BotSpawnPoint = "2780.47 204.591 5309.4"; // set the spawn point of the bot + + int m_botAcuracy = 10; // Setting the bot's accuracy (the higher the number, the more often the bot misses) + + int BotSolderCountMin = 1; // assign the minimum number of bots + int BotSolderCountMax = 2; // assign the maximum number of bots + + int botLootCountMin = 5; // set the minimum amount of loot for the bot + int botLootCountMax = 15; // assign the maximum amount of loot for the bot + + float Zone_Radius = 1100; // Trigger radius for the player to spawn bots + + bool isUseCheckPoints = true; // set whether checkpoints are used true - used, fslse - not used + bool isBotKaratist = true; // We set whether bots will carry weapons or will be fought with fists, by default they are with weapons, if needed without a firearm, write true + bool onRespawnBot = true; // Enable or disable bot respawn (true - enabled, fslse - disabled) + bool canUseTrigger = true; // Use trigger (true - enabled, fslse - disabled), if the trigger is not used, bots will spawn immediately after starting the server + bool useKilFeed = true; // Enabling or disabling alerts when killing a bot + + bool m_Frendly = true; // Friendliness :) enable or disable. If enabled, then bots will not attack you until you attack it, if you attack a bot, you will become an enemy for all bots. + int rndFriendly = Math.RandomInt(0,1); + + bool onVoice = true; // Enable or disable bot voice (enabling this setting causes more server load) + int m_spawnBotRadius = 400; // The radius of the spawn of bots in the territory, the center of the territory is the coordinate specified in BotSpawnPoint + + int m_SpeedPatrol = 2; // Setting the movement speed while patrolling (min = 1 max = 3) + + int rndTargetDist = Math.RandomInt( 100, 200 ); + int m_TargetDist = rndTargetDist; // We set the distance in meters at which the bot sees the target. + + bool canBotSpawned = true; // Do not change !!!!!!! + + // ------------------------------- end of config ------------------------------------------ // + + + // Arrays with loot and clothes + // If some type is not needed, just leave empty quotes example ---> TStringArray OtherEquip = {""}; + ref TStringArray Shirt = {"BDUJacket","BomberJacket_Black","BomberJacket_Blue","BomberJacket_Brown","BomberJacket_Grey","BomberJacket_Maroon","BomberJacket_Olive","BomberJacket_SkyBlue","ChernarusSportShirt", + "FirefighterJacket_Beige","FirefighterJacket_Black","GorkaEJacket_Flat","GorkaEJacket_PautRev","GorkaEJacket_Summer","HikingJacket_Black","HikingJacket_Blue","HikingJacket_Green", + "HikingJacket_Red","HuntingJacket_Autumn","HuntingJacket_Brown","HuntingJacket_Spring","HuntingJacket_Summer","HuntingJacket_Winter","JumpsuitJacket_Blue","JumpsuitJacket_Gray", + "JumpsuitJacket_Green","JumpsuitJacket_Red","LabCoat","LeatherJacket_Beige","LeatherJacket_Black","LeatherJacket_Brown","LeatherJacket_Natural","M65Jacket_Black","M65Jacket_Khaki", + "M65Jacket_Olive","M65Jacket_Tan","MedicalScrubsShirt_Blue","MedicalScrubsShirt_Green","MedicalScrubsShirt_White","ParamedicJacket_Blue","ParamedicJacket_Crimson","ParamedicJacket_Green", + "PoliceJacket","PoliceJacketOrel","PrisonUniformJacket","QuiltedJacket_Black","QuiltedJacket_Blue","QuiltedJacket_Green","QuiltedJacket_Grey","QuiltedJacket_Orange","QuiltedJacket_Red", + "QuiltedJacket_Violet","QuiltedJacket_Yellow","Raincoat_Black","Raincoat_Blue","Raincoat_Green","Raincoat_Orange","Raincoat_Pink","Raincoat_Red","Raincoat_Yellow","RidersJacket_Black", + "Shirt_BlueCheck","Shirt_BlueCheckBright","Shirt_GreenCheck","Shirt_PlaneBlack","Shirt_RedCheck","Shirt_WhiteCheck","Sweater_Blue","Sweater_Gray","Sweater_Green","Sweater_Red","TShirt_Beige", + "TShirt_Black","TShirt_Blue","TShirt_Green","TShirt_Grey","TShirt_OrangeWhiteStripes","TShirt_Red","TShirt_RedBlackStripes","TShirt_White","TacticalShirt_Black","TacticalShirt_Grey", + "TacticalShirt_Olive","TacticalShirt_Tan","TelnyashkaShirt","TrackSuitJacket_Black","TrackSuitJacket_Blue","TrackSuitJacket_Green","TrackSuitJacket_LightBlue","TrackSuitJacket_Red", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","WomanSuit_Beige","WomanSuit_Black","WomanSuit_Blue","WomanSuit_Brown", + "WomanSuit_DarkGrey","WomanSuit_Khaki","WomanSuit_LightGrey","WomanSuit_White","WoolCoat_Beige","WoolCoat_Black","WoolCoat_BlackCheck","WoolCoat_Blue","WoolCoat_BlueCheck","WoolCoat_BrownCheck", + "WoolCoat_Green","WoolCoat_GreyCheck","WoolCoat_Red","WoolCoat_RedCheck","MiniDress_BlueChecker","MiniDress_BlueWithDots","MiniDress_BrownChecker","MiniDress_GreenChecker","MiniDress_Pink", + "MiniDress_PinkChecker","MiniDress_RedChecker","MiniDress_WhiteChecker","NurseDress_Blue","NurseDress_White"}; //Add the top of the clothes + ref TStringArray Jeans = {"BDUPants","Breeches_Beetcheck","Breeches_Beige","Breeches_Black","Breeches_Blackcheck","Breeches_Blue","Breeches_Browncheck","Breeches_Green","Breeches_Pink", + "Breeches_Red","Breeches_White","CanvasPantsMidi_Beige","CanvasPantsMidi_Blue","CanvasPantsMidi_Grey","CanvasPantsMidi_Red","CanvasPantsMidi_Violet","CanvasPants_Beige", + "CanvasPants_Blue","CanvasPants_Grey","CanvasPants_Red","CanvasPants_Violet","CargoPants_Beige","CargoPants_Black","CargoPants_Blue","CargoPants_Green","CargoPants_Grey", + "FirefightersPants_Beige","FirefightersPants_Black","GorkaPants_Autumn","GorkaPants_Flat","GorkaPants_PautRev","GorkaPants_Summer","HunterPants_Autumn","HunterPants_Brown", + "HunterPants_Spring","HunterPants_Summer","HunterPants_Winter","Jeans_Black","Jeans_Blue","Jeans_BlueDark","Jeans_Brown","Jeans_Green","Jeans_Grey","LeatherPants_Beige", + "LeatherPants_Black","LeatherPants_Brown","LeatherPants_Natural","MedicalScrubsPants_Blue","MedicalScrubsPants_Green","MedicalScrubsPants_White","PolicePants","PolicePantsOrel", + "SlacksPants_Beige","SlacksPants_Black","SlacksPants_Blue","SlacksPants_Brown","SlacksPants_DarkGrey","SlacksPants_Khaki","SlacksPants_LightGrey","SlacksPants_White", + "TrackSuitPants_Black","TrackSuitPants_Blue","TrackSuitPants_Green","TrackSuitPants_LightBlue","TrackSuitPants_Red","USMCPants_Desert","USMCPants_Woodland"}; //Add pants + ref TStringArray Shoes = {"AthleticShoes_Black","AthleticShoes_Blue","AthleticShoes_Brown","AthleticShoes_Green","AthleticShoes_Grey","CombatBoots_Beige","CombatBoots_Black", + "CombatBoots_Brown","CombatBoots_Green","CombatBoots_Grey","DressShoes_Beige","DressShoes_Black","DressShoes_Brown","DressShoes_Sunburst","DressShoes_White", + "HikingBootsLow_Beige","HikingBootsLow_Black","HikingBootsLow_Blue","HikingBootsLow_Grey","HikingBoots_Black","HikingBoots_Brown","JoggingShoes_Black","JoggingShoes_Blue", + "JoggingShoes_Red","JoggingShoes_Violet","JoggingShoes_White","JungleBoots_Beige","JungleBoots_Black","JungleBoots_Brown","JungleBoots_Green","JungleBoots_Olive","LeatherShoes_Beige", + "LeatherShoes_Black","LeatherShoes_Brown","LeatherShoes_Natural","MilitaryBoots_Beige","MilitaryBoots_Black","MilitaryBoots_Bluerock","MilitaryBoots_Brown","MilitaryBoots_Redpunk", + "NBCBootsGray","NBCBootsYellow","Sneakers_Black","Sneakers_Gray","Sneakers_Green","Sneakers_Red","Sneakers_White","TTSKOBoots","Wellies_Black","Wellies_Brown","Wellies_Green","Wellies_Grey", + "WorkingBoots_Beige","WorkingBoots_Brown","WorkingBoots_Green","WorkingBoots_Grey","WorkingBoots_Yellow"}; //Add boots + ref TStringArray BackPack = {"AliceBag_Black","AliceBag_Camo","AliceBag_Green","AssaultBag_Black","AssaultBag_Green","AssaultBag_Ttsko","CoyoteBag_Brown", + "CoyoteBag_Green","HuntingBag","ImprovisedBag","LeatherSack_Beige","LeatherSack_Black","LeatherSack_Brown","LeatherSack_Natural", + "MountainBag_Green","MountainBag_Orange","MountainBag_Red","SmershBag","TaloonBag_Blue","TaloonBag_Green","TaloonBag_Orange", + "TaloonBag_Violet","TortillaBag","ChildBag_Blue","ChildBag_Green","ChildBag_Red","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add the Backpack + ref TStringArray Vest = {"HuntingVest","LeatherStorageVest_Beige","LeatherStorageVest_Black","LeatherStorageVest_Brown", + "LeatherStorageVest_Natural","PlateCarrierVest","PressVest_Blue","PressVest_LightBlue","ReflexVest", + "SmershVest","UKAssVest_Black","UKAssVest_Camo","UKAssVest_Khaki","UKAssVest_Olive","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add Vest + ref TStringArray Helm = {"Balaclava3Holes_Beige","Balaclava3Holes_Black","Balaclava3Holes_Blue","Balaclava3Holes_Green","BalaclavaMask_Beige","BalaclavaMask_Black","BalaclavaMask_Blackskull", + "BalaclavaMask_Blue","BalaclavaMask_Green","BalaclavaMask_Pink","BalaclavaMask_White","BallisticHelmet_Black","BallisticHelmet_Green","BallisticHelmet_UN","Bandana_Blackpattern", + "Bandana_Camopattern","Bandana_Greenpattern","Bandana_Polkapattern","Bandana_Redpattern","BaseballCap_Beige","BaseballCap_Black","BaseballCap_Blue","BaseballCap_CMMG_Black", + "BaseballCap_CMMG_Pink","BaseballCap_Camo","BaseballCap_Olive","BaseballCap_Pink","BaseballCap_Red","BeanieHat_Beige","BeanieHat_Black","BeanieHat_Blue","BeanieHat_Brown", + "BeanieHat_Green","BeanieHat_Grey","BeanieHat_Pink","BeanieHat_Red","BoonieHat_Black","BoonieHat_Blue","BoonieHat_DPM","BoonieHat_Dubok","BoonieHat_Flecktran","BoonieHat_NavyBlue", + "BoonieHat_Olive","BoonieHat_Orange","BoonieHat_Red","BoonieHat_Tan","ConstructionHelmet_Blue","ConstructionHelmet_Lime","ConstructionHelmet_Orange","ConstructionHelmet_Red", + "ConstructionHelmet_White","ConstructionHelmet_Yellow","CowboyHat_Brown","CowboyHat_black","CowboyHat_darkBrown","CowboyHat_green","DarkMotoHelmet_Black","DarkMotoHelmet_Blue", + "DarkMotoHelmet_Green","DarkMotoHelmet_Grey","DarkMotoHelmet_Lime","DarkMotoHelmet_Red","DarkMotoHelmet_White","DirtBikeHelmet_Black","DirtBikeHelmet_Blue","DirtBikeHelmet_Chernarus", + "DirtBikeHelmet_Green","DirtBikeHelmet_Khaki","DirtBikeHelmet_Mouthguard","DirtBikeHelmet_Police","DirtBikeHelmet_Red","DirtBikeHelmet_Visor","FlatCap_Black","FlatCap_BlackCheck", + "FlatCap_Blue","FlatCap_Brown","FlatCap_BrownCheck","FlatCap_Grey","FlatCap_GreyCheck","FlatCap_Red","GP5GasMask","GasMask","GorkaHelmet","Mich2001Helmet","MotoHelmet_Black", + "MotoHelmet_Blue","MotoHelmet_Green","MotoHelmet_Grey","MotoHelmet_Lime","MotoHelmet_Red","MotoHelmet_White","NioshFaceMask","OfficerHat","PilotkaCap","PoliceCap","PrisonerCap", + "RadarCap_Black","RadarCap_Blue","RadarCap_Brown","RadarCap_Green","RadarCap_Red","SkateHelmet_Black","SkateHelmet_Blue","SkateHelmet_Gray","SkateHelmet_Green","SkateHelmet_Red", + "TankerHelmet","Ushanka_Black","Ushanka_Blue","Ushanka_Green","WeldingMask","ZSh3PilotHelmet","ZmijovkaCap_Black","ZmijovkaCap_Blue","ZmijovkaCap_Brown","ZmijovkaCap_Green","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add a helmet or headgear + ref TStringArray Gloves = {"LeatherGloves_Beige","LeatherGloves_Black","LeatherGloves_Brown","LeatherGloves_Natural","OMNOGloves_Brown","OMNOGloves_Gray", + "WorkingGloves_Beige","WorkingGloves_Black","WorkingGloves_Brown","WorkingGloves_Yellow","SurgicalGloves_Blue","SurgicalGloves_Green", + "SurgicalGloves_LightBlue","SurgicalGloves_White","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //Add gloves + ref TStringArray OtherEquip = {"CivilianBelt", "MilitaryBelt","","","","","","","","","","","","","","","",""}; //Add an additional item of clothing, it can be anything :) + + ref TStringArray RandomLoot = {"Apple","AgaricusMushroom","AuriculariaMushroom","BakedBeansCan","Bitterlings","BoxCerealCrunchin","BrisketSpread","Canteen", + "CatFoodCan","Chips","Crackers","DogFoodCan","GreenBellPepper","Lunchmeat","Pajka","Pate","PeachesCan","Pear","Plum","Potato", + "PowderedMilk","Pumpkin","Rice","SaltySticks","SardinesCan","SlicedPumpkin","SodaCan_Cola","SodaCan_Fronta","SodaCan_Kvass", + "SodaCan_Pipsi","SodaCan_Spite","SpaghettiCan","TacticalBaconCan","Tomato","TunaCan","UnknownFoodCan","Zagorky","ZagorkyChocolate", + "ZagorkyPeanuts","Zucchini","BandageDressing","BarbedWire","Battery9V","BloodBagEmpty","BloodBagIV","BloodTestKit","BurlapSack", + "CanOpener","CharcoalTablets","Chemlight_Blue","Chemlight_Green","Chemlight_Red","Chemlight_White","Chemlight_Yellow","ChernarusMap", + "Compass","Crowbar","DisinfectantAlcohol","DisinfectantSpray","DuctTape","Epinephrine","EpoxyPutty","Fabric","FishingRod", + "Flashlight","GardenLime","Hacksaw","Hammer","HandSaw","HeadlightH7_Box","Headtorch_Black","Headtorch_Grey","Heatpack", + "ImprovisedFishingRod","IodineTincture","LargeGasCanister","LugWrench","Matchbox","MediumGasCanister","MetalWire","Morphine", + "NVGHeadstrap","NailBox","Netting","NylonKnifeSheath","OrienteeringCompass","PainkillerTablets","PersonalRadio","PetrolLighter", + "PipeWrench","Pliers","PortableGasLamp","PortableGasStove","Pot","PurificationTablets","Rangefinder","Roadflare","SalineBag", + "SalineBagIV","Screwdriver","SewingKit","SmallGasCanister","SparkPlug","StartKitIV","Stone","TetracyclineAntibiotics","Thermometer", + "VitaminBottle","WaterBottle","Whetstone","Wrench","XmasLights","AmmoBox_00buck_10rnd","AmmoBox_12gaRubberSlug_10Rnd","AmmoBox_12gaSlug_10Rnd", + "AmmoBox_22_50Rnd","AmmoBox_308WinTracer_20Rnd","AmmoBox_308Win_20Rnd","AmmoBox_357_20Rnd","AmmoBox_380_35rnd","AmmoBox_45ACP_25rnd", + "AmmoBox_545x39Tracer_20Rnd","AmmoBox_545x39_20Rnd","AmmoBox_556x45Tracer_20Rnd","AmmoBox_556x45_20Rnd","AmmoBox_762x39Tracer_20Rnd", + "AmmoBox_762x39_20Rnd","AmmoBox_762x54Tracer_20Rnd","AmmoBox_762x54_20Rnd","AmmoBox_9x19_25rnd","AmmoBox_9x39AP_20Rnd","AmmoBox_9x39_20Rnd", + "M18SmokeGrenade_Green","M18SmokeGrenade_Purple","M18SmokeGrenade_Red","M18SmokeGrenade_White","M18SmokeGrenade_Yellow","UniversalLight", + "PistolOptic","KashtanOptic","KazuarOptic","KobraOptic","KobraOptic","ACOGOptic_6x","","","","","","","","","","","","","","","","","","","", + "","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; //We add any loot to the array, the amount is not limited + ref TStringArray MeleeWeap = {"WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe"}; //Add melee weapons + + // -------------------------------- end -------------------------------------------------------// + + EntityAI itemEnt; // Do not change !!!! + + // Function for creating checkpoints (register checkpoints here) + void AddCeckPoint(SurvivorBotBase m_BotSolder) + { + m_BotSolder.SetUseCheckpoint(); // Do not touch this line! + +/* m_BotSolder.AddCheckpoint("13429.400391 5.890710 6028.540039"); + m_BotSolder.AddCheckpoint("13380.400391 6.140470 6040.580078"); + m_BotSolder.AddCheckpoint("13376.799805 6.140510 6130.660156"); + m_BotSolder.AddCheckpoint("13404.700195 6.083950 6218.189941"); + m_BotSolder.AddCheckpoint("13412.400391 5.780290 6245.870117"); + m_BotSolder.AddCheckpoint("13425.799805 5.979890 6270.229980"); + m_BotSolder.AddCheckpoint("13427.099609 6.382700 6348.950195"); + m_BotSolder.AddCheckpoint("13464.400391 6.096580 6368.109863"); */ + } + // ---------------------------------- end -------------------------------------- / + + ref array m_BotMass = new array; + ref array m_PlaersZoneArray = new array; + + // The function of creating weapons for the bot (here you can add 7 weapon wmds, enter at your discretion) + void createWeapFromBot(SurvivorBotBase m_BotSolder) + { + int randomWeapon = Math.RandomInt(1, 7); + + switch( randomWeapon ) + { + case 1: + { + m_BotSolder.AddWeapon("M4A1"); //Weapon + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); //Att 1 + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); //Att 2 + m_BotSolder.AddWeaponAtt("ACOGOptic"); //Att 3 + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); //Mag + break; + //We add body kits as needed, magazines for weapons are issued automatically, no need to add them + } + + case 2: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 3: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 4: + { + m_BotSolder.AddWeapon("SVD"); + m_BotSolder.AddMagazine("Mag_SVD_10Rnd"); + break; + } + + case 5: + { + m_BotSolder.AddWeapon("M4A1"); + m_BotSolder.AddWeaponAtt("M4_RISHndgrd"); + m_BotSolder.AddWeaponAtt("M4_MPBttstck"); + m_BotSolder.AddWeaponAtt("ACOGOptic"); + m_BotSolder.AddMagazine("Mag_STANAG_30Rnd"); + break; + } + + case 6: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + + case 7: + { + m_BotSolder.AddWeapon("AKM"); + m_BotSolder.AddWeaponAtt("AK_WoodBttstck"); + m_BotSolder.AddWeaponAtt("AK_WoodHndgrd"); + m_BotSolder.AddMagazine("Mag_AKM_Drum75Rnd"); + break; + } + } + } + // ----------------------------- end ------------------------------------- // + + // Bot spawn function (we don't change anything here !!!) + void createBotUnit() + { + vector Navmesh; + vector botSpPos; + private SurvivorBotBase m_BotSolder; + + ref TStringArray m_BotBody = { "BotM_Mirek", "BotM_Rolf", "BotM_Quinn", "BotM_Peter", "BotM_Oliver" }; + + PGFilter m_pgFilterNav = new PGFilter(); + m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.INSIDE, 0); + + float bspX = BotSpawnPoint[0]; + float bspY = BotSpawnPoint[2]; + + if (isUseCheckPoints) + botSpPos = Vector(bspX + Math.RandomInt(-7, 7), BotSpawnPoint[1], bspY + Math.RandomInt(-7, 7)); + else + botSpPos = Vector(bspX + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius), BotSpawnPoint[1], bspY + Math.RandomInt(-m_spawnBotRadius, m_spawnBotRadius)); + + bool IsNavmesh = world.SampleNavmeshPosition( botSpPos, 2, m_pgFilterNav, Navmesh ); + + if (IsNavmesh) + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), Navmesh, 0, "NONE")); + else + m_BotSolder = SurvivorBotBase.Cast(GetGame().CreatePlayer(null, m_BotBody.GetRandomElement(), botSpPos, 0, "NONE")); + + + m_BotSolder.GetInventory().CreateInInventory(Shirt.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Jeans.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Shoes.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(BackPack.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Vest.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Helm.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(Gloves.GetRandomElement()); + m_BotSolder.GetInventory().CreateInInventory(OtherEquip.GetRandomElement()); + + if (isBotKaratist) + m_BotSolder.GetHumanInventory().CreateInHands(MeleeWeap.GetRandomElement()); + else + createWeapFromBot(m_BotSolder); + + int rndLootCnt = Math.RandomInt(botLootCountMin, botLootCountMax); + + for (int i = 0; i < rndLootCnt; i++) + { + itemEnt = m_BotSolder.GetInventory().CreateInInventory(RandomLoot.GetRandomElement()); + if (itemEnt) + { + int rndHlt = Math.RandomInt(55,90); + itemEnt.SetHealth("","",rndHlt); + } + } + + +// if (rndFriendly == 0){ +// m_Frendly = false; +// } + + m_BotSolder.SetAcuracy(m_botAcuracy); + m_BotSolder.SetDistance(m_TargetDist); + m_BotSolder.SetUseVoice(onVoice); + m_BotSolder.SetUseKillFeed(useKilFeed); + m_BotSolder.SetFrendly(m_Frendly); + m_BotSolder.SetSpeedPatrol(m_SpeedPatrol); + + + if (isUseCheckPoints) + AddCeckPoint(m_BotSolder); + + + m_BotMass.Insert(m_BotSolder); + } + // ----------------------------- end ------------------------------------- // + + // ----------------------------- Bots respawn function ----------------------------------------// + private void respawnBotUnitC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + SurvivorBotBase Bot_Ar; + vector posB; + bool m_botRemoved = false; + float distB; + int m_countBot = m_BotMass.Count(); + int plaersZoneCount = -1; + m_PlaersZoneArray.Clear(); + if (canBotSpawned) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && player.IsAlive() ) + { + m_PlaersZoneArray.Insert(player); + // return; + } + } + Print("Players count in zone bots C1 = " + m_PlaersZoneArray.Count()); + if (m_PlaersZoneArray.Count() == 0) + { + + for ( int a = 0; a < m_countBot; a++ ) + { + Bot_Ar = m_BotMass.Get(a); + if (Bot_Ar) + { + if (!Bot_Ar.IsAlive()) + { + posB = Bot_Ar.GetPosition(); + distB = vector.Distance( posB, BotSpawnPoint ); + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + else + { + if (distB < Zone_Radius) + { + m_BotMass.Remove( a ); + GetGame().ObjectDelete( Bot_Ar ); + } + + if (m_BotMass.Count() == 0) + m_botRemoved = true; + } + } + } + + if (m_botRemoved && m_PlaersZoneArray.Count() == 0) + { + StartMissionAI(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitC1); + m_botRemoved = false; + } + } + } + } + // ----------------------------- end ----------------------------------------// + + + + + // Spawn function of a group of bots + int delaySpawn = 0; + void spawnBotGroup() + { + int rndBotGrpCnt = Math.RandomInt(BotSolderCountMin, BotSolderCountMax); + Print("Bots spawned! Count " + rndBotGrpCnt); + for (int a = 0; a < rndBotGrpCnt; a++) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(createBotUnit, 500 + delaySpawn); + delaySpawn +=1000; + } + } + // --------------------------------------- end --------------------------------------- // + + // Player trigger function + void TriggerPlayersC1() + { + ref array players = new array; + GetGame().GetPlayers( players ); + delaySpawn = 0; + + if (canBotSpawned && IsGoodSrvFps()) + { + for ( int u = 0; u < players.Count(); u++ ) + { + + PlayerBase player; + Class.CastTo(player, players.Get(u)); + vector pos = player.GetPosition(); + float dist = vector.Distance( pos, BotSpawnPoint ); + + if ( dist < Zone_Radius && !player.IsBot() ) + { + spawnBotGroup(); + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(TriggerPlayersC1); + + if (onRespawnBot) + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(respawnBotUnitC1, 60000, true); + } + } + } + } + // --------------------------------------- end --------------------------------------- // + + void StartMissionAI() + { + Print("Start mission bot"); + if (canUseTrigger) + { + GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(TriggerPlayersC1, 5000, true); + } + else if (IsGoodSrvFps()) + { + spawnBotGroup(); + } + } + + bool IsGoodSrvFps() + { + float TestFpsSrv = GetGame().GetFps(); + + if (TestFpsSrv < 2) + { + return true; + } + else + { + Print("Server FPS low! FPS = " + TestFpsSrv + " Bots not respawned!"); + return false; + } + } +} \ No newline at end of file