コード例 #1
0
ファイル: NetWorld.cs プロジェクト: l0stfake7/MSCMP
        /// <summary>
        /// Handle full world sync message.
        /// </summary>
        /// <param name="msg">The message to handle.</param>

        public void HandleFullWorldSync(Messages.FullWorldSyncMessage msg)
        {
            // Read time

            Game.GameWorld gameWorld = Game.GameWorld.Instance;
            gameWorld.WorldTime = msg.dayTime;
            gameWorld.WorldDay  = msg.day;

            // Read mailbox name

            gameWorld.PlayerLastName = msg.mailboxName;

            // Doors.

            foreach (Messages.DoorsInitMessage door in msg.doors)
            {
                Vector3 position            = Utils.NetVec3ToGame(door.position);
                Game.Objects.GameDoor doors = Game.GameDoorsManager.Instance.FindGameDoors(position);
                Client.Assert(doors != null, $"Unable to find doors at: {position}.");
                if (doors.IsOpen != door.open)
                {
                    doors.Open(door.open);
                }
            }

            // Lights.

            foreach (Messages.LightSwitchMessage light in msg.lights)
            {
                Vector3 position = Utils.NetVec3ToGame(light.pos);
                Game.Objects.LightSwitch lights = Game.LightSwitchManager.Instance.FindLightSwitch(position);
                Client.Assert(lights != null, $"Unable to find light switch at: {position}.");
                if (lights.SwitchStatus != light.toggle)
                {
                    lights.TurnOn(light.toggle);
                }
            }

            // Weather.

            Game.GameWeatherManager.Instance.SetWeather(msg.currentWeather);

            // Vehicles.

            foreach (Messages.VehicleInitMessage vehicleMsg in msg.vehicles)
            {
                Vector3    pos = Utils.NetVec3ToGame(vehicleMsg.transform.position);
                Quaternion rot = Utils.NetQuatToGame(vehicleMsg.transform.rotation);

                NetVehicle vehicle = GetVehicle(vehicleMsg.id);
                Client.Assert(vehicle != null, $"Received info about non existing vehicle {vehicleMsg.id} in full world sync. (pos: {pos}, rot: {rot})");

                vehicle.Teleport(pos, rot);
            }

            // Pickupables

            List <ushort> pickupablesIds = new List <ushort>();

            foreach (var kv in netPickupables)
            {
                pickupablesIds.Add(kv.Key);
            }

            foreach (Messages.PickupableSpawnMessage pickupableMsg in msg.pickupables)
            {
                SpawnPickupable(pickupableMsg);
                pickupablesIds.Remove(pickupableMsg.id);
            }

            // Remove spawned (and active) pickupables that we did not get info about.

            foreach (ushort id in pickupablesIds)
            {
                GameObject gameObject = netPickupables[id].gameObject;
                if (gameObject && !gameObject.activeSelf)
                {
                    continue;
                }

                DestroyPickupableLocal(id);
            }
        }
