private void HandleLogout(TcpSession session, Packet p) { //_logger.Debug("-C_LOGOUT_REQ-"); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } Players.TryRemove(session.Guid, out plr); var ack = new Packet(EGamePacket.SLogoutAck); session.Send(ack); }
private void HandleRemoveDeny(TcpSession session, Packet p) { var accID = p.ReadUInt64(); var nickname = p.ReadCStringBuffer(31); //_logger.Debug("-C_REMOVE_DENY_REQ- ID: {0} Nickname: {1}", accID, nickname); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var ack = new Packet(EChatPacket.SRemoveDenyAck); if (plr.DenyList.ContainsKey(accID)) { plr.DenyList.Remove(accID); GameDatabase.Instance.RemoveDeny(plr.AccountID, accID); ack.Write((byte)EDenyResult.OK); } else { ack.Write((byte)EDenyResult.Failed2); } ack.Write(accID); ack.WriteStringBuffer(nickname, 31); session.Send(ack); SendDenyList(plr); }
private void HandleWhisper(TcpSession session, Packet p) { var accID = p.ReadUInt64(); var unk1 = p.ReadUInt32(); var unk2 = p.ReadByte(); var msgSize = p.ReadUInt16(); var msg = Encoding.ASCII.GetString(p.ReadBytes(msgSize)); _logger.Debug("-C_WHISPER_REQ- accID: {0} unk1: {1} unk2: {2} Size: {3} Msg: {4}", accID, unk1, unk2, msgSize, msg); var target = _players.GetPlayerByID(accID); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } if (target == null) return; var ack = new Packet(EChatPacket.SWhisperAck); ack.Write(plr.AccountID); ack.Write(unk1); ack.Write(unk2); ack.Write(msgSize); ack.Write(msg); target.Session.Send(ack); }
private void HandleChatMessage(TcpSession session, Packet p) { var channelID = p.ReadUInt32(); var msgSize = p.ReadUInt16(); var msg = Encoding.ASCII.GetString(p.ReadBytes(msgSize)); //_logger.Debug("-C_MESSAGE_REQ- ChannelID: {0} Msg: {1}", channelID, msg); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } if (plr.Channel == null) return; var ack = new Packet(EChatPacket.SMessageAck); ack.Write(plr.AccountID); ack.Write((uint)plr.Channel.ID); ack.Write((ushort)msg.Length); ack.Write(msg); plr.Channel.Broadcast(ack); }
private void HandleGetData(TcpSession session, Packet p) { var accID = p.ReadUInt64(); //_logger.Debug("-C_GET_DATA_REQ- ID: {0}", accID); var ack = new Packet(EChatPacket.SGetDataAck); ack.Write(accID); // accid Player sender; if (!_players.TryGetValue(session.Guid, out sender)) { session.StopListening(); return; } var plr = _players.GetPlayerByID(accID); if(plr == null) { ack.Write((byte)0x01); session.Send(ack); return; } ack.Write((byte)0x00); // result code ack.WriteChatUserData(plr, true); session.Send(ack); }
private void HandleAddFriend(TcpSession session, Packet p) { var accID = p.ReadUInt64(); var nickname = p.ReadCStringBuffer(31); //_logger.Debug("-C_ADD_FRIEND_REQ- ID: {0} Nickname: {1}", accID, nickname); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var ack = new Packet(EChatPacket.SAddFriendAck); ack.Write(accID); var plrToRequest = _players.GetPlayerByID(accID); if (plrToRequest == null) { ack.Write((byte)EAddFriendResult.DoenstExist); } else { var friend = plr.FriendList.FirstOrDefault(f => f.ID == accID); if (friend == null) { plr.FriendList.Add(new Friend() { ID = accID, Nickname = nickname, Accepted = false }); GameDatabase.Instance.AddFriend(plr.AccountID, accID, nickname); SendBRSFriendNotify(plr, plrToRequest, EFriendNotify.Request); ack.Write((byte)EAddFriendResult.MadeRequest); } else { if (friend.Accepted) ack.Write((byte)EAddFriendResult.AlreadyInList); else ack.Write((byte)EAddFriendResult.AlreadyRequested); } } ack.WriteStringBuffer(nickname, 31); session.Send(ack); }
private void HandleChannelEnter(TcpSession session, Packet p) { var chanName = p.ReadCString(); //_logger.Debug("-C_CHANENTER_REQ- Name: {0}", chanName); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var chan = _channels.GetChannelByName(chanName); if (chan.ID == 0) return; var ack = new Packet(EChatPacket.SChannelEnterAck); ack.Write((uint)chan.ID); session.Send(ack); }
private void HandleLoginRequest(TcpSession session, Packet p) { var ip = session.Client.Client.RemoteEndPoint as IPEndPoint; var username = p.ReadCStringBuffer(43); var sessionID = p.ReadUInt32(); var accID = AuthDatabase.Instance.GetAccountID(username); Logger.Info("-CLoginReq- User: {0} ID: {1} SessionID: {2}", username, accID, sessionID); Packet ack; if (accID == 0 || !ValidateSession(sessionID, accID, ip.Address)) { ack = new Packet(EGamePacket.SLoginAck); ack.Write((ulong)0); ack.Write((uint)5); session.Send(ack); session.StopListening(); return; } var player = GameDatabase.Instance.GetPlayer(accID); if (player == null) // new player! { player = new Player { Username = username, Nickname = AuthDatabase.Instance.GetNickname(accID), GMLevel = AuthDatabase.Instance.GetGMLevel(accID), AccountID = accID, PEN = GameConfig.Instance.StartPEN, AP = GameConfig.Instance.StartAP, DMStats = new DMStatistics(), TDStats = new TDStatistics() }; GameDatabase.Instance.CreatePlayer(player); } player.Session = session; player.SessionID = sessionID; GameDatabase.Instance.UpdateOnlineFlag(player.AccountID, true); if (Players.GetPlayerByID(player.AccountID) != null /* prevent multiple logins! */) { session.StopListening(); return; } Players.TryAdd(session.Guid, player); ack = new Packet(EGamePacket.SLoginAck); ack.Write(player.AccountID); ack.Write((uint)0); // error code session.Send(ack); #region License info ack = new Packet(EGamePacket.SLicenseInfoAck); ack.Write((byte)100); for (var i = 1; i <= 100; i++) ack.Write((byte)i); //foreach (var license in player.Licenses) //ack.Write((byte)license); session.Send(ack); #endregion #region Character info ack = new Packet(EGamePacket.SCharSlotInfoAck); ack.Write((byte)player.Characters.Count); // num chars ack.Write((byte)3); // num charslots ack.Write(player.ActiveCharSlot); // active char slot session.Send(ack); for (var i = 0; i < player.Characters.Count; i++) { var character = player.Characters[i]; ack = new Packet(EGamePacket.SOpenCharInfoAck); ack.Write(character.Slot); ack.Write((byte)0x01); ack.Write((byte)0x03); ack.Write((character.Avatar)); session.Send(ack); ack = new Packet(EGamePacket.SCharEquipInfoAck); ack.Write(character.Slot); ack.Write((byte)1); // skill counter ack.Write((byte)3); for (var j = 0; j < 3; j++) { for (var n = 0; n < 3; n++) { ack.Write((byte)n); ack.Write(character.Weapons[n]); } ack.Write((byte)0); ack.Write(character.Skill); } for (var j = 0; j < 7; j++) { ack.Write((byte)j); ack.Write(character.Clothes[j]); } session.Send(ack); } #endregion #region Inventory ack = new Packet(EGamePacket.SInventoryAck); ack.Write((uint)player.Inventory.Count); foreach (var item in player.Inventory) { ack.Write(item.ID); ack.Write(item.Category); ack.Write(item.SubCategory); ack.Write(item.ItemID); ack.Write(item.ProductID); ack.Write(item.EffectID); ack.Write(item.SellPrice); ack.Write(item.PurchaseTime); ack.Write(item.ExpireTime); ack.Write(item.Energy); ack.Write(item.TimeLeft); } session.Send(ack); #endregion ack = new Packet(EGamePacket.SResultAck); ack.Write((uint)0x27); session.Send(ack); #region Account info ack = new Packet(EGamePacket.SBeginAccountInfoAck); ack.Write((byte)0x00); ack.Write((byte)player.Level); ack.Write((uint)(player.CalculateTotalEXP() + player.EXP)); ack.Write((uint)0); // points?? ack.Write((uint)(player.TutorialCompleted ? 3 : 0)); ack.WriteStringBuffer(player.Nickname, 31); ack.Write((uint)0); // unk // dm stuff ack.Write(player.DMStats.Won); // wins? ack.Write(player.DMStats.Lost); // loses?? ack.Write((uint)player.DMStats.CalculateWinRate() >> 1); ack.Write((uint)0); ack.Write((uint)0); ack.Write((uint)0); ack.Write((uint)0); ack.Write((uint)0); ack.Write((uint)0); // td score stuff ack.Write(player.TDStats.CalculateWinRate()); // wins?? ack.Write(0); // loses? ack.Write(player.TDStats.TotalTouchdowns); ack.Write(20 * player.TDStats.TotalMatches); ack.Write(player.TDStats.TotalTouchdownAssists); ack.Write(player.TDStats.TotalKills); ack.Write(player.TDStats.TotalKillAssists); ack.Write(player.TDStats.TotalOffense); ack.Write(player.TDStats.TotalOffenseAssists); ack.Write(player.TDStats.TotalDefense); ack.Write(player.TDStats.TotalDefenseAssists); ack.Write(player.TDStats.TotalRecovery); ack.Write((uint)0); // Total / x / 2 ??? ack.Write((uint)0); // unk, nothing happens ack.Write((uint)0); // super increase for total score?? ack.Write((uint)0); // total score goes to 0?? ack.Write((uint)0); // unk, nothing happens ack.Write((uint)0); // unk, nothing happens session.Send(ack); #endregion ack = new Packet(EGamePacket.SResultAck); ack.Write((uint)0x11); session.Send(ack); }
private void HandleNATInfo(TcpSession session, Packet p) { var ip = (IPEndPoint) session.Client.Client.RemoteEndPoint; Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } plr.PrivateIP = p.ReadUInt32(); plr.PrivatePort = p.ReadUInt16(); plr.PublicIP = p.ReadUInt32(); plr.PublicPort = p.ReadUInt16(); // ignore public stuff from client plr.PublicIP = (uint)ip.Address.Address; plr.PublicPort = plr.PrivatePort; plr.NATUnk = p.ReadUInt16(); plr.ConnectionType = p.ReadByte(); if (ip.Address.ToString() == "127.0.0.1") plr.ConnectionType = 1; if (plr.ConnectionType == 6) plr.ConnectionType = 4; Logger.Info("-CNATInfoReq- NATUnk: {0} Type: {1}", plr.NATUnk, plr.ConnectionType); }
private void HandleScoreSurvival(TcpSession session, Packet p) { Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var sGame = (SurvivalGameScore)plr.GameScore; sGame.TotalPoints++; sGame.Kills++; }
private void HandleMovePlayer(TcpSession session, Packet p) { var targetID = p.ReadUInt64(); var unk = p.ReadUInt64(); var fromTeam = (ETeam) p.ReadByte(); var toTeam = (ETeam) p.ReadByte(); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } if (plr.Room == null) return; if (plr.Room.State != EGameRuleState.Waiting) return; var targetPlr = plr.Room.Players.GetPlayerByID(targetID); if (targetPlr == null) return; var room = plr.Room; switch (toTeam) { case ETeam.Alpha: { var numAlpha = room.CountInTeam(ETeam.Alpha, targetPlr.GameMode); var limit = targetPlr.GameMode == EPlayerGameMode.Normal ? room.PlayerLimit / 2 : room.SpectatorLimit / 2; if (numAlpha >= limit) // full return; targetPlr.Team = ETeam.Alpha; } break; case ETeam.Beta: { var numBeta = room.CountInTeam(ETeam.Beta, targetPlr.GameMode); var limit = targetPlr.GameMode == EPlayerGameMode.Normal ? room.PlayerLimit / 2 : room.SpectatorLimit / 2; if (numBeta >= limit) // full return; targetPlr.Team = ETeam.Beta; } break; } var ack = new Packet(EGamePacket.SCRoomMovePlayer); ack.Write(targetID); ack.Write(unk); ack.Write((byte)fromTeam); ack.Write((byte)toTeam); session.Send(ack); room.BroadcastBriefing(); }
private void HandleTutorialCompleted(TcpSession session, Packet p) { var unk = p.ReadUInt32(); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } if (plr.TutorialCompleted) return; plr.PEN += 5000; plr.TutorialCompleted = true; GameDatabase.Instance.UpdateTutorialFlag(plr); GameDatabase.Instance.UpdateMoney(plr); }
private void HandleRoomChangeItems(TcpSession session, Packet p) { var accID = p.ReadUInt64(); var skill = p.ReadUInt32(); var skill2 = p.ReadUInt32(); // alpha thing -> removed in beta var weapon1 = p.ReadUInt32(); var weapon2 = p.ReadUInt32(); var weapon3 = p.ReadUInt32(); var unk = p.ReadBytes(27); //_logger.Debug("-C_ROOM_CHANGE_ITEMS_REQ-"); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var room = plr.Room; if (room == null) return; // Slot freeze bug fix if (skill2 != 0) skill = skill2; var ack = new Packet(EGamePacket.SRoomChangeItemsAck); ack.Write(accID); ack.Write(skill); ack.Write(0); ack.Write(weapon1); ack.Write(weapon2); ack.Write(weapon3); ack.Write(unk); room.Broadcast(ack, plr.AccountID); }
private void HandleChangePlayerGameMode(TcpSession session, Packet p) { var gameMode = (EPlayerGameMode)p.ReadByte(); //_logger.Debug("-C_ROOM_PLAYERGAMEMODE_CHANGE_REQ- GameMode: {0}", gameMode.ToString()); Player player; if (!Players.TryGetValue(session.Guid, out player)) { session.StopListening(); return; } if(player.Room == null) return; var room = player.Room; player.GameMode = gameMode; var ack = new Packet(EGamePacket.SChangeTeamAck); ack.Write(player.AccountID); ack.Write((byte)player.Team); ack.Write((byte)player.GameMode); room.Broadcast(ack); room.BroadcastBriefing(); }
private void HandleRepairItem(TcpSession session, Packet p) { var itemID = p.ReadUInt64(); Player player; if (!Players.TryGetValue(session.Guid, out player)) { session.StopListening(); return; } var itm = player.Inventory.FirstOrDefault(i => i.ID == itemID); if (itm == null) { session.StopListening(); return; } itm.Energy = itm.MaxEnergy; var ack = new Packet(EGamePacket.SRepairItemAck); ack.Write((byte)0); ack.Write(itemID); session.Send(ack); player.PEN -= 0; // repair cost player.UpdateMoney(); }
private void HandleCreateCharacter(TcpSession session, Packet p) { var slot = p.ReadByte(); var avatar = p.ReadUInt32(); //_logger.Debug("-C_CREATE_CHARACTER_REQ- Slot: {0} Avatar: {1}", slot, avatar); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } if (plr.Characters.Count >= 3) // no cheating my friend! { session.StopListening(); return; } var character = new Character {Slot = slot, Avatar = avatar}; plr.Characters.Add(character); GameDatabase.Instance.CreateCharacter(plr.AccountID, slot, avatar); var ack = new Packet(EGamePacket.SCreateCharacterAck); ack.Write(slot); ack.Write(avatar); ack.Write((byte)1); // SKILL COUNT ack.Write((byte)3); // WEAPON COUNT session.Send(ack); }
private void HandleRefreshEQItems(TcpSession session, Packet p) { Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var items = plr.Inventory; var res = items.Where(item => item.TimeLeft == 0); var ls = res as IList<Item> ?? res.ToList(); //_logger.Debug("-C_REFRESH_EQ_ITEMS_REQ- Count: {0}", ls.Count); var ack = new Packet(EGamePacket.SRefreshInvalidateEQItemsAck); ack.Write((byte)ls.Count()); foreach (var item in ls) { ack.Write(item.ID); } session.Send(ack); }
private void HandleDeleteCharacter(TcpSession session, Packet p) { var slot = p.ReadByte(); //_logger.Debug("-C_SELECT_CHARACTER_REQ- Slot: {0}", slot); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var res = plr.Characters.Where(c => c.Slot == slot); if (!res.Any()) // cheater { session.StopListening(); return; } var character = plr.Characters.First(c => c.Slot == slot); if (character == null) { session.StopListening(); return; } plr.Characters.Remove(character); GameDatabase.Instance.DeleteCharacter(plr.AccountID, slot); var ack = new Packet(EGamePacket.SDeleteCharacterAck); ack.Write(slot); session.Send(ack); }
private void HandleBRSFriendNotify(TcpSession session, Packet p) { var accID = p.ReadUInt64(); var accepted = p.ReadInt32() > 0; var nickname = p.ReadCStringBuffer(31); //_logger.Debug("-C_ADD_FRIEND_REQ- ID: {0} Nickname: {1}", accID, nickname); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } Packet ack; var plrFromRequest = _players.GetPlayerByID(accID); if (plrFromRequest == null) return; if (accepted) { SendBRSFriendNotify(plr, plrFromRequest, EFriendNotify.Accepted); SendBRSFriendNotify(plrFromRequest, plr, EFriendNotify.Accepted); } else { SendBRSFriendNotify(plr, plrFromRequest, EFriendNotify.Denied); SendBRSFriendNotify(plr, plrFromRequest, EFriendNotify.DeleteRelation); SendBRSFriendNotify(plrFromRequest, plr, EFriendNotify.DeleteRelation); } var friend = plrFromRequest.FriendList.FirstOrDefault(f => f.ID == plr.AccountID); if (friend == null) return; if (accepted) { friend.Accepted = true; GameDatabase.Instance.UpdateFriend(plrFromRequest.AccountID, friend.ID, friend.Accepted); var newFriend = new Friend() { ID = plrFromRequest.AccountID, Nickname = plrFromRequest.Nickname, Accepted = true }; plr.FriendList.Add(newFriend); GameDatabase.Instance.AddFriend(plr.AccountID, newFriend.ID, newFriend.Nickname, newFriend.Accepted); } else { plrFromRequest.FriendList.Remove(friend); GameDatabase.Instance.RemoveFriend(plrFromRequest.AccountID, friend.ID); } }
private void HandleAvatarChange(TcpSession session, Packet p) { // TODO //ulong accountID = p.ReadUInt64(); ////Costume Ids //for (int i = 0; i < 7; i++) // p.ReadInt32(); ////Skill ids (Action) //for (int i = 0; i < 2; i++) // p.ReadInt32(); ////Weapon Ids //for (int i = 0; i < 3; i++) // p.ReadInt32(); //_logger.Debug("-C_AVATAR_CHANGE_REQ-"); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } var data = p.ReadToEnd(); var ack = new Packet(EGamePacket.SAvatarChangeAck); ack.Write(data); plr.Room.Broadcast(ack, plr.AccountID) ; }
private void HandleChannelLeave(TcpSession session, Packet p) { //_logger.Debug("-C_CHAN_LEAVE_REQ-"); Player plr; if (_players.TryGetValue(session.Guid, out plr)) return; session.StopListening(); }
async private void HandleChannelEnter(TcpSession session, Packet p) { var id = p.ReadUInt32(); //_logger.Debug("-C_CHAN_ENTER_REQ- ID: {0}", id); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } Channel channel; if (!Channels.TryGetValue((ushort)id, out channel)) return; channel.Join(plr); var ack = new Packet(EGamePacket.SResultAck); ack.Write((uint)5); session.Send(ack); ack = new Packet(EGamePacket.SCashUpdateAck); ack.Write(plr.PEN); ack.Write(plr.AP); session.Send(ack); //if (plr.ConnectionType == 0x06) // Alice.SendMessageTo(plr.AccountID, "Mit deinem Router ist es leider nicht möglich hier zu spielen :("); //else if (plr.ConnectionType == 0x04) // Alice.SendMessageTo(plr.AccountID, "Mit deinem Router kannst du leider nur einen Raum erstellen :("); await Task.Delay(1000); SendRoomList(session); }
private void HandleFriendListRequest(TcpSession session, Packet p) { //_logger.Debug("-C_FRIENDLIST_REQ-"); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } SendFriendList(plr); }
private void HandleChannelLeave(TcpSession session, Packet p) { //_logger.Debug("-C_CHAN_LEAVE_REQ-"); Player plr; if (!Players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } if (plr.Channel == null) return; plr.Channel.Leave(plr); var ack = new Packet(EGamePacket.SResultAck); ack.Write((uint)8); session.Send(ack); }
private void HandleLoginRequest(TcpSession session, Packet p) { var ip = session.Client.Client.RemoteEndPoint as IPEndPoint; var accID = p.ReadUInt64(); var nickname = p.ReadCString(); _logger.Info("-CLoginReq- User: {0} ID: {1}", nickname, accID); var ack = new Packet(EChatPacket.SLoginAck); if (accID == 0 || !ValidateSession(accID, nickname, ip.Address) || _players.GetPlayerByID(accID) != null /* prevent multiple logins! */) { ack.Write((uint)1); // error code session.Send(ack); session.StopListening(); return; } var plr = GameDatabase.Instance.GetPlayer(accID); plr.Session = session; _players.TryAdd(session.Guid, plr); ack.Write((uint)0); // error code session.Send(ack); }
private void HandleBuyItem(TcpSession session, Packet p) { int count = p.ReadByte(); Player player; if (!Players.TryGetValue(session.Guid, out player)) { session.StopListening(); return; } var buyTime = DateTime.Now; var itemsToBuy = new List<Tuple<Item, ShopItem>>(); uint penCost = 0; uint apCost = 0; for (var i = 0; i < count; i++) { var item = new Item(); var mixedID = p.ReadBytes(4); item.Category = mixedID[0]; item.SubCategory = mixedID[1]; item.ItemID = BitConverter.ToUInt16(mixedID, 2); item.ProductID = p.ReadByte(); item.EffectID = p.ReadUInt32(); item.PurchaseTime = HelperUtils.GetUnixTimestamp(buyTime); var shopItem = GameDatabase.Instance.GetShopItem(item.Category, item.SubCategory, item.ItemID, item.ProductID); if (shopItem == null) // hacker { Logger.Error("-CBuyItemReq FAILED(HAX)- ItemID: {0} Category: {1} SubCategory: {2} Type: {3} EffectID: {4}", item.ItemID, item.Category, item.SubCategory, item.ProductID, item.EffectID); session.StopListening(); return; } item.Energy = shopItem.Energy; item.ExpireTime = (shopItem.Time == -1) ? -1 : HelperUtils.GetUnixTimestamp(buyTime.AddSeconds(shopItem.Time)); penCost += shopItem.Price; apCost += shopItem.Cash; itemsToBuy.Add(new Tuple<Item, ShopItem>(item, shopItem)); } Packet ack; if (player.PEN < penCost || player.AP < apCost) { ack = new Packet(EGamePacket.SBuyItemAck); ack.Write((byte)EBuyItemResult.NotEnoughMoney); session.Send(ack); return; } _pluginManager.OnBuyItem(player, itemsToBuy.Select(e => e.Item1).ToList()); foreach (var tuple in itemsToBuy) { var item = tuple.Item1; var shopItem = tuple.Item2; //_logger.Debug("-C_BUY_ITEM_REQ- ItemID: {0} Category: {1} SubCategory: {2} Type: {3} EffectID: {4}", item.ItemID, item.Category, item.SubCategory, item.ProductID, item.EffectID); player.PEN -= shopItem.Price; player.AP -= shopItem.Cash; var id = GameDatabase.Instance.CreateItem(item, player.AccountID); if (id == 0) { ack = new Packet(EGamePacket.SBuyItemAck); ack.Write((byte)EBuyItemResult.DBError); session.Send(ack); continue; } item.ID = id; item.SetupAPWeapon(); player.AddItem(item); ack = new Packet(EGamePacket.SBuyItemAck); ack.Write((byte)EBuyItemResult.OK); ack.Write(item.Category); ack.Write(item.SubCategory); ack.Write(item.ItemID); ack.Write(item.ProductID); ack.Write(item.EffectID); ack.Write(item.ID); session.Send(ack); } player.UpdateMoney(); }
private void HandleSetDataRequest(TcpSession session, Packet p) { //_logger.Debug("-C_SETDATA_REQ-"); Player plr; if (!_players.TryGetValue(session.Guid, out plr)) { session.StopListening(); return; } p.ReadUInt16(); // unk p.ReadUInt64(); // accID plr.ServerID = p.ReadUInt16(); var channelID = p.ReadInt16(); var roomID = p.ReadInt32(); if(roomID == -1) roomID = 0; if (channelID == -1) channelID = 0; plr.Room = new Room(null, EServerType.Chat) { ID = (uint)roomID }; plr.CommunityByte = p.ReadByte(); p.ReadUInt32(); // total exp p.ReadBytes(32); // td/dm info plr.AllowCombiRequest = (EAllowCommunityRequest)p.ReadByte(); plr.AllowFriendRequest = (EAllowCommunityRequest)p.ReadByte(); plr.AllowInvite = (EAllowCommunityRequest)p.ReadByte(); plr.AllowInfoRequest = (EAllowCommunityRequest)p.ReadByte(); plr.CommunityData = p.ReadBytes(41); Channel channel; if (!_channels.TryGetValue((ushort)channelID, out channel)) return; if (plr.Channel == null && channelID > 0) // join { var ack = new Packet(EChatPacket.SChannelPlayerListInfoAck); ack.Write((uint)channel.ID); ack.Write(channel.Players.Count); foreach (var player in channel.Players.Values) ack.WriteChatUserData(player); session.Send(ack); channel.Join(plr); } else if(channelID == 0) // leave { if(plr.Channel != null) plr.Channel.Leave(plr); } else // update { var ack = new Packet(EChatPacket.SChannelPlayerListInfoAck); ack.Write((uint)channel.ID); ack.Write(channel.Players.Count); foreach (var player in channel.Players.Values) ack.WriteChatUserData(player); channel.Broadcast(ack); } }
private void HandleRefundItem(TcpSession session, Packet p) { var itemID = p.ReadUInt64(); Player player; if (!Players.TryGetValue(session.Guid, out player)) { session.StopListening(); return; } var itm = player.Inventory.FirstOrDefault(i => i.ID == itemID); if (itm == null) { session.StopListening(); return; } player.Inventory.Remove(itm); GameDatabase.Instance.RemoveItem(itemID); var ack = new Packet(EGamePacket.SRefundItemAck); ack.Write((byte)0); ack.Write(itemID); session.Send(ack); player.PEN += itm.SellPrice; player.UpdateMoney(); }
private void HandshakeConnection(string Type, IPEndPoint ip, string username, string password, TcpSession session, Packet ack) { switch (Type) { // Success case "success": var newSession = _sessions.AddSession(AuthDatabase.Instance.GetAccountID(username), ip.Address); _logger.Info("Succesfully authenticated Username: {0} with SessionID: {1}", username, newSession.SessionID); ack.Write(newSession.SessionID); // session id ack.Write(new byte[12]); // unk ack.Write((byte)ELoginResult.OK); session.Send(ack); break; // Invalid password/username combination case "failed": _logger.Error("Failed login for Username: {0}", username); ack.Write((uint)0); ack.Write(new byte[12]); ack.Write((byte)ELoginResult.AccountError); session.Send(ack); session.StopListening(); break; // Banned account tried to login case "banned": _logger.Error("Failed login for Username: {0}", username); ack.Write((uint)0); ack.Write(new byte[12]); ack.Write((byte)ELoginResult.AccountBlocked); session.Send(ack); session.StopListening(); break; default: break; } }
private void HandleGetPlayerInfo(TcpSession session, Packet p) { ulong accID = p.ReadUInt32(); //_logger.Debug("-C_GET_PLAYER_INFO_REQ- ID: {0}", accID); Player player; if (!Players.TryGetValue(session.Guid, out player)) { session.StopListening(); return; } //var ack = new Packet(0x3A); //ack.Write(player.AccountID); //ack.Write((ulong)0); //ack.Write((ulong)0); //ack.WriteStringBuffer("STRING1", 7); //ack.WriteStringBuffer("NOOB", 4); //session.Send(ack); }