public static IEnumerator ActionRemoveParked(ThreadBase t)
        {
            VehicleInfo info = m_removeParkedInfo;

            for (ushort i = 0; i < VehicleManager.instance.m_parkedVehicles.m_size; i++)
            {
                if (VehicleManager.instance.m_parkedVehicles.m_buffer[i].Info != null)
                {
                    if (info == VehicleManager.instance.m_parkedVehicles.m_buffer[i].Info)
                    {
                        VehicleManager.instance.ReleaseParkedVehicle(i);
                    }
                }

                if (i % 256 == 255)
                {
                    yield return(i);
                }
            }
        }
Пример #2
0
        public static IEnumerator ActionRemoveExisting(ThreadBase t)
        {
            VehicleInfo       info     = m_removeInfo;
            Array16 <Vehicle> vehicles = VehicleManager.instance.m_vehicles;

            for (ushort i = 0; i < vehicles.m_buffer.Length; i++)
            {
                if (vehicles.m_buffer[i].Info != null)
                {
                    if (info == vehicles.m_buffer[i].Info)
                    {
                        VehicleManager.instance.ReleaseVehicle(i);
                    }
                }

                if (i % 256 == 255)
                {
                    yield return(i);
                }
            }
        }
Пример #3
0
 private static void AddThread(ThreadBase thread)
 {
     //可以立即执行的时候尝试去执行,但不一定能立即执行成功
     if (thread.isExecuteable)
     {
         thread.Execute();
     }
     if (thread.isCompleted)
     {
         if (thread.exception == null)
         {
             thread.OnCompleted();
         }
         else
         {
             Debug.LogError(thread.exception);
         }
     }
     else
     {
         Instance.threads.Add(thread);
     }
 }
Пример #4
0
    private static void delete_thread(ThreadBase th)
    {
        ThreadHelper.lock_grab(th.spinlock /*mutex*/);

        th.exit = true; // Search must be already finished
        ThreadHelper.lock_release(th.spinlock /*mutex*/);

        th.notify_one();

        //TODO: is call needed?
        //th.join(); // Wait for thread termination
    }
        public static IEnumerator UpdateCapacityUnits(ThreadBase t)
        {
            int count = 0;
            Array16 <Vehicle> vehicles = VehicleManager.instance.m_vehicles;

            for (int i = 0; i < vehicles.m_size; i++)
            {
                if ((vehicles.m_buffer[i].m_flags & Vehicle.Flags.Spawned) == Vehicle.Flags.Spawned)
                {
                    if (prefabUpdateUnits == null || vehicles.m_buffer[i].Info == prefabUpdateUnits)
                    {
                        int capacity = GetUnitsCapacity(vehicles.m_buffer[i].Info.m_vehicleAI);

                        if (capacity != -1)
                        {
                            CitizenUnit[] units = CitizenManager.instance.m_units.m_buffer;
                            uint          unit  = vehicles.m_buffer[i].m_citizenUnits;

                            int currentUnitCount = GetTotalUnitGroups(unit);
                            int newUnitCount     = Mathf.CeilToInt(capacity / 5f);

                            // Capacity reduced
                            if (newUnitCount < currentUnitCount)
                            {
                                // Get the first unit to remove
                                uint n = unit;
                                for (int j = 1; j < newUnitCount; j++)
                                {
                                    n = units[n].m_nextUnit;
                                }
                                // Releasing units excess
                                CitizenManager.instance.ReleaseUnits(units[n].m_nextUnit);
                                units[n].m_nextUnit = 0;

                                count++;
                            }
                            // Capacity increased
                            else if (newUnitCount > currentUnitCount)
                            {
                                // Get the last unit
                                uint n = unit;
                                while (units[n].m_nextUnit != 0)
                                {
                                    n = units[n].m_nextUnit;
                                }

                                // Creating missing units
                                int newCapacity = capacity - currentUnitCount * 5;
                                CitizenManager.instance.CreateUnits(out units[n].m_nextUnit, ref SimulationManager.instance.m_randomizer, 0, (ushort)i, 0, 0, 0, newCapacity, 0);

                                count++;
                            }
                        }
                    }
                }
                if (i % 256 == 255)
                {
                    yield return(null);
                }
            }
            prefabUpdateUnits = null;

            DebugUtils.Log("Modified capacity of " + count + " vehicle(s). Total unit count: " + CitizenManager.instance.m_unitCount + "/" + CitizenManager.MAX_UNIT_COUNT);
        }
