Esempio n. 1
0
        //------------    Process packet related to spawning prop    ------------
        private void ProcessIncomingSpawn(CSteamID remoteId, PacketHolder packetHolder)
        {
            var packet = packetHolder.Packet <Spawn>();

            if (packet == null)
            {
                return;
            }

            switch (packet.Value.Action)
            {
            // When player accepted new spawn and sent back this callback
            case ActionType.PropSpawn:
            {
                Vector3?pos = null;
                if (packet.Value.Pos != null)
                {
                    pos = new Vector3(packet.Value.Pos.Value.X, packet.Value.Pos.Value.Y, packet.Value.Pos.Value.Z);
                }

                SpawnProp(packet.Value.Name, pos);
                // When host receives prop spawn from player
                if (_globals.PlayingAsHost)
                {
                    SpawnPropCallback(packet.Value.Name, pos, remoteId);
                }

                break;
            }
            }
        }
Esempio n. 2
0
        //------------    Process packet related to only changing object rotation    ------------
        private void ProcessIncomingObjectRotationChange(PacketHolder packetHolder, CSteamID remoteId)
        {
            var packet = packetHolder.Packet <Rotation>();

            if (packet == null)
            {
                return;
            }
            if (packet.Value.ObjType != ObjectType.Prop)
            {
                return;
            }

            if (!_props.TryGetValue(packet.Value.Obj, out KinematicBody updatingObj))
            {
                return;
            }

            Vector3 newObjRotation = updatingObj.Rotation;

            if (packet.Value.Rot != null)
            {
                newObjRotation.x = packet.Value.Rot.Value.X;
                newObjRotation.y = packet.Value.Rot.Value.Y;
                newObjRotation.z = packet.Value.Rot.Value.Z;
            }

            updatingObj.Rotation = newObjRotation;

            if (packet.Value.SentByHost)
            {
                return;
            }
            ObjectRotationChangeCallback(packet.Value.Obj, newObjRotation, remoteId);
        }
Esempio n. 3
0
        //------------    Process packet related to only changing object position    ------------
        private void ProcessIncomingObjectMovementChange(PacketHolder packetHolder, CSteamID remoteId)
        {
            var packet = packetHolder.Packet <Movement>();

            if (packet == null)
            {
                return;
            }
            if (packet.Value.ObjType != ObjectType.Prop)
            {
                return;
            }

            if (!_props.TryGetValue(packet.Value.Obj, out KinematicBody updatingObj))
            {
                return;
            }

            Transform newObjTransform = updatingObj.Transform;

            if (packet.Value.Pos != null)
            {
                newObjTransform.origin.x = packet.Value.Pos.Value.X;
                newObjTransform.origin.y = packet.Value.Pos.Value.Y;
                newObjTransform.origin.z = packet.Value.Pos.Value.Z;
            }

            updatingObj.Transform = newObjTransform;

            if (packet.Value.SentByHost)
            {
                return;
            }
            ObjectPositionChangeCallback(packet.Value.Obj, newObjTransform.origin, remoteId);
        }
Esempio n. 4
0
        private void ProcessPlayerMovementAndRotationChange(PacketHolder packetHolder, CSteamID remoteId)
        {
            var packet = packetHolder.Packet <MovementAndRotation>();

            if (packet == null)
            {
                return;
            }
            if (packet.Value.ObjType != ObjectType.Player)
            {
                return;
            }

            if (!_globals.PlayerBodies.TryGetValue(packet.Value.Obj, out KinematicBody updatingPlayer))
            {
                if (_globals.OwnPlayerBody != null && _globals.OwnPlayerBody.Name.Equals(packet.Value.Obj))
                {
                    updatingPlayer = _globals.OwnPlayerBody;
                }
                else
                {
                    return;
                }
            }

            Transform newPlayerTransform = updatingPlayer.Transform;

            if (packet.Value.Pos != null)
            {
                newPlayerTransform.origin.x = packet.Value.Pos.Value.X;
                newPlayerTransform.origin.y = packet.Value.Pos.Value.Y;
                newPlayerTransform.origin.z = packet.Value.Pos.Value.Z;
            }

            updatingPlayer.Transform = newPlayerTransform;

            Vector3 newPlayerRotation = updatingPlayer.Rotation;

            if (packet.Value.Rot != null)
            {
                newPlayerRotation.x = packet.Value.Rot.Value.X;
                newPlayerRotation.y = packet.Value.Rot.Value.Y;
                newPlayerRotation.z = packet.Value.Rot.Value.Z;
            }

            updatingPlayer.Rotation = newPlayerRotation;
            if (_globals.PlayingAsHost)
            {
                PlayerMovementAndRotationChangeCallback(packet.Value.Obj, newPlayerTransform.origin, newPlayerRotation,
                                                        remoteId);
            }
        }
