private static void Postfix(MechComponentRef mechComponent, bool isOnMech, WorkOrderEntry_RepairComponent __result) { var mech = MechLabPanel_LoadMech.CurrentMech; if (mechComponent == null) { return; } float tpmod = 1; float cbmod = 1; Logger.LogDebug($"Module Repair Cost for {mechComponent.ComponentDefID}: "); Logger.LogDebug("***************************************"); foreach (var tag in ArmorRepair.ModSettings.RepairCostByTag) { if (mech != null && mech.Chassis.ChassisTags.Contains(tag.Tag)) { Logger.LogDebug($" Chassis {tag.Tag} mods tp:{tag.RepairTPCost:0.00} cb:{tag.RepairCBCost:0.00}"); tpmod *= tag.RepairTPCost; cbmod *= tag.RepairCBCost; } if (mechComponent.Def.ComponentTags.Contains(tag.Tag)) { Logger.LogDebug($" {mechComponent.ComponentDefID} {tag.Tag} mods tp:{tag.RepairTPCost:0.00} cb:{tag.RepairCBCost:0.00}"); tpmod *= tag.RepairTPCost; cbmod *= tag.RepairCBCost; } } if (tpmod != 1 || cbmod != 1) { var trav = new Traverse(__result); if (tpmod != 1) { var cost = trav.Field <int>("Cost"); int new_cost = Mathf.CeilToInt(cost.Value * tpmod); Logger.LogDebug($" TP cost: {cost.Value} * {tpmod:0.000} = {new_cost}"); cost.Value = new_cost; } if (cbmod != 1) { var cost = trav.Field <int>("CBillCost"); int new_cost = Mathf.CeilToInt(cost.Value * cbmod); Logger.LogDebug($" CBIll cost: {cost.Value} * {cbmod:0.000} = {new_cost}"); cost.Value = new_cost; } } else { Logger.LogDebug(" no need to adjust, return"); } Logger.LogDebug("***************************************"); }
public void ComponentRepairWorkOrder(MechComponentRef mechComponent, bool isOnMech, WorkOrderEntry_RepairComponent result) { var workOrderCosts = mechComponent.Def.GetComponent <WorkOrderCosts>(); if (workOrderCosts == null) { return; } if (mechComponent.DamageLevel == ComponentDamageLevel.Destroyed) { ApplyCosts(result, workOrderCosts.RepairDestroyed); } else { ApplyCosts(result, workOrderCosts.Repair); } }
public static bool Prefix(MechBayPanel __instance, MechBayMechUnitElement mechElement) { Logger.LogDebug("We are repairing, yes?"); Logger.Log("We are repairing, yes?"); if (!Core.Settings.RepairRearm) { return(true); } var sim = UnityGameInstance.BattleTechGame.Simulation; MechDef mechDef = mechElement.MechDef; WorkOrderEntry_MechLab workOrderEntry_MechLab = __instance.Sim.GetWorkOrderEntryForMech(mechDef); bool flag = false; for (int i = 0; i < mechDef.Inventory.Length; i++) { MechComponentRef mechComponentRef = mechDef.Inventory[i]; if (mechComponentRef.DamageLevel != ComponentDamageLevel.Functional && mechComponentRef.DamageLevel != ComponentDamageLevel.Installing && !MechValidationRules.MechComponentUnderMaintenance(mechComponentRef, MechValidationLevel.MechLab, workOrderEntry_MechLab)) { flag = true; break; } } if (!mechDef.IsDamaged && !flag) { return(false); } List <ChassisLocations> list = new List <ChassisLocations>(); __instance.pendingWorkOrderNew = false; __instance.pendingWorkOrderEntriesToAdd.Clear(); if (workOrderEntry_MechLab == null) { workOrderEntry_MechLab = new WorkOrderEntry_MechLab(WorkOrderType.MechLabGeneric, "MechLab-BaseWorkOrder", Strings.T("Modify 'Mech - {0}", new object[] { mechDef.Description.Name }), mechDef.GUID, 0, Strings.T(__instance.Sim.Constants.Story.GeneralMechWorkOrderCompletedText, new object[] { mechDef.Description.Name })); workOrderEntry_MechLab.SetMechDef(mechDef); __instance.pendingWorkOrderNew = true; } __instance.pendingWorkOrder = workOrderEntry_MechLab; if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.Head, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.Head.CurrentInternalStructure < mechDef.Chassis.Head.InternalStructure) { list.Add(ChassisLocations.Head); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.CenterTorso, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.CenterTorso.CurrentInternalStructure < mechDef.Chassis.CenterTorso.InternalStructure) { list.Add(ChassisLocations.CenterTorso); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.LeftTorso, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.LeftTorso.CurrentInternalStructure < mechDef.Chassis.LeftTorso.InternalStructure) { list.Add(ChassisLocations.LeftTorso); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.RightTorso, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.RightTorso.CurrentInternalStructure < mechDef.Chassis.RightTorso.InternalStructure) { list.Add(ChassisLocations.RightTorso); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.LeftLeg, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.LeftLeg.CurrentInternalStructure < mechDef.Chassis.LeftLeg.InternalStructure) { list.Add(ChassisLocations.LeftLeg); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.RightLeg, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.RightLeg.CurrentInternalStructure < mechDef.Chassis.RightLeg.InternalStructure) { list.Add(ChassisLocations.RightLeg); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.LeftArm, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.LeftArm.CurrentInternalStructure < mechDef.Chassis.LeftArm.InternalStructure) { list.Add(ChassisLocations.LeftArm); } if (!MechValidationRules.MechStructureUnderMaintenance(ChassisLocations.RightArm, MechValidationLevel.MechLab, workOrderEntry_MechLab) && mechDef.RightArm.CurrentInternalStructure < mechDef.Chassis.RightArm.InternalStructure) { list.Add(ChassisLocations.RightArm); } if (list.Count < 1 && !flag) { GenericPopupBuilder.Create("Repair Already Ordered", string.Format("A repair order has already been queued for " + "{0}", mechDef.Name)).AddFader(new UIColorRef?(LazySingletonBehavior <UIManager> .Instance.UILookAndColorConstants.PopupBackfill), 0f, true).Render(); __instance.OnRepairAllCancelled(); return(false); } int num = 0; int num2 = 0; for (int j = 0; j < list.Count; j++) { LocationDef chassisLocationDef = mechDef.GetChassisLocationDef(list[j]); LocationLoadoutDef locationLoadoutDef = mechDef.GetLocationLoadoutDef(list[j]); int structureCount = Mathf.RoundToInt(Mathf.Max(0f, chassisLocationDef.InternalStructure - locationLoadoutDef.CurrentInternalStructure)); WorkOrderEntry_RepairMechStructure workOrderEntry_RepairMechStructure = __instance.Sim.CreateMechRepairWorkOrder(mechDef.GUID, list[j], structureCount); __instance.pendingWorkOrderEntriesToAdd.Add(workOrderEntry_RepairMechStructure); num += workOrderEntry_RepairMechStructure.GetCost(); num2 += workOrderEntry_RepairMechStructure.GetCBillCost(); } StringBuilder stringBuilder = new StringBuilder(); int num3 = 0; for (int k = 0; k < mechDef.Inventory.Length; k++) { MechComponentRef mechComponentRef2 = mechDef.Inventory[k]; if (string.IsNullOrEmpty(mechComponentRef2.SimGameUID)) { mechComponentRef2.SetSimGameUID(__instance.Sim.GenerateSimGameUID()); } if (mechComponentRef2.DamageLevel == ComponentDamageLevel.Destroyed) { if (num3 < 1) { stringBuilder.Append("\n\nThe following components have been Destroyed. If you continue with the Repair, " + "replacement Components will NOT be installed. If you want to replace them with identical or " + "different Components, you must Refit the 'Mech.\n\n"); } if (num3 < 5) { stringBuilder.Append(mechComponentRef2.MountedLocation.ToString()); stringBuilder.Append(": "); stringBuilder.Append(mechComponentRef2.Def.Description.Name); stringBuilder.Append("\n"); } num3++; WorkOrderEntry_InstallComponent workOrderEntry_InstallComponent = sim.CreateComponentInstallWorkOrder(__instance.selectedMech.MechDef.GUID, mechComponentRef2, ChassisLocations.None, mechComponentRef2.MountedLocation); __instance.pendingWorkOrderEntriesToAdd.Insert(0, workOrderEntry_InstallComponent); num += workOrderEntry_InstallComponent.GetCost(); num2 += workOrderEntry_InstallComponent.GetCBillCost(); } else if (mechComponentRef2.DamageLevel != ComponentDamageLevel.Functional && mechComponentRef2.DamageLevel != ComponentDamageLevel.Installing) { WorkOrderEntry_RepairComponent workOrderEntry_RepairComponent = __instance.Sim.CreateComponentRepairWorkOrder(mechComponentRef2, true); __instance.pendingWorkOrderEntriesToAdd.Add(workOrderEntry_RepairComponent); num += workOrderEntry_RepairComponent.GetCost(); num2 += workOrderEntry_RepairComponent.GetCBillCost(); } } foreach (var foo in __instance.pendingWorkOrderEntriesToAdd) { Logger.LogDebug(foo.ID); } Logger.LogDebug("Armor Repair Section"); float armorLoss = 1; bool armorTag = false; foreach (var tag in mechDef.MechTags) { Logger.LogDebug(tag); if (tag.StartsWith("XLRPArmor")) { armorTag = true; string[] parsedString = tag.Split('_'); armorLoss = float.Parse(parsedString[1]); } Logger.LogDebug(armorLoss.ToString()); } if (armorTag) { if (!mechDef.MechTags.Contains("XLRP_Armor_Repairing")) { mechDef.MechTags.Add("XLRP_Armor_Repairing"); } int brokenArmor = (int)((1 - armorLoss) * mechDef.MechDefAssignedArmor); int frontArmor = (int)(mechDef.MechDefAssignedArmor - mechDef.CenterTorso.AssignedRearArmor - mechDef.LeftTorso.AssignedRearArmor - mechDef.RightTorso.AssignedRearArmor); int rearArmor = (int)(mechDef.CenterTorso.AssignedRearArmor + mechDef.LeftTorso.AssignedRearArmor + mechDef.RightTorso.AssignedRearArmor); Logger.LogDebug($"brokenAmor: {brokenArmor}, frontArmor: {frontArmor}, rearArmor: {rearArmor}"); WorkOrderEntry_ModifyMechArmor subEntry = sim.CreateMechArmorModifyWorkOrder(__instance.selectedMech.MechDef.GUID, ChassisLocations.All, brokenArmor, frontArmor, rearArmor); __instance.pendingWorkOrderEntriesToAdd.Add(subEntry); num += subEntry.GetCost(); num2 += subEntry.GetCBillCost(); } num = Mathf.Max(1, Mathf.CeilToInt((float)num / (float)__instance.Sim.MechTechSkill)); if (num3 > 5) { stringBuilder.Append(Strings.T("...\nAnd {0} additional destroyed components.\n", new object[] { num3 - 5 })); } string body = Strings.T("Repairing {0} will cost {1:n0} C-Bills and take {2} Days.{3}\n\nProceed?", new object[] { mechDef.Name, num2, num, stringBuilder.ToString() }); GenericPopupBuilder.Create("Repair 'Mech?", body).AddButton("Cancel", new Action(__instance.OnRepairAllCancelled), true, null). AddButton("Repair", new Action(__instance.OnRepairAllAccepted), true, null).AddFader(new UIColorRef?(LazySingletonBehavior <UIManager> .Instance.UILookAndColorConstants.PopupBackfill), 0f, true).Render(); return(false); }
// this.selectedMech public static void Postfix(SimGameState __instance, MechComponentRef mechComponent, bool isOnMech, ref WorkOrderEntry_RepairComponent __result) { try { WorkOrderCostsHandler.Shared.ComponentRepairWorkOrder(mechComponent, isOnMech, __result); } catch (Exception e) { Control.mod.Logger.LogError(e); } }