コード例 #2
0
ファイル: NetWorld.cs プロジェクト: l0stfake7/MSCMP
        /// <summary>
        /// Write full world synchronization message.
        /// </summary>
        /// <param name="msg">The message to write to.</param>
        public void WriteFullWorldSync(Messages.FullWorldSyncMessage msg)
        {
            // Write time

            Game.GameWorld gameWorld = Game.GameWorld.Instance;
            msg.dayTime = gameWorld.WorldTime;
            msg.day     = gameWorld.WorldDay;

            // Write mailbox name

            msg.mailboxName = gameWorld.PlayerLastName;

            // Write doors

            List <Game.Objects.GameDoor> doors = Game.GameDoorsManager.Instance.doors;
            int doorsCount = doors.Count;

            msg.doors = new Messages.DoorsInitMessage[doorsCount];

            for (int i = 0; i < doorsCount; ++i)
            {
                var doorMsg = new Messages.DoorsInitMessage();
                Game.Objects.GameDoor door = doors[i];
                doorMsg.position = Utils.GameVec3ToNet(door.Position);
                doorMsg.open     = door.IsOpen;
                msg.doors[i]     = doorMsg;
            }

            // Write light switches.

            List <Game.Objects.LightSwitch> lights = Game.LightSwitchManager.Instance.lightSwitches;
            int lightCount = lights.Count;

            msg.lights = new Messages.LightSwitchMessage[lightCount];

            for (int i = 0; i < lightCount; i++)
            {
                var lightMsg = new Messages.LightSwitchMessage();
                Game.Objects.LightSwitch light = lights[i];
                lightMsg.pos    = Utils.GameVec3ToNet(light.Position);
                lightMsg.toggle = light.SwitchStatus;
                msg.lights[i]   = lightMsg;
            }

            // Write weather

            Game.GameWeatherManager.Instance.WriteWeather(msg.currentWeather);

            // Write vehicles.

            int vehiclesCount = vehicles.Count;

            msg.vehicles = new Messages.VehicleInitMessage[vehiclesCount];

            for (int i = 0; i < vehiclesCount; ++i)
            {
                var        vehicleMsg = new Messages.VehicleInitMessage();
                NetVehicle vehicle    = vehicles[i];
                vehicleMsg.id = vehicle.NetId;
                vehicleMsg.transform.position = Utils.GameVec3ToNet(vehicle.GetPosition());
                vehicleMsg.transform.rotation = Utils.GameQuatToNet(vehicle.GetRotation());
                msg.vehicles[i] = vehicleMsg;
            }

            // Write pickupables.

            var pickupableMessages = new List <Messages.PickupableSpawnMessage>();

            foreach (var kv in netPickupables)
            {
                NetPickupable pickupable = kv.Value;
                if (pickupable.gameObject == null)
                {
                    Logger.Log($"Null ptr of the pickupable game object {pickupable.NetId}");
                    continue;
                }
                var pickupableMsg = new Messages.PickupableSpawnMessage();
                pickupableMsg.id = pickupable.NetId;
                var metaData = pickupable.gameObject.GetComponent <Game.Components.PickupableMetaDataComponent>();
                pickupableMsg.prefabId = metaData.prefabId;
                Transform transform = pickupable.gameObject.transform;
                pickupableMsg.transform.position = Utils.GameVec3ToNet(transform.position);
                pickupableMsg.transform.rotation = Utils.GameQuatToNet(transform.rotation);
                pickupableMsg.active             = pickupable.gameObject.activeSelf;
                List <float> data = new List <float>();

                //Beercases
                if (metaData.PrefabDescriptor.type == Game.GamePickupableDatabase.PrefabType.BeerCase && pickupable.gameObject.name != "beer case")
                {
                    Game.Objects.BeerCase beer = Game.BeerCaseManager.Instance.FindBeerCase(pickupable.gameObject);
                    data.Add(Game.BeerCaseManager.Instance.FullCaseBottles - beer.UsedBottles);
                }

                if (data.Count != 0)
                {
                    pickupableMsg.Data = data.ToArray();
                }
                pickupableMessages.Add(pickupableMsg);
            }

            msg.pickupables = pickupableMessages.ToArray();

            netManager.GetLocalPlayer().WriteSpawnState(msg);
        }
