Ejemplo n.º 1
0
        public static void OutputToSecondPort(ref MinerComponent __instance, PlanetFactory factory)
        {
            if (__instance.productId <= 0)
            {
                return;
            }

            for (int slotId = __instance.lastUsedPort; slotId < 3; slotId++)
            {
                if (TryInsertItem(ref __instance, factory, slotId))
                {
                    return;
                }
            }

            if (__instance.lastUsedPort != 0)
            {
                for (int slotId = 0; slotId < __instance.lastUsedPort; slotId++)
                {
                    if (TryInsertItem(ref __instance, factory, slotId))
                    {
                        return;
                    }
                }
            }

            __instance.lastUsedPort = 0;
        }
Ejemplo n.º 2
0
        private static bool TryInsertItem(ref MinerComponent __instance, PlanetFactory factory, int slotId)
        {
            int insertTarget = GetInsertTarget(__instance, slotId);

            if (insertTarget <= 0)
            {
                return(false);
            }

            if (__instance.productCount > 0)
            {
                if (!factory.InsertInto(insertTarget, 0, __instance.productId))
                {
                    return(false);
                }

                __instance.productCount--;
                if (__instance.productCount == 0)
                {
                    __instance.productId = 0;
                }
                return(false);
            }

            __instance.lastUsedPort = slotId;
            return(true);
        }
Ejemplo n.º 3
0
        public static int GetInsertTarget(MinerComponent miner, int slotId)
        {
            if (slotId == 0)
            {
                return(miner.insertTarget);
            }
            if (slotId == 1)
            {
                return(miner.insertTarget2);
            }
            if (slotId == 2)
            {
                return(miner.insertTarget3);
            }

            return(0);
        }
Ejemplo n.º 4
0
        public static int GetTotalVeinAmountForMineComponent(MinerComponent minerComponent, VeinData[] veinPool)
        {
            int veinAmount = 0;

            if (minerComponent.veinCount > 0)
            {
                for (int i = 0; i < minerComponent.veinCount; i++)
                {
                    int num = minerComponent.veins[i];
                    if (num > 0 && veinPool[num].id == num && veinPool[num].amount > 0)
                    {
                        veinAmount += veinPool[num].amount;
                    }
                }
            }
            return(veinAmount);
        }
Ejemplo n.º 5
0
        public static void Postfix(int entityId, ItemProto newProto, PlanetFactory __instance)
        {
            if (entityId == 0 || __instance.entityPool[entityId].id == 0)
            {
                return;
            }
            if (__instance.entityPool[entityId].minerId <= 0)
            {
                return;
            }
            MinerComponent component = __instance.factorySystem.minerPool[__instance.entityPool[entityId].minerId];

            if (component.type != EMinerType.Vein)
            {
                return;
            }

            PrefabDesc desc   = newProto.prefabDesc;
            float      radius = DSPAdvancedMiner.getMinerRadius(desc);

            radius *= radius;

            Pose pose;

            pose.position = __instance.entityPool[entityId].pos;
            pose.rotation = __instance.entityPool[entityId].rot;

            int[]        tmp_ids             = new int[256];
            Vector3      vector2             = pose.position + pose.forward * -1.2f;
            Vector3      rhs                 = -pose.forward;
            Vector3      vector3             = pose.up;
            int          veinsInAreaNonAlloc = __instance.planet.physics.nearColliderLogic.GetVeinsInAreaNonAlloc(vector2, DSPAdvancedMiner.getMinerRadius(desc) + 4, tmp_ids);
            PrebuildData prebuildData        = default(PrebuildData);

            prebuildData.InitParametersArray(veinsInAreaNonAlloc);
            VeinData[] veinPool   = __instance.planet.factory.veinPool;
            int        paramCount = 0;

            for (int j = 0; j < veinsInAreaNonAlloc; j++)
            {
                if (tmp_ids[j] != 0 && veinPool[tmp_ids[j]].id == tmp_ids[j])
                {
                    if (veinPool[tmp_ids[j]].type != EVeinType.Oil)
                    {
                        Vector3 vector4 = veinPool[tmp_ids[j]].pos - vector2;
                        float   num2    = Vector3.Dot(vector3, vector4);
                        vector4 -= vector3 * num2;
                        float sqrMagnitude = vector4.sqrMagnitude;
                        float num3         = Vector3.Dot(vector4.normalized, rhs);
                        if (sqrMagnitude <= radius && num3 >= 0.73f && Mathf.Abs(num2) <= 2f)
                        {
                            prebuildData.parameters[paramCount++] = tmp_ids[j];
                        }
                    }
                }
                else
                {
                    Assert.CannotBeReached();
                }
            }

            component.InitVeinArray(paramCount);
            if (paramCount > 0)
            {
                Array.Copy(prebuildData.parameters, component.veins, paramCount);
            }

            for (int i = 0; i < component.veinCount; i++)
            {
                __instance.RefreshVeinMiningDisplay(component.veins[i], component.entityId, 0);
            }

            component.ArrangeVeinArray();
            __instance.factorySystem.minerPool[__instance.entityPool[entityId].minerId] = component;
        }