Esempio n. 5
0
        private void ProcessIncomingPlayerIds(PacketHolder packetHolder)
        {
            var incomingPlayerIds = packetHolder.Packet <PlayerIds>();

            if (incomingPlayerIds != null)
            {
                if (!incomingPlayerIds.Value.SentByHost)
                {
                    return;
                }
                var newIncomingPlayerIds =
                    Array.ConvertAll(incomingPlayerIds.Value.GetIdsArray(), item => (CSteamID)item);
                _globals.UserIds.UnionWith(newIncomingPlayerIds);
                GD.Print($"OK: Added lobby player id's from host, new count: {_globals.UserIds.Count}");
            }

            GD.Print("NOTIFY: Changing scene after getting PlayerIds packet.");
            OnLobbyEnteredFinished();
        }
Esempio n. 6
0
        private void ProcessIncomingUserAction(CSteamID remoteId, PacketHolder packetHolder)
        {
            var userAction = packetHolder.Packet <UserAction>();

            if (userAction == null)
            {
                return;
            }
            GD.Print($"NOTIFY: Receiving UserAction: {userAction.Value.Action}.");
            switch (userAction.Value.Action)
            {
            case ActionType.PlayerIds:
                var sendingUsers = new HashSet <CSteamID>(_globals.UserIds);
                sendingUsers.RemoveWhere(id => id.Equals(remoteId));

                var packet = Utils.GetPlayerIdsBytes(true, sendingUsers);
                SteamNetworking.SendP2PPacket(remoteId, packet, (uint)packet.Length,
                                              EP2PSend.k_EP2PSendReliable);
                GD.Print($"OK: Sent user list from host to: {SteamFriends.GetFriendPersonaName(remoteId)}");

                break;
            }
        }
Esempio n. 7
0
        private void ProcessSpawn(PacketHolder packetHolder, CSteamID remoteId)
        {
            var packet = packetHolder.Packet <Spawn>();

            if (packet == null)
            {
                return;
            }

            switch (packet.Value.Action)
            {
            case ActionType.PlayerSpawn:
                PackedScene   playerScene;
                KinematicBody player;
                if (packet.Value.Name.Equals(_globals.OwnId.ToString()))
                {
                    playerScene = ResourceLoader.Load <PackedScene>(_playerPath);
                    player      = playerScene?.Instance() as KinematicBody;
                    if (player == null)
                    {
                        return;
                    }
                    GetParent().AddChild(player);
                    player.Name            = packet.Value.Name;
                    _globals.OwnPlayerBody = player;
                }
                else
                {
                    playerScene = ResourceLoader.Load <PackedScene>(_networkedPlayerPath);
                    player      = playerScene?.Instance() as KinematicBody;
                    if (player == null)
                    {
                        return;
                    }
                    AddChild(player);
                    player.Name = packet.Value.Name;
                    _globals.PlayerBodies.Add(player.Name, player);
                }

                Transform propTransform;
                if (packet.Value.Pos != null)
                {
                    propTransform          = player.Transform;
                    propTransform.origin.x = packet.Value.Pos.Value.X;
                    propTransform.origin.y = packet.Value.Pos.Value.Y;
                    propTransform.origin.z = packet.Value.Pos.Value.Z;
                    player.Transform       = propTransform;
                }
                else
                {
                    propTransform          = player.Transform;
                    propTransform.origin.x = DefaultSpawnPos.x;
                    propTransform.origin.y = DefaultSpawnPos.y;
                    propTransform.origin.z = DefaultSpawnPos.z;
                    player.Transform       = propTransform;
                }

                if (_globals.PlayingAsHost)
                {
                    SpawnPlayerCallback(packet.Value.Name, propTransform.origin, remoteId);
                    SendAllExitingPlayersCallback(remoteId);
                }

                break;
            }
        }