示例#1
0
        public bool PackupVehicles(Sim sim, bool onlyMine)
        {
            if (sim == null)
            {
                return(false);
            }

            AddTry("Packup Vehicles");

            if (sim.LotHome == null)
            {
                IncStat("Packup: Homeless");
                return(false);
            }

            List <Vehicle> vehicles = GetLotVehicles(sim.LotHome);

            foreach (Vehicle vehicle in vehicles)
            {
                if (onlyMine)
                {
                    IOwnableVehicle ownable = vehicle as IOwnableVehicle;
                    if (ownable == null)
                    {
                        continue;
                    }

                    if (ownable != sim.GetPreferredVehicle())
                    {
                        continue;
                    }
                }

                if (Inventories.TryToMove(vehicle, sim))
                {
                    IncStat("Packup: Packed " + vehicle.GetLocalizedName());
                }
                else
                {
                    IncStat("Packup: Fail " + vehicle.GetLocalizedName());
                }
            }

            ClearWorth(sim.Household);
            return(true);
        }
示例#2
0
文件: SimEx.cs 项目: pepoluan/NRaas
        public static Vehicle GetOwnedAndUsableVehicle(Sim ths, Lot lot, bool bAddPending, bool bAllowBikes, bool bIgnoreCanDrive, bool allowUFO)
        {
            if (ths.IsPet)
            {
                return(null);
            }

            Vehicle vehicleForCurrentInteraction = ths.GetVehicleForCurrentInteraction();

            if (vehicleForCurrentInteraction != null)
            {
                return(vehicleForCurrentInteraction);
            }

            /*
             * if (GameUtils.IsInstalled(ProductVersion.EP2))
             * {
             *  ActiveFireFighter occupation = ths.Occupation as ActiveFireFighter;
             *  if (occupation != null)
             *  {
             *      Car vehicle = occupation.GetVehicle(bAddPending);
             *      if (vehicle != null)
             *      {
             *          return vehicle;
             *      }
             *  }
             * }
             */

            Vehicle reservedVehicle = ths.GetReservedVehicle();

            if ((reservedVehicle != null) && (bAllowBikes || (!(reservedVehicle is Bicycle) && !(reservedVehicle is MagicBroom))))
            {
                IOwnableVehicle vehicle3 = reservedVehicle as IOwnableVehicle;
                if (vehicle3 == null)
                {
                    return(reservedVehicle);
                }

                if (ths.CanUseVehicleRightNow(vehicle3, true, true))
                {
                    if (bAddPending)
                    {
                        vehicle3.PendingUse = true;
                    }
                    return(reservedVehicle);
                }
            }

            /*
             * if (ths.OccupationAsPerformanceCareer != null)
             * {
             *  Car car2 = ths.OccupationAsPerformanceCareer.GetCareerCar();
             *  if (car2 != null)
             *  {
             *      return car2;
             *  }
             * }
             * else if (ths.CareerManager.OccupationAsCareer != null)
             * {
             *  FortuneTellerCareer career = ths.CareerManager.Occupation as FortuneTellerCareer;
             *  if (((career != null) && (career.CurLevelBranchName == "ScamArtist")) && (career.Level >= FortuneTellerCareer.kLevelNeededForLimoRide))
             *  {
             *      Car car3 = GlobalFunctions.CreateObjectOutOfWorld("CarLimo") as Car;
             *      car3.DestroyOnRelease = true;
             *      return car3;
             *  }
             * }
             */

            IOwnableVehicle preferredVehicle = ths.GetPreferredVehicle();

            if (ths.CanUseVehicleRightNow(preferredVehicle, true, bIgnoreCanDrive) && (bAllowBikes || (!(reservedVehicle is Bicycle) && !(reservedVehicle is MagicBroom))))
            {
                if (bAddPending)
                {
                    preferredVehicle.PendingUse = true;
                }
                return(preferredVehicle as Vehicle);
            }

            if (bAllowBikes && ths.HasTrait(TraitNames.Rebellious))
            {
                IOwnableVehicle motorcycleIfAvailable = ths.GetMotorcycleIfAvailable(bAddPending, bIgnoreCanDrive);
                if (motorcycleIfAvailable != null)
                {
                    return(motorcycleIfAvailable as Vehicle);
                }
            }

            if (bAllowBikes && ths.HasTrait(TraitNames.EnvironmentallyConscious))
            {
                IOwnableVehicle bikeIfAvailable = ths.GetBikeIfAvailable(bAddPending, bIgnoreCanDrive);
                if (bikeIfAvailable != null)
                {
                    return(bikeIfAvailable as Vehicle);
                }
            }

            // Custom
            List <IOwnableVehicle> vehicles = Inventories.QuickDuoFind <IOwnableVehicle, Vehicle>(ths.Inventory);
            IOwnableVehicle        vehicle  = ths.GetBroomOrMostExpensiveUsableVehicle(vehicles, bAllowBikes, bAddPending, bIgnoreCanDrive, allowUFO, false);

            if (vehicle != null)
            {
                return(vehicle as Vehicle);
            }

            vehicles.Clear();
            vehicle = ths.GetMostExpensiveUsableParkedVehicle(lot, bAllowBikes, bAddPending, bIgnoreCanDrive, allowUFO);
            if (vehicle != null)
            {
                return(vehicle as Vehicle);
            }

            if (lot != ths.LotHome)
            {
                vehicle = ths.GetMostExpensiveUsableParkedVehicle(ths.LotHome, bAllowBikes, bAddPending, bIgnoreCanDrive, allowUFO);
                if (vehicle != null)
                {
                    return(vehicle as Vehicle);
                }
            }

            /*
             * Car careerCar = ths.GetCareerCar();
             * if (careerCar != null)
             * {
             *  IOwnableVehicle vehicle8 = careerCar as IOwnableVehicle;
             *  if (bAddPending && (vehicle8 != null))
             *  {
             *      vehicle8.PendingUse = true;
             *  }
             *  return careerCar;
             * }
             */
            return(null);
        }