Ejemplo n.º 6
0
        public static void Postfix(int id, ItemProto newProto, PlanetFactory __instance)
        {
            if (id == 0 || __instance.entityPool[id].id == 0)
            {
                return;
            }
            if (__instance.entityPool[id].minerId <= 0)
            {
                return;
            }
            MinerComponent component = __instance.factorySystem.minerPool[__instance.entityPool[id].minerId];

            if (component.type != EMinerType.Vein)
            {
                return;
            }

            PrefabDesc desc = newProto.prefabDesc;

            Pose pose;

            pose.position = __instance.entityPool[id].pos;
            pose.rotation = __instance.entityPool[id].rot;

            int[]   tmp_ids             = new int[256];
            Vector3 vector3             = pose.position + pose.forward * -1.2f;
            Vector3 rhs                 = -pose.forward;
            Vector3 up                  = pose.up;
            int     veinsInAreaNonAlloc =
                __instance.planet.physics.nearColliderLogic.GetVeinsInAreaNonAlloc(vector3, DSPAdvancedMiner.getMinerRadius(desc) + 4, tmp_ids);

            int[] refArray = new int[veinsInAreaNonAlloc];

            VeinData[] veinPool = __instance.planet.factory.veinPool;
            int        refCount = 0;

            for (int j = 0; j < veinsInAreaNonAlloc; j++)
            {
                if (tmp_ids[j] != 0 && veinPool[tmp_ids[j]].id == tmp_ids[j])
                {
                    if (veinPool[tmp_ids[j]].type != EVeinType.Oil)
                    {
                        Vector3 pos     = veinPool[tmp_ids[j]].pos;
                        Vector3 vector4 = pos - vector3;
                        float   num8    = Vector3.Dot(up, vector4);
                        vector4 -= up * num8;
                        float sqrMagnitude = vector4.sqrMagnitude;
                        float num9         = Vector3.Dot(vector4.normalized, rhs);
                        float radius       = DSPAdvancedMiner.getMinerRadius(desc);
                        if (sqrMagnitude <= radius * radius && num9 >= 0.73f && Mathf.Abs(num8) <= 2f)
                        {
                            refArray[refCount++] = tmp_ids[j];
                        }
                    }
                }
            }

            component.InitVeinArray(refCount);
            if (refCount > 0)
            {
                Array.Copy(refArray, component.veins, refCount);
            }

            for (int i = 0; i < component.veinCount; i++)
            {
                __instance.RefreshVeinMiningDisplay(component.veins[i], component.entityId, 0);
            }

            component.ArrageVeinArray();
            __instance.factorySystem.minerPool[__instance.entityPool[id].minerId] = component;
        }
Ejemplo n.º 7
0
 public static void SetEmpty(ref MinerComponent __instance)
 {
     __instance.insertTarget2 = 0;
 }
