Пример #1
0
        public void Leave(Player plr, byte leaveType = 0)
        {
            Packet ack;
            if (ServerType == EServerType.Game)
            {
                ack = new Packet(EGamePacket.SRoomPlayerLeave);
                ack.Write(plr.AccountID);
                ack.WriteStringBuffer(plr.Nickname, 31);
                ack.Write(leaveType); // leave reason | 1 = kick
                Broadcast(ack);

                ack = new Packet(EGamePacket.SPlayerLeaveAck);
                ack.Write(plr.AccountID);
                ack.Write(plr.SlotID);
                Broadcast(ack);
            }

            Player tmp;
            if (!_players.TryRemove(plr.Session.Guid, out tmp)) return;
            plr.IsReady = false;
            plr.State = EPlayerState.Lobby;
            plr.SlotID = 0;
            plr.Room = null;
            plr.Team = ETeam.Neutral;
            plr.GameMode = EPlayerGameMode.Normal;
            plr.ResetScore();

            if (_players.Count == 0)
            {
                Room roomTEMP;
                RoomCollection.TryRemove(TunnelID, out roomTEMP);

                if (Channel == null || ServerType != EServerType.Game) return;
                ack = new Packet(EGamePacket.SDisposeRoomAck);
                ack.Write(ID);
                Channel.Broadcast(ack);
                return;
            }

            if (ServerType != EServerType.Game) return;
            if (MasterID == plr.AccountID) // master left, we need a new one
            {
                MasterID = _players.First().Value.AccountID;
                ack = new Packet(EGamePacket.SRoomChangeRefereeAck);
                ack.Write(MasterID);
                Broadcast(ack);

                ack = new Packet(EGamePacket.SRoomChangeMasterAck);
                ack.Write(MasterID);
                Broadcast(ack);
            }

            if (State == EGameRuleState.Playing && ( (CountInTeam(ETeam.Alpha) == 0 || CountInTeam(ETeam.Beta) == 0) 
                || (CountInTeamPlaying(ETeam.Alpha) == 0 || CountInTeamPlaying(ETeam.Beta) == 0) ))
                BeginResult();
        }
Пример #2
0
        public void Leave(Player plr, byte leaveType = 0)
        {
            Packet ack;

            if (ServerType == EServerType.Game)
            {
                ack = new Packet(EGamePacket.SRoomPlayerLeave);
                ack.Write(plr.AccountID);
                ack.WriteStringBuffer(plr.Nickname, 31);
                ack.Write(leaveType); // leave reason | 1 = kick
                Broadcast(ack);

                ack = new Packet(EGamePacket.SPlayerLeaveAck);
                ack.Write(plr.AccountID);
                ack.Write(plr.SlotID);
                Broadcast(ack);
            }

            Player tmp;

            if (!_players.TryRemove(plr.Session.Guid, out tmp))
            {
                return;
            }
            plr.IsReady  = false;
            plr.State    = EPlayerState.Lobby;
            plr.SlotID   = 0;
            plr.Room     = null;
            plr.Team     = ETeam.Neutral;
            plr.GameMode = EPlayerGameMode.Normal;
            plr.ResetScore();

            if (_players.Count == 0)
            {
                Room roomTEMP;
                RoomCollection.TryRemove(TunnelID, out roomTEMP);

                if (Channel == null || ServerType != EServerType.Game)
                {
                    return;
                }
                ack = new Packet(EGamePacket.SDisposeRoomAck);
                ack.Write(ID);
                Channel.Broadcast(ack);
                return;
            }

            if (ServerType != EServerType.Game)
            {
                return;
            }
            if (MasterID == plr.AccountID) // master left, we need a new one
            {
                MasterID = _players.First().Value.AccountID;
                ack      = new Packet(EGamePacket.SRoomChangeRefereeAck);
                ack.Write(MasterID);
                Broadcast(ack);

                ack = new Packet(EGamePacket.SRoomChangeMasterAck);
                ack.Write(MasterID);
                Broadcast(ack);
            }

            if (State == EGameRuleState.Playing && ((CountInTeam(ETeam.Alpha) == 0 || CountInTeam(ETeam.Beta) == 0) ||
                                                    (CountInTeamPlaying(ETeam.Alpha) == 0 || CountInTeamPlaying(ETeam.Beta) == 0)))
            {
                BeginResult();
            }
        }
