#region Header
// Voxpire _,-'/-'/ Dupe.cs
// . __,-; ,'( '/
// \. `-.__`-._`:_,-._ _ , . ``
// `:-._,------' ` _,`--` -: `_ , ` ,' :
// `---..__,,--' (C) 2015 ` -'. -'
// # Vita-Nex [http://core.vita-nex.com] #
// {o)xxx|===============- # -===============|xxx(o}
// # The MIT License (MIT) #
#endregion
#region References
using System;
using System.Linq;
using Server.Items;
using Server.Targeting;
#endregion
namespace Server.Commands
{
public class Dupe
{
public static void Initialize()
{
CommandSystem.Register("Dupe", AccessLevel.GameMaster, Dupe_OnCommand);
CommandSystem.Register("DupeInBag", AccessLevel.GameMaster, DupeInBag_OnCommand);
}
[Usage("Dupe [amount]")]
[Description("Dupes a targeted item.")]
private static void Dupe_OnCommand(CommandEventArgs e)
{
var amount = 1;
if (e.Length > 0)
{
amount = e.GetInt32(0);
}
e.Mobile.Target = new DupeTarget(false, Math.Max(1, amount));
e.Mobile.SendMessage("What do you wish to dupe?");
}
[Usage("DupeInBag <count>")]
[Description("Dupes an item at it's current location (count) number of times.")]
private static void DupeInBag_OnCommand(CommandEventArgs e)
{
var amount = 1;
if (e.Length > 0)
{
amount = e.GetInt32(0);
}
e.Mobile.Target = new DupeTarget(true, Math.Max(1, amount));
e.Mobile.SendMessage("What do you wish to dupe?");
}
private class DupeTarget : Target
{
private readonly bool _InBag;
private readonly int _Amount;
public DupeTarget(bool inbag, int amount)
: base(15, false, TargetFlags.None)
{
_InBag = inbag;
_Amount = amount;
}
protected override void OnTarget(Mobile m, object targ)
{
var done = false;
if (!(targ is Item))
{
m.SendMessage("You can only dupe items.");
return;
}
CommandLogging.WriteLine(
m,
"{0} {1} duping {2} (inBag={3}; amount={4})",
m.AccessLevel,
CommandLogging.Format(m),
CommandLogging.Format(targ),
_InBag,
_Amount);
var item = (Item)targ;
Container pack;
if (_InBag)
{
if (item.Parent is Container)
{
pack = (Container)item.Parent;
}
else if (item.Parent is Mobile)
{
pack = ((Mobile)item.Parent).Backpack;
}
else
{
pack = null;
}
}
else
{
pack = m.Backpack;
}
var t = item.GetType();
var a = t.GetCustomAttributes<ConstructableAttribute>(false);
if (a != null && a.Length > 0 && a.Any(ca => ca.AccessLevel > m.AccessLevel))
{
return;
}
try
{
m.SendMessage("Duping {0}...", _Amount);
var noCtor = false;
for (var i = 0; i < _Amount; i++)
{
var o = t.CreateInstanceSafe<Item>();
if (o == null)
{
noCtor = true;
break;
}
CopyProperties(item, o);
o.Parent = null;
item.OnAfterDuped(o);
if (item is Container && o is Container)
{
m.SendMessage("Duping Container Children...");
DupeChildren(m, (Container)item, (Container)o);
}
if (pack != null)
{
pack.DropItem(o);
}
else
{
o.MoveToWorld(m.Location, m.Map);
}
o.UpdateTotals();
o.InvalidateProperties();
o.Delta(ItemDelta.Update);
CommandLogging.WriteLine(
m,
"{0} {1} duped {2} creating {3}",
m.AccessLevel,
CommandLogging.Format(m),
CommandLogging.Format(item),
CommandLogging.Format(o));
}
if (!noCtor)
{
m.SendMessage("Done");
done = true;
}
}
catch
{
m.SendMessage("Error!");
return;
}
if (!done)
{
m.SendMessage("Unable to dupe. Item must have a 0 parameter constructor.");
}
else
{
item.Delta(ItemDelta.Update);
}
}
}
public static Item DupeItem(Item item)
{
return DupeItem(null, item);
}
public static Item DupeItem(Mobile m, Item item)
{
try
{
var t = item.GetType();
if (m != null)
{
var a = t.GetCustomAttributes<ConstructableAttribute>(false);
if (a != null && a.Length > 0 && a.Any(ca => ca.AccessLevel > m.AccessLevel))
{
return null;
}
}
var o = t.CreateInstanceSafe<Item>();
if (o == null)
{
return null;
}
CopyProperties(item, o);
o.Parent = null;
item.OnAfterDuped(o);
if (item is Container && o is Container)
{
DupeChildren(m, (Container)item, (Container)o);
}
if (m != null)
{
o.MoveToWorld(m.Location, m.Map);
o.UpdateTotals();
o.InvalidateProperties();
o.Delta(ItemDelta.Update);
CommandLogging.WriteLine(m, "{0} {1} duped {2} creating {3}", m.AccessLevel, CommandLogging.Format(m),
CommandLogging.Format(item), CommandLogging.Format(o));
}
item.Delta(ItemDelta.Update);
return o;
}
catch
{
return null;
}
}
public static void DupeChildren(Container src, Container dest)
{
DupeChildren(null, src, dest);
}
public static void DupeChildren(Mobile m, Container src, Container dest)
{
foreach (var item in src.Items)
{
try
{
var t = item.GetType();
if (m != null)
{
var a = t.GetCustomAttributes<ConstructableAttribute>(false);
if (a != null && a.Length > 0 && a.Any(ca => ca.AccessLevel > m.AccessLevel))
{
continue;
}
}
var o = t.CreateInstanceSafe<Item>();
if (o == null)
{
continue;
}
CopyProperties(item, o);
o.Parent = null;
item.OnAfterDuped(o);
if (item is Container && o is Container)
{
DupeChildren(m, (Container)item, (Container)o);
}
dest.DropItem(o);
o.Location = item.Location;
o.UpdateTotals();
o.InvalidateProperties();
o.Delta(ItemDelta.Update);
CommandLogging.WriteLine(
m,
"{0} {1} duped {2} creating {3}",
m.AccessLevel,
CommandLogging.Format(m),
CommandLogging.Format(item),
CommandLogging.Format(o));
item.Delta(ItemDelta.Update);
}
catch
{ }
}
}
public static void CopyProperties(Item src, Item dest)
{
var props = src.GetType().GetProperties();
foreach (var p in props)
{
try
{
if (p.CanRead && p.CanWrite)
{
p.SetValue(dest, p.GetValue(src, null), null);
}
}
catch
{ }
}
}
}
}
I tried this on a ver 54 server a modified copy of Land of Archon . I replaced the scripts\commands\dupe with this one server still complies but can not dupe a rewards box with items in it . Using Pandora's gift box is not an option as there are 4 version's I would like to give out .
There's only a few friends an family playing but would be nice to have abilities to dupe a chest of items .
We use essential cookies to make this site work, and optional cookies to enhance your experience.