private void OnSettlementEntered(MobileParty party, Settlement settlement, Hero hero) { if (party?.LeaderHero == null || !settlement.IsTown && !settlement.IsVillage || !party.IsLordParty && !party.IsCaravan) { return; } Dictionary <ItemCategory, int> dictionary1 = new Dictionary <ItemCategory, int>(5); MobileParty mobileParty = party; TroopRoster troopRoster1; if (mobileParty == null) { troopRoster1 = (TroopRoster)null; } else { Hero leaderHero = mobileParty.LeaderHero; troopRoster1 = leaderHero != null?leaderHero.getTemplate() : (TroopRoster)null; } TroopRoster troopRoster2 = troopRoster1; Town town = (Town)null; if (settlement.IsTown) { town = settlement.GetComponent <Town>(); } foreach (TroopRosterElement troopRosterElement in party.MemberRoster) { int val1 = troopRosterElement.NumberReadyToUpgrade; if (val1 > 0) { foreach (CharacterObject upgradeTarget in troopRosterElement.Character.UpgradeTargets) { ItemCategory itemFromCategory = upgradeTarget.UpgradeRequiresItemFromCategory; if ((town == null || town.MarketData.GetItemCountOfCategory(itemFromCategory) != 0) && itemFromCategory != null) { if (troopRoster2 != (TroopRoster)null) { int troopCount = troopRoster2.GetTroopCount(upgradeTarget); if (troopCount != 0) { if (troopCount > 1) { val1 = Math.Min(val1, troopCount - party.MemberRoster.GetTroopCount(upgradeTarget)); if (val1 <= 0) { continue; } } } else { continue; } } if (dictionary1.ContainsKey(itemFromCategory)) { dictionary1[itemFromCategory] += val1; } else { dictionary1[itemFromCategory] = val1; } } } } } if (dictionary1.Count <= 0) { return; } if (town != null) { foreach (ItemCategory key in dictionary1.Keys) { if (dictionary1[key] > town.MarketData.GetItemCountOfCategory(key)) { dictionary1[key] = town.MarketData.GetItemCountOfCategory(key); } } } Hero leaderHero1 = party.LeaderHero; Dictionary <ItemCategory, List <ItemRosterElement> > dictionary2 = new Dictionary <ItemCategory, List <ItemRosterElement> >(dictionary1.Count); SettlementComponent market = settlement.GetComponent(typeof(SettlementComponent)); foreach (ItemRosterElement itemRosterElement in settlement.ItemRoster) { ItemCategory itemCategory = itemRosterElement.EquipmentElement.Item.ItemCategory; if (dictionary1.ContainsKey(itemCategory) && !dictionary2.ContainsKey(itemCategory)) { dictionary2[itemCategory] = new List <ItemRosterElement>(); } dictionary2[itemCategory].Add(itemRosterElement); } foreach (KeyValuePair <ItemCategory, List <ItemRosterElement> > keyValuePair in dictionary2) { foreach (ItemRosterElement subject in keyValuePair.Value.OrderBy <ItemRosterElement, int>((Func <ItemRosterElement, int>)(o => market.GetItemPrice(o.EquipmentElement, party))).ToList <ItemRosterElement>()) { int num = Math.Min(subject.Amount, dictionary1[keyValuePair.Key]); while (num > 0 && leaderHero1.Gold > market.GetItemPrice(subject.EquipmentElement, party)) { SellItemsAction.Apply(settlement.Party, party.Party, subject, 1, settlement); --num; dictionary1[keyValuePair.Key]--; } if (num <= 0) { if (dictionary1[keyValuePair.Key] == 0) { break; } } else { break; } } } }
private static bool Prefix( PartiesBuyHorseCampaignBehavior __instance, MobileParty mobileParty, Settlement settlement, Hero hero) { if (mobileParty != null && !mobileParty.MapFaction.IsAtWarWith(settlement.MapFaction) && (mobileParty != MobileParty.MainParty && mobileParty.IsLordParty) && (mobileParty.LeaderHero != null && !mobileParty.IsDisbanding && settlement.IsTown)) { double currentTime = (double)Campaign.CurrentTime; int num1 = Math.Min(100000, mobileParty.Leader.HeroObject.Gold); int numberOfMounts = mobileParty.Party.NumberOfMounts; if (numberOfMounts > mobileParty.Party.NumberOfRegularMembers) { return(false); } Town component = settlement.GetComponent <Town>(); if (component.MarketData.GetItemCountOfCategory(DefaultItemCategories.Horse) == 0) { return(false); } float averageValue = DefaultItemCategories.Horse.AverageValue; float num2 = averageValue * (float)numberOfMounts / (float)num1; if ((double)num2 < 0.0799999982118607) { float randomFloat1 = MBRandom.RandomFloat; float randomFloat2 = MBRandom.RandomFloat; float randomFloat3 = MBRandom.RandomFloat; float num3 = (0.08f - num2) * (float)num1 * randomFloat1 * randomFloat2 * randomFloat3; if ((double)num3 > (double)(mobileParty.Party.NumberOfRegularMembers - numberOfMounts) * (double)averageValue) { num3 = (float)(mobileParty.Party.NumberOfRegularMembers - numberOfMounts) * averageValue; } Traverse.Create((object)__instance).Method("BuyHorses", new Type[3] { typeof(MobileParty), typeof(Town), typeof(float) }, (object[])null).GetValue((object)mobileParty, (object)component, (object)num3); } } if (mobileParty == null || mobileParty == MobileParty.MainParty || (!mobileParty.IsLordParty || mobileParty.LeaderHero == null) || (mobileParty.IsDisbanding || !settlement.IsTown)) { return(true); } float num4 = 0.0f; EquipmentElement equipmentElement; for (int index = mobileParty.ItemRoster.Count - 1; index >= 0; --index) { ItemRosterElement subject = mobileParty.ItemRoster[index]; equipmentElement = subject.EquipmentElement; if (equipmentElement.Item.IsMountable) { double num1 = (double)num4; int amount = subject.Amount; equipmentElement = subject.EquipmentElement; int num2 = equipmentElement.Item.Value; double num3 = (double)(amount * num2); num4 = (float)(num1 + num3); } else { equipmentElement = subject.EquipmentElement; if (!equipmentElement.Item.IsFood) { SellItemsAction.Apply(mobileParty.Party, settlement.Party, subject, subject.Amount, settlement); } } } float num5 = Math.Min(100000f, (float)mobileParty.LeaderHero.Gold); float num6 = (float)(mobileParty.Party.PartySizeLimit - mobileParty.Party.NumberOfMenWithHorse); if ((double)num4 > (double)num5 * 0.100000001490116) { for (int index = (int)((double)mobileParty.Party.NumberOfMounts - (double)num6); index < 10; ++index) { ItemRosterElement subject = new ItemRosterElement(); int num1 = 0; foreach (ItemRosterElement itemRosterElement in mobileParty.ItemRoster) { equipmentElement = itemRosterElement.EquipmentElement; if (equipmentElement.Item.IsMountable) { equipmentElement = itemRosterElement.EquipmentElement; if (equipmentElement.Item.Value > num1) { equipmentElement = itemRosterElement.EquipmentElement; num1 = equipmentElement.Item.Value; subject = itemRosterElement; } } } if (num1 > 0) { SellItemsAction.Apply(mobileParty.Party, settlement.Party, subject, 1, settlement); num4 -= (float)num1; if ((double)num4 < (double)num5 * 0.100000001490116) { break; } } else { break; } } } return(false); }