Пример #3
0
        public void Join(Player plr)
        {
            plr.Room = this;
            if (ServerType == EServerType.Game)
            {
                plr.ResetScore();
                plr.State = EPlayerState.Lobby;
            }
            _players.TryAdd(plr.Session.Guid, plr);

            if (ServerType != EServerType.Game) return;

            var ack = new Packet(EGamePacket.SEnterRoomSuccessAck);
            ack.Write(ID);
            ack.Write(MatchKey);
            ack.Write((uint)State);
            ack.Write((uint)TimeState);
            ack.Write(TimeLimit);

            var ts = DateTime.Now - StartTime;
            if(State == EGameRuleState.Waiting || State == EGameRuleState.Result)
                ack.Write((uint)0);
            else
                ack.Write((uint)ts.TotalMilliseconds); // time passed
            ack.Write(ScoreLimit);
            ack.Write(IsFriendly);
            ack.Write(IsBalanced);
            ack.Write(MinLevel);
            ack.Write(MaxLevel);
            ack.Write(EquipLimit);
            ack.Write(IsNoIntrusion);
            plr.Session.Send(ack);

            // Generate unique slot id!
            var slotID = 2;
            while (FindPlayerInSlot(slotID) != null)
                slotID++;
            plr.SlotID = (byte)slotID;

            ack = new Packet(EGamePacket.SIdsInfoAck);
            ack.Write(plr.SlotID);
            ack.Write(TunnelID);
            ack.Write((uint)0);
            plr.Session.Send(ack);

            ack = new Packet(EGamePacket.SPlayerEnteredAck);
            ack.Write((byte)0x00);
            ack.Write((byte)_players.Count);

            foreach (var player in _players.Values)
            {
                ack.Write(player.PrivateIP); // private ip
                ack.Write(player.PrivatePort); // private port
                ack.Write(player.PublicIP); // public ip
                ack.Write(player.PublicPort); // public port
                ack.Write(player.NATUnk);
                ack.Write(player.ConnectionType); // connection type | 6 relay
                ack.Write(player.AccountID);
                ack.Write(player.SlotID);
                ack.Write((uint)0);
                ack.Write((byte)0x01);
                ack.WriteStringBuffer(player.Nickname, 31);
            }
            Broadcast(ack);
        }
Пример #4
0
        public void Join(Player plr)
        {
            plr.Room = this;
            if (ServerType == EServerType.Game)
            {
                plr.ResetScore();
                plr.State = EPlayerState.Lobby;
            }
            _players.TryAdd(plr.Session.Guid, plr);

            if (ServerType != EServerType.Game)
            {
                return;
            }

            var ack = new Packet(EGamePacket.SEnterRoomSuccessAck);

            ack.Write(ID);
            ack.Write(MatchKey);
            ack.Write((uint)State);
            ack.Write((uint)TimeState);
            ack.Write(TimeLimit);

            var ts = DateTime.Now - StartTime;

            if (State == EGameRuleState.Waiting || State == EGameRuleState.Result)
            {
                ack.Write((uint)0);
            }
            else
            {
                ack.Write((uint)ts.TotalMilliseconds); // time passed
            }
            ack.Write(ScoreLimit);
            ack.Write(IsFriendly);
            ack.Write(IsBalanced);
            ack.Write(MinLevel);
            ack.Write(MaxLevel);
            ack.Write(EquipLimit);
            ack.Write(IsNoIntrusion);
            plr.Session.Send(ack);

            // Generate unique slot id!
            var slotID = 2;

            while (FindPlayerInSlot(slotID) != null)
            {
                slotID++;
            }
            plr.SlotID = (byte)slotID;

            ack = new Packet(EGamePacket.SIdsInfoAck);
            ack.Write(plr.SlotID);
            ack.Write(TunnelID);
            ack.Write((uint)0);
            plr.Session.Send(ack);

            ack = new Packet(EGamePacket.SPlayerEnteredAck);
            ack.Write((byte)0x00);
            ack.Write((byte)_players.Count);

            foreach (var player in _players.Values)
            {
                ack.Write(player.PrivateIP);      // private ip
                ack.Write(player.PrivatePort);    // private port
                ack.Write(player.PublicIP);       // public ip
                ack.Write(player.PublicPort);     // public port
                ack.Write(player.NATUnk);
                ack.Write(player.ConnectionType); // connection type | 6 relay
                ack.Write(player.AccountID);
                ack.Write(player.SlotID);
                ack.Write((uint)0);
                ack.Write((byte)0x01);
                ack.WriteStringBuffer(player.Nickname, 31);
            }
            Broadcast(ack);
        }