public void Join(Player plr) { _players.TryAdd(plr.Session.Guid, plr); plr.Channel = this; if (ServerType != EServerType.Chat) return; var ack = new Packet(EChatPacket.SChannelPlayerJoinedAck); ack.Write((uint)ID); ack.WriteChatUserData(plr); Broadcast(ack, plr.AccountID); }
public void CreatePlayer(Player plr) { using (var con = GetConnection()) { using (var cmd = BuildQuery(con, "INSERT INTO accounts(ID, Nickname, Level, PEN, AP, GMLevel) VALUES(@ID, @Nickname, @Level, @PEN, @AP, @GMLevel); INSERT INTO account_tdstats(ID) VALUES(@ID); INSERT INTO account_dmstats(ID) VALUES(@ID);", "@ID", plr.AccountID, "@Nickname", plr.Nickname, "@Level", plr.Level, "@PEN", plr.PEN, "@AP", plr.AP, "@GMLevel", plr.GMLevel)) { cmd.ExecuteNonQuery(); } } }
public override bool OnReadyRound(Player plr, Room room) { var rule = CheckRule(room); if (rule == null) return false; if (CheckEquip(plr, rule)) return false; var ack = new Packet(EGamePacket.SResultAck); ack.Write((uint)EServerResult.WearingUnusbleItem); plr.Session.Send(ack); return true; }
public void Leave(Player plr) { Player tmp; _players.TryRemove(plr.Session.Guid, out tmp); plr.Channel = null; if (ServerType != EServerType.Chat) return; var ack = new Packet(EChatPacket.SChannelPlayerLeftAck); ack.Write((uint)ID); ack.Write(plr.AccountID); Broadcast(ack); }
public override void OnBuyItem(Player plr, List<Item> itemsToBuy) { foreach (var item in itemsToBuy) item.EffectID = 0; }
public void UpdateTutorialFlag(Player plr) { using (var con = GetConnection()) { using (var cmd = BuildQuery(con, "UPDATE accounts SET TutorialCompleted=@TC WHERE ID=@ID", "@TC", plr.TutorialCompleted, "@ID", plr.AccountID)) { cmd.ExecuteNonQuery(); } } }
public void UpdateMoney(Player plr) { using (var con = GetConnection()) { using (var cmd = BuildQuery(con, "UPDATE accounts SET PEN=@PEN, AP=@AP WHERE ID=@ID", "@PEN", plr.PEN, "@AP", plr.AP, "@ID", plr.AccountID)) { cmd.ExecuteNonQuery(); } } }
public void UpdateEXPLevel(Player plr) { using (var con = GetConnection()) { using (var cmd = BuildQuery(con, "UPDATE accounts SET EXP=@EXP, Level=@Level WHERE ID=@ID", "@EXP", plr.EXP, "@Level", plr.Level, "@ID", plr.AccountID)) { cmd.ExecuteNonQuery(); } } }
public Player GetPlayer(ulong accID) { using (var con = GetConnection()) { using (var cmd = BuildQuery(con, "SELECT * FROM accounts WHERE ID=@ID", "@ID", accID)) { using (var r = cmd.ExecuteReader()) { if (!r.Read()) return null; var player = new Player { AccountID = (ulong) r.GetInt64("ID"), Nickname = r.GetString("Nickname"), EXP = (uint) r.GetInt32("EXP"), Level = (uint) r.GetInt32("Level"), TutorialCompleted = (r.GetByte("TutorialCompleted") > 0), ActiveCharSlot = r.GetByte("ActiveCharSlot"), PEN = (uint) r.GetInt32("PEN"), AP = (uint) r.GetInt32("AP"), GMLevel = r.GetByte("GMLevel"), Licenses = GetLicenses(accID), Inventory = GetInventory(accID), Characters = GetCharacters(accID), TDStats = GetTDStats(accID), DMStats = GetDMStats(accID), DenyList = GetDenyList(accID), FriendList = GetFriendList(accID) }; return player; } } } }
public virtual bool OnBeginRound(Player plr, Room room) { return false; }
public override bool OnCreateRoom(Player plr, Room room) { room.IsBalanced = false; return false; }
public virtual bool OnReadyRound(Player plr, Room room) { return false; }
public virtual bool OnCreateRoom(Player plr, Room room) { return false; }
public virtual void OnBuyItem(Player plr, List<Item> itemsToBuy) { }
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); }
private bool CheckEquip(Player plr, string rule) { if (!_database.ContainsKey(rule)) return true; foreach (var itm in _database[rule]) { var character = plr.Characters.FirstOrDefault(c => c.Slot == plr.ActiveCharSlot); if(character == null) continue; if ((from w in character.Weapons where w != 0 select plr.Inventory.First(e => e.ID == w)).Any(i => i.Category == itm.Category && i.SubCategory == itm.SubCategory && i.ItemID == itm.ItemID)) return false; if ((from w in character.Clothes where w != 0 select plr.Inventory.First(e => e.ID == w)).Any(i => i.Category == itm.Category && i.SubCategory == itm.SubCategory && i.ItemID == itm.ItemID)) return false; if(character.Skill == 0) continue; var skill = plr.Inventory.First(e => e.ID == character.Skill); if (skill.Category == itm.Category && skill.SubCategory == itm.SubCategory && skill.ItemID == itm.ItemID) return false; } return true; }
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 virtual string OnAdminAction(Player sender, string[] args) { return ""; }