public override void Handle(User sender, InPacket packetReader) { uint userId = packetReader.ReadUint(); int nxCode = packetReader.ReadInt(); // Unused. string username = packetReader.ReadString(); string displayname = packetReader.ReadString(); uint sessionId = packetReader.ReadUint(); // Login session Id -> Doesn't seem to be correct? -> We'll use it like this for now. //ushort gender = GetUShort(4); //ushort age = GetUShort(5); //ushort wrPointScore = GetUShort(6); // WR Point System -> The score of your computer performance. //ushort accessCode = GetUShort(7); // Permissions. /*int clanId = GetInt(8); * int clanUserLevel = GetInt(9); * int clanIcon = GetInt(10); * string clanName = GetString(11);*/ if (userId > 0 && username.Length > 2 && displayname.Length > 2 && sessionId > 0) { if (Managers.UserManager.Instance.Add(sessionId, sender)) { Program.AuthServer.Send(new Packets.Internal.PlayerAuthorization(sessionId, userId, username)); } else { sender.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure)); sender.Disconnect(); } } else { sender.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure)); sender.Disconnect(); } }
public override void Handle(Server sender, InPacket packetReader) { uint ErrorCode = packetReader.ReadUint(); if (ErrorCode != 1) { sender.Disconnect(); return; } string globalKey = packetReader.ReadString(); string serverName = packetReader.ReadString(); string ipAddress = packetReader.ReadString(); int port = packetReader.ReadInt(); byte type = packetReader.ReadByte(); if (!Enum.IsDefined(typeof(ServerTypes), type)) { sender.Disconnect(); return; } ServerTypes enumType = (ServerTypes)type; byte serverId = Managers.ServerManager.Instance.Add(sender, serverName, ipAddress, port, enumType); if (serverId > 0) { Log.Instance.WriteLine($"Added Server: {serverName} @ {ipAddress}:{port} with Id: {serverId}"); sender.Send(new Packets.Internal.Authorize(serverId)); } else { Log.Instance.WriteError($"Failed to add Server: {serverName} @ {ipAddress}:{port}. Reason: Server Limit reached."); sender.Send(new Packets.Internal.Authorize(Core.Enums.Internal.AuthorizationErrorCodes.MaxServersReached)); sender.Disconnect(); } }
public override void Handle(User sender, InPacket packetReader) { ushort actionType = packetReader.ReadUshort(); if (actionType >= (ushort)Enums.ItemAction.BuyItem && actionType <= (ushort)Enums.ItemAction.UseItem) { if (actionType == (ushort)Enums.ItemAction.BuyItem) { string itemCode = packetReader.ReadString().ToUpper(); if (itemCode.Length == 4) { if (Managers.ItemManager.Instance.Items.ContainsKey(itemCode)) { ItemData item = Managers.ItemManager.Instance.Items[itemCode]; if (item != null) { uint dbId = packetReader.ReadUint(2); //if (item.dbId == dbId) { byte length = packetReader.ReadByte(4); if (length < 4) { if (item.Shop.IsBuyable) { //TODO: Level check. //TODO: Add add dinar function. if (sender.Inventory.Items.Count < Objects.Inventory.Inventory.MAX_ITEMS) { if (!item.Shop.RequiresPremium || (item.Shop.RequiresPremium && sender.Premium != Enums.Premium.Free2Play)) { int price = item.Shop.Cost[length]; if (price >= 0) { int moneyCalc = (int)sender.Money - price; if (moneyCalc >= 0) { var invItem = (Objects.Inventory.Item)null; try { invItem = sender.Inventory.Items.Select(n => n.Value).Where(n => n.ItemCode == item.Code).First(); } catch { invItem = null; } uint utcTime = (uint)DateTime.Now.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds; uint itemLength = (uint)(86400 * days[length]); sender.Money = (uint)moneyCalc; if (invItem != null) { // Has item in inventory. // Extend & insert into db :) Databases.Game.Query(string.Concat("INSERT INTO user_inventory (`id`, `owner`, `code`, `startdate`, `length`, `price`, `expired`, `deleted`) VALUES (NULL, '", sender.ID, "', '", item.Code.ToUpper(), "', '", utcTime, "', '", itemLength, "', '", price, "', '0', '0'); UPDATE user_details SET money='", sender.Money, "' WHERE id = ", sender.ID, ";")); invItem.ExpireDate = invItem.ExpireDate.AddSeconds(itemLength); sender.Inventory.Rebuild(); sender.Send(new Packets.Itemshop(sender)); } else { // No item in invetory // Insert & fetch id uint itemdbId = 0; MySql.Data.MySqlClient.MySqlCommand cmd; try { cmd = new MySql.Data.MySqlClient.MySqlCommand(string.Concat("INSERT INTO user_inventory (`id`, `owner`, `code`, `startdate`, `length`, `price`, `expired`, `deleted`) VALUES (NULL, '", sender.ID, "', '", item.Code.ToUpper(), "', '", utcTime, "', '", itemLength, "', '", price, "', '0', '0');"), Databases.Game.OpenConnection()); cmd.ExecuteNonQuery(); itemdbId = (uint)cmd.LastInsertedId; } catch { itemdbId = 0; } if (itemdbId > 0) { Databases.Game.Query(string.Concat("UPDATE user_details SET money='", sender.Money, "' WHERE id = ", sender.ID, ";")); sender.Inventory.Add(new Objects.Inventory.Item(-1, itemdbId, item.Code, (utcTime + itemLength))); sender.Inventory.Rebuild(); sender.Send(new Packets.Itemshop(sender)); } else { sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.CannotBeBougth)); } } } else { sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.NotEnoughDinar)); } } else { sender.Disconnect(); // Item can't be bought for this period. - Cheating? } } else { sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.PremiumOnly)); } } else { sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.InventoryFull)); // Inventory is full. } } else { sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.CannotBeBougth)); // Buying an item that isn't for sale? - Cheating? } } else { sender.Disconnect(); // Cheating? } } else { sender.Disconnect(); // Invalid id for the item - Cheating? } } else { sender.Disconnect(); // Server error. } } else { sender.Disconnect(); // Code doesn't exist - Cheating? } } else { sender.Disconnect(); // Wrong Code - Cheating? } } /*else if (actionType == (ushort)Enums.ItemAction.UseItem) * { * sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.InvalidItem)); * }*/ else { sender.Send(new Packets.Itemshop(Packets.Itemshop.ErrorCodes.InvalidItem)); } /*} else { * sender.Disconnect(); // Invalid Action type - Cheating? * }*/ }
public override void Handle(Server sender, InPacket packetReader) { ushort errorCode = packetReader.ReadUshort(); if (Enum.IsDefined(typeof(PlayerAuthorizationErrorCodes), errorCode)) { PlayerAuthorizationErrorCodes enumErrorCode = (PlayerAuthorizationErrorCodes)errorCode; uint targetId = packetReader.ReadUint(); switch (enumErrorCode) { // A new player logs in. case PlayerAuthorizationErrorCodes.Login: { Session session = Managers.SessionManager.Instance.Get(targetId); if (session != null) { if (!session.IsActivated) { session.Activate((byte)sender.ID); sender.Send(new Packets.Internal.PlayerAuthorization(session)); } else { sender.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.SessionAlreadyActivated, targetId)); } } else { sender.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.InvalidSession, targetId)); } break; } // Update the information of a player. case PlayerAuthorizationErrorCodes.Update: { Session session = Managers.SessionManager.Instance.Get(targetId); if (session != null) { /* Packet Structure v2 * * Connection Time * Ping * * [Sub Type] * - 1 - Update Channel * - 2 - Update Session Information * - 3 - Update Action * - 4 - Update Lobby Room information * - 5 - Update Ingame Room information * * [Data Blocks] * - [1] - Update Channel * - Current channel Id * - Channel Slot * * - [2] - Update Session Information * - Session - Kills * - Session - Deaths * - Session - Xp Earned * - Session - Dinar Earned * - Session - Dinar Spend * * - [3] - Update Action * - Update Type: * * [1]: Join Room * - Room ID * - Room Slot * - Room Is Master * * [2]: Leave Room * - Room ID * - Room Old Slot * - Room Was Master? * - New master slot * * [3]: Room Start * - Team * * [4]: Room Stop * - Kills * - Deaths * - Flags * - Points * - Xp Earned * - Dinar Earned * - xp Bonusses (%-Name:%-Name) * - dinar bonusses (%-Name:%-Name) * * - [4] - Update Lobby Room information * - Update Type: * * [1]: Switch Side * - Room ID * - Room Slot * - Room Is Master * * [2]: * * - [5] - Update Ingame Room information * - Update Type: * * [1]: Score Update (Player Kill/Player Death) * - Room ID * - Room Kills * - Room Deaths * - Room Flags * - Room Points * * [2]: */ } else { // Force a closure of the connection. sender.Send(new Packets.Internal.PlayerAuthorization(PlayerAuthorizationErrorCodes.InvalidSession, targetId)); } break; } // A player logs out of the server. case PlayerAuthorizationErrorCodes.Logout: { Session session = Managers.SessionManager.Instance.Get(targetId); if (session != null) { if (session.IsActivated) { session.End(); } } break; } default: { // Unused. break; } } } else { Console.WriteLine(string.Concat("Unknown PlayerAuthorization error: ", errorCode)); } }
public override void Handle(ServerClient sender, InPacket packetReader) { ushort errorCode = packetReader.ReadUshort(); if (Enum.IsDefined(typeof(PlayerAuthorizationErrorCodes), errorCode)) { PlayerAuthorizationErrorCodes enumErrorCode = (PlayerAuthorizationErrorCodes)errorCode; uint targetId = packetReader.ReadUint(); switch (enumErrorCode) { // A new player logs in. case PlayerAuthorizationErrorCodes.Login: { Entities.User u = Managers.UserManager.Instance.Get(targetId); if (u != null) { uint userId = packetReader.ReadUint(); string username = packetReader.ReadString(); string displayname = packetReader.ReadString(); u.OnAuthorize(userId, username, displayname); } break; } // Update the information of a player. case PlayerAuthorizationErrorCodes.Update: { break; } // A player logs out of the server. case PlayerAuthorizationErrorCodes.Logout: { break; } case PlayerAuthorizationErrorCodes.InvalidSession: { Entities.User u = Managers.UserManager.Instance.Get(targetId); if (u != null) { if (!u.Authenticated) { u.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure)); } u.Disconnect(); } break; } case PlayerAuthorizationErrorCodes.IvalidMatch: { Entities.User u = Managers.UserManager.Instance.Get(targetId); if (u != null) { u.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure)); u.Disconnect(); } break; } case PlayerAuthorizationErrorCodes.SessionAlreadyActivated: { Entities.User u = Managers.UserManager.Instance.Get(targetId); if (u != null) { u.Send(new Packets.Authorization(Packets.Authorization.ErrorCodes.NormalProcedure)); u.Disconnect(); } break; } default: { // Unused. break; } } } else { Log.Instance.WriteLine(string.Concat("Unknown PlayerAuthorization error: ", errorCode)); } }
public override void Handle(User sender, InPacket packetReader) { if (sender.Authenticated) { byte type = packetReader.ReadByte(); if (Enum.IsDefined(typeof(ChatType), type)) { // TODO: Read everything correctly. ChatType chatType = (ChatType)type; uint nowTimeStamp = (uint)DateTime.Now.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds; uint targetId = packetReader.ReadUint(); string targetName = packetReader.ReadString(); string message = packetReader.ReadString(); string realMessage = message.Split(new string[] { ">>" }, StringSplitOptions.None)[1].Trim(); if (realMessage.Length <= 55) { realMessage = realMessage.Trim(); switch (chatType) { case ChatType.LobbyToChannel: { if (sender.Room == null) { Databases.Game.AsyncInsert("chat_public_lobby", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "target_all", 0 }, { "message", realMessage }, { "timestamp", nowTimeStamp } }); OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName); Managers.ChannelManager.Instance.SendLobby(sender.Channel, p.BuildEncrypted()); } else { sender.Disconnect(); // Sending lobby messages when in a room? } break; } case ChatType.LobbyToAll: { if (sender.Room == null) { Databases.Game.AsyncInsert("chat_public_lobby", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "target_all", 1 }, { "message", realMessage }, { "timestamp", nowTimeStamp } }); OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName); Managers.ChannelManager.Instance.SendAllLobbies(p.BuildEncrypted()); } else { sender.Disconnect(); // Sending lobby messages when in a room? } break; } case ChatType.RoomToAll: { if (sender.Room != null) { if (sender.Room.State == RoomState.Waiting && sender.RoomSlot == sender.Room.Master) { if (sender.Room.Supermaster) { targetId = 998; } } Databases.Game.AsyncInsert("chat_public_room", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "room_id", sender.Room.ID }, { "team_side", (byte)sender.Room.Players[sender.RoomSlot].Team }, { "target_all", 1 }, { "message", realMessage }, { "timestamp", nowTimeStamp } }); OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName); sender.Room.Send(p.BuildEncrypted()); } else { sender.Disconnect(); } break; } case ChatType.RoomToTeam: { if (sender.Room != null) { if (sender.Room.Mode != Mode.Free_For_All && sender.Room.State == RoomState.Playing) { Databases.Game.AsyncInsert("chat_public_room", new System.Collections.Generic.Dictionary<string, object>() { { "server", Config.SERVER_ID }, { "channel_id", (byte)sender.Channel }, { "sender_id", sender.ID }, { "room_id", sender.Room.ID }, { "team_side", (byte)sender.Room.Players[sender.RoomSlot].Team }, { "target_all", 0 }, { "message", realMessage }, { "timestamp", nowTimeStamp } }); OutPacket p = new Packets.Chat(sender, chatType, message, targetId, targetName); byte[] buffer = p.BuildEncrypted(); sender.Room.Players.Values.Where(n => n.Team == sender.Room.Players[sender.RoomSlot].Team).ToList().ForEach(n => n.Send(buffer)); } else { sender.Disconnect(); // NO team CHAT IN FFA or in the lobby. } } break; } default: { break; } } } else { sender.Disconnect(); // Message is to long? } } } else { sender.Disconnect(); } }