Example #1
0
        public void ProcessPacket(DysonSphereRemoveFramePacket packet, NebulaConnection conn)
        {
            Log.Info($"Processing DysonSphere Remove Frame notification for system {GameMain.data.galaxy.stars[packet.StarIndex].name} (Index: {GameMain.data.galaxy.stars[packet.StarIndex].index})");
            DysonSphere_Manager.IncomingDysonSpherePacket = true;
            DysonSphereLayer dsl = GameMain.data.dysonSpheres[packet.StarIndex]?.GetLayer(packet.LayerId);

            if (DysonSphere_Manager.CanRemoveFrame(packet.FrameId, dsl))
            {
                dsl.RemoveDysonFrame(packet.FrameId);
            }
            DysonSphere_Manager.IncomingDysonSpherePacket = false;
        }
Example #2
0
 public override void ProcessPacket(ILSEnergyConsumeNotification packet, NebulaConnection conn)
 {
     if (GameMain.data.galacticTransport.stationPool.Length > packet.stationGId && GameMain.data.galacticTransport.stationPool[packet.stationGId] != null)
     {
         StationComponent stationComponent = GameMain.data.galacticTransport.stationPool[packet.stationGId];
         stationComponent.energy -= packet.cost;
         if (stationComponent.energy < 0)
         {
             stationComponent.energy = 0;
         }
     }
 }
        public override void ProcessPacket(DysonSphereStatusPacket packet, NebulaConnection conn)
        {
            DysonSphere dysonSphere = GameMain.data.dysonSpheres[packet.StarIndex];

            if (IsHost || dysonSphere == null)
            {
                return;
            }
            dysonSphere.grossRadius          = packet.GrossRadius;
            dysonSphere.energyReqCurrentTick = packet.EnergyReqCurrentTick;
            dysonSphere.energyGenCurrentTick = packet.EnergyGenCurrentTick;
        }
        private void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
        {
            IsConnected      = false;
            serverConnection = null;

            InGamePopup.ShowWarning(
                "Connection Lost",
                $"You have been disconnect of the server.\nReason{disconnectInfo.Reason}",
                "Quit", "Reconnect",
                () => { LocalPlayer.LeaveGame(); },
                () => { Reconnect(); });
        }
Example #5
0
        public void ProcessPacket(GameHistoryRemoveTechPacket packet, NebulaConnection conn)
        {
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                GameDataHistoryManager.IsIncommingRequest = true;
                GameMain.history.RemoveTechInQueue(packet.Index);
                GameDataHistoryManager.IsIncommingRequest = false;
                playerManager.SendPacketToOtherPlayers(packet, player);
            }
        }
 public void ProcessPacket(DysonSphereRemoveShellPacket packet, NebulaConnection conn)
 {
     Log.Info($"Processing DysonSphere remove shell notification for system {GameMain.data.galaxy.stars[packet.StarIndex].name} (Index: {GameMain.data.galaxy.stars[packet.StarIndex].index})");
     using (DysonSphere_Manager.IncomingDysonSpherePacket.On())
     {
         DysonSphereLayer dsl = GameMain.data.dysonSpheres[packet.StarIndex]?.GetLayer(packet.LayerId);
         if (DysonSphere_Manager.CanRemoveShell(packet.ShellId, dsl))
         {
             dsl.RemoveDysonShell(packet.ShellId);
         }
     }
 }
Example #7
0
 public override void ProcessPacket(ConnectToSpraycoaterPacket packet, NebulaConnection conn)
 {
     using (Multiplayer.Session.Factories.IsIncomingRequest.On())
     {
         CargoTraffic cargoTraffic = GameMain.galaxy.PlanetById(packet.PlanetId)?.factory?.cargoTraffic;
         if (cargoTraffic == null)
         {
             return;
         }
         cargoTraffic.ConnectToSpraycoater(packet.SpraycoaterId, packet.CargoBeltId, packet.IncBeltId);
     }
 }
Example #8
0
        public void ProcessPacket(PlanetBroadcastPacket packet, NebulaConnection conn)
        {
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                //Forward packet to other users
                playerManager.SendRawPacketToPlanet(packet.PacketObject, packet.PlanetId, conn);
                //Forward packet to the host
                MultiplayerHostSession.Instance.PacketProcessor.EnqueuePacketForProcessing(packet.PacketObject, conn);
            }
        }
