@@ -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