示例#3
0
        protected override void PrivatePerformAction(bool prompt)
        {
            Overwatch.Log(Name);

            Dictionary <IGameObject, bool> outOfWorldObjects = new Dictionary <IGameObject, bool>();

            Dictionary <ObjectGuid, bool> reservedObjects = new Dictionary <ObjectGuid, bool>();

            foreach (ParkingSpace space in Sims3.Gameplay.Queries.GetObjects <ParkingSpace>())
            {
                Vehicle vehicle = space.GetContainedVehicle();
                if (vehicle == null && space.ReservedVehicle != null)
                {
                    space.mReservedVehicle = null;
                }

                if (vehicle == null)
                {
                    continue;
                }

                if (!RetainOnLot(space))
                {
                    continue;
                }

                reservedObjects[vehicle.ObjectId] = true;
            }

            foreach (MooringPost post in Sims3.Gameplay.Queries.GetObjects <MooringPost>())
            {
                Vehicle vehicle = post.GetContainedVehicle();
                if (vehicle == null)
                {
                    continue;
                }

                if (!RetainOnLot(post))
                {
                    continue;
                }

                reservedObjects[vehicle.ObjectId] = true;
            }

            foreach (BikeRack rack in Sims3.Gameplay.Queries.GetObjects <BikeRack>())
            {
                if (!RetainOnLot(rack))
                {
                    continue;
                }

                foreach (Bicycle bike in rack.GetContainedBikes())
                {
                    reservedObjects[bike.ObjectId] = true;
                }
            }

            foreach (SimDescription sim in SimListing.GetResidents(false).Values)
            {
                if (sim.BoardingSchool != null)
                {
                    AddOutOfWorldObjects(outOfWorldObjects, sim.BoardingSchool.mInventoryItems);
                }

                if (sim.mInventoryItemsWhileInPassport != null)
                {
                    AddOutOfWorldObjects(outOfWorldObjects, sim.mInventoryItemsWhileInPassport);
                }

                Sim createdSim = sim.CreatedSim;
                if (createdSim != null)
                {
                    PoliceStation.GoToJail interaction = createdSim.CurrentInteraction as PoliceStation.GoToJail;
                    if ((interaction != null) && (interaction.mInmatesObjects != null))
                    {
                        foreach (IGameObject obj in interaction.mInmatesObjects)
                        {
                            outOfWorldObjects[obj] = true;
                        }
                    }

                    Vehicle reserved = createdSim.GetReservedVehicle();
                    if (reserved != null)
                    {
                        reservedObjects[reserved.ObjectId] = true;
                    }
                }

                ObjectGuid preferred = sim.mPreferredVehicleGuid;
                if (preferred != ObjectGuid.InvalidObjectGuid)
                {
                    reservedObjects[preferred] = true;
                }
            }

            if (ParentsLeavingTownSituation.sAdultsInventories != null)
            {
                foreach (List <InventoryItem> list in ParentsLeavingTownSituation.sAdultsInventories.Values)
                {
                    AddOutOfWorldObjects(outOfWorldObjects, list);
                }
            }

            int count = 0;

            foreach (Vehicle vehicle in Sims3.Gameplay.Queries.GetObjects <Vehicle>())
            {
                if (outOfWorldObjects.ContainsKey(vehicle))
                {
                    continue;
                }

                if (vehicle.HasFlags(GameObject.FlagField.IsStolen))
                {
                    continue;
                }

                if (reservedObjects.ContainsKey(vehicle.ObjectId))
                {
                    continue;
                }

                if ((!vehicle.InInventory) && (vehicle.Driver != null) && (!vehicle.Driver.HasBeenDestroyed))
                {
                    if (vehicle.Driver.LotCurrent == vehicle.LotCurrent)
                    {
                        continue;
                    }

                    if (vehicle.Driver.IsPerformingAService)
                    {
                        continue;
                    }
                }

                // Temporary until further review can be done
                if (vehicle is CarUFO)
                {
                    continue;
                }

                if (vehicle is WindSurfboard)
                {
                    // These vehicles can be placed on the ground, so don't require a parent
                    continue;
                }

                if (vehicle is MagicBroom)
                {
                    if (vehicle.InInventory)
                    {
                        continue;
                    }

                    if (vehicle.Parent is BroomStand)
                    {
                        continue;
                    }
                }
                else
                {
                    IOwnableVehicle ownableVehicle = vehicle as IOwnableVehicle;
                    if (ownableVehicle != null)
                    {
                        if (ownableVehicle.PendingUse)
                        {
                            continue;
                        }

                        CarOwnable carOwnable = vehicle as CarOwnable;
                        if (carOwnable != null)
                        {
                            if (!carOwnable.GeneratedOwnableForNpc)
                            {
                                continue;
                            }
                        }
                        else
                        {
                            BoatOwnable boatOwnable = vehicle as BoatOwnable;
                            if (boatOwnable != null)
                            {
                                if (!boatOwnable.GeneratedOwnableForNpc)
                                {
                                    continue;
                                }
                            }
                            else
                            {
                                if (ownableVehicle.InInventory)
                                {
                                    continue;
                                }
                            }
                        }
                    }

                    if ((vehicle is FoodTruckBase) || (vehicle is CarService))
                    {
                        if (vehicle.InWorld)
                        {
                            continue;
                        }
                    }
                }

                if ((vehicle.InWorld) && (vehicle.InUse))
                {
                    bool found = false;

                    foreach (Sim sim in vehicle.ActorsUsingMe)
                    {
                        if (!sim.HasBeenDestroyed)
                        {
                            found = true;
                            break;
                        }
                    }

                    if (found)
                    {
                        continue;
                    }
                }

                string parentSpace = null;
                if (vehicle.Parent != null)
                {
                    parentSpace = vehicle.Parent.GetType().ToString();
                    if (parentSpace.Contains("GalleryShopParkingSpace") || parentSpace.Contains("StoreSetParkingSpace"))
                    {
                        continue;
                    }
                }

                {
                    string catalogName = vehicle.CatalogName;

                    bool inInventory = vehicle.InInventory;

                    vehicle.UnParent();

                    IUsesParkingSpace parker = vehicle as IUsesParkingSpace;

                    if (parker != null)
                    {
                        ParkingSpace space = vehicle.Parent as ParkingSpace;
                        if (space != null)
                        {
                            space.UnReserveSpot(parker);
                        }
                        else
                        {
                            MooringPost post = vehicle.Parent as MooringPost;
                            if (post != null)
                            {
                                post.UnReserveSpot(parker as Boat);
                            }
                        }
                    }

                    vehicle.Destroy();

                    if (!(vehicle is LightweightTaxi))
                    {
                        count++;
                        Overwatch.Log("Towed " + catalogName);

                        if (inInventory)
                        {
                            Overwatch.Log(" Was InInventory");
                        }

                        if (!string.IsNullOrEmpty(parentSpace))
                        {
                            Overwatch.Log(" Space: " + parentSpace);
                        }
                    }
                }
            }

            if ((count > 0) || (prompt))
            {
                Overwatch.AlarmNotify(Common.Localize("CleanupVehicles:Complete", false, new object[] { count }));
            }
        }
