protected static void PreReturnHome(Dictionary <ulong, List <ConsignedObjectProxy> > list) { Dictionary <ulong, SimDescription> sims = SimListing.GetSims <SimDescription>(null, false); foreach (KeyValuePair <ulong, List <ConsignedObjectProxy> > pair in list) { SimDescription description = null; sims.TryGetValue(pair.Key, out description); if (description != null) { Sim createdSim = description.CreatedSim; Inventory familyInventory = null; if ((description.Household != null) && (description.Household.SharedFamilyInventory != null)) { familyInventory = description.Household.SharedFamilyInventory.Inventory; } foreach (ConsignedObjectProxy obj in pair.Value) { if (obj.Object == null) { continue; } if ((createdSim == null) || !Inventories.TryToMove(obj.Object, createdSim)) { if (familyInventory != null) { familyInventory.TryToAdd(obj.Object); } else { obj.Object.Destroy(); } } } } else { foreach (ConsignedObjectProxy obj3 in pair.Value) { if (obj3.Object == null) { continue; } obj3.Object.Destroy(); } } } }
protected static void Consign(Dictionary <ulong, List <ConsignedObjectProxy> > lookup, Dictionary <ObjectGuid, float> consignAttempts, float[] consignmentPrices, float madeGoodSaleThreshold, float reputationBonusForPositiveFeedback, Curve qualityVsReputationCurve, float sellXItemsOpportunityReputationGainMultiplier, int consignmentLifespan, float dailyNumberOfAttemptsDecrement, Curve reputationVsStoreFeeCurve, int numberOfTopSellingItems, float makeXSimoleonsOpportunityConsignmentFeeMultiplier) { if (lookup != null) { Dictionary <ulong, SimDescription> sims = SimListing.GetSims <SimDescription>(null, false); foreach (ulong num in lookup.Keys) { SimDescription desc = null; sims.TryGetValue(num, out desc); if ((desc != null) && (desc.CreatedSim != null))// && desc.CreatedSim.IsInActiveHousehold) { Consignment consignment = desc.SkillManager.AddElement(SkillNames.Consignment) as Consignment; bool unsold = false; int totalSale = 0x0; List <Pair <int, IGameObject> > list = new List <Pair <int, IGameObject> >(); bool bornSalesmanAdded = false; string displayName = null; List <ConsignedObjectProxy> list2 = lookup[num]; int index = 0x0; while (index < list2.Count) { ConsignedObjectProxy local1 = list2[index]; local1.Age++; float chance = 0; try { if (list2[index].Object != null) { chance = list2[index].GetChanceOfSale(desc.CreatedSim); } else { list2.RemoveAt(index); continue; } } catch (Exception e) { Common.DebugException("Consignment Section A", e); chance = 1f; } if (RandomUtil.RandomChance01(chance)) { if (list2[index].Age >= consignmentPrices.Length) { list2[index].Age = consignmentPrices.Length - 1; } int valueOfSale = list2[index].GetValueOfSale(desc); totalSale += valueOfSale; float quality = list2[index].GetQuality(); try { if ((((float)valueOfSale) / ((float)list2[index].Object.Value)) >= madeGoodSaleThreshold) { desc.CreatedSim.BuffManager.AddElement(BuffNames.MadeGoodSale, Origin.None); } if (!bornSalesmanAdded && (((desc.TraitManager.HasElement(TraitNames.BornSalesman) && (quality >= TraitTuning.BornSalesmanQualityMinimumThresholdForPositiveFeedback)) && RandomUtil.InterpolatedChance(TraitTuning.BornSalesmanQualityMinimumThresholdForPositiveFeedback, 1f, TraitTuning.BornSalesmanQualityMinimumChanceOfPositiveFeedback, TraitTuning.BornSalesmanQualityMaximumChanceOfPositiveFeedback, quality)) || ((!desc.TraitManager.HasElement(TraitNames.BornSalesman) && (quality >= ConsignmentRegister.kQualityMinimumThreshold)) && RandomUtil.InterpolatedChance(ConsignmentRegister.kQualityMinimumThreshold, 1f, ConsignmentRegister.kQualityMinimumChanceOfPositiveFeedback, ConsignmentRegister.kQualityMaximumChanceOfPositiveFeedback, quality)))) { bornSalesmanAdded = true; displayName = list2[index].DisplayName; consignment.TrackReputationChange(reputationBonusForPositiveFeedback); } float reputationChange = qualityVsReputationCurve.Fx(quality); if (consignment.OppItemsSoldLifetimeOpportunityCompleted && (reputationChange > 0f)) { reputationChange *= sellXItemsOpportunityReputationGainMultiplier; } if (desc.TraitManager.HasElement(TraitNames.BornSalesman) && (reputationChange > 0f)) { reputationChange *= TraitTuning.BornSalesmanReputationOnSaleBonusMultiplier; } consignment.TrackConsignmentSale(list2[index].Object, valueOfSale, reputationChange); } catch (Exception e) { Common.DebugException("Consignment Section B", e); } list.Add(new Pair <int, IGameObject>(valueOfSale, list2[index].Object)); EventTracker.SendEvent(EventTypeId.kSoldConsignedObject, desc.CreatedSim); GameObject obj2 = list2[index].Object as GameObject; if (obj2 != null) { Consignments.NotifySell(desc, obj2, valueOfSale); } list2.RemoveAt(index); } else if (list2[index].Age >= consignmentLifespan) { unsold = true; consignment.TrackConsignmentReturn(); if (desc.CreatedSim.Inventory.ValidForThisInventory(list2[index].Object)) { Inventories.TryToMove(list2[index].Object, desc.CreatedSim); } else { desc.CreatedSim.Household.SharedFamilyInventory.Inventory.TryToAdd(list2[index].Object); } list2[index].Object.EnableInteractions(); list2.RemoveAt(index); } else { index++; } } DisplayStory(desc, list, totalSale, unsold, displayName, reputationVsStoreFeeCurve, numberOfTopSellingItems, makeXSimoleonsOpportunityConsignmentFeeMultiplier); } } } foreach (ObjectGuid guid in new List <ObjectGuid>(consignAttempts.Keys)) { float attempts = consignAttempts[guid]; consignAttempts[guid] = Math.Max((float)0f, (float)(attempts - dailyNumberOfAttemptsDecrement)); } }
protected override OptionResult Run(GameHitParameters <GameObject> parameters) { Common.StringBuilder log = new Common.StringBuilder("Run"); try { Lot targetLot = Porter.GetLot(parameters.mTarget); if (targetLot == null) { return(OptionResult.Failure); } Dictionary <ulong, IMiniSimDescription> preExistingSims = SimListing.GetSims <IMiniSimDescription>(null, true); Household me = targetLot.Household; if (me == null) { me = GetImportSelection(targetLot); if (me == null) { return(OptionResult.Failure); } } Dictionary <ulong, IMiniSimDescription> allSims = SimListing.GetSims <IMiniSimDescription>(null, true); Dictionary <int, HouseData> houses = new Dictionary <int, HouseData>(); Dictionary <int, HouseData> doppleHouses = new Dictionary <int, HouseData>(); List <SimDescription> cleanUp = new List <SimDescription>(); List <SimDescription> fixUp = new List <SimDescription>(); List <Household> importedHouses = new List <Household>(); importedHouses.Add(me); List <SimDescription> checkSims = new List <SimDescription>(); log += Common.NewLine + "A"; List <SimDescription> sims = new List <SimDescription>(me.AllSimDescriptions); foreach (SimDescription sim in sims) { if (sim == null) { continue; } log += Common.NewLine + sim.FullName; Porter.AddExport(sim); string description = sim.mBio; if (string.IsNullOrEmpty(description)) { continue; } if (!description.Contains("NRaas.Porter:")) { continue; } description = description.Replace("NRaas.Porter:", ""); if (string.IsNullOrEmpty(description)) { continue; } HouseData lookup = new HouseData(description); lookup.Reconcile(sim); ValidateTask.Perform(sim); List <SimDescription> dependents = new List <SimDescription>(); if (HandleDoppleganger(sim, preExistingSims, allSims, dependents)) { if (!houses.ContainsKey(lookup.mID)) { if (!doppleHouses.ContainsKey(lookup.mID)) { doppleHouses.Add(lookup.mID, lookup); } } checkSims.AddRange(dependents); cleanUp.Add(sim); continue; } else { fixUp.Add(sim); } HouseData data; if (!houses.TryGetValue(lookup.mID, out data)) { data = lookup; houses.Add(data.mID, data); } doppleHouses.Remove(lookup.mID); data.mSims.Add(sim); } log += Common.NewLine + "B"; foreach (SimDescription sim in fixUp) { log += Common.NewLine + sim.FullName; new Relationships.RepairParents().Perform(sim, UnusedLog, allSims); new Relationships.RepairChildren().Perform(sim, UnusedLog, allSims); new Relationships.RepairSiblings().Perform(sim, UnusedLog, allSims); } log += Common.NewLine + "C"; foreach (SimDescription cleanup in cleanUp) { log += Common.NewLine + cleanup.FullName; try { if (cleanup.Household != null) { cleanup.Household.Remove(cleanup); } checkSims.Remove(cleanup); cleanup.Genealogy.ClearAllGenealogyInformation(); cleanup.Dispose(); } catch (Exception e) { Common.DebugException(log, e); } } log += Common.NewLine + "D"; if (houses.Count == 0) { SimpleMessageDialog.Show(Common.Localize("Title"), Common.Localize("Unpack:NotProper")); return(OptionResult.Failure); } else if (houses.Count == 1) { int funds = -1; foreach (HouseData data in houses.Values) { if (data.mID != 0) { funds = data.mFunds; } } if (funds >= 0) { me.SetFamilyFunds(funds); SimpleMessageDialog.Show(Common.Localize("Title"), Common.Localize("Unpack:Unneeded")); return(OptionResult.Failure); } } log += Common.NewLine + "E"; int unpacked = 0, failed = 0; List <HouseData> sorted = new List <HouseData>(houses.Values); sorted.Sort(new Comparison <HouseData>(HouseData.SortByCost)); foreach (HouseData data in sorted) { log += Common.NewLine + "House: " + data.mID; if (data.mID != 1) { Household house = null; if (data.mID != 0) { Lot lot = FindLot(data.mFunds, data.mSims); if (lot == null) { lot = FindLot(-1, null); if (lot == null) { failed++; continue; } } house = Household.Create(); importedHouses.Add(house); lot.MoveIn(house); house.Name = data.mName; int finalFunds = (data.mFunds - lot.Cost); if (finalFunds >= 0) { house.SetFamilyFunds(finalFunds); me.ModifyFamilyFunds(-data.mFunds); } else { house.SetFamilyFunds(0); me.ModifyFamilyFunds(-data.mFunds); me.ModifyFamilyFunds(finalFunds); } if (me.FamilyFunds < 0) { me.SetFamilyFunds(0); } if (house.FamilyFunds < 0) { house.SetFamilyFunds(0); } unpacked++; } foreach (SimDescription sim in data.mSims) { log += Common.NewLine + sim.FullName; if (house != null) { log += Common.NewLine + "Moved"; me.Remove(sim); house.Add(sim); Instantiation.Perform(sim, null); } else { log += Common.NewLine + "PlaceGrave"; Porter.PlaceGraveTask.Perform(sim); } } if (house != null) { string name = house.LotHome.Name; if (string.IsNullOrEmpty(name)) { name = house.LotHome.Address; } Porter.Notify(Common.Localize("Unpack:Success", false, new object[] { house.Name, name }), house.LotHome.ObjectId); } } else { unpacked++; } foreach (SimDescription sim in data.mSims) { sim.mBio = null; } } log += Common.NewLine + "F"; foreach (SimDescription checkSim in checkSims) { log += Common.NewLine + checkSim.FullName; if (checkSim.ChildOrBelow) { bool found = false; Household parentHousehold = null; foreach (SimDescription parent in Relationships.GetParents(checkSim)) { if ((checkSim.Household != null) && (parent.Household == checkSim.Household)) { found = true; break; } else { parentHousehold = parent.Household; } } if (!found) { if (parentHousehold == null) { if ((checkSim.Household != null) && (checkSim.Household.NumMembers == 1)) { foreach (Household house in Household.sHouseholdList) { foreach (SimDescription sim in Households.All(house)) { if (Relationships.IsCloselyRelated(checkSim, sim, false)) { parentHousehold = house; break; } } if (parentHousehold != null) { break; } } } } if (parentHousehold != null) { if (checkSim.Household != null) { checkSim.Household.Remove(checkSim); } parentHousehold.Add(checkSim); Instantiation.AttemptToPutInSafeLocation(checkSim.CreatedSim, false); } } } } log += Common.NewLine + "G"; foreach (Household house in importedHouses) { foreach (Sim sim in Households.AllSims(house)) { foreach (GameObject obj in Inventories.QuickFind <GameObject>(sim.Inventory)) { bool moveToFamily = false; if (!sim.Inventory.ValidForThisInventory(obj)) { moveToFamily = true; } else if (obj is IStageProp) { moveToFamily = true; } if (moveToFamily) { sim.Inventory.RemoveByForce(obj); Inventories.TryToMove(obj, house.SharedFamilyInventory.Inventory); } } } } log += Common.NewLine + "H"; int doppleFunds = 0; foreach (HouseData data in doppleHouses.Values) { doppleFunds += data.mFunds; } me.ModifyFamilyFunds(-doppleFunds); if (me.FamilyFunds < 0) { me.SetFamilyFunds(0); } SimpleMessageDialog.Show(Common.Localize("Title"), Common.Localize("Unpack:Completion", false, new object[] { unpacked, failed })); } catch (Exception e) { Common.Exception(log, e); } return(OptionResult.SuccessClose); }