private void PacketHandler_0x03_Login(Client client, ClientPacket packet) { var name = packet.ReadString8(); var password = packet.ReadString8(); GameLog.DebugFormat("cid {0}: Login request for {1}", client.ConnectionId, name); if (!World.PlayerExists(name)) { client.LoginMessage("That character does not exist", 3); GameLog.InfoFormat("cid {0}: attempt to login as nonexistent character {1}", client.ConnectionId, name); return; } if (World.TryGetUser(name, out User loginUser)) { if (loginUser.VerifyPassword(password)) { GameLog.DebugFormat("cid {0}: password verified for {1}", client.ConnectionId, name); if (Game.World.WorldData.ContainsKey <User>(name)) { GameLog.InfoFormat("cid {0}: {1} logging on again, disconnecting previous connection", client.ConnectionId, name); client.LoginMessage("That character is already online. Please try again.", 3); World.ControlMessageQueue.Add(new HybrasylControlMessage(ControlOpcodes.LogoffUser, name)); return; } GameLog.DebugFormat("cid {0} ({1}): logging in", client.ConnectionId, name); client.LoginMessage("\0", 0); client.SendMessage("Welcome to Hybrasyl!", 3); GameLog.DebugFormat("cid {0} ({1}): sending redirect to world", client.ConnectionId, name); var redirect = new Redirect(client, this, Game.World, name, client.EncryptionSeed, client.EncryptionKey); GameLog.InfoFormat("cid {0} ({1}): login successful, redirecting to world server", client.ConnectionId, name); loginUser.Login.LastLogin = DateTime.Now; loginUser.Login.LastLoginFrom = ((IPEndPoint)client.Socket.RemoteEndPoint).Address.ToString(); loginUser.Save(); client.Redirect(redirect); } else { GameLog.WarningFormat("cid {0} ({1}): password incorrect", client.ConnectionId, name); client.LoginMessage("Incorrect password", 3); loginUser.Login.LastLoginFailure = DateTime.Now; loginUser.Login.LoginFailureCount++; loginUser.Save(); } } else { // Something bad has happened client.LoginMessage("An unknown error occurred. Please contact Hybrasyl support.", 3); } }
public Lobby(int port) : base(port) { GameLog.InfoFormat("LobbyConstructor: port is {0}", port); PacketHandlers = new LobbyPacketHandler[256]; for (int i = 0; i < 256; ++i) { PacketHandlers[i] = (c, p) => GameLog.WarningFormat("Lobby: Unhandled opcode 0x{0:X2}", p.Opcode); } PacketHandlers[0x00] = PacketHandler_0x00_ClientVersion; PacketHandlers[0x57] = PacketHandler_0x57_ServerTable; }
public Login(int port) : base(port) { GameLog.InfoFormat("LoginConstructor: port is {0}", port); PacketHandlers = new LoginPacketHandler[256]; for (int i = 0; i < 256; ++i) { PacketHandlers[i] = (c, p) => GameLog.WarningFormat("Login: Unhandled opcode 0x{0:X2}", p.Opcode); } PacketHandlers[0x02] = PacketHandler_0x02_CreateA; PacketHandlers[0x03] = PacketHandler_0x03_Login; PacketHandlers[0x04] = PacketHandler_0x04_CreateB; PacketHandlers[0x10] = PacketHandler_0x10_ClientJoin; PacketHandlers[0x26] = PacketHandler_0x26_ChangePassword; PacketHandlers[0x4B] = PacketHandler_0x4B_RequestNotification; PacketHandlers[0x68] = PacketHandler_0x68_RequestHomepage; }
public bool AddItem(User giver, byte slot, byte quantity = 1) { ItemObject toAdd; // Some sanity checks // Check if our "exchange" is full if (_sourceItems.IsFull || _targetItems.IsFull) { _source.SendMessage("Maximum exchange size reached. No more items can be added.", MessageTypes.SYSTEM); _target.SendMessage("Maximum exchange size reached. No more items can be added.", MessageTypes.SYSTEM); return(false); } // Check if either participant's inventory would be full as a result of confirmation if (_sourceItems.Count == _sourceSize || _targetItems.Count == _targetSize) { _source.SendMessage("Inventory full.", MessageTypes.SYSTEM); _target.SendMessage("Inventory full.", MessageTypes.SYSTEM); return(false); } // OK - we have room, now what? var theItem = giver.Inventory[slot]; // Further checks! // Is the ItemObject exchangeable? if (!theItem.Exchangeable) { giver.SendMessage("You can't trade this.", MessageTypes.SYSTEM); return(false); } // Weight check if (giver == _source && _targetWeight + theItem.Weight > _target.MaximumWeight) { _source.SendSystemMessage("It's too heavy."); _target.SendSystemMessage("They can't carry any more."); return(false); } if (giver == _target && _sourceWeight + theItem.Weight > _source.MaximumWeight) { _target.SendSystemMessage("It's too heavy."); _source.SendSystemMessage("They can't carry any more."); return(false); } // Is the ItemObject stackable? if (theItem.Stackable && theItem.Count > 1) { var targetItem = giver == _target?_source.Inventory.Find(theItem.Name) : _target.Inventory.Find(theItem.Name); // Check to see that giver has sufficient number of whatever, and also that the quantity is a positive number if (quantity <= 0) { giver.SendSystemMessage("You can't give zero of something, chief."); return(false); } if (quantity > theItem.Count) { giver.SendSystemMessage($"You don't have that many {theItem.Name} to give!"); return(false); } // Check if the recipient already has this ItemObject - if they do, ensure the quantity proposed for trade // wouldn't put them over maxcount for the ItemObject in question if (targetItem != null && targetItem.Count + quantity > theItem.MaximumStack) { if (giver == _target) { _target.SendSystemMessage($"They can't carry any more {theItem.Name}"); _source.SendSystemMessage($"You can't carry any more {theItem.Name}."); } else { _source.SendSystemMessage($"They can't carry any more {theItem.Name}"); _target.SendSystemMessage($"You can't carry any more {theItem.Name}."); } return(false); } giver.RemoveItem(theItem.Name, quantity); toAdd = new ItemObject(theItem); toAdd.Count = quantity; } else if (!theItem.Stackable || theItem.Count == 1) { // ItemObject isn't stackable or is a stack of one // Remove the ItemObject entirely from giver toAdd = theItem; giver.RemoveItem(slot); } else { GameLog.WarningFormat("exchange: Hijinx occuring: participants are {0} and {1}", _source.Name, _target.Name); _active = false; return(false); } // Now add the ItemObject to the active exchange and make sure we update weight if (giver == _source) { var exchangeSlot = (byte)_sourceItems.Count; _sourceItems.AddItem(toAdd); _source.SendExchangeUpdate(toAdd, exchangeSlot); _target.SendExchangeUpdate(toAdd, exchangeSlot, false); _targetWeight += toAdd.Weight; } if (giver == _target) { var exchangeSlot = (byte)_targetItems.Count; _targetItems.AddItem(toAdd); _target.SendExchangeUpdate(toAdd, exchangeSlot); _source.SendExchangeUpdate(toAdd, exchangeSlot, false); _sourceWeight += toAdd.Weight; } return(true); }
public virtual void Shutdown() { GameLog.WarningFormat("{ServerType}: shutting down", this.GetType().ToString()); Listener?.Close(); GameLog.WarningFormat("{ServerType}: shutdown complete", this.GetType().ToString()); }