Ejemplo n.º 1
0
    public RequestSpawn requestSpawn(string username, int id)
    {
        RequestSpawn request = new RequestSpawn();

        request.send(username, id);;
        return(request);
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
    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);
    }
Ejemplo n.º 5
0
    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"
            });
        }
    }
Ejemplo n.º 6
0
    //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)
            {
            }
        });
    }
Ejemplo n.º 7
0
        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)
                        {
                        }
                    }
            }
        }
Ejemplo n.º 8
0
    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;
            }
        }
    }
Ejemplo n.º 9
0
 //Take in the options here
 public void RequestGameSpawn(RequestSpawn requestSpawn)
 {
     masterSpawner.InternalSpawnRequest(requestSpawn);
 }