Example #9
0
        public void ProcessPacket(PlayerAnimationUpdate packet, NebulaConnection conn)
        {
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                packet.PlayerId = player.Id;
                playerManager.SendPacketToOtherPlayers(packet, player, DeliveryMethod.Unreliable);

                SimulatedWorld.UpdateRemotePlayerAnimation(packet);
            }
        }
Example #10
0
        public void ProcessPacket(DysonSphereAddLayerPacket packet, NebulaConnection conn)
        {
            Log.Info($"Processing DysonSphere Add Layer notification for system {GameMain.data.galaxy.stars[packet.StarIndex].name} (Index: {GameMain.data.galaxy.stars[packet.StarIndex].index})");
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                playerManager.SendPacketToOtherPlayers(packet, player);
                using (DysonSphere_Manager.IncomingDysonSpherePacket.On())
                    GameMain.data.dysonSpheres[packet.StarIndex]?.AddLayer(packet.OrbitRadius, DataStructureExtensions.ToQuaternion(packet.OrbitRotation), packet.OrbitAngularSpeed);
            }
        }
Example #11
0
        private void ClientSocket_OnClose(object sender, CloseEventArgs e)
        {
            IsConnected      = false;
            serverConnection = null;

            UnityDispatchQueue.RunOnMainThread(() =>
            {
                // If the client is Quitting by himself, we don't have to inform him of his disconnection.
                if (e.Code == (ushort)DisconnectionReason.ClientRequestedDisconnect)
                {
                    return;
                }

                if (e.Code == (ushort)DisconnectionReason.ModVersionMismatch)
                {
                    InGamePopup.ShowWarning(
                        "Mod Version Mismatch",
                        $"Your Nebula Multiplayer Mod is not the same as the Host version.\nMake sure to use the same version.",
                        "OK",
                        OnDisconnectPopupCloseBeforeGameLoad);
                    return;
                }

                if (e.Code == (ushort)DisconnectionReason.GameVersionMismatch)
                {
                    InGamePopup.ShowWarning(
                        "Game Version Mismatch",
                        $"Your version of the game is not the same as the one used by the Host.\nMake sure to use the same version.",
                        "OK",
                        OnDisconnectPopupCloseBeforeGameLoad);
                    return;
                }

                if (SimulatedWorld.IsGameLoaded)
                {
                    InGamePopup.ShowWarning(
                        "Connection Lost",
                        $"You have been disconnect of the server.\n{e.Reason}",
                        "Quit", "Reconnect",
                        () => { LocalPlayer.LeaveGame(); },
                        () => { Reconnect(); });
                }
                else
                {
                    InGamePopup.ShowWarning(
                        "Server Unavailable",
                        $"Could not reach the server, please try again later.",
                        "OK",
                        OnDisconnectPopupCloseBeforeGameLoad);
                }
            });
        }
        public void ProcessPacket(SyncComplete packet, NebulaConnection conn)
        {
            Player player = playerManager.GetSyncingPlayer(conn);

            if (player == null)
            {
                Log.Warn("Received a SyncComplete packet, but no player is joining.");
                return;
            }

            // Should these be locked together?

            int syncingCount;

            using (playerManager.GetSyncingPlayers(out var syncingPlayers))
            {
                bool removed = syncingPlayers.Remove(player.Connection);
                syncingCount = syncingPlayers.Count;
            }

            using (playerManager.GetConnectedPlayers(out var connectedPlayers))
            {
                connectedPlayers.Add(player.Connection, player);
            }

            // Load overriden Planet and Star names
            foreach (StarData s in GameMain.galaxy.stars)
            {
                if (!string.IsNullOrEmpty(s.overrideName))
                {
                    player.SendPacket(new NameInputPacket(s.overrideName, s.id, LocalPlayer.PlayerId));
                }

                foreach (PlanetData p in s.planets)
                {
                    if (!string.IsNullOrEmpty(p.overrideName))
                    {
                        player.SendPacket(new NameInputPacket(p.overrideName, p.id, LocalPlayer.PlayerId));
                    }
                }
            }

            // Since the player is now connected, we can safely spawn his player model
            SimulatedWorld.SpawnRemotePlayerModel(player.Data);

            if (syncingCount == 0)
            {
                var inGamePlayersDatas = playerManager.GetAllPlayerDataIncludingHost();
                playerManager.SendPacketToAllPlayers(new SyncComplete(inGamePlayersDatas));
                SimulatedWorld.OnAllPlayersSyncCompleted();
            }
        }
