Skip to content

Commit c13d3f6

Browse files
committed
fix anvil multiple enchants
1 parent 77daa9c commit c13d3f6

File tree

1 file changed

+60
-11
lines changed

1 file changed

+60
-11
lines changed

src/MiNET/MiNET/ItemStackInventoryManager.cs

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -540,25 +540,37 @@ protected virtual void ProcessCraftRecipeOptionalAction(CraftRecipeOptionalActio
540540

541541
if (secondItem is ItemEnchantedBook) // Enchanting mode
542542
{
543-
NbtList nbt = GetContainerItem(13, 2).ExtraData.Get<NbtList>("ench").Clone() as NbtList;
544-
data.Add(nbt);
545-
}
546-
else if (secondItem is ItemAir) // Rename mode
547-
{
548-
NbtCompound nbt = new NbtCompound("display")
543+
NbtList nbt = new NbtList("ench");
544+
545+
if (sourceItem.ExtraData.Get<NbtList>("ench") == null)
549546
{
550-
new NbtString("Name", strings[0]),
551-
};
547+
nbt = secondItem.ExtraData.Get<NbtList>("ench").Clone() as NbtList;
548+
}
549+
else
550+
{
551+
nbt = sourceItem.ExtraData.Get<NbtList>("ench").Clone() as NbtList;
552+
553+
foreach (NbtCompound ench in secondItem.ExtraData.Get<NbtList>("ench"))
554+
{
555+
nbt.Add(ench.Clone() as NbtCompound);
556+
}
557+
data.Remove("ench");
558+
}
559+
552560
data.Add(nbt);
553561
}
554-
else if (secondItem is ItemBlock) // Repairing mode
562+
else if (secondItem is ItemBlock or ItemLeather or ItemIronIngot or ItemGoldIngot or ItemDiamond or ItemScute or ItemPhantomMembrane) // Repairing mode
555563
{
556564
int damage1 = data.Get<NbtInt>("Damage").Value;
557565
int maxDurability = sourceItem.GetMaxUses();
558566

559567
int damaged = maxDurability - ((maxDurability - damage1) + (maxDurability / 4) * secondItem.Count);
560568

561-
data.Get<NbtInt>("Damage").Value = Math.Max((int) damaged, 0);
569+
data.Get<NbtInt>("Damage").Value = Math.Max(damaged, 0);
570+
}
571+
else if (secondItem is ItemAir) // Renaming mode
572+
{
573+
//nothing, handled below
562574
}
563575
else if (secondItem is Item) // Combining mode
564576
{
@@ -572,9 +584,31 @@ protected virtual void ProcessCraftRecipeOptionalAction(CraftRecipeOptionalActio
572584
maxDurability = sourceItem.Durability;
573585
}
574586

587+
if (secondItem.ExtraData.Get<NbtList>("ench") != null)
588+
{
589+
NbtList nbt = new NbtList("ench");
590+
591+
if (sourceItem.ExtraData.Get<NbtList>("ench") == null)
592+
{
593+
nbt = secondItem.ExtraData.Get<NbtList>("ench").Clone() as NbtList;
594+
}
595+
else
596+
{
597+
nbt = sourceItem.ExtraData.Get<NbtList>("ench").Clone() as NbtList;
598+
599+
foreach (NbtCompound ench in secondItem.ExtraData.Get<NbtList>("ench"))
600+
{
601+
nbt.Add(ench.Clone() as NbtCompound);
602+
}
603+
}
604+
605+
data.Remove("ench");
606+
data.Add(nbt);
607+
}
608+
575609
repairCost = repairCost * 2;
576610

577-
var damaged = maxDurability - (maxDurability - damage1) + (maxDurability - damage2) + (0.12 * maxDurability);
611+
var damaged = maxDurability - ((maxDurability - damage1) + (maxDurability - damage2) + (0.12 * maxDurability));
578612

579613
data.Get<NbtInt>("Damage").Value = Math.Max((int)damaged, 0);
580614
data.Get<NbtInt>("RepairCost").Value = repairCost;
@@ -583,6 +617,21 @@ protected virtual void ProcessCraftRecipeOptionalAction(CraftRecipeOptionalActio
583617
//_player.ExperienceManager.SendAttributes();
584618
}
585619

620+
if (strings.Count > 0) // Real renaming
621+
{
622+
NbtCompound nbt = new NbtCompound("display")
623+
{
624+
new NbtString("Name", strings[0]),
625+
};
626+
627+
if (data.Contains("display"))
628+
{
629+
data.Remove("display");
630+
}
631+
632+
data.Add(nbt);
633+
}
634+
586635
var item = sourceItem.Clone() as Item;
587636
item.Damage = data.Get<NbtInt>("Damage").Value;
588637
item.UniqueId = Environment.TickCount;

0 commit comments

Comments
 (0)