Ejemplo n.º 8
0
        public static bool InternalUpdatePatch(ref MinerComponent __instance, ref uint __result, ref PlanetFactory factory, ref VeinData[] veinPool, float power, ref float miningRate, ref float miningSpeed, ref int[] productRegister)
        {
            if (ActiveCustomizeRate.Value)
            {
                miningRate = CustomRate.Value;
            }
            if (power < 0.1f)
            {
                return(true);
            }
            //var _this = __instance;
            int gmProtoId = factory.entityPool[__instance.entityId].protoId;

            //如果是原始的采矿机,执行原始函数
            if (gmProtoId != 9446 && gmProtoId != 9447 && gmProtoId != 9448)
            {
                return(true);
            }
            else//否则是新增的采矿机
            {
                //根据采矿及类型决定熔炼产物
                Dictionary <int, int> mapDict;
                if (gmProtoId == 9446)
                {
                    mapDict = ProductMapA;
                }
                else if (gmProtoId == 9447)
                {
                    mapDict = ProductMapB;
                }
                else
                {
                    mapDict = ProductMapC;
                }

                __result = 0U;
                if (__instance.type == EMinerType.Vein)
                {
                    if (__instance.veinCount > 0)
                    {
                        int num1gm = __instance.veins[__instance.currentVeinIndex];
                        Assert.Positive(num1gm);
                        int oriid1  = veinPool[num1gm].productId;
                        int outid1  = oriid1;
                        int cratio1 = 1;
                        if (mapDict.ContainsKey(oriid1) && SmelterRatio.ContainsKey(mapDict[oriid1]))
                        {
                            outid1  = mapDict[oriid1];
                            cratio1 = SmelterRatio[mapDict[oriid1]];
                        }

                        if (__instance.time <= __instance.period)
                        {
                            __instance.time += (int)(power * (float)__instance.speed * miningSpeed * (float)__instance.veinCount / (float)cratio1);
                            __result         = 1U;
                        }
                        if (__instance.time >= __instance.period)
                        {
                            int num = __instance.veins[__instance.currentVeinIndex];
                            Assert.Positive(num);
                            if (veinPool[num].id == 0)
                            {
                                __instance.RemoveVeinFromArray(__instance.currentVeinIndex);
                                __instance.GetMinimumVeinAmount(factory, veinPool);
                                if (__instance.veinCount > 1)
                                {
                                    __instance.currentVeinIndex %= __instance.veinCount;
                                }
                                else
                                {
                                    __instance.currentVeinIndex = 0;
                                }
                                __instance.time += (int)(power * (float)__instance.speed * miningSpeed * (float)__instance.veinCount / (float)cratio1);

                                __result = 0U;
                                return(false);
                            }
                            //此处修改产物
                            int OriId        = veinPool[num].productId;
                            int OutputId     = OriId;
                            int ConsumeRatio = 1;

                            if (mapDict.ContainsKey(OriId) && SmelterRatio.ContainsKey(mapDict[OriId]))
                            {
                                OutputId     = mapDict[OriId];
                                ConsumeRatio = SmelterRatio[mapDict[OriId]];
                            }


                            if (__instance.productCount < 50 && (__instance.productId == 0 || __instance.productId == OutputId || __instance.productId == OriId))
                            {
                                __instance.productId = OutputId;
                                __instance.time     -= __instance.period;
                                if (veinPool[num].amount > 0)
                                {
                                    __instance.productCount++;
                                    productRegister[__instance.productId]++;

                                    for (int igm = 0; igm < ConsumeRatio; igm++)//一次产物输出采矿采几次
                                    {
                                        bool flag = true;
                                        if (miningRate < 0.99999f)
                                        {
                                            __instance.seed = (uint)((ulong)(__instance.seed % 2147483646U + 1U) * 48271UL % 2147483647UL) - 1U;
                                            flag            = (__instance.seed / 2147483646.0 < (double)miningRate);
                                        }
                                        if (flag)
                                        {
                                            int num2 = num;
                                            veinPool[num2].amount = veinPool[num2].amount - 1;
                                            if (veinPool[num].amount < __instance.minimumVeinAmount)
                                            {
                                                __instance.minimumVeinAmount = veinPool[num].amount;
                                            }
                                            factory.planet.veinAmounts[(int)veinPool[num].type] -= 1L;
                                            PlanetData.VeinGroup[] veinGroups = factory.planet.veinGroups;
                                            short groupIndex = veinPool[num].groupIndex;
                                            veinGroups[(int)groupIndex].amount = veinGroups[(int)groupIndex].amount - 1L;
                                            factory.veinAnimPool[num].time     = ((veinPool[num].amount < 20000) ? (1f - (float)veinPool[num].amount * 5E-05f) : 0f);
                                            if (veinPool[num].amount <= 0)
                                            {
                                                PlanetData.VeinGroup[] veinGroups2 = factory.planet.veinGroups;
                                                short groupIndex2 = veinPool[num].groupIndex;
                                                veinGroups2[(int)groupIndex2].count = veinGroups2[(int)groupIndex2].count - 1;
                                                factory.RemoveVeinWithComponents(num);
                                                __instance.RemoveVeinFromArray(__instance.currentVeinIndex);
                                                __instance.GetMinimumVeinAmount(factory, veinPool);
                                            }
                                            else
                                            {
                                                __instance.currentVeinIndex++;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    __instance.RemoveVeinFromArray(__instance.currentVeinIndex);
                                    __instance.GetMinimumVeinAmount(factory, veinPool);
                                }
                                if (__instance.veinCount > 1)
                                {
                                    __instance.currentVeinIndex %= __instance.veinCount;
                                }
                                else
                                {
                                    __instance.currentVeinIndex = 0;
                                }
                            }
                        }
                    }
                }

                if (__instance.productCount > 0 && __instance.insertTarget > 0 && __instance.productId > 0 && factory.InsertInto(__instance.insertTarget, 0, __instance.productId))
                {
                    __instance.productCount--;
                    if (__instance.productCount == 0)
                    {
                        __instance.productId = 0;
                    }
                }
            }
            return(false);
        }
Ejemplo n.º 9
0
        public bool MinerComponent_InternalUpdate(PlanetFactory factory, VeinData[] veinPool, PowerNetwork powerNetwork, float power, float miningRate, float miningSpeed, int[] productRegister, MinerComponent minerComponent)
        {
            if (minerComponent.type != EMinerType.Vein)
            {
                return(false);
            }

            var plantPosition = factory.entityPool[minerComponent.entityId].pos;

            int      vpNum      = ((minerComponent.veinCount != 0) ? minerComponent.veins[minerComponent.currentVeinIndex] : 0);
            VeinData veinData   = veinPool[vpNum];
            string   veinName   = veinData.type.ToString();
            int      veinAmount = DSPStatisticsHelper.GetTotalVeinAmountForMineComponent(minerComponent, veinPool);

            var       signData  = factory.entitySignPool[minerComponent.entityId];
            ItemProto itemProto = signData.iconId0 != 0 ? LDB.items.Select((int)signData.iconId0) : null;

            var time = (int)(power * (float)minerComponent.speed * miningSpeed * (float)minerComponent.veinCount);

            float consumerRatio = ((powerNetwork == null || powerNetwork.id <= 0) ? 0f : ((float)powerNetwork.consumerRatio));

            // Debug.Log(factory.planet.displayName + " - " + __instance.entityId + ", " + veinName + ", " + __instance.workstate + ", VeinCount: " + __instance.veinCount + " VeinAmount: " + veinAmount + " | " + latlon);

            Texture2D texture = null;

            if (itemProto != null)
            {
                texture  = itemProto.iconSprite.texture;
                veinName = itemProto.name.Translate();
            }

            float  minutesToEmptyVein;
            string minutesToEmptyVeinTxt;
            var    miningRatePerMin = 0f;

            if (time == 0 || veinAmount == 0 || minerComponent.period == 0)
            {
                minutesToEmptyVeinTxt = (veinAmount == 0) ? "Empty" : "Infinity";
                minutesToEmptyVein    = (veinAmount == 0) ? 0 : float.PositiveInfinity;
            }
            else
            {
                var miningTimePerSec          = minerComponent.period / (MineralExhaustionNotifier.timeStepsSecond);
                var secondsPerMiningOperation = (float)miningTimePerSec / (float)time;
                miningRatePerMin      = 60 / secondsPerMiningOperation;
                minutesToEmptyVein    = (float)Math.Round((float)veinAmount / miningRatePerMin, 0);
                minutesToEmptyVeinTxt = minutesToEmptyVein.ToString();
                if (minerComponent.workstate == EWorkState.Full)
                {
                    minutesToEmptyVeinTxt += " to ∞";
                }
                minutesToEmptyVeinTxt += " min"; // .ToString("0.0") + "每分钟".Translate();
            }
            var minerStat = new MinerNotificationDetail()
            {
                minerComponent        = minerComponent,
                entityId              = minerComponent.entityId,
                planetName            = factory.planet.displayName,
                itemProto             = itemProto,
                signType              = signData.signType,
                veinName              = veinName,
                veinAmount            = veinAmount,
                plantPosition         = plantPosition,
                factory               = factory,
                miningRate            = miningRate,
                time                  = time,
                period                = minerComponent.period,
                veinCount             = minerComponent.veinCount,
                miningRatePerMin      = miningRatePerMin,
                minutesToEmptyVein    = minutesToEmptyVein,
                minutesToEmptyVeinTxt = minutesToEmptyVeinTxt,
                resourceTexture       = texture,
                powerNetwork          = powerNetwork,
                consumerRatio         = consumerRatio
            };

            minerStats.Add(minerStat);

            return(true);
        }