Example #13
0
        public override void ProcessPacket(DysonSpherePaintCellsPacket packet, NebulaConnection conn)
        {
            DysonSphere sphere = GameMain.data.dysonSpheres[packet.StarIndex];

            if (sphere == null)
            {
                return;
            }
            using (Multiplayer.Session.DysonSpheres.IsIncomingRequest.On())
            {
                DysonSphereLayer layer = sphere.GetLayer(packet.LayerId);
                if (layer == null)
                {
                    Multiplayer.Session.DysonSpheres.HandleDesync(packet.StarIndex, conn);
                    return;
                }

                // UIDEPaintingbox.OpenGrid()
                Color32[] cellColors;
                if (layer.cellColors != null)
                {
                    Assert.True(layer.cellColors.Length == packet.CellCount);
                    cellColors = layer.cellColors;
                }
                else
                {
                    cellColors = new Color32[packet.CellCount];
                }

                // UIDysonPaintingGrid.PaintCells()
                Color32 paint = packet.Paint.ToColor32();
                for (int i = 0; i < packet.CursorCells.Length; i++)
                {
                    int cid = packet.CursorCells[i];
                    if (cid >= 0)
                    {
                        Color32 color = cellColors[cid];
                        color.a -= (color.a <= 127) ? (byte)0 : (byte)127;
                        color.a *= 2;
                        Color32 color2 = Color32.Lerp(color, paint, packet.Strength);
                        color2.a       /= 2;
                        color2.a       += ((paint.a > 0) ? (packet.SuperBrightMode ? (byte)127 : (byte)0) : (byte)0);
                        cellColors[cid] = color2;
                    }
                }
                layer.SetPaintingData(cellColors);
            }
            if (IsHost)
            {
                Multiplayer.Session.DysonSpheres.SendPacketToDysonSphereExcept(packet, packet.StarIndex, conn);
            }
        }
        public void ProcessPacket(StatisticUpdateDataPacket packet, NebulaConnection conn)
        {
            StatisticalSnapShot snapshot;

            StatisticsManager.IsIncommingRequest = true;
            using (BinaryUtils.Reader reader = new BinaryUtils.Reader(packet.StatisticsBinaryData))
            {
                ref FactoryProductionStat[] productionStats = ref GameMain.statistics.production.factoryStatPool;
                int numOfSnapshots = reader.BinaryReader.ReadInt32();
                for (int i = 0; i < numOfSnapshots; i++)
                {
                    //Clear all current statistical data
                    for (int a = 0; a < GameMain.statistics.production.factoryStatPool.Length; a++)
                    {
                        GameMain.statistics.production.factoryStatPool[a]?.ClearRegisters();
                    }

                    //Load new snapshot
                    snapshot = new StatisticalSnapShot(reader.BinaryReader);
                    for (int factoryId = 0; factoryId < snapshot.ProductionChangesPerFactory.Length; factoryId++)
                    {
                        if (productionStats[factoryId] == null)
                        {
                            productionStats[factoryId] = new FactoryProductionStat();
                            productionStats[factoryId].Init();
                        }
                        for (int changeId = 0; changeId < snapshot.ProductionChangesPerFactory[factoryId].Count; changeId++)
                        {
                            if (snapshot.ProductionChangesPerFactory[factoryId][changeId].IsProduction)
                            {
                                productionStats[factoryId].productRegister[snapshot.ProductionChangesPerFactory[factoryId][changeId].ProductId] += snapshot.ProductionChangesPerFactory[factoryId][changeId].Amount;
                            }
                            else
                            {
                                productionStats[factoryId].consumeRegister[snapshot.ProductionChangesPerFactory[factoryId][changeId].ProductId] += snapshot.ProductionChangesPerFactory[factoryId][changeId].Amount;
                            }
                        }
                        //Import power system statistics
                        productionStats[factoryId].powerGenRegister = snapshot.PowerGenerationRegister[factoryId];
                        productionStats[factoryId].powerConRegister = snapshot.PowerConsumptionRegister[factoryId];
                        productionStats[factoryId].powerChaRegister = snapshot.PowerChargingRegister[factoryId];
                        productionStats[factoryId].powerDisRegister = snapshot.PowerDischargingRegister[factoryId];

                        //Import fake energy stored values
                        StatisticsManager.PowerEnergyStoredData = snapshot.EnergyStored;

                        //Import Research statistics
                        productionStats[factoryId].hashRegister = snapshot.HashRegister[factoryId];
                    }
                    GameMain.statistics.production.GameTick(snapshot.CapturedGameTick);
                }
            }
Example #15
0
        public void RegisterPlayer(NebulaConnection nebulaConnection, ushort playerId)
        {
            using (instance.GetRequestors(out var requestors))
            {
                requestors.Add(playerId, nebulaConnection);
            }

            if (!IsStatisticsNeeded)
            {
                ClearCapturedData();
                IsStatisticsNeeded = true;
            }
        }
        public void ProcessPacket(DysonSphereAddShellPacket packet, NebulaConnection conn)
        {
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                playerManager.SendPacketToOtherPlayers(packet, player);
                using (DysonSphere_Manager.IncomingDysonSpherePacket.On())
                {
                    GameMain.data.dysonSpheres[packet.StarIndex]?.GetLayer(packet.LayerId)?.NewDysonShell(packet.ProtoId, new List <int>(packet.NodeIds));
                }
            }
        }
