Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
VasiliyP

AI Bots / Боты для сервера DayZ

Recommended Posts

Posted (edited)

Привет, а почему у некоторых ботов нету оружия в руках, а у некоторых есть оружие, но не вставлен магазин? в следствии чего они имитируют атаку как с палкой в руке, убивая их обнаруживаю, что в инвентаре есть 2 полные обоймы, а в оружие ничего нет, получается лёгкая нажива. Еще интересно, стоит параметр перереспа ботов, а они не всегда перереспываются + когда боты проходят все точки на последней они начинают бегать вокруг себя. Ещё вопрос, можно ли им к вещам делать атачменты как к оружию? Приложу свой файл мисии.

class BotGroupMissionZel: BotMissionBase
{
	
	void BotGroupMissionZel() { StartMissionAI(); }
	
	AIWorld world = GetGame().GetWorld().GetAIWorld();
	
	// Конфиги ботов
	vector BotSpawnPoint = "2284.996826 185.435043 5273.306641";				// задаем точку спавна бота	
	
	int m_botAcuracy = 8;											// Настройка меткости бота (чем выше число, тем чаще бот промазывает)
	
	int BotSolderCountMin = 3;  									// назначаем минимальное количесство ботов
	int BotSolderCountMax = 6;										// назначаем максимальное количесство ботов
	
	int botLootCountMin = 1; 										// назначаем минимальное количество лута у бота
	int botLootCountMax = 1; 										// назначаем максимальное количество лута у бота
	
	float Zone_Radius = 1000;										// Радиус триггера на игрока для появления ботов
	
	bool isUseCheckPoints = true;									// задаем используются ли чекпонинты true - используются, fslse - не используются
	bool isBotKaratist = false;										// Задаем будут ли боты с оружием или будут дратся кулаками, по умолчанию они с оружием, если нужны без огнестрела пропиши true
	bool onRespawnBot = true;										// Включение или отключение респавна бота (true - включено, fslse - выключено)
	bool canUseTrigger = true;										// Использовать триггер (true - включено, fslse - выключено), если не используется триггер боты спавнятся сразу после запуска сервера
	bool useKilFeed = false;										// Включение или отключение оповещения при убийстве бота
	bool m_Frendly = false;											// Дружелюбие :) включение или отключение. Если включено то боты вас не будут атаковать пока вы на него не нападете, если атакуете бота то станете для всех ботов врагом. 
	bool onVoice = false;											// Включение или отключение голоса бота (включение этого параметра вызывает больше нагрузки на сервер)
	int m_spawnBotRadius = 30;										// Радиус спавна ботов на територие, центром територии является координата указанная в BotSpawnPoint
	int m_SpeedPatrol = 2;											// Установка скорости передвижения при патрулировании (min = 1 max = 3)
	
	bool RemoveWPN = false;											//Включение или отключение удаления оружия после смерти бота
	bool DropLoot = false;											//Включение или отключение выпадания лута после смерти бота (при включении тело бота удаляется)
	
	string CustomTag = "";											
	string KillNotificationCustom = "";
	
	string QuestItem = "";											//тут можно прописать класс любой вещи которая со 100% шансом выпадет при убийстве бота(удобно для создания квестов)
	int QuestItemCount = 0;											//Количество выпадаемых вещей которую прописали выше 
	
	int m_TargetDist = 200;											// Задаем растояние в метрах на котором бот видит цель.
	
	bool canBotSpawned = true;										// Не изменять!!!!!!!
	
