Esempio n. 1
0
        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();
                    }
                }
            }
        }
Esempio n. 2
0
        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));
            }
        }
Esempio n. 3
0
        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);
        }