servuo/Scripts/Services/PreventInaccess.cs
TrueUO f608d123a4
Bug Fixes (#4762)
-Fixed issue where client helpers could bypass the container gump and add items directly to the seed box
-SearedFireAntGoo is no longer stackable
-Blue NPC's (mainly vendors, not initial innocent) can no longer be attacked on trammel maps
-Aggressors/Aggressed from pet masters now works properly. This was suspected to crated large numbers to redundant aggressor/aggressed added to a mobiles aggressor/aggressed lists
-Aggressive action for healing a mobile while fighting another mobile has been re-enabled
-AuraDamage is now a harmful act, ie those affected will aggro on your pet!
-MLDryads should no longer attack other wild creatures during Blackthorn Invasion Instance
-More code cleanup
2020-04-21 17:25:24 -07:00

87 lines
2.8 KiB
C#

using System.Collections.Generic;
namespace Server.Misc
{
/*
* This system prevents the inability for server staff to
* access their server due to data overflows during login.
*
* Whenever a staff character's NetState is disposed right after
* the login process, the character is moved to and logged out
* at a "safe" alternative.
*
* The location the character was moved from will be reported
* to the player upon the next successful login.
*
* This system does not affect non-staff players.
*/
public static class PreventInaccess
{
public static readonly bool Enabled = true;
private static readonly LocationInfo[] m_Destinations = new LocationInfo[]
{
new LocationInfo(new Point3D(5275, 1163, 0), Map.Felucca), // Jail
new LocationInfo(new Point3D(5275, 1163, 0), Map.Trammel),
new LocationInfo(new Point3D(5445, 1153, 0), Map.Felucca), // Green acres
new LocationInfo(new Point3D(5445, 1153, 0), Map.Trammel)
};
private static Dictionary<Mobile, LocationInfo> m_MoveHistory;
public static void Initialize()
{
m_MoveHistory = new Dictionary<Mobile, LocationInfo>();
if (Enabled)
EventSink.Login += OnLogin;
}
public static void OnLogin(LoginEventArgs e)
{
Mobile from = e.Mobile;
if (from == null || from.IsPlayer())
return;
if (HasDisconnected(from))
{
if (!m_MoveHistory.ContainsKey(from))
m_MoveHistory[from] = new LocationInfo(from.Location, from.Map);
LocationInfo dest = GetRandomDestination();
from.Location = dest.Location;
from.Map = dest.Map;
}
else if (m_MoveHistory.ContainsKey(from))
{
LocationInfo orig = m_MoveHistory[from];
from.SendMessage("Your character was moved from {0} ({1}) due to a detected client crash.", orig.Location, orig.Map);
m_MoveHistory.Remove(from);
}
}
private static bool HasDisconnected(Mobile m)
{
return (m.NetState == null || m.NetState.Socket == null);
}
private static LocationInfo GetRandomDestination()
{
return m_Destinations[Utility.Random(m_Destinations.Length)];
}
private class LocationInfo
{
private readonly Point3D m_Location;
private readonly Map m_Map;
public LocationInfo(Point3D loc, Map map)
{
m_Location = loc;
m_Map = map;
}
public Point3D Location => m_Location;
public Map Map => m_Map;
}
}
}