	// ------------------------------- конец конфига  ------------------------------------------ //
	
	
	// Массивы с лутом и одеждой
	// Если какойто тип не нужен просто оставляем пустые ковычки пример ---> TStringArray OtherEquip = {""}; 
	ref TStringArray Shirt = {"MMG_operatorshirt_erdl", "MMG_operatorshirt_black", "MMG_operatorshirt_tan", "MMG_operatorshirt_ucp"}; 					//Добавляем верх одежды
	ref TStringArray Jeans = {"MMG_combatpants_erdl", "MMG_combatpants_black", "MMG_combatpants_tan", "MMG_combatpants_ucp"}; 							//Добавляем штаны
	ref TStringArray Shoes = {"MMG_boots_erdl", "MMG_boots_black", "MMG_boots_tan", "MMG_boots_ucp"};			                                        //Добавляем ботинки
	ref TStringArray BackPack = {"MMG_carrier_backpack_erdl", "MMG_carrier_backpack_black", "MMG_carrier_backpack_tan", "MMG_carrier_backpack_ucp"};	//Добавляем Рюкзак
	ref TStringArray Vest = {"MMG_tt_Vest_erdl", "MMG_tt_Vest_black", "MMG_tt_Vest_tan", "MMG_tt_Vest_ucp"};		                                    //Добавляем разгрузку
	ref TStringArray Helm = {"MMG_tactical_helmet_erdl", "MMG_tactical_helmet_black", "MMG_tactical_helmet_tan", "MMG_tactical_helmet_ucp"};		    //Добавляем шлем или головной убор
	ref TStringArray Gloves = {"mmg_tactical_gloves_erdl", "mmg_tactical_gloves_black", "mmg_tactical_gloves_tan", "mmg_tactical_gloves_ucp"};	        //Добавляем перчатки
	
		ref TStringArray OtherEquip = 
	{
	"MMG_facemask_erdl","MMG_balaclava_erdl",
	"MMG_facemask_black","MMG_balaclava_black",
	"MMG_facemask_tan","MMG_balaclava_tan",
	"MMG_facemask_ucp","MMG_balaclava_ucp",
	"mmg_cargobelt_erdl",
	"mmg_cargobelt_tan",
	"mmg_cargobelt_black",
	"mmg_cargobelt_ucp"
	};	 //Добавляем дополнительный элемент одежды, это может быть всё что угодно :)
	
	ref TStringArray RandomLoot = 
	{
	"SardinesCan", 
	"SodaCan_Cola",
	"UnknownFoodCan_Opened",
	"RabbitLegMeat",
	"Vodka",
	"BandageDressing",
	"SalineBagIV",
	"TetracyclineAntibiotics",
	"CharcoalTablets",
	"Epinephrine",
	"Morphine",
	"TraderPlus_Money_DIM_Gold",
	"PersonalRadio",
	"AntiChemInjector",
	"HDSN_Sulfur",
	"HDSN_Charcoal",
	"MS_DuctTape",
	"MS_Knife",
	"BurlapSack",
	"ElectronicRepairKit",
	"Battery9V"
	};  //Добавляем в масив любой лут, количество не ограничено
	
	ref TStringArray MeleeWeap = {"MS_Toporik","MS_Shovel","MS_Knife","WoodAxe", "FirefighterAxe", "Shovel", "Pickaxe","CrudeMachete","OrientalMachete","Machete","NailedBaseballBat","BarbedBaseballBat"};	//Добавляем холодное оружие
	
	// -------------------------------- конец массивов лута  -------------------------------------------------------//

	EntityAI itemEnt;				// Не изменять!!!!