コード例 #3
0
ファイル: NetWorld.cs プロジェクト: UnsignedVoid/MSCMP
        /// <summary>
        /// Write full world synchronization message.
        /// </summary>
        /// <param name="msg">The message to write to.</param>
        public void WriteFullWorldSync(Messages.FullWorldSyncMessage msg)
        {
            Logger.Debug("Writing full world synchronization message.");
            var watch = System.Diagnostics.Stopwatch.StartNew();

            // 'Player is loading' is only applicable for remote client.
            playerIsLoading = false;

            // Write time

            Game.GameWorld gameWorld = Game.GameWorld.Instance;
            msg.dayTime = gameWorld.WorldTime;
            msg.day     = gameWorld.WorldDay;

            // Write mailbox name

            msg.mailboxName = gameWorld.PlayerLastName;

            // Write doors

            List <GameDoor> doors      = GameDoorsManager.Instance.doors;
            int             doorsCount = doors.Count;

            msg.doors = new Messages.DoorsInitMessage[doorsCount];

            Logger.Debug($"Writing state of {doorsCount} doors.");
            for (int i = 0; i < doorsCount; ++i)
            {
                var      doorMsg = new Messages.DoorsInitMessage();
                GameDoor door    = doors[i];
                doorMsg.position = Utils.GameVec3ToNet(door.Position);
                doorMsg.open     = door.IsOpen;
                msg.doors[i]     = doorMsg;
            }

            // Write light switches.

            List <LightSwitch> lights = Game.LightSwitchManager.Instance.lightSwitches;
            int lightCount            = lights.Count;

            msg.lights = new Messages.LightSwitchMessage[lightCount];

            Logger.Debug($"Writing light switches state of {lightCount}");
            for (int i = 0; i < lightCount; i++)
            {
                var         lightMsg = new Messages.LightSwitchMessage();
                LightSwitch light    = lights[i];
                lightMsg.pos    = Utils.GameVec3ToNet(light.Position);
                lightMsg.toggle = light.SwitchStatus;
                msg.lights[i]   = lightMsg;
            }

            // Write weather

            GameWeatherManager.Instance.WriteWeather(msg.currentWeather);

            // Write objects. (Pickupables, Player vehicles, AI vehicles)

            var pickupableMessages = new List <Messages.PickupableSpawnMessage>();

            Logger.Debug(
                $"Writing state of {ObjectSyncManager.Instance.ObjectIDs.Count} objects");
            foreach (var kv in ObjectSyncManager.Instance.ObjectIDs)
            {
                ObjectSyncComponent osc = kv.Value;
                if (osc == null)
                {
                    continue;
                }
                if (osc.ObjectType != ObjectSyncManager.ObjectTypes.Pickupable)
                {
                    continue;
                }
                bool wasActive = true;
                if (!osc.gameObject.activeSelf)
                {
                    wasActive = false;
                    osc.gameObject.SetActive(true);
                }
                Logger.Log($"Writing object: {osc.gameObject.name}");

                var pickupableMsg = new Messages.PickupableSpawnMessage();

                var metaData = osc.gameObject.GetComponent <PickupableMetaDataComponent>();
                Client.Assert(metaData != null && metaData.PrefabDescriptor != null,
                              $"Object with broken meta data -- {osc.gameObject.name}.");

                pickupableMsg.prefabId = metaData.prefabId;

                Transform transform = osc.gameObject.transform;
                pickupableMsg.transform.position = Utils.GameVec3ToNet(transform.position);
                pickupableMsg.transform.rotation = Utils.GameQuatToNet(transform.rotation);

                pickupableMsg.active = osc.gameObject.activeSelf;

                // ObjectID
                pickupableMsg.id =
                    osc.gameObject.GetComponent <ObjectSyncComponent>().ObjectID;

                List <float> data = new List <float>();

                if (data.Count != 0)
                {
                    pickupableMsg.Data = data.ToArray();
                }
                if (!wasActive)
                {
                    osc.gameObject.SetActive(false);
                }
                pickupableMessages.Add(pickupableMsg);
            }

            msg.pickupables = pickupableMessages.ToArray();

            netManager.GetLocalPlayer().WriteSpawnState(msg);

            watch.Stop();
            Logger.Debug(
                "World state has been written. Took " + watch.ElapsedMilliseconds + "ms");
        }
コード例 #4
0
ファイル: NetWorld.cs プロジェクト: UnsignedVoid/MSCMP
        /// <summary>
        /// Handle full world sync message.
        /// </summary>
        /// <param name="msg">The message to handle.</param>

        public void HandleFullWorldSync(Messages.FullWorldSyncMessage msg)
        {
            Logger.Debug("Handling full world synchronization message.");
            var watch = System.Diagnostics.Stopwatch.StartNew();

            // Read time

            Game.GameWorld gameWorld = Game.GameWorld.Instance;
            gameWorld.WorldTime = msg.dayTime;
            gameWorld.WorldDay  = msg.day;

            // Read mailbox name

            gameWorld.PlayerLastName = msg.mailboxName;

            // Doors.

            foreach (Messages.DoorsInitMessage door in msg.doors)
            {
                Vector3 position            = Utils.NetVec3ToGame(door.position);
                Game.Objects.GameDoor doors =
                    Game.GameDoorsManager.Instance.FindGameDoors(position);
                Client.Assert(doors != null, $"Unable to find doors at: {position}.");
                if (doors.IsOpen != door.open)
                {
                    doors.Open(door.open);
                }
            }

            // Lights.

            foreach (Messages.LightSwitchMessage light in msg.lights)
            {
                Vector3 position = Utils.NetVec3ToGame(light.pos);
                Game.Objects.LightSwitch lights =
                    Game.LightSwitchManager.Instance.FindLightSwitch(position);
                Client.Assert(
                    lights != null, $"Unable to find light switch at: {position}.");
                if (lights.SwitchStatus != light.toggle)
                {
                    lights.TurnOn(light.toggle);
                }
            }

            // Weather.

            GameWeatherManager.Instance.SetWeather(msg.currentWeather);

            // Pickupables

            foreach (Messages.PickupableSpawnMessage pickupableMsg in msg.pickupables)
            {
                SpawnPickupable(pickupableMsg);
            }

            // Remove spawned (and active) pickupables that we did not get info about.

            foreach (var kv in GamePickupableDatabase.Instance.Pickupables)
            {
                if (kv.Value.GetComponent <ObjectSyncComponent>() == null)
                {
                    GameObject.Destroy(kv.Value);
                }
            }

            GamePickupableDatabase.Instance.Pickupables.Clear();
            playerIsLoading = false;

            watch.Stop();
            Logger.Debug("Full world synchronization message has been handled. Took " +
                         watch.ElapsedMilliseconds + "ms");
        }
