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; }
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); }
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); }
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); }
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; }
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; }
public static void SetEmpty(ref MinerComponent __instance) { __instance.insertTarget2 = 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); }
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); }