	// Функция создания чекпоинтов (прописываем чекпоинты тут)
	void AddCeckPoint(SurvivorBotBase m_BotSolder)
	{
		m_BotSolder.SetUseCheckpoint(); // Эту строку не трогаем!
		
		m_BotSolder.AddCheckpoint("2293.674316 188.249283 5288.731934");
		m_BotSolder.AddCheckpoint("2308.227051 189.361099 5306.066895");
		m_BotSolder.AddCheckpoint("2290.794678 189.123337 5311.432129");
		m_BotSolder.AddCheckpoint("2258.075684 188.975922 5312.944336");
		m_BotSolder.AddCheckpoint("2243.186279 188.903198 5311.354004");
		m_BotSolder.AddCheckpoint("2207.653320 188.395676 5308.153809");
		m_BotSolder.AddCheckpoint("2204.366699 185.716354 5277.533691");
		m_BotSolder.AddCheckpoint("2175.490723 186.812378 5244.015625");
		m_BotSolder.AddCheckpoint("2180.699951 186.468674 5214.647461");
		m_BotSolder.AddCheckpoint("2190.357178 185.496780 5214.873535");
		m_BotSolder.AddCheckpoint("2211.482910 185.439163 5207.737305");
		m_BotSolder.AddCheckpoint("2216.868164 185.422882 5200.903809");
		m_BotSolder.AddCheckpoint("2235.261963 185.359650 5204.806641");
		m_BotSolder.AddCheckpoint("2241.299561 185.539307 5156.678711");
		m_BotSolder.AddCheckpoint("2276.781494 185.665207 5161.344727");
		m_BotSolder.AddCheckpoint("2359.306885 188.126617 5177.913086");
		m_BotSolder.AddCheckpoint("2373.353271 189.120270 5151.782227");
		m_BotSolder.AddCheckpoint("2379.332520 189.297012 5144.050293");
		m_BotSolder.AddCheckpoint("2425.942871 190.145264 5153.515625");
		m_BotSolder.AddCheckpoint("2490.492676 190.326553 5165.691895");
		m_BotSolder.AddCheckpoint("2500.952148 191.449356 5134.786621");
		m_BotSolder.AddCheckpoint("2503.646484 191.878662 5127.040039");
		m_BotSolder.AddCheckpoint("2497.747803 193.252533 5121.148438");
		m_BotSolder.AddCheckpoint("2484.314697 193.266998 5108.248535");
		m_BotSolder.AddCheckpoint("2506.879639 193.485565 5085.309082");
		m_BotSolder.AddCheckpoint("2514.415039 193.580017 5084.563965");
		m_BotSolder.AddCheckpoint("2524.835205 193.564209 5086.637695");
		m_BotSolder.AddCheckpoint("2532.411621 193.327286 5096.593750");
		m_BotSolder.AddCheckpoint("2549.559326 193.252365 5107.280273");
		m_BotSolder.AddCheckpoint("2567.514648 193.208389 5117.867676");
		m_BotSolder.AddCheckpoint("2579.140625 193.145233 5124.494141");
		m_BotSolder.AddCheckpoint("2587.805176 194.451599 5113.859375");
		m_BotSolder.AddCheckpoint("2577.024902 194.446960 5102.753906");
		m_BotSolder.AddCheckpoint("2557.540771 194.144775 5091.420898");
		m_BotSolder.AddCheckpoint("2556.088135 194.432098 5083.431152");
		m_BotSolder.AddCheckpoint("2549.160889 193.757446 5079.373535");
		m_BotSolder.AddCheckpoint("2554.951904 193.733856 5064.354004");
		m_BotSolder.AddCheckpoint("2545.804199 193.712143 5060.679199");
		m_BotSolder.AddCheckpoint("2541.373047 193.733612 5058.360352");
		m_BotSolder.AddCheckpoint("2543.679443 193.779892 5052.245605");
		m_BotSolder.AddCheckpoint("2543.081299 193.930420 5045.297852");
		m_BotSolder.AddCheckpoint("2554.990723 194.342667 5032.033203");
		m_BotSolder.AddCheckpoint("2572.843506 194.379669 5039.752930");
		m_BotSolder.AddCheckpoint("2630.900635 195.119385 5075.913086");
		m_BotSolder.AddCheckpoint("2643.377930 195.033325 5086.298828");
		m_BotSolder.AddCheckpoint("2643.376221 195.410782 5100.416504");
		m_BotSolder.AddCheckpoint("2631.156006 195.759796 5114.764160");
		m_BotSolder.AddCheckpoint("2635.107666 196.149994 5128.170410");
		m_BotSolder.AddCheckpoint("2633.314697 196.149994 5132.558594");
		m_BotSolder.AddCheckpoint("2628.312256 195.917816 5140.714844");
		m_BotSolder.AddCheckpoint("2605.632080 195.188431 5160.520508");
		m_BotSolder.AddCheckpoint("2604.123047 195.159439 5166.338379");
		m_BotSolder.AddCheckpoint("2604.062012 195.561310 5233.225098");
		m_BotSolder.AddCheckpoint("2572.066650 191.664795 5240.660156");
		m_BotSolder.AddCheckpoint("2537.203613 190.410019 5239.770020");	
		m_BotSolder.AddCheckpoint("2524.040771 190.403290 5241.257324");
		m_BotSolder.AddCheckpoint("2507.250000 190.354996 5236.633789");
		m_BotSolder.AddCheckpoint("2503.542480 190.237198 5256.426270");
		m_BotSolder.AddCheckpoint("2488.741455 190.339996 5248.140137");
		m_BotSolder.AddCheckpoint("2457.431396 190.277466 5245.237305");
		m_BotSolder.AddCheckpoint("2386.265869 190.369980 5258.360840");
		m_BotSolder.AddCheckpoint("2360.798096 190.230042 5272.488770");
		m_BotSolder.AddCheckpoint("2346.487793 190.189407 5263.115723");
		m_BotSolder.AddCheckpoint("2326.060303 188.355087 5246.906738");
		m_BotSolder.AddCheckpoint("2317.626709 188.469345 5256.745605");
		m_BotSolder.AddCheckpoint("2285.165039 185.394653 5247.201660");
		m_BotSolder.AddCheckpoint("2284.996826 185.435043 5273.306641");
	}
	// ---------------------------------- Конец функции создания чекпоинтов  -------------------------------------- /	
	

