public RequestSpawn requestSpawn(string username, int id) { RequestSpawn request = new RequestSpawn(); request.send(username, id);; return(request); }
private bool SpawnThread(RequestSpawn spawnProperties) { if (_processUsageCounter >= MaximumProcesses) { UnityEngine.Debug.LogError("[ProcessSpawner] - Maximum Process Count Reached"); return(false); } bool spawnComplete = false; //Find process name from AlaisStruct foreach (ProcessStruct process in processArray) { if (process.Alias.Equals(spawnProperties.ProcessAlias)) { Process p = new Process(); p.StartInfo.FileName = ProcessPath + process.Path; //Args to pass: Port, Scene, UniqueID... p.StartInfo.Arguments = ArgsString() + " -NetworkAddress " + SpawnerNetworkAddress + " -NetworkPort " + (StartingNetworkPort + _portCounter) + " -SceneName " + spawnProperties.SceneName + " -UniqueID " + spawnProperties.UniqueID; if (p.Start()) { spawnComplete = true; print("[ProcessSpawner]: spawning: " + p.StartInfo.FileName + "; args=" + p.StartInfo.Arguments); //Increment current port and process counter after sucessful spawn. _portCounter++; _processUsageCounter++; //If registered to a master. Notify it of the current thread utilization if (client != null) { client.Send((short)MsgId.SpawnerStatus, new SpawnerStatus() { CurrentThreads = _processUsageCounter }); } break; } else { UnityEngine.Debug.LogError("[ProcessSpawner] - Process Createion Failed."); return(false); } } } if (!spawnComplete) { UnityEngine.Debug.LogError("Process Alias not found"); return(false); } return(true); }
private void PerformSpawn() { var spawnLocation = GetSpawnLocation(); if (spawnLocation != null) { var unitDatas = GetUnitDatasToSpawn(); #if DEBUG Console.WriteLine($"Spawning with {unitDatas.Count()} enemies for threat level {GetThreatLevel()}"); #endif RequestSpawn?.Invoke(unitDatas, spawnLocation.Value); } lastSpawn = ScreenManager.CurrentScreen.PauseAdjustedCurrentTime; }
public void InternalSpawnRequest(RequestSpawn message) { //Get all spawners that have atleast 1 slot free List <SpawnerContainer> freeSlotSpawners = registeredSpawners.Where(x => (x.CurrentThreads < x.MaxThreads)).ToList(); if (freeSlotSpawners.Count == 0) { Debug.LogError("[MasterSpawner] - No Spawners with slots free available to service SpawnRequest."); return; } //sort by least busy spawner first freeSlotSpawners = freeSlotSpawners.OrderBy(x => x.CurrentThreads).ToList(); //Send SpawnRequest to the least busy Spawner server.SendToClient(freeSlotSpawners[0].connectionId, (short)MsgId.RequestSpawn, message); }
private void HandleSpawnRequest(InsightNetworkMessage netMsg) { RequestSpawn message = netMsg.ReadMessage <RequestSpawn>(); if (SpawnThread(message)) { //netMsg.Reply((short)MsgId.RequestSpawn, new RequestSpawn() { // SceneName = message.SceneName, // NetworkAddress = SpawnerNetworkAddress, // UniqueID = Guid.NewGuid().ToString() }); } else { netMsg.Reply((short)MsgId.Error, new ErrorMsg() { Text = "[ProcessSpawner] - Spawn failed" }); } }
//Instead of handling the msg here we will forward it to an available spawner. private void HandleSpawnRequestMsg(InsightNetworkMessage netMsg) { RequestSpawn message = netMsg.ReadMessage <RequestSpawn>(); //Get all spawners that have atleast 1 slot free List <SpawnerContainer> freeSlotSpawners = new List <SpawnerContainer>(); foreach (SpawnerContainer spawner in registeredSpawners) { if (spawner.CurrentThreads < spawner.MaxThreads) { freeSlotSpawners.Add(spawner); } } //sort by least busy spawner first freeSlotSpawners = freeSlotSpawners.OrderBy(x => x.CurrentThreads).ToList(); server.SendToClient(freeSlotSpawners[0].connectionId, (short)MsgId.RequestSpawn, message, (callbackStatus, reader) => { if (callbackStatus == CallbackStatus.Ok) { RequestSpawn callbackResponse = reader.ReadMessage <RequestSpawn>(); if (server.logNetworkMessages) { Debug.Log("[Spawn Callback] Game Created on Child Spawner: " + callbackResponse.UniqueID); } netMsg.Reply((short)MsgId.RequestSpawn, callbackResponse); } if (callbackStatus == CallbackStatus.Timeout) { } if (callbackStatus == CallbackStatus.Error) { } }); }
private void SendData(int packetType, int remoteClient = -1, int ignoreClient = -1, string networkText = null, int number = 0, float number2 = 0.0f, float number3 = 0.0f, float number4 = 0.0f, int number5 = 0, int number6 = 0, int number7 = 0) { if (!_tcpClient.Connected) { return; } lock (SyncLock) { //Debug.WriteLine($"TX: {packetType}"); var buffer = new byte[131070]; using (var memoryStream = new MemoryStream(buffer) { Position = 0 }) using (var writer = new BinaryWriter(memoryStream)) { var oldSteamPosition = writer.BaseStream.Position; writer.BaseStream.Position += 2L; writer.Write((byte)packetType); IPacket packet = null; switch ((PacketType)packetType) { case PacketType.ConnectRequest: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new ConnectRequest())); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.PlayerInfo: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new PlayerInfo())); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.PlayerInventorySlot: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new PlayerInventorySlot())); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.RequestSpawn: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new RequestSpawn())); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.SpawnPlayer: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SpawnPlayer { PlayerIndex = (byte)number })); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.UpdatePlayer: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new UpdatePlayer { PlayerIndex = (byte)number })); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.SendPlayerHealth: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendPlayerHealth { PlayerIndex = (byte)number, CurrentHealth = 100, HealthMax = 100 })); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.SendPlayerMana: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendPlayerMana { PlayerIndex = (byte)number, CurrentMana = 100, ManaMax = 100 })); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.SendPlayerBuffs: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendPlayerBuffs { PlayerIndex = (byte)number })); PacketHelper.WriteToWriter(writer, packet); break; case PacketType.SendClientUUID: PacketEvents.InvokePacketPreSend(new PacketEventArgs(packet = new SendClientUUID())); PacketHelper.WriteToWriter(writer, packet); break; } var newStreamPosition = writer.BaseStream.Position; writer.BaseStream.Position = oldSteamPosition; writer.Write((short)newStreamPosition); writer.BaseStream.Position = newStreamPosition; try { _networkStream.BeginWrite(buffer, 0, (int)memoryStream.Position, ar => _networkStream.EndWrite(ar), null); } catch // The connection was most likely closed by the host (Disconnect packets) { } } } }
private void ReadP2PPacket(byte[] array, uint num, uint num2, CSteamID csteamID) { MemoryStream serializationStream = new MemoryStream(array); Packet packet = new BinaryFormatter().Deserialize(serializationStream) as Packet; if (packet.packetType == PacketType.Single) { PacketSingle packetS = packet as PacketSingle; switch (packetS.message.type) { case MessageType.None: break; case MessageType.LobbyInfoRequest: SendP2P(csteamID, new Message_LobbyInfoRequest_Result(SteamFriends.GetPersonaName(), PilotSaveManager.currentVehicle.vehicleName, PilotSaveManager.currentScenario.scenarioName, PilotSaveManager.currentCampaign.campaignName, PlayerManager.players.Count.ToString()), EP2PSend.k_EP2PSendReliable); break; case MessageType.LobbyInfoRequest_Result: Message_LobbyInfoRequest_Result result = packetS.message as Message_LobbyInfoRequest_Result; Multiplayer._instance.lobbyInfoText.text = result.username + "'s Game\n" + result.vehicle + "\n" + result.campaign + " " + result.scenario + "\n" + (result.playercount == "1" ? result.playercount + " Player" : result.playercount + " Players"); break; case MessageType.JoinRequest: if (!isHost) { Debug.LogError($"Recived Join Request when we are not the host"); return; } Message_JoinRequest joinRequest = packetS.message as Message_JoinRequest; if (players.Contains(csteamID)) { Debug.LogError("The player seemed to send two join requests"); return; } if (joinRequest.currentVehicle == PilotSaveManager.currentVehicle.vehicleName && joinRequest.currentScenario == PilotSaveManager.currentScenario.scenarioID && joinRequest.currentCampaign == PilotSaveManager.currentCampaign.campaignID) { Debug.Log($"Accepting {csteamID.m_SteamID}"); players.Add(csteamID); readyDic.Add(csteamID, false); UpdateLoadingText(); SendP2P(csteamID, new Message_JoinRequest_Result(true), EP2PSend.k_EP2PSendReliable); } else { string reason = "Failed to Join Player"; if (joinRequest.currentVehicle != PilotSaveManager.currentVehicle.vehicleName) { reason += "\nWrong Vehicle."; } if (joinRequest.currentScenario != PilotSaveManager.currentScenario.scenarioID) { reason += "\nWrong Scenario."; } if (joinRequest.currentCampaign != PilotSaveManager.currentCampaign.campaignID) { reason += "\nWrong Campaign."; } SendP2P(csteamID, new Message_JoinRequest_Result(false, reason), EP2PSend.k_EP2PSendReliable); Debug.Log($"Denied {csteamID}, reason\n{reason}"); } break; case MessageType.JoinRequest_Result: Message_JoinRequest_Result joinResult = packetS.message as Message_JoinRequest_Result; if (joinResult.canJoin) { Debug.Log($"Joining {csteamID.m_SteamID}"); hostID = csteamID; StartCoroutine(FlyButton()); } else { Debug.LogWarning($"We can't join {csteamID.m_SteamID} reason = \n{joinResult.reason}"); } break; case MessageType.Ready: //The client has said they are ready to start, so we change it in the dictionary if (readyDic.ContainsKey(csteamID)) { Debug.Log($"{csteamID.m_SteamID} has said they are ready!\nHost ready state {hostReady}"); readyDic[csteamID] = true; if (alreadyInGame) { //Someone is trying to join when we are already in game. Debug.Log($"We are already in session, {csteamID} is joining in!"); SendP2P(csteamID, new Message(MessageType.Ready_Result), EP2PSend.k_EP2PSendReliable); break; } else if (hostReady && EveryoneElseReady()) { Debug.Log("The last client has said they are ready, starting"); SendGlobalP2P(new Message(MessageType.Ready_Result), EP2PSend.k_EP2PSendReliable); LoadingSceneController.instance.PlayerReady(); } UpdateLoadingText(); } break; case MessageType.Ready_Result: Debug.Log("The host said everyone is ready, launching the mission"); hostReady = true; LoadingSceneController.instance.PlayerReady(); break; case MessageType.RequestSpawn: if (RequestSpawn != null) { RequestSpawn.Invoke(packet, csteamID); } break; case MessageType.RequestSpawn_Result: if (RequestSpawn_Result != null) { RequestSpawn_Result.Invoke(packet); } break; case MessageType.SpawnVehicle: if (SpawnVehicle != null) { SpawnVehicle.Invoke(packet); } break; case MessageType.RigidbodyUpdate: if (RigidbodyUpdate != null) { RigidbodyUpdate.Invoke(packet); } break; case MessageType.PlaneUpdate: if (PlaneUpdate != null) { PlaneUpdate.Invoke(packet); } break; case MessageType.EngineTiltUpdate: if (EngineTiltUpdate != null) { EngineTiltUpdate.Invoke(packet); } break; case MessageType.Disconnecting: if (isHost) { if (Multiplayer.SoloTesting) { break; } players.Remove(csteamID); SendGlobalP2P(packet); } else { Message_Disconnecting messsage = ((PacketSingle)packet).message as Message_Disconnecting; if (messsage.isHost) { //If it is the host quiting we just need to quit the mission as all networking will be lost. FlightSceneManager flightSceneManager = FindObjectOfType <FlightSceneManager>(); if (flightSceneManager == null) { Debug.LogError("FlightSceneManager was null when host quit"); } flightSceneManager.ExitScene(); } break; } if (Disconnecting != null) { Disconnecting.Invoke(packet); } break; case MessageType.WeaponsSet: if (WeaponSet != null) { WeaponSet.Invoke(packet); } break; case MessageType.WeaponsSet_Result: if (WeaponSet_Result != null) { WeaponSet_Result.Invoke(packet); } if (isHost) { SendGlobalP2P(packet); } break; case MessageType.WeaponFiring: if (WeaponFiring != null) { WeaponFiring.Invoke(packet); } break; case MessageType.WeaponStoppedFiring: if (WeaponStoppedFiring != null) { WeaponStoppedFiring.Invoke(packet); } break; case MessageType.MissileUpdate: if (MissileUpdate != null) { MissileUpdate.Invoke(packet); } break; case MessageType.RequestNetworkUID: if (RequestNetworkUID != null) { RequestNetworkUID.Invoke(packet); } break; case MessageType.LoadingTextUpdate: if (!isHost) { UpdateLoadingText(packet); } break; default: break; } } }
//Take in the options here public void RequestGameSpawn(RequestSpawn requestSpawn) { masterSpawner.InternalSpawnRequest(requestSpawn); }