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(); }
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(); } }
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); }
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); }