static void Postfix(AIUnitSpawn __instance) { if (Networker.isHost) { Debug.Log("Setting up new AI."); AIManager.setupAIAircraft(__instance.actor); Debug.Log("Telling client about newly spawned AI."); Actor actor = __instance.actor; if (!actor.isPlayer) { if (actor.name.Contains("Client")) { return; } bool Aggresion = false; if (actor.gameObject.GetComponent <UIDNetworker_Sender>() != null) { Debug.Log("Try sending ai " + actor.name + " to client."); HPInfo[] hPInfos2 = null; int[] cmLoadout = null; UIDNetworker_Sender uidSender = actor.gameObject.GetComponent <UIDNetworker_Sender>(); if (actor.role == Actor.Roles.Air) { WeaponManager wm = actor.gameObject.GetComponent <WeaponManager>(); if (wm != null) { hPInfos2 = PlaneEquippableManager.generateHpInfoListFromWeaponManager(actor.weaponManager, PlaneEquippableManager.HPInfoListGenerateNetworkType.sender, uidSender.networkUID).ToArray(); } } AIUnitSpawn aIUnitSpawn = actor.gameObject.GetComponent <AIUnitSpawn>(); if (aIUnitSpawn == null) { Debug.LogWarning("AI unit spawn is null on ai " + actor.name); } else { Aggresion = aIUnitSpawn.engageEnemies; } bool canBreak = false; PhoneticLetters letters = new PhoneticLetters(); foreach (var Group in VTScenario.current.groups.GetExistingGroups(actor.team)) { foreach (var ID in Group.unitIDs) { if (ID == actor.unitSpawn.unitID) { letters = Group.groupID; canBreak = true; break; } } if (canBreak) { break; } } List <ulong> ids = new List <ulong>(); ulong lastID; SAMLauncher launcher = actor.gameObject.GetComponentInChildren <SAMLauncher>(); if (launcher != null) { foreach (var radar in launcher.lockingRadars) { if (radar.myActor == null) { Debug.LogError("Locking radar on one of the SAM's is literally null."); } if (VTOLVR_Multiplayer.AIDictionaries.reverseAllActors.TryGetValue(radar.myActor, out lastID)) { ids.Add(lastID); // Debug.Log("Aded a radar ID"); } else { Debug.LogError("Couldn't get a locking radar on one of the SAM's, probably a dictionary problem."); } } } ulong[] irIDS = new ulong[0]; IRSAMNetworker_Sender irs = actor.gameObject.GetComponentInChildren <IRSAMNetworker_Sender>(); if (irs != null) { irIDS = irs.irIDs; } Debug.Log("Finally sending AI " + actor.name + " to client all clients."); if (canBreak) { NetworkSenderThread.Instance.SendPacketAsHostToAllClients(new Message_SpawnAIVehicle(actor.name, AIManager.GetUnitNameFromCatalog(actor.unitSpawn.unitName), VTMapManager.WorldToGlobalPoint(actor.gameObject.transform.position), new Vector3D(actor.gameObject.transform.rotation.eulerAngles), uidSender.networkUID, hPInfos2, cmLoadout, 0.65f, Aggresion, actor.unitSpawn.unitSpawner.unitInstanceID, letters, ids.ToArray(), irIDS), EP2PSend.k_EP2PSendReliable); } else { // Debug.Log("It seems that " + actor.name + " is not in a unit group, sending anyways."); NetworkSenderThread.Instance.SendPacketAsHostToAllClients(new Message_SpawnAIVehicle(actor.name, AIManager.GetUnitNameFromCatalog(actor.unitSpawn.unitName), VTMapManager.WorldToGlobalPoint(actor.gameObject.transform.position), new Vector3D(actor.gameObject.transform.rotation.eulerAngles), uidSender.networkUID, hPInfos2, cmLoadout, 0.65f, Aggresion, actor.unitSpawn.unitSpawner.unitInstanceID, ids.ToArray(), irIDS), EP2PSend.k_EP2PSendReliable); } } else { Debug.Log("Could not find the UIDNetworker_Sender"); } } AIManager.TellClientAboutAI(new Steamworks.CSteamID(0)); } }
public static void setupAIAircraft(Actor actor) { if (actor.role == Actor.Roles.Missile || actor.isPlayer) { return; } if (actor.name.Contains("Rearm/Refuel")) { return; } foreach (AI ai in AIManager.AIVehicles) { if (ai.actor == actor) { return; } } if (actor.parentActor == null) { AIManager.AIVehicles.Add(new AIManager.AI(actor.gameObject, actor.unitSpawn.unitName, actor, Networker.networkUID + 1)); foreach (Actor child in actor.gameObject.GetComponentsInChildren <Actor>()) { ulong networkUID = Networker.GenerateNetworkUID(); Debug.Log("Adding UID senders to " + child.name + $", their uID will be {networkUID}."); if (!VTOLVR_Multiplayer.AIDictionaries.allActors.ContainsKey(networkUID)) { VTOLVR_Multiplayer.AIDictionaries.allActors.Add(networkUID, child); } if (!VTOLVR_Multiplayer.AIDictionaries.reverseAllActors.ContainsKey(child)) { VTOLVR_Multiplayer.AIDictionaries.reverseAllActors.Add(child, networkUID); } UIDNetworker_Sender uidSender = child.gameObject.AddComponent <UIDNetworker_Sender>(); uidSender.networkUID = networkUID; Debug.Log("Added UID sender!"); Debug.Log("Checking for locking radars"); foreach (LockingRadar radar in child.GetComponentsInChildren <LockingRadar>()) { if (radar.GetComponent <Actor>() == child) { Debug.Log($"Adding radar sender to object {child.name} as it is the same game object as this actor."); LockingRadarNetworker_Sender lastLockingSender = child.gameObject.AddComponent <LockingRadarNetworker_Sender>(); lastLockingSender.networkUID = networkUID; Debug.Log("Added locking radar!"); } else if (radar.GetComponentInParent <Actor>() == child) { Debug.Log($"Adding radar sender to object {child.name} as it is a child of this actor."); LockingRadarNetworker_Sender lastLockingSender = child.gameObject.AddComponent <LockingRadarNetworker_Sender>(); lastLockingSender.networkUID = networkUID; Debug.Log("Added locking radar!"); } else { Debug.Log("This radar is not direct child of this actor, ignoring"); } } Debug.Log("Checking for health"); if (child.gameObject.GetComponent <Health>() != null) { Debug.Log("adding health sender to ai"); HealthNetworker_Sender healthNetworker = child.gameObject.AddComponent <HealthNetworker_Sender>(); healthNetworker.networkUID = networkUID; Debug.Log("added health sender to ai!"); } else { Debug.Log(child.name + " has no health?"); } Debug.Log("checking for movement type"); if (child.gameObject.GetComponent <ShipMover>() != null) { Debug.Log("I am a ship!"); ShipNetworker_Sender shipNetworker = child.gameObject.AddComponent <ShipNetworker_Sender>(); shipNetworker.networkUID = networkUID; } else if (child.gameObject.GetComponent <GroundUnitMover>() != null) { Debug.Log("I am a ground mover!"); if (child.gameObject.GetComponent <Rigidbody>() != null) { GroundNetworker_Sender lastGroundSender = child.gameObject.AddComponent <GroundNetworker_Sender>(); lastGroundSender.networkUID = networkUID; } } else if (child.gameObject.GetComponent <Rigidbody>() != null) { Debug.Log("I am physicsy!"); RigidbodyNetworker_Sender lastRigidSender = child.gameObject.AddComponent <RigidbodyNetworker_Sender>(); lastRigidSender.networkUID = networkUID; //reduced tick rate for ground Units if (child.role == Actor.Roles.Ground) { lastRigidSender.tickRate = 0.01f; } if (child.role == Actor.Roles.GroundArmor) { lastRigidSender.tickRate = 1.0f; } } Debug.Log("checking if aircraft"); if (!child.isPlayer && child.role == Actor.Roles.Air) { if (child.weaponManager != null) { PlaneEquippableManager.generateHpInfoListFromWeaponManager(child.weaponManager, PlaneEquippableManager.HPInfoListGenerateNetworkType.generate, uidSender.networkUID); } PlaneNetworker_Sender lastPlaneSender = child.gameObject.AddComponent <PlaneNetworker_Sender>(); lastPlaneSender.networkUID = networkUID; } Debug.Log("checking ext lights"); if (child.gameObject.GetComponentInChildren <ExteriorLightsController>() != null) { //ExtNPCLight_Sender extLight = actor.gameObject.AddComponent<ExtNPCLight_Sender>(); //extLight.networkUID = networkUID; } Debug.Log("checking for guns"); if (child.gameObject.GetComponentsInChildren <Actor>().Count() <= 1) {//only run this code on units without subunits ulong turretCount = 0; foreach (ModuleTurret moduleTurret in child.gameObject.GetComponentsInChildren <ModuleTurret>()) { TurretNetworker_Sender tSender = moduleTurret.gameObject.AddComponent <TurretNetworker_Sender>(); tSender.networkUID = networkUID; tSender.turretID = turretCount; Debug.Log("Added turret " + turretCount + " to actor " + networkUID + " uid"); turretCount++; } ulong gunCount = 0; foreach (GunTurretAI moduleTurret in child.gameObject.GetComponentsInChildren <GunTurretAI>()) { AAANetworker_Sender gSender = moduleTurret.gameObject.AddComponent <AAANetworker_Sender>(); gSender.networkUID = networkUID; gSender.gunID = gunCount; Debug.Log("Added gun " + gunCount + " to actor " + networkUID + " uid"); gunCount++; } } Debug.Log("checking for IRSams"); IRSamLauncher ml = child.gameObject.GetComponentInChildren <IRSamLauncher>(); if (ml != null) { List <ulong> samIDS = new List <ulong>(); MissileNetworker_Sender lastSender; for (int i = 0; i < ml.ml.missiles.Length; i++) { lastSender = ml.ml.missiles[i].gameObject.AddComponent <MissileNetworker_Sender>(); lastSender.networkUID = Networker.GenerateNetworkUID(); samIDS.Add(lastSender.networkUID); } child.gameObject.AddComponent <IRSAMNetworker_Sender>().irIDs = samIDS.ToArray(); } Debug.Log("checking for soldier"); Soldier soldier = child.gameObject.GetComponentInChildren <Soldier>(); if (soldier != null) { if (soldier.soldierType == Soldier.SoldierTypes.IRMANPAD) { List <ulong> samIDS = new List <ulong>(); MissileNetworker_Sender lastSender; for (int i = 0; i < soldier.irMissileLauncher.missiles.Length; i++) { lastSender = soldier.irMissileLauncher.missiles[i].gameObject.AddComponent <MissileNetworker_Sender>(); lastSender.networkUID = Networker.GenerateNetworkUID(); samIDS.Add(lastSender.networkUID); } child.gameObject.AddComponent <IRSAMNetworker_Sender>().irIDs = samIDS.ToArray(); } } Debug.Log("checking for airport"); AirportManager airport = child.gameObject.GetComponent <AirportManager>(); if (airport != null) { AIManager.SetUpCarrier(child.gameObject, networkUID, child.team); } //if (!child.unitSpawn.unitSpawner.spawned) //{ // Debug.Log("Actor " + child.name + " isn't spawned yet, still sending."); //} } } else { Debug.Log(actor.name + " has a parent, not giving an uID sender."); } }
public static List <Player> players = new List <Player>(); //This is the list of players /// <summary> /// This runs when the map has finished loading and hopefully /// when the player first can interact with the vehicle. /// </summary> public static IEnumerator MapLoaded() { Debug.Log("map loading started"); while (VTMapManager.fetch == null || !VTMapManager.fetch.scenarioReady || FlightSceneManager.instance.switchingScene) { yield return(null); } Debug.Log("The map has loaded"); gameLoaded = true; // As a client, when the map has loaded we are going to request a spawn point from the host SetPrefabs(); carrierStart = FlightSceneManager.instance.playerActor.unitSpawn.unitSpawner.linkedToCarrier; if (!Networker.isHost) { FlightSceneManager.instance.playerActor.gameObject.transform.parent = null; Debug.Log($"Sending spawn request to host, host id: {Networker.hostID}, client id: {SteamUser.GetSteamID().m_SteamID}"); Debug.Log("Killing all units currently on the map."); List <Actor> allActors = new List <Actor>(); foreach (var actor in TargetManager.instance.allActors) { if (!actor.isPlayer) { allActors.Add(actor); } } foreach (var actor in allActors) { TargetManager.instance.UnregisterActor(actor); GameObject.Destroy(actor.gameObject); } VTScenario.current.units.units.Clear(); VTScenario.current.units.alliedUnits.Clear(); VTScenario.current.units.enemyUnits.Clear(); VTScenario.current.groups.DestroyAll(); if (teamLeftie) { foreach (AirportManager airportManager in VTMapManager.fetch.airports) { if (airportManager.team == Teams.Allied) { airportManager.team = Teams.Enemy; } else if (airportManager.team == Teams.Enemy) { airportManager.team = Teams.Allied; } } } var rearmPoints = GameObject.FindObjectsOfType <ReArmingPoint>(); //back up option below if (teamLeftie) { foreach (ReArmingPoint rep in rearmPoints) { if (rep.team == Teams.Allied) { rep.team = Teams.Enemy; rep.canArm = true; rep.canRefuel = true; } else if (rep.team == Teams.Enemy) { rep.team = Teams.Allied; rep.canArm = true; rep.canRefuel = true; } } } Message_RequestSpawn msg = new Message_RequestSpawn(teamLeftie, SteamUser.GetSteamID().m_SteamID); NetworkSenderThread.Instance.SendPacketToSpecificPlayer(Networker.hostID, msg, EP2PSend.k_EP2PSendReliable); /*foreach (var actor in TargetManager.instance.allActors) * { * VTScenario.current.units.AddSpawner(actor.unitSpawn.unitSpawner); * }*/ } else { Debug.Log("Starting map loaded host routines"); Networker.hostLoaded = true; Networker.hostReady = true; foreach (var actor in TargetManager.instance.allActors) { AIManager.setupAIAircraft(actor); } NetworkSenderThread.Instance.SendPacketAsHostToAllClients(new Message_HostLoaded(true), EP2PSend.k_EP2PSendReliable); GameObject localVehicle = VTOLAPI.GetPlayersVehicleGameObject(); if (localVehicle != null) { GenerateSpawns(localVehicle.transform); localUID = Networker.GenerateNetworkUID(); UIDNetworker_Sender hostSender = localVehicle.AddComponent <UIDNetworker_Sender>(); hostSender.networkUID = localUID; Debug.Log($"The host's uID is {localUID}"); Transform hostTrans = localVehicle.transform; ///uncomment to randomise host spawn// /// localVehicle.transform.position = hostTrans.position; SpawnLocalVehicleAndInformOtherClients(localVehicle, hostTrans.transform.position, hostTrans.transform.rotation, localUID, 0); } else { Debug.Log("Local vehicle for host was null"); } if (spawnRequestQueue.Count != 0) { SpawnRequestQueue(); } Networker.alreadyInGame = true; } while (AIManager.AIsToSpawnQueue.Count > 0) { AIManager.SpawnAIVehicle(AIManager.AIsToSpawnQueue.Dequeue()); } SpawnPlayersInPlayerSpawnQueue(); if (!Networker.isHost) { // If the player is not the host, they only need a receiver? Debug.Log($"Player not the host, adding world data receiver"); worldData = new GameObject(); worldData.AddComponent <WorldDataNetworker_Receiver>(); } else { // If the player is the host, setup the sender so they can send world data Debug.Log($"Player is the host, setting up the world data sender"); worldData = new GameObject(); worldData.AddComponent <WorldDataNetworker_Sender>(); } }
/// <summary> /// Tell the connected clients about all the vehicles the host has. This code should never be run on a client. /// </summary> /// <param name="steamID">Pass 0 to tell it to every client.</param> public static void TellClientAboutAI(CSteamID steamID) { if (!Networker.isHost) { Debug.LogWarning("The client shouldn't be trying to tell everyone about AI"); return; } Debug.Log("Trying sending AI's to client " + steamID); foreach (var actor in TargetManager.instance.allActors) { if (actor == null) { continue; } if (actor.parentActor != null) { continue; } Debug.Log("Trying sending new stage 1"); if (!actor.isPlayer) { if (actor.name.Contains("Client [") == false) { Debug.Log("Trying sending new stage 2"); bool Aggresion = false; if (actor.gameObject.GetComponent <UIDNetworker_Sender>() != null) { Debug.Log("Try sending ai " + actor.name + " to client."); HPInfo[] hPInfos2 = null; int[] cmLoadout = null; UIDNetworker_Sender uidSender = actor.gameObject.GetComponent <UIDNetworker_Sender>(); List <ulong> subUIDs = new List <ulong>(); foreach (UIDNetworker_Sender subActor in actor.gameObject.GetComponentsInChildren <UIDNetworker_Sender>()) { subUIDs.Add(subActor.networkUID); Debug.Log("Found ID sender with ID " + subActor.networkUID); } if (actor.role == Actor.Roles.Air) { WeaponManager wm = actor.gameObject.GetComponent <WeaponManager>(); if (wm != null) { hPInfos2 = PlaneEquippableManager.generateHpInfoListFromWeaponManager(actor.weaponManager, PlaneEquippableManager.HPInfoListGenerateNetworkType.sender, uidSender.networkUID).ToArray(); } } AIUnitSpawn aIUnitSpawn = actor.gameObject.GetComponent <AIUnitSpawn>(); if (aIUnitSpawn == null) { Debug.LogWarning("AI unit spawn is null on ai " + actor.name); } else { Aggresion = aIUnitSpawn.engageEnemies; } bool canBreak = false; PhoneticLetters letters = new PhoneticLetters(); foreach (var Group in VTScenario.current.groups.GetExistingGroups(actor.team)) { foreach (var ID in Group.unitIDs) { if (aIUnitSpawn != null) { if (ID == actor.unitSpawn.unitID) { letters = Group.groupID; canBreak = true; break; } } } if (canBreak) { break; } } Debug.LogWarning("passed group stuff"); List <ulong> ids = new List <ulong>(); ulong lastID; SAMLauncher launcher = actor.gameObject.GetComponentInChildren <SAMLauncher>(); if (launcher != null) { foreach (var radar in launcher.lockingRadars) { if (radar.myActor == null) { Debug.LogError("Locking radar on one of the SAM's is literally null."); } if (VTOLVR_Multiplayer.AIDictionaries.reverseAllActors.TryGetValue(radar.myActor, out lastID)) { ids.Add(lastID); // Debug.Log("Aded a radar ID"); } else { Debug.LogError("Couldn't get a locking radar on one of the SAM's, probably a dictionary problem."); } } } ulong[] irIDS = new ulong[0]; IRSAMNetworker_Sender irs = actor.gameObject.GetComponentInChildren <IRSAMNetworker_Sender>(); if (irs != null) { irIDS = irs.irIDs; } bool redfor = false; if (actor.team == Teams.Enemy) { redfor = true; } if (steamID != new CSteamID(0)) { Debug.Log("Finally sending AI " + actor.name + " to client " + steamID); Debug.Log("This unit is made from " + subUIDs.Count + " actors! "); if (canBreak) { NetworkSenderThread.Instance.SendPacketToSpecificPlayer(steamID, new Message_SpawnAIVehicle(actor.name, GetUnitNameFromCatalog(actor.unitSpawn.unitName), redfor, VTMapManager.WorldToGlobalPoint(actor.gameObject.transform.position), actor.gameObject.transform.rotation, uidSender.networkUID, subUIDs.ToArray(), hPInfos2, cmLoadout, 0.65f, Aggresion, actor.unitSpawn.unitSpawner.unitInstanceID, letters, ids.ToArray(), irIDS), EP2PSend.k_EP2PSendReliableWithBuffering); } else { // Debug.Log("It seems that " + actor.name + " is not in a unit group, sending anyways."); NetworkSenderThread.Instance.SendPacketToSpecificPlayer(steamID, new Message_SpawnAIVehicle(actor.name, GetUnitNameFromCatalog(actor.unitSpawn.unitName), redfor, VTMapManager.WorldToGlobalPoint(actor.gameObject.transform.position), actor.gameObject.transform.rotation, uidSender.networkUID, subUIDs.ToArray(), hPInfos2, cmLoadout, 0.65f, Aggresion, actor.unitSpawn.unitSpawner.unitInstanceID, ids.ToArray(), irIDS), EP2PSend.k_EP2PSendReliableWithBuffering); } } else { Debug.Log("Finally sending AI " + actor.name + " to client all clients."); Debug.Log("This unit is made from " + subUIDs.Count + " actors! "); if (canBreak) { Networker.addToReliableSendBuffer(new Message_SpawnAIVehicle(actor.name, GetUnitNameFromCatalog(actor.unitSpawn.unitName), redfor, VTMapManager.WorldToGlobalPoint(actor.gameObject.transform.position), actor.gameObject.transform.rotation, uidSender.networkUID, subUIDs.ToArray(), hPInfos2, cmLoadout, 0.65f, Aggresion, actor.unitSpawn.unitSpawner.unitInstanceID, letters, ids.ToArray(), irIDS)); } else { // Debug.Log("It seems that " + actor.name + " is not in a unit group, sending anyways."); Networker.addToReliableSendBuffer(new Message_SpawnAIVehicle(actor.name, GetUnitNameFromCatalog(actor.unitSpawn.unitName), redfor, VTMapManager.WorldToGlobalPoint(actor.gameObject.transform.position), actor.gameObject.transform.rotation, uidSender.networkUID, subUIDs.ToArray(), hPInfos2, cmLoadout, 0.65f, Aggresion, actor.unitSpawn.unitSpawner.unitInstanceID, ids.ToArray(), irIDS)); } } } else { Debug.Log("Could not find the UIDNetworker_Sender"); } } } } }