コード例 #5
0
        /// <summary>
        /// Handle full world sync message.
        /// </summary>
        /// <param name="msg">The message to handle.</param>

        public void HandleFullWorldSync(Messages.FullWorldSyncMessage msg)
        {
            Logger.Debug("Handling full world synchronization message.");
            var watch = System.Diagnostics.Stopwatch.StartNew();

            // Read time

            Game.GameWorld gameWorld = GameWorld.Instance;
            gameWorld.WorldTime = msg.dayTime;
            gameWorld.WorldDay  = msg.day;

            // Read mailbox name

            gameWorld.PlayerLastName = msg.mailboxName;

            // Doors.

            foreach (Messages.DoorsInitMessage door in msg.doors)
            {
                Vector3  position = Utils.NetVec3ToGame(door.position);
                GameDoor doors    = GameDoorsManager.Instance.FindGameDoors(position);
                Client.Assert(doors != null, $"Unable to find doors at: {position}.");
                if (doors.IsOpen != door.open)
                {
                    doors.Open(door.open);
                }
            }

            // Lights.

            foreach (Messages.LightSwitchMessage light in msg.lights)
            {
                Vector3     position = Utils.NetVec3ToGame(light.pos);
                LightSwitch lights   = LightSwitchManager.Instance.FindLightSwitch(position);
                Client.Assert(lights != null, $"Unable to find light switch at: {position}.");
                if (lights.SwitchStatus != light.toggle)
                {
                    lights.TurnOn(light.toggle);
                }
            }

            // Pickupables

            foreach (Messages.PickupableSpawnMessage pickupableMsg in msg.pickupables)
            {
                SpawnPickupable(pickupableMsg);
            }

            // Remove spawned (and active) pickupables that we did not get info about.

            foreach (var kv in GamePickupableDatabase.Instance.Pickupables)
            {
                if (kv.Value.GetComponent <ObjectSyncComponent>() == null)
                {
                    GameObject.Destroy(kv.Value);
                }
            }

            // Connected players.

            int i = 0;

            foreach (int newPlayerID in msg.connectedPlayers.playerIDs)
            {
                Steamworks.CSteamID localSteamID     = Steamworks.SteamUser.GetSteamID();
                Steamworks.CSteamID newPlayerSteamID = new Steamworks.CSteamID(msg.connectedPlayers.steamIDs[i]);
                // If player is not host or local player, setup new player.
                if (newPlayerSteamID != netManager.GetHostPlayer().SteamId&& newPlayerSteamID != localSteamID)
                {
                    netManager.players.Add(newPlayerID, new NetPlayer(netManager, this, newPlayerSteamID));
                    netManager.players[newPlayerID].Spawn();
                    Logger.Debug("Setup new player at ID: " + newPlayerID);
                }
                i++;
            }

            // Object owners.

            foreach (Messages.ObjectOwnerSync syncMsg in msg.objectOwners)
            {
                if (syncMsg.ownerPlayerID != -1)
                {
                    ObjectSyncManager.Instance.ObjectIDs[syncMsg.objectID].Owner = netManager.GetPlayerByPlayerID(syncMsg.ownerPlayerID);
                }
            }

            GamePickupableDatabase.Instance.Pickupables.Clear();
            playerIsLoading = false;

            watch.Stop();
            Logger.Debug("Full world synchronization message has been handled. Took " + watch.ElapsedMilliseconds + "ms");
        }