public override void Handle(ServerClient sender, InPacket packetReader) { ushort errorCode = packetReader.ReadUshort(); if (sender.Authorized) { return; // Ignore other packets. } if (Enum.IsDefined(typeof(AuthorizationErrorCodes), errorCode)) { AuthorizationErrorCodes enumErrorCode = (AuthorizationErrorCodes)errorCode; switch (enumErrorCode) { case AuthorizationErrorCodes.OK: { sender.OnAuthorize(packetReader.ReadByte()); Console.Title = "AlterEmu - Game Server: " + Config.SERVER_NAME; break; } case AuthorizationErrorCodes.InvalidKey: { DisconnectErrorLog(sender, "Error while authorizing: the authorization key didn't match."); break; } case AuthorizationErrorCodes.Duplicate: { DisconnectErrorLog(sender, "Error while authorizing: a server with the same ip address is already online."); break; } case AuthorizationErrorCodes.MaxServersReached: { DisconnectErrorLog(sender, "Error while authorizing: maximum amount of servers reached."); break; } case AuthorizationErrorCodes.NameAlreadyUsed: { DisconnectErrorLog(sender, "Error while authorizing: the server name is already in use."); break; } default: { DisconnectErrorLog(sender, string.Concat("An unknown(", errorCode.ToString("x2"), ") error occured while authorizing the server.")); break; } } } else { // Unknown error Log.Instance.WriteLine(string.Concat("An unknown(", errorCode.ToString("x2"), ") error occured while authorizing the server.")); sender.Disconnect(true); } }
public override void Handle(User sender, InPacket packetReader) { if (sender.Authenticated && sender.Room != null) { // [0] = ROOM SLOT // [1] = ROOM ID byte roomSlot = packetReader.ReadByte(0); if (roomSlot < sender.Room.MaximumPlayers) { ushort roomId = packetReader.ReadUshort(1); if (roomId == sender.Room.ID) { byte unknown = packetReader.ReadByte(2); // Seems to be 2 or 0? ushort subType = packetReader.ReadUshort(3); // HANDLE PACKET IN A SEPERATED CLASS // GameDataHandler handler = NetworkTable.Instance.GetHandler(subType); if (handler != null) { try { handler.Process(sender, packetReader); } catch { /* error? */ } } else { Log.Instance.WriteLine("UNKNOWN SUBPACKET :: " + packetReader); } } else { sender.Disconnect(); // Wrong room targeted - Cheating? } } else { sender.Disconnect(); // Room slot over maximum players - Cheating? } } }
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) { if (sender.Room == null) { Objects.Channel channel = Managers.ChannelManager.Instance.Get(sender.Channel); ushort roomId = packetReader.ReadUshort(); string roomPassword = packetReader.ReadString(); if (channel.Rooms.ContainsKey(roomId)) { Room r = null; if (channel.Rooms.TryGetValue(roomId, out r)) { bool validPassword = true; bool validPremium = true; if (r.HasPassword && r.Password != roomPassword) { validPassword = false; } if (r.PremiumOnly && sender.Premium == Enums.Premium.Free2Play) { validPremium = false; } // TODO: Validate the level limit. if (validPassword) { if (validPremium) { if (!r.Add(sender)) { sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.GenericError)); } } else { sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.OnlyPremium)); } } else { sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.InvalidPassword)); } } else { sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.GenericError)); } } else { sender.Send(new Packets.RoomJoin(Packets.RoomJoin.ErrorCodes.GenericError)); } } } else { sender.Disconnect(); } }