コード例 #1
0
ファイル: Room.cs プロジェクト: tim-low/SSAD-game-server
        public virtual void Disconnect(GameClient client)
        {
            bool IsOwner = false;

            if (this.Owner == client)
            {
                IsOwner = true;
            }
            this.Leave(client, true);
            client.Character.Status.Update(null);
            Parent.Disconnect(client);
            // Enqueue all disconnect client
            if (IsInGame || !IsInGame)
            {
                var ack2 = new UpdateRoomPlayerCountAck()
                {
                    Room = this
                };
                var ack3 = new PlayerHasLeftRoomAck()
                {
                    Token          = client.Character?.Token,
                    Character      = client.Character,
                    HasOwnerChange = IsOwner,
                    Owner          = this.Owner.GetIdentifier()
                };
                // Invoke only when the room is in Room State and not in Game state
                EventDespatcher.EnqueueRoom(ack3.CreatePacket(), client);
                this.Parent.Broadcast(ack2.CreatePacket());
                // Invoke the despatcher in 10s
                new Task(() => EventDespatcher.Invoke()).Start();
            }
        }
コード例 #2
0
        public static void HandleLeaveRoom(Packet packet)
        {
            CmdLeaveRoom cmd = new CmdLeaveRoom(packet);

            if (packet.Sender.Character?.Token != cmd.Token)
            {
                packet.SendBackError(12);
                return;
            }

            Character character = packet.Sender.Character;

            // User can only leave from room
            if (character?.Status?.GetState() != typeof(Room))
            {
                packet.SendBackError(11);
                return;
            }

            Room room = character.Status.GetObject <Room>();

            // Update Status from Room to Lobby
            bool hasOwnerChange = room.Leave(packet.Sender);

            character.Unready();

            var ack1 = new LeaveRoomAck()
            {
                Lobby = room.Parent
            };
            var ack2 = new UpdateRoomPlayerCountAck()
            {
                Room = room
            };
            var ack3 = new PlayerHasLeftRoomAck()
            {
                Token          = packet.Sender.Character?.Token,
                Character      = character,
                HasOwnerChange = hasOwnerChange,
                Owner          = room.Owner.GetIdentifier()
            };

            // Tell client if they successfully left room
            packet.SendBack(ack1.CreatePacket());

            room.Broadcast(ack3.CreatePacket());
            // Everyone in the lobby should receive note that the player count decreased

            packet.Sender.Character.Vec3 = new System.Numerics.Vector3(0, 0, 1);

            // 0.5 sleep then broadcast
            Thread.Sleep(500);

            packet.Sender.Character.Status.GetObject <IBroadcaster>().Broadcast(ack2.CreatePacket());

            // Everyone in the room should receive note of the player that left.
        }