Example #17
0
        public Player PlayerConnected(NebulaConnection conn)
        {
            // TODO: Load old player state if we have one. We generate a random one for now.
            ushort     playerId    = GetNextAvailablePlayerId();
            Float3     randomColor = new Float3(Random.value, Random.value, Random.value);
            PlayerData playerData  = new PlayerData(playerId, randomColor);

            Player newPlayer = new Player(conn, playerData);

            pendingPlayers.Add(conn, newPlayer);

            return(newPlayer);
        }
        public void ProcessPacket(NewSetInserterPickTargetPacket packet, NebulaConnection conn)
        {
            PlanetFactory factory = GameMain.data.factories[packet.FactoryIndex];

            if (factory != null)
            {
                FactoryManager.TargetPlanet = factory.planetId;
                factory.WriteObjectConn(packet.ObjId, 1, false, packet.OtherObjId, -1);
                factory.factorySystem.SetInserterPickTarget(packet.InserterId, packet.OtherObjId, packet.Offset);
                factory.entityPool[packet.ObjId].pos = packet.PointPos.ToVector3();
                FactoryManager.TargetPlanet          = FactoryManager.PLANET_NONE;
            }
        }
        public void ProcessPacket(SyncComplete packet, NebulaConnection conn)
        {
            // Everyone is now connected, we can safely spawn the player model of all the other players that are currently connected
            foreach (var playerData in packet.AllPlayers)
            {
                if (playerData.PlayerId != LocalPlayer.PlayerId)
                {
                    SimulatedWorld.SpawnRemotePlayerModel(playerData);
                }
            }

            SimulatedWorld.OnAllPlayersSyncCompleted();
        }
Example #20
0
 public void ProcessPacket(PasteEntitySettingUpdate packet, NebulaConnection conn)
 {
     if (GameMain.data.factories[packet.FactoryIndex] != null)
     {
         EntitySettingDesc backup = EntitySettingDesc.clipboard;
         EntitySettingDesc.clipboard = packet.GetEntitySettings();
         using (FactoryManager.EventFromServer.On())
         {
             GameMain.data.factories[packet.FactoryIndex].PasteEntitySetting(packet.EntityId);
         }
         EntitySettingDesc.clipboard = backup;
     }
 }
        public override void ProcessPacket(PlayerUpdateLocalStarId packet, NebulaConnection conn)
        {
            if (IsClient)
            {
                return;
            }

            INebulaPlayer player = playerManager.GetPlayer(conn);
            if (player != null)
            {
                player.Data.LocalStarId = packet.StarId;
            }
        }
Example #22
0
        public void ProcessPacket(DysonSwarmRemoveOrbitPacket packet, NebulaConnection conn)
        {
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                playerManager.SendPacketToOtherPlayers(packet, player);
                using (DysonSphere_Manager.IncomingDysonSwarmPacket.On())
                {
                    GameMain.data.dysonSpheres[packet.StarIndex]?.swarm?.RemoveOrbit(packet.OrbitId);
                }
            }
        }