示例#4
0
        protected override bool Allow(SimDescription sim)
        {
            if (!base.Allow(sim))
            {
                return(false);
            }

            if ((sim.CreatedSim.LotCurrent == null) || (sim.CreatedSim.LotCurrent.IsWorldLot))
            {
                IncStat("In Transit");
                return(false);
            }
            else if (!Households.AllowGuardian(sim))
            {
                IncStat("Too Young");
                return(false);
            }
            else if (sim.GetPreferredVehicle() != null)
            {
                IncStat("Preferred");
                return(false);
            }
            else
            {
                bool found = false;
                List <IOwnableVehicle> vehicles = Inventories.InventoryDuoFindAll <IOwnableVehicle, Vehicle>(sim);

                IOwnableVehicle choice = sim.CreatedSim.GetOwnedAndUsableVehicle(sim.CreatedSim.LotCurrent) as IOwnableVehicle;
                if (choice != null)
                {
                    vehicles.Add(choice);
                }

                IOwnableVehicle reserved = sim.CreatedSim.GetReservedVehicle() as IOwnableVehicle;
                if (reserved != null)
                {
                    if (!vehicles.Contains(reserved))
                    {
                        vehicles.Add(reserved);
                    }
                }

                IOwnableVehicle preferred = sim.CreatedSim.GetPreferredVehicle();
                if (preferred != null)
                {
                    if (!vehicles.Contains(preferred))
                    {
                        vehicles.Add(preferred);
                    }
                }

                AddStat("Vehicles", vehicles.Count);

                foreach (IOwnableVehicle existing in vehicles)
                {
                    CarOwnable car = existing as CarOwnable;
                    if ((car != null) && (car.GeneratedOwnableForNpc))
                    {
                        continue;
                    }

                    T vehicle = existing as T;
                    if ((vehicle != null) && (!Test(vehicle)))
                    {
                        IncStat("Has Other Type");
                        return(false);
                    }

                    found = true;
                }

                if (found)
                {
                    if (AddScoring("ReplaceVehicle", sim) <= 0)
                    {
                        IncStat("Replace Score Fail");
                        return(false);
                    }
                }
            }

            return(true);
        }