/// <summary> /// Gets called when the parent server wishes to handoff a player off /// </summary> /// <param name="msg">request details</param> private void OnPlayerHandoffRequest(INetworkConnection con, Packet pck) { PacketRelayPlayerHandoffRequest msg = pck as PacketRelayPlayerHandoffRequest; // Create an auth ticket for the player, if we want to allow them to connect. ServerUser su = new ServerUser(); su.OwningServer = msg.OwningServer; su.AuthTicket = Guid.Empty; su.ID = msg.Player; su.AccountName = msg.AccountName; su.Profile = msg.Profile; if (msg.Character != null) { msg.Character.OwningAccount = su; su.CurrentCharacter = msg.Character; su.CurrentCharacter.TargetResource = msg.TargetResource; } string rmsg = ""; su.AuthTicket = OnPlayerConnectionRequest(su, ref rmsg); bool allowed = su.AuthTicket != Guid.Empty; if (allowed) { ConnectionManager.AuthorizeUser(su, false); if (msg.Character != null) { CharacterCache.CacheCharacter(su.CurrentCharacter, ServerUser.AccountName); } } PacketPlayerAuthorizedForTransfer p = (PacketPlayerAuthorizedForTransfer)CreatePacket((int)ServerPacketType.PacketPlayerAuthorizedForTransfer, 0, true, true); p.ReplyCode = allowed ? ReplyType.OK : ReplyType.Failure; p.Profile = msg.Profile; p.AccountName = msg.AccountName; p.AuthTicket = su.AuthTicket; p.ReplyMessage = allowed ? "Welcome to " + MyServer.ServerName + ", " + msg.AccountName : "Server is currently not accepting logins. Try again a little later. " + rmsg; p.Player = msg.Player; p.TargetResource = msg.TargetResource; msg.ReplyPacket = p; // reply will be sent by NetworkConnection.OnAfterPacketProcessed }
/// <summary> /// Requests that a player be connected to the cluster server /// </summary> /// <param name="userId">the id of the account to be transferred</param> /// <param name="accountName">the name of the account to be transferred</param> /// <param name="remotePlayerEndpoint">the remote endpoint of the transferee</param> /// <param name="targetResource">the target content resource the player wants, or Guid.Empy if none</param> /// <param name="accountProperties">the account properties of the account to transfer</param> /// <param name="owningServer">the server in the cluster that owns the server. See ServerUser.Owner</param> public void RequestPlayerHandoff(Guid userId, string accountName, Guid targetResource, AccountProfile profile, ServerCharacterInfo characterToTransfer, string owningServer) { // request auth ticket from game server PacketRelayPlayerHandoffRequest p = (PacketRelayPlayerHandoffRequest)CreatePacket((int)ServerPacketType.RequestPlayerHandoff, 0, false, false); p.NeedsReply = true; p.Player = userId; p.SharedSecret = Server.SharedClusterServerSecret; p.AccountName = accountName; p.TargetResource = targetResource; p.Profile = profile; p.OwningServer = owningServer; p.Character = characterToTransfer; Log1.Logger("Server.Outbound.Network").Info("Requesting authenticated client *" + p.AccountName + "* to be handed off to game server " + Name + "."); Send(p); }