Example #23
0
        public void ProcessPacket(DysonSwarmRemoveOrbitPacket packet, NebulaConnection conn)
        {
            Log.Info($"Processing DysonSwarm Remove Orbit notification for system {GameMain.data.galaxy.stars[packet.StarIndex].name} (Index: {GameMain.data.galaxy.stars[packet.StarIndex].index})");
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                playerManager.SendPacketToOtherPlayers(packet, player);
                DysonSphere_Manager.IncomingDysonSwarmPacket = true;
                GameMain.data.dysonSpheres[packet.StarIndex]?.swarm?.RemoveOrbit(packet.OrbitId);
                DysonSphere_Manager.IncomingDysonSwarmPacket = false;
            }
        }
        public void ProcessPacket(DysonSwarmAddOrbitPacket packet, NebulaConnection conn)
        {
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                playerManager.SendPacketToOtherPlayers(packet, player);
                using (DysonSphere_Manager.IncomingDysonSwarmPacket.On())
                {
                    GameMain.data.dysonSpheres[packet.StarIndex]?.swarm?.NewOrbit(packet.Radius, DataStructureExtensions.ToQuaternion(packet.Rotation));
                }
            }
        }
Example #25
0
        public override void ProcessPacket(GameHistoryDataRequest packet, NebulaConnection conn)
        {
            if (IsClient)
            {
                return;
            }

            using (BinaryUtils.Writer writer = new BinaryUtils.Writer())
            {
                GameMain.history.Export(writer.BinaryWriter);
                conn.SendPacket(new GameHistoryDataResponse(writer.CloseAndGetBytes()));
            }
        }
 public override void ProcessPacket(PasteBuildingSettingUpdate packet, NebulaConnection conn)
 {
     if (GameMain.galaxy.PlanetById(packet.PlanetId)?.factory != null)
     {
         BuildingParameters backup = BuildingParameters.clipboard;
         BuildingParameters.clipboard = packet.GetBuildingSettings();
         using (FactoryManager.IsIncomingRequest.On())
         {
             GameMain.galaxy.PlanetById(packet.PlanetId).factory.PasteBuildingSetting(packet.ObjectId);
         }
         BuildingParameters.clipboard = backup;
     }
 }
Example #27
0
        public void ProcessPacket(NewSetInserterInsertTargetPacket packet, NebulaConnection conn)
        {
            PlanetFactory factory = GameMain.galaxy.PlanetById(packet.PlanetId)?.factory;

            if (factory != null)
            {
                FactoryManager.TargetPlanet = factory.planetId;
                factory.WriteObjectConn(packet.ObjId, 1, false, packet.OtherObjId, -1);
                factory.factorySystem.SetInserterInsertTarget(packet.InserterId, packet.OtherObjId, packet.Offset);
                factory.factorySystem.inserterPool[packet.InserterId].pos2 = packet.PointPos.ToVector3();
                FactoryManager.TargetPlanet = FactoryManager.PLANET_NONE;
            }
        }
Example #28
0
        public static void RemoveSubscriber(int stationGId, NebulaConnection player)
        {
            List <NebulaConnection> players;

            if (StationUISubscribers.TryGetValue(stationGId, out players))
            {
                StationUISubscribers[stationGId].Remove(player);
                if (StationUISubscribers[stationGId].Count == 0)
                {
                    StationUISubscribers.Remove(stationGId);
                }
            }
        }
Example #29
0
        public Player PlayerConnected(NebulaConnection conn)
        {
            //Generate new data for the player
            ushort     playerId    = GetNextAvailablePlayerId();
            Float3     randomColor = new Float3(Random.value, Random.value, Random.value);
            PlayerData playerData  = new PlayerData(playerId, -1, randomColor);

            Player newPlayer = new Player(conn, playerData);

            pendingPlayers.Add(conn, newPlayer);

            return(newPlayer);
        }
Example #30
0
        public void ProcessPacket(DysonSwarmAddOrbitPacket packet, NebulaConnection conn)
        {
            Log.Info($"Processing DysonSwarm New Orbit notification for system {GameMain.data.galaxy.stars[packet.StarIndex].name} (Index: {GameMain.data.galaxy.stars[packet.StarIndex].index})");
            Player player = playerManager.GetPlayer(conn);

            if (player != null)
            {
                playerManager.SendPacketToOtherPlayers(packet, player);
                DysonSphere_Manager.IncomingDysonSwarmPacket = true;
                GameMain.data.dysonSpheres[packet.StarIndex]?.swarm?.NewOrbit(packet.Radius, DataStructureExtensions.ToUnity(packet.Rotation));
                DysonSphere_Manager.IncomingDysonSwarmPacket = false;
            }
        }