예제 #1
0
        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.
        }
예제 #3
0
        public static void HandleJoinRoom(Packet packet)
        {
            CmdJoinRoom cmd = new CmdJoinRoom(packet);

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

            Character character = packet.Sender.Character;

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

            Lobby userLobby = character.Status.GetObject <Lobby>();

            Room joinedRoom;

            // Unable to find the room in RoomManager
            if (!userLobby.RoomManager.Get(cmd.RoomId, out joinedRoom))
            {
                packet.SendBackError(15);
                return;
            }

            if (joinedRoom.IsInGame)
            {
                packet.SendBackError(16);
                return;
            }

            // Room is full (max 4)
            if (joinedRoom.IsFull())
            {
                packet.SendBackError(17);
                return;
            }

            // Room is locked and client entered wrong password
            if (cmd.IsLocked && cmd.Password != joinedRoom.Password)
            {
                packet.SendBackError(18);
                return;
            }

            // Room is not locked or successfully entered password

            // Update status to that room.
            joinedRoom.Join(packet.Sender);

            var ack1 = new JoinRoomAck()
            {
                Room = joinedRoom
            };
            var ack2 = new UpdateRoomPlayerCountAck()
            {
                Room = joinedRoom
            };
            var ack3 = new NewPlayerInRoomAck()
            {
                Token     = packet.Sender.Character.Token,
                Character = character
            };

            // Give client room details when they join
            packet.SendBack(ack1.CreatePacket());

            // Everyone in the lobby should receive note that the player count increased
            userLobby.Broadcast(ack2.CreatePacket());

            // Everyone in the room should receive note of the new player except for the player itself sicne ack1 is given to them
            joinedRoom.Broadcast(ack3.CreatePacket(), packet.Sender);
        }