	ref array<SurvivorBotBase> m_BotMass = new array<SurvivorBotBase>;
	ref array<SurvivorBotBase> m_PlaersZoneArray = new array<SurvivorBotBase>;
	
	// Функция создания оружия для бота (тут можно добавить 7 вмдов оружия, вписываем по своему усмотрению)
	void createWeapFromBot(SurvivorBotBase m_BotSolder)
	{
		int randomWeapon = Math.RandomInt(1, 7);
			
		switch( randomWeapon )
		{	
			case 1: 
			{
				m_BotSolder.AddWeapon("SNAFU_MAR10_Black_GUN"); 	 //оружие
				m_BotSolder.AddWeaponAtt("SNAFU_Tango6T_Black");
				m_BotSolder.AddWeaponAtt("Battery9V");
				m_BotSolder.AddWeaponAtt("SNAFU_Bipod");
				m_BotSolder.AddMagazine("SNAFU_Mar10_15rnd_Mag"); //Обойма SNAFU_HuntingOptic
				break;
				//Обвесы добовляем по необходимости, магазины для оружия выдаются автоматически если они не назначены в ручную
			}
				
			case 2: 
			{
				m_BotSolder.AddWeapon("GCGN_M249");
				m_BotSolder.AddWeaponAtt("SNAFU_M249Bipod");
				m_BotSolder.AddWeaponAtt("SNAFU_M249Grip");
				m_BotSolder.AddWeaponAtt("SNAFU_M249HG");
				m_BotSolder.AddWeaponAtt("SNAFU_M249Stock");
				m_BotSolder.AddWeaponAtt("SNAFU_FGKAC_Grip");
				m_BotSolder.AddWeaponAtt("ACOGOptic_6x");
				m_BotSolder.AddMagazine("GCGN_M249_Mag");
				break;
			}
				
			case 3: 
			{
				m_BotSolder.AddWeapon("SNAFUHoneyBadger_Black");
				m_BotSolder.AddWeaponAtt("SNAFU_FGKAC_Grip");
				m_BotSolder.AddWeaponAtt("SNAFU_EOTech_EXPS");
				m_BotSolder.AddWeaponAtt("Battery9V");
				m_BotSolder.AddMagazine("SNAFU_CMAG60300_Black");
				break;
			}
				
			case 4: 
			{
				m_BotSolder.AddWeapon("GCGN_M110_Black");
				m_BotSolder.AddWeaponAtt("SNAFU_FGCR_Grip");
				m_BotSolder.AddWeaponAtt("SNAFU_Tango6T_Black");
				m_BotSolder.AddWeaponAtt("Battery9V");
				m_BotSolder.AddMagazine("GCGN_M110_Mag");
				break;
			}
				
			case 5: 
			{
				m_BotSolder.AddWeapon("SNAFU_M4300AC_10_GUN"); 	
				m_BotSolder.AddWeaponAtt("SNAFU_SCQR_Stock");	
				m_BotSolder.AddWeaponAtt("SNAFU_HG625");	
				m_BotSolder.AddWeaponAtt("SNAFU_FGKAC_Grip");	
				m_BotSolder.AddWeaponAtt("SNAFU_HeramuzzelF");	
				m_BotSolder.AddWeaponAtt("SNAFUUniversalLight");	
				m_BotSolder.AddWeaponAtt("Battery9V");
				m_BotSolder.AddWeaponAtt("SNAFU_PEQ1_Laser");	
				m_BotSolder.AddWeaponAtt("Battery9V");	
				m_BotSolder.AddWeaponAtt("SNAFU_Trijicon_Docter");
				m_BotSolder.AddWeaponAtt("Battery9V");	
				m_BotSolder.AddMagazine("SNAFU_CMAG40300_Black");
				break;
			}
				
			case 6: 
			{
				m_BotSolder.AddWeapon("SNAFU_AK12A");
				m_BotSolder.AddWeaponAtt("SNAFU_AK_HG");
				m_BotSolder.AddWeaponAtt("SNAFU_FGKAC_Grip");
				m_BotSolder.AddWeaponAtt("SNAFU_AK19Muzzel");
				m_BotSolder.AddWeaponAtt("SNAFU_AK19_Stock");
				m_BotSolder.AddWeaponAtt("SNAFU_EOTech_EXPS3");
				m_BotSolder.AddWeaponAtt("Battery9V");
				m_BotSolder.AddMagazine("SNAFU_RPK16_Black_Mag");
				break;
			}
				
			case 7: 
			{
				m_BotSolder.AddWeapon("SNAFU_KAC_Gun");
				m_BotSolder.AddMagazine("SNAFU_KAC_Mag");
				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.SetCost(PGAreaType.OBJECTS, 1.0);
		m_pgFilterNav.SetCost(PGAreaType.BUILDING, 1.0);
		m_pgFilterNav.SetFlags(PGPolyFlags.WALK, PGPolyFlags.LADDER | PGPolyFlags.CRAWL | PGPolyFlags.CROUCH | PGPolyFlags.DOOR |PGPolyFlags.DISABLED | PGPolyFlags.SWIM | PGPolyFlags.SWIM_SEA, 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);
		m_BotSolder.RemoveWpn(RemoveWPN);
		m_BotSolder.DropLootOnDeath(DropLoot);
		m_BotSolder.m_QuestItem = QuestItem;
		m_BotSolder.m_QuestItemCount = QuestItemCount;
		m_BotSolder.m_CustomTag = CustomTag;
		m_BotSolder.m_KillNotificationCustom = KillNotificationCustom;
		
		
		if (isUseCheckPoints) 
			AddCeckPoint(m_BotSolder);
	
		
		m_BotMass.Insert(m_BotSolder);
	}
	// ----------------------------- Конец функции спавна бота ------------------------------------- //
	bool m_SpawnedReady = true;
	// ----------------------------- Функция респавна ботов ----------------------------------------//
	private void respawnBotUnitZel()
	{
		ref array<Man> players = new array<Man>;
		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 (DropLoot)
				{
					m_botRemoved = true;
				}
					
				if (m_botRemoved && m_PlaersZoneArray.Count() == 0)	
				{
					StartMissionAI();
					GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(respawnBotUnitZel);
					m_botRemoved = false;
					m_SpawnedReady = true;
				}
			}			
		}		
	}
	// ----------------------------- Конец функции ----------------------------------------//
	

	
	
	// Функция спавна группы ботов
	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<Man> players = new array<Man>;
		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() ) 
				{
					if (m_SpawnedReady)
					{	
						m_SpawnedReady = false;
						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;
		}			
	}	
}

 

Edited by MrX (see edit history)

Share this post


Link to post
Share on other sites



Да все просто, в  кейсах выбора оружия просто нет дефолтного значения, так было сделан специально чтобы иногда бот был с кулаками, добавьте дефолтный кейс с оружием и этой проблемы не будет

Share this post


Link to post
Share on other sites
30.03.2024 в 03:21, VasiliyP сказал:

Да все просто, в  кейсах выбора оружия просто нет дефолтного значения, так было сделан специально чтобы иногда бот был с кулаками, добавьте дефолтный кейс с оружием и этой проблемы не будет

Подскажите пожалуйста, а почему боты на некоторых точках ходят кругами, как будто не могут точку найти, точки вынаю из Vpp админ тулз на горячую клавишу P, при изятии координат персонаж стоит ровно на земле.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.