예제 #1
0
        /// <summary>
        /// Write full world synchronization message.
        /// </summary>
        /// <param name="msg">The message to write to.</param>
        public void WriteFullWorldSync(Messages.FullWorldSyncMessage msg)
        {
            // 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 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.

            msg.pickupables = new Messages.PickupableSpawnMessage[netPickupables.Count];
            int idx = 0;

            foreach (var kv in netPickupables)
            {
                NetPickupable pickupable    = kv.Value;
                var           pickupableMsg = new Messages.PickupableSpawnMessage();
                pickupableMsg.id = pickupable.NetId;
                // Logger.Log($"Serializing pickupable: {pickupableMsg.id}. {pickupable.gameObject}");
                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);
                msg.pickupables[idx++]           = pickupableMsg;
            }
        }
예제 #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);
        }