public static bool Warp(Creature creature, Item item, bool warpPartyMembers)
{
if (creature == null)
throw new ArgumentNullException("creature");
if (item == null)
throw new ArgumentNullException("item");
// Check meta data
if (!item.MetaData1.Has("TARGET"))
{
Send.ServerMessage(creature, Localization.Get("No target found."));
return false;
}
// Get target
var target = item.MetaData1.GetString("TARGET");
// Get location based on target
Location loc;
if (target.StartsWith("pos")) // pos@regionId,x,y
{
var match = Regex.Match(target, @"pos@(?<regionId>[0-9]+),(?<x>[0-9]+),(?<y>[0-9]+)");
if (!match.Success)
{
Log.Warning("HiddenTownBack: Invalid position target: {0}", target);
Send.ServerMessage(creature, Localization.Get("Invalid target."));
return false;
}
loc.RegionId = Convert.ToInt32(match.Groups["regionId"].Value);
loc.X = Convert.ToInt32(match.Groups["x"].Value);
loc.Y = Convert.ToInt32(match.Groups["y"].Value);
}
else if (target.StartsWith("portal")) // portal@name
{
// Remove "portal@" prefix
target = target.Substring(7).Trim();
// Get portal data
var portalData = AuraData.PortalDb.Find(target);
if (portalData == null)
{
Log.Warning("HiddenTownBack: Unknown target: {0}", target);
Send.ServerMessage(creature, Localization.Get("Unknown target."));
return false;
}
// Get location
try
{
loc = new Location(portalData.Location);
}
catch
{
Log.Warning("HiddenTownBack: Invalid portal location: {0}", target);
Send.ServerMessage(creature, Localization.Get("Invalid portal location."));
return false;
}
}
else if (target == "last_town")
{
loc = new Location(creature.LastTown);
}
else
{
Log.Warning("HiddenTownBack: Unknown target type: {0}", target);
Send.ServerMessage(creature, Localization.Get("Unknown target type."));
return false;
}
// Warp party
if (warpPartyMembers && item.HasTag("/party_enable/") && creature.Party.Leader == creature)
{
var partyMembers = creature.Party.GetMembersInRange(creature);
foreach (var member in partyMembers)
member.Warp(loc);
}
// Warp user after we got the party members
creature.Warp(loc);
return true;
}
}