THANK YOU!!!! that was the missing link just ran it now it works perfect added logic for equipping the shield from the inventory.
That error was causing all the problems that was making me think about trying jobs.
Once again thank you so much. Now all i have to do clean up the shield class.
Code Select
using System;
using Verse;
using RimWorld;
using Harmony;
namespace Shield
{
[StaticConstructorOnStartup]
class Harmonypatches
{
private static readonly Type shieldPatchType = typeof(Harmonypatches);
static Harmonypatches()
{
HarmonyInstance h = HarmonyInstance.Create("ShieldHarmony");
h.Patch(AccessTools.Method(typeof(Pawn_EquipmentTracker), nameof(Pawn_EquipmentTracker.AddEquipment)),
postfix: new HarmonyMethod(shieldPatchType, nameof(ShieldPatchAddEquipment)));
h.Patch(AccessTools.Method(typeof(Pawn_ApparelTracker), nameof(Pawn_ApparelTracker.Wear)),
postfix: new HarmonyMethod(shieldPatchType, nameof(ShieldPatchWearApparel)));
}
public static void ShieldPatchAddEquipment(Pawn_EquipmentTracker __instance, ThingWithComps newEq)
{
Pawn owner = __instance.pawn;
// must have picked up a weapon
if (PawnHasShieldEquiped(owner) || PawnHasShieldInInvnetory(owner))
{
if (newEq.def.IsWeapon)
{
if (PawnHasValidEquiped(owner) && PawnHasShieldInInvnetory(owner))
{
for (int i = 0; i < owner.inventory.innerContainer.Count; i++)
{
foreach (ThingCategoryDef tgd in owner.inventory.innerContainer[i].def.thingCategories)
{
if (tgd.defName == "Shield")
{
Thing whocares;
__instance.pawn.inventory.innerContainer.TryDrop(owner.inventory.innerContainer[i], ThingPlaceMode.Direct, out whocares, null, null);
owner.apparel.Wear(whocares as Apparel);
}
}
}
}
else
{
if (PawnHasShieldEquiped(owner) && !PawnHasValidEquiped(owner))
{
Apparel shield = null;
// do we have a shield equipped
for(int i = 0; i < owner.inventory.innerContainer.Count; i++)
{
foreach (ThingCategoryDef tgd in owner.inventory.innerContainer[i].def.thingCategories)
{
if (tgd.defName == "Shield")
{
Thing whocares;
__instance.pawn.inventory.innerContainer.TryDrop(owner.inventory.innerContainer[i], ThingPlaceMode.Direct, out whocares, null, null);
}
}
}
for (int i = 0; i < owner.apparel.WornApparelCount; i++)
{
foreach (ThingCategoryDef tgd in owner.apparel.WornApparel[i].def.thingCategories)
{
if (tgd.defName == "Shield")
{
shield = owner.apparel.WornApparel[i];
}
}
}
// we have a shield equipped
if (shield != null)
{
owner.apparel.Remove(shield);
owner.inventory.innerContainer.TryAddOrTransfer(shield, false);
}
}
}
}
}
}
public static void ShieldPatchWearApparel(Pawn_EquipmentTracker __instance, Apparel newApparel)
{
bool shield = false;
foreach (ThingCategoryDef tgd in newApparel.def.thingCategories)
{
// we have a shield in the inventory
if (tgd.defName == "Shield")
{
shield = true;
}
}
if (!shield)
{
return;
}
Pawn owner = __instance.pawn;
// must have picked up a weapon
if (PawnHasShieldInInvnetory(owner))
{
// do we have a shield equipped
for (int i = 0; i < owner.inventory.innerContainer.Count; i++)
{
foreach (ThingCategoryDef tgd in owner.inventory.innerContainer[i].def.thingCategories)
{
if (tgd.defName == "Shield")
{
Thing whocares;
__instance.pawn.inventory.innerContainer.TryDrop(owner.inventory.innerContainer[i], ThingPlaceMode.Direct, out whocares, null, null);
}
}
}
Apparel wornshield = null;
for (int i = 0; i < owner.apparel.WornApparelCount; i++)
{
foreach (ThingCategoryDef tgd in owner.apparel.WornApparel[i].def.thingCategories)
{
if (tgd.defName == "Shield")
{
wornshield = owner.apparel.WornApparel[i];
}
}
}
// we have a shield equipped
if (wornshield != null)
{
owner.apparel.Remove(wornshield);
owner.inventory.innerContainer.TryAddOrTransfer(wornshield, false);
}
}
else
{
if (!PawnHasValidEquiped(owner))
{
Apparel wornshield = null;
for (int i = 0; i < owner.apparel.WornApparelCount; i++)
{
foreach (ThingCategoryDef tgd in owner.apparel.WornApparel[i].def.thingCategories)
{
if (tgd.defName == "Shield")
{
wornshield = owner.apparel.WornApparel[i];
}
}
}
// we have a shield equipped
if (wornshield != null)
{
owner.apparel.Remove(wornshield);
owner.inventory.innerContainer.TryAddOrTransfer(wornshield, false);
}
}
}
}
// check if a pawn has a shield equipped
public static bool PawnHasShieldEquiped(Pawn pawn)
{
bool revalue = false;
Apparel shield = null;
// do we have a shield equipped
foreach (Apparel a in pawn.apparel.WornApparel)
{
foreach (ThingCategoryDef tgd in a.def.thingCategories)
{
if (tgd.defName == "Shield")
{
shield = a;
}
}
}
// we have a shield equipped
if (shield != null)
{
revalue = true;
}
return revalue;
}
// check if a pawn has a shield in inventory
public static bool PawnHasShieldInInvnetory(Pawn pawn)
{
bool revalue = false;
foreach (Thing a in pawn.inventory.innerContainer)
{
foreach (ThingCategoryDef tgd in a.def.thingCategories)
{
// we have a shield in the inventory
if (tgd.defName == "Shield")
{
revalue = true;
}
}
}
return revalue;
}
// check if the pawn picked up a shield
public static bool PawnPickedUpAShield(ThingWithComps newEquipment)
{
bool reValue = false;
foreach (ThingCategoryDef tgd in newEquipment.def.thingCategories)
{
if (tgd.defName == "Shield")
{
reValue = true;
}
}
return reValue;
}
// check if equiped weapon can be used with shield
public static bool PawnHasValidEquiped(Pawn pawn)
{
if (pawn.equipment.Primary.def.IsMeleeWeapon)
{
// add logic for the two handed weaopns
return true;
}
if (pawn.equipment.Primary.def.defName.Equals("Gun_Pistol"))
{
return true;
}
if (pawn.equipment.Primary.def.defName.Equals("Gun_PDW"))
{
return true;
}
if (pawn.equipment.Primary.def.defName.Equals("Gun_HeavySMG"))
{
return true;
}
if (pawn.equipment.Primary.def.defName.Equals("Pila"))
{
return true;
}
if (pawn.equipment.Primary.def.weaponTags.Contains("MedievalShields_ValidSidearm"))
{
return true;
}
return false;
}
}
}
That error was causing all the problems that was making me think about trying jobs.
Once again thank you so much. Now all i have to do clean up the shield class.