Пример #6
0
        private static IEnumerator FixEnumerableThread(ThreadBase t)
        {
            SimulationManager.instance.ForcedSimulationPaused = true;

            try
            {
                uint brokenCount   = 0;
                uint confusedCount = 0;

                // Fix broken offers
                TransferManager.TransferOffer[] incomingOffers = typeof(TransferManager).GetField("m_incomingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[];
                TransferManager.TransferOffer[] outgoingOffers = typeof(TransferManager).GetField("m_outgoingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[];

                ushort[] incomingCount = typeof(TransferManager).GetField("m_incomingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[];
                ushort[] outgoingCount = typeof(TransferManager).GetField("m_outgoingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[];

                int[] incomingAmount = typeof(TransferManager).GetField("m_incomingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[];
                int[] outgoingAmount = typeof(TransferManager).GetField("m_outgoingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[];

                // Based on TransferManager.RemoveAllOffers
                for (int i = 0; i < 64; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        int num  = i * 8 + j;
                        int num2 = (int)incomingCount[num];
                        for (int k = num2 - 1; k >= 0; k--)
                        {
                            int num3 = num * 256 + k;
                            if (IsInfoNull(incomingOffers[num3]))
                            {
                                incomingAmount[i]   -= incomingOffers[num3].Amount;
                                incomingOffers[num3] = incomingOffers[--num2];
                                brokenCount++;
                            }
                        }
                        incomingCount[num] = (ushort)num2;
                        int num4 = (int)outgoingCount[num];
                        for (int l = num4 - 1; l >= 0; l--)
                        {
                            int num5 = num * 256 + l;
                            if (IsInfoNull(outgoingOffers[num5]))
                            {
                                outgoingAmount[i]   -= outgoingOffers[num5].Amount;
                                outgoingOffers[num5] = outgoingOffers[--num4];
                                brokenCount++;
                            }
                        }
                        outgoingCount[num] = (ushort)num4;
                    }

                    yield return(null);
                }

                if (brokenCount > 0)
                {
                    Debug.Log("Removed " + brokenCount + " broken transfer offers.");
                }

                // Fix broken vehicles
                Array16 <Vehicle> vehicles = VehicleManager.instance.m_vehicles;
                for (int i = 0; i < vehicles.m_size; i++)
                {
                    if (vehicles.m_buffer[i].m_flags != Vehicle.Flags.None)
                    {
                        bool exists = (vehicles.m_buffer[i].m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None;

                        // Vehicle validity
                        InstanceID target;
                        bool       isInfoNull = vehicles.m_buffer[i].Info == null;
                        bool       isLeading  = vehicles.m_buffer[i].m_leadingVehicle == 0;
                        bool       isWaiting  = !exists && (vehicles.m_buffer[i].m_flags & Vehicle.Flags.WaitingSpace) != Vehicle.Flags.None;
                        bool       isConfused = exists && isLeading && !isInfoNull && vehicles.m_buffer[i].Info.m_vehicleAI.GetLocalizedStatus((ushort)i, ref vehicles.m_buffer[i], out target) == Locale.Get("VEHICLE_STATUS_CONFUSED");

                        if (isInfoNull || isWaiting || isConfused)
                        {
                            try
                            {
                                VehicleManager.instance.ReleaseVehicle((ushort)i);
                                if (isInfoNull)
                                {
                                    brokenCount++;
                                }
                                if (isConfused)
                                {
                                    confusedCount++;
                                }
                            }
                            catch { }
                        }
                    }
                    if (i % 256 == 255)
                    {
                        yield return(null);
                    }
                }

                if (confusedCount > 0)
                {
                    Debug.Log("Removed " + confusedCount + " confused vehicle instances.");
                }

                Array16 <VehicleParked> vehiclesParked = VehicleManager.instance.m_parkedVehicles;
                for (int i = 0; i < vehiclesParked.m_size; i++)
                {
                    if (vehiclesParked.m_buffer[i].Info == null)
                    {
                        try
                        {
                            VehicleManager.instance.ReleaseParkedVehicle((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255)
                    {
                        yield return(null);
                    }
                }

                if (brokenCount > 0)
                {
                    Debug.Log("Removed " + brokenCount + " broken vehicle instances.");
                }
                brokenCount = 0;

                // Fix broken buildings
                Array16 <Building> buildings = BuildingManager.instance.m_buildings;
                for (int i = 0; i < buildings.m_size; i++)
                {
                    if (buildings.m_buffer[i].Info == null)
                    {
                        try
                        {
                            BuildingManager.instance.ReleaseBuilding((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255)
                    {
                        yield return(null);
                    }
                }

                if (brokenCount > 0)
                {
                    Debug.Log("Removed " + brokenCount + " broken building instances.");
                }
                brokenCount = 0;

                // Fix broken props
                Array16 <PropInstance> props = PropManager.instance.m_props;
                for (int i = 0; i < props.m_size; i++)
                {
                    if (props.m_buffer[i].Info == null)
                    {
                        try
                        {
                            PropManager.instance.ReleaseProp((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255)
                    {
                        yield return(null);
                    }
                }

                if (brokenCount > 0)
                {
                    Debug.Log("Removed " + brokenCount + " broken prop instances.");
                }
                brokenCount = 0;

                // Fix broken trees
                Array32 <TreeInstance> trees = TreeManager.instance.m_trees;
                for (int i = 0; i < trees.m_size; i++)
                {
                    if (trees.m_buffer[i].Info == null)
                    {
                        try
                        {
                            TreeManager.instance.ReleaseTree((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255)
                    {
                        yield return(null);
                    }
                }

                if (brokenCount > 0)
                {
                    Debug.Log("Removed " + brokenCount + " broken tree instances.");
                }
                brokenCount = 0;
            }
            finally
            {
                SimulationManager.instance.ForcedSimulationPaused = false;
            }
        }
Пример #7
0
    public static ThreadPool Threads = new ThreadPool();     // Global object

    //void check_time();

    // start_routine() is the C function which is called when a new thread
    // is launched. It is a wrapper to the virtual function idle_loop().

    public static int start_routine(ThreadBase th)
    {
        th.idle_loop();
        return(0);
    }
        public void RegisterThread(ThreadBase thread)
        {
            if (registeredThreads.Contains(thread))
            {
                return;
            }

            registeredThreads.Add(thread);
        }
        private static IEnumerator FixEnumerableThread(ThreadBase t)
        {
            SimulationManager.instance.ForcedSimulationPaused = true;

            try
            {
                uint brokenCount = 0;
                uint confusedCount = 0;

                // Fix broken offers
                TransferManager.TransferOffer[] incomingOffers = typeof(TransferManager).GetField("m_incomingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[];
                TransferManager.TransferOffer[] outgoingOffers = typeof(TransferManager).GetField("m_outgoingOffers", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as TransferManager.TransferOffer[];

                ushort[] incomingCount = typeof(TransferManager).GetField("m_incomingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[];
                ushort[] outgoingCount = typeof(TransferManager).GetField("m_outgoingCount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as ushort[];

                int[] incomingAmount = typeof(TransferManager).GetField("m_incomingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[];
                int[] outgoingAmount = typeof(TransferManager).GetField("m_outgoingAmount", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(TransferManager.instance) as int[];

                // Based on TransferManager.RemoveAllOffers
                for (int i = 0; i < 64; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        int num = i * 8 + j;
                        int num2 = (int)incomingCount[num];
                        for (int k = num2 - 1; k >= 0; k--)
                        {
                            int num3 = num * 256 + k;
                            if (IsInfoNull(incomingOffers[num3]))
                            {
                                incomingAmount[i] -= incomingOffers[num3].Amount;
                                incomingOffers[num3] = incomingOffers[--num2];
                                brokenCount++;
                            }
                        }
                        incomingCount[num] = (ushort)num2;
                        int num4 = (int)outgoingCount[num];
                        for (int l = num4 - 1; l >= 0; l--)
                        {
                            int num5 = num * 256 + l;
                            if (IsInfoNull(outgoingOffers[num5]))
                            {
                                outgoingAmount[i] -= outgoingOffers[num5].Amount;
                                outgoingOffers[num5] = outgoingOffers[--num4];
                                brokenCount++;
                            }
                        }
                        outgoingCount[num] = (ushort)num4;
                    }

                    yield return null;
                }

                if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken transfer offers.");

                // Fix broken vehicles
                Array16<Vehicle> vehicles = VehicleManager.instance.m_vehicles;
                for (int i = 0; i < vehicles.m_size; i++)
                {
                    if (vehicles.m_buffer[i].m_flags != Vehicle.Flags.None)
                    {
                        bool exists = (vehicles.m_buffer[i].m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None;

                        // Vehicle validity
                        InstanceID target;
                        bool isInfoNull = vehicles.m_buffer[i].Info == null;
                        bool isLeading = vehicles.m_buffer[i].m_leadingVehicle == 0;
                        bool isWaiting = !exists && (vehicles.m_buffer[i].m_flags & Vehicle.Flags.WaitingSpace) != Vehicle.Flags.None;
                        bool isConfused = exists && isLeading && !isInfoNull && vehicles.m_buffer[i].Info.m_vehicleAI.GetLocalizedStatus((ushort)i, ref vehicles.m_buffer[i], out target) == Locale.Get("VEHICLE_STATUS_CONFUSED");

                        if (isInfoNull || isWaiting || isConfused)
                        {
                            try
                            {
                                VehicleManager.instance.ReleaseVehicle((ushort)i);
                                if (isInfoNull) brokenCount++;
                                if (isConfused) confusedCount++;
                            }
                            catch { }
                        }
                    }
                    if (i % 256 == 255) yield return null;
                }

                if (confusedCount > 0) Debug.Log("Removed " + confusedCount + " confused vehicle instances.");

                Array16<VehicleParked> vehiclesParked = VehicleManager.instance.m_parkedVehicles;
                for (int i = 0; i < vehiclesParked.m_size; i++)
                {
                    if (vehiclesParked.m_buffer[i].Info == null)
                    {
                        try
                        {
                            VehicleManager.instance.ReleaseParkedVehicle((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255) yield return null;
                }

                if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken vehicle instances.");
                brokenCount = 0;

                // Fix broken buildings
                Array16<Building> buildings = BuildingManager.instance.m_buildings;
                for (int i = 0; i < buildings.m_size; i++)
                {
                    if (buildings.m_buffer[i].Info == null)
                    {
                        try
                        {
                            BuildingManager.instance.ReleaseBuilding((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255) yield return null;
                }

                if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken building instances.");
                brokenCount = 0;

                // Fix broken props
                Array16<PropInstance> props = PropManager.instance.m_props;
                for (int i = 0; i < props.m_size; i++)
                {
                    if (props.m_buffer[i].Info == null)
                    {
                        try
                        {
                            PropManager.instance.ReleaseProp((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255) yield return null;
                }

                if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken prop instances.");
                brokenCount = 0;

                // Fix broken trees
                Array32<TreeInstance> trees = TreeManager.instance.m_trees;
                for (int i = 0; i < trees.m_size; i++)
                {
                    if (trees.m_buffer[i].Info == null)
                    {
                        try
                        {
                            TreeManager.instance.ReleaseTree((ushort)i);
                            brokenCount++;
                        }
                        catch { }
                    }
                    if (i % 256 == 255) yield return null;
                }

                if (brokenCount > 0) Debug.Log("Removed " + brokenCount + " broken tree instances.");
                brokenCount = 0;
            }
            finally
            {
                SimulationManager.instance.ForcedSimulationPaused = false;
            }
        }