public void Emit(float dt) { PrimaryElement firstPrimaryElement = GetFirstPrimaryElement(); if (!((UnityEngine.Object)firstPrimaryElement == (UnityEngine.Object)null)) { Storage component = GetComponent <Storage>(); float mass = firstPrimaryElement.Mass; float num = Mathf.Min(mass, base.master.emptyRate * dt); if (!(num <= 0f)) { Tag prefabTag = firstPrimaryElement.GetComponent <KPrefabID>().PrefabTag; component.ConsumeAndGetDisease(prefabTag, num, out SimUtil.DiseaseInfo disease_info, out float aggregate_temperature); Vector3 position = base.transform.GetPosition(); position.y += 1.8f; bool flag = GetComponent <Rotatable>().GetOrientation() == Orientation.FlipH; position.x += ((!flag) ? 0.2f : (-0.2f)); int num2 = Grid.PosToCell(position) + ((!flag) ? 1 : (-1)); if (Grid.Solid[num2]) { num2 += (flag ? 1 : (-1)); } Element element = firstPrimaryElement.Element; byte idx = element.idx; if (element.IsLiquid) { FallingWater.instance.AddParticle(num2, idx, num, aggregate_temperature, disease_info.idx, disease_info.count, true, false, false, false); } else { SimMessages.ModifyCell(num2, idx, aggregate_temperature, num, disease_info.idx, disease_info.count, SimMessages.ReplaceType.None, false, -1); } } } }
public void Process(WorldGen worldGen, Chunk world, SeededRandom rnd) { SetValuesFunction setValues = delegate(int index, object elem, Sim.PhysicsData pd, Sim.DiseaseCell dc) { SimMessages.ModifyCell(index, ElementLoader.GetElementIndex((elem as Element).id), pd.temperature, pd.mass, dc.diseaseIdx, dc.elementCount, SimMessages.ReplaceType.Replace, false, -1); }; DoProcess(worldGen, world, setValues, rnd); }
public static void ModifyCell(int gamecell, int elementidx, float temperature, float mass, byte diseaseid, int diseasecount) { if ((double)temperature < 0.0 || 10000.0 < (double)temperature) { Debug.Log("Modifycelltofailed: int" + gamecell + " int" + elementidx + "float" + temperature + "float" + mass + " byte" + diseaseid + " disease name " + Db.Get().Diseases.GetIndex(diseaseid) + " int" + diseasecount); return; } if ((double)temperature == 0.0 && (double)mass > 0.0 && elementidx >= 0) { Debug.Log("Modifycelltofailed: int" + gamecell + " int" + elementidx + "float" + temperature + "float" + mass + " byte" + diseaseid + " disease name " + Db.Get().Diseases.GetIndex(diseaseid) + " int" + diseasecount); return; } SimMessages.ModifyCell(gamecell, elementidx, temperature, mass, diseaseid, diseasecount, SimMessages.ReplaceType.Replace, false, -1); }
static public void Postfix(GameObject go) { PrimaryElement firstPrimaryElement = this.GetFirstPrimaryElement(); if ((UnityEngine.Object)firstPrimaryElement == (UnityEngine.Object)null) { return; } Storage component = this.GetComponent <Storage>(); float num = Mathf.Min(firstPrimaryElement.Mass, this.master.emptyRate * dt); if ((double)num <= 0.0) { return; } Tag prefabTag = firstPrimaryElement.GetComponent <KPrefabID>().PrefabTag; SimUtil.DiseaseInfo disease_info; float aggregate_temperature; component.ConsumeAndGetDisease(prefabTag, num, out disease_info, out aggregate_temperature); Vector3 position = this.transform.GetPosition(); position.y += 1.8f; bool flag = this.GetComponent <Rotatable>().GetOrientation() == Orientation.FlipH; position.x += !flag ? 0.2f : -0.2f; int index = Grid.PosToCell(position) + (!flag ? 1 : -1); if (Grid.Solid[index]) { index += !flag ? -1 : 1; } Element element = firstPrimaryElement.Element; byte idx = element.idx; ConduitDispenser conduitDispenser = go.AddOrGet <ConduitDispenser>(); if (!conduitDispenser.IsConnected) { if (element.IsLiquid) { FallingWater.instance.AddParticle(index, idx, num, aggregate_temperature, disease_info.idx, disease_info.count, true, false, false, false); } else { SimMessages.ModifyCell(index, (int)idx, aggregate_temperature, num, disease_info.idx, disease_info.count, SimMessages.ReplaceType.None, false, -1); } } }
// Token: 0x0600004E RID: 78 RVA: 0x000034A0 File Offset: 0x000016A0 public void Emit(float dt) { PrimaryElement firstPrimaryElement = this.GetFirstPrimaryElement(); if (firstPrimaryElement == null) { return; } Storage component = this.GetComponent <Storage>(); float num = Mathf.Min(firstPrimaryElement.Mass, this.master.EmptyRate * dt); if ((double)num <= 0.0) { return; } Tag prefabTag = firstPrimaryElement.GetComponent <KPrefabID>().PrefabTag; SimUtil.DiseaseInfo diseaseInfo; float temperature; float amount_consumed; // public void ConsumeAndGetDisease(Tag tag, float amount, out float amount_consumed, out SimUtil.DiseaseInfo disease_info, out float aggregate_temperature) component.ConsumeAndGetDisease(prefabTag, num, out amount_consumed, out diseaseInfo, out temperature); Vector3 position = this.transform.GetPosition(); position.y += 1.8f; bool flag = this.GetComponent <Rotatable>().GetOrientation() == Orientation.FlipH; position.x += (flag ? -0.2f : 0.2f); int num2 = Grid.PosToCell(position) + (flag ? -1 : 1); if (Grid.Solid[num2]) { num2 += (flag ? 1 : -1); } Element element = firstPrimaryElement.Element; byte idx = element.idx; if (element.IsLiquid) { FallingWater.instance.AddParticle(num2, idx, num, temperature, diseaseInfo.idx, diseaseInfo.count, true); return; } SimMessages.ModifyCell(num2, (int)idx, temperature, num, diseaseInfo.idx, diseaseInfo.count); }
public unsafe static bool DoSettleSim(WorldGenSettings settings, Sim.Cell[] cells, float[] bgTemp, Sim.DiseaseCell[] dcs, WorldGen.OfflineCallbackFunction updateProgressFn, Data data, List <KeyValuePair <Vector2I, TemplateContainer> > templateSpawnTargets, Action <OfflineWorldGen.ErrorInfo> error_cb, Action <Sim.Cell[], float[], Sim.DiseaseCell[]> onSettleComplete) { Sim.SIM_Initialize(Sim.DLL_MessageHandler); SimMessages.CreateSimElementsTable(ElementLoader.elements); SimMessages.CreateWorldGenHACKDiseaseTable(WorldGen.diseaseIds); Sim.DiseaseCell[] dc = new Sim.DiseaseCell[dcs.Length]; SimMessages.SimDataInitializeFromCells(Grid.WidthInCells, Grid.HeightInCells, cells, bgTemp, dc); int num = 500; updateProgressFn(UI.WORLDGEN.SETTLESIM.key, 0f, WorldGenProgressStages.Stages.SettleSim); Vector2I min = new Vector2I(0, 0); Vector2I max = new Vector2I(Grid.WidthInCells, Grid.HeightInCells); byte[] bytes = null; using (MemoryStream memoryStream = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(memoryStream)) { try { Sim.Save(writer); } catch (Exception ex) { string message = ex.Message; string stackTrace = ex.StackTrace; WorldGenLogger.LogException(message, stackTrace); return(updateProgressFn(new StringKey("Exception in Sim Save"), -1f, WorldGenProgressStages.Stages.Failure)); } } bytes = memoryStream.ToArray(); } FastReader reader = new FastReader(bytes); if (Sim.Load(reader) != 0) { updateProgressFn(UI.WORLDGEN.FAILED.key, -1f, WorldGenProgressStages.Stages.Failure); return(true); } byte[] array = new byte[Grid.CellCount]; for (int i = 0; i < Grid.CellCount; i++) { array[i] = byte.MaxValue; } for (int j = 0; j < num; j++) { SimMessages.NewGameFrame(0.2f, min, max); IntPtr intPtr = Sim.HandleMessage(SimMessageHashes.PrepareGameData, array.Length, array); updateProgressFn(UI.WORLDGEN.SETTLESIM.key, (float)j / (float)num * 100f, WorldGenProgressStages.Stages.SettleSim); if (!(intPtr == IntPtr.Zero)) { Sim.GameDataUpdate *ptr = (Sim.GameDataUpdate *)(void *) intPtr; for (int k = 0; k < ptr->numSubstanceChangeInfo; k++) { Sim.SubstanceChangeInfo substanceChangeInfo = ptr->substanceChangeInfo[k]; int cellIdx = substanceChangeInfo.cellIdx; cells[cellIdx].elementIdx = ptr->elementIdx[cellIdx]; cells[cellIdx].insulation = ptr->insulation[cellIdx]; cells[cellIdx].properties = ptr->properties[cellIdx]; cells[cellIdx].temperature = ptr->temperature[cellIdx]; cells[cellIdx].mass = ptr->mass[cellIdx]; cells[cellIdx].strengthInfo = ptr->strengthInfo[cellIdx]; } foreach (KeyValuePair <Vector2I, TemplateContainer> templateSpawnTarget in templateSpawnTargets) { Cell templateCellData; for (int l = 0; l < templateSpawnTarget.Value.cells.Count; l++) { templateCellData = templateSpawnTarget.Value.cells[l]; Vector2I key = templateSpawnTarget.Key; int x = key.x; Vector2I key2 = templateSpawnTarget.Key; int num2 = Grid.OffsetCell(Grid.XYToCell(x, key2.y), templateCellData.location_x, templateCellData.location_y); if (Grid.IsValidCell(num2)) { cells[num2].elementIdx = (byte)ElementLoader.GetElementIndex(templateCellData.element); cells[num2].temperature = templateCellData.temperature; cells[num2].mass = templateCellData.mass; dcs[num2].diseaseIdx = (byte)WorldGen.diseaseIds.FindIndex((string name) => name == templateCellData.diseaseName); dcs[num2].elementCount = templateCellData.diseaseCount; } } } } } for (int m = 0; m < Grid.CellCount; m++) { int callbackIdx = (m != Grid.CellCount - 1) ? (-1) : 2147481337; SimMessages.ModifyCell(m, cells[m].elementIdx, cells[m].temperature, cells[m].mass, dcs[m].diseaseIdx, dcs[m].elementCount, SimMessages.ReplaceType.Replace, false, callbackIdx); } bool flag = false; while (!flag) { SimMessages.NewGameFrame(0.2f, min, max); IntPtr intPtr2 = Sim.HandleMessage(SimMessageHashes.PrepareGameData, array.Length, array); if (!(intPtr2 == IntPtr.Zero)) { Sim.GameDataUpdate *ptr2 = (Sim.GameDataUpdate *)(void *) intPtr2; for (int n = 0; n < ptr2->numCallbackInfo; n++) { Sim.CallbackInfo callbackInfo = ptr2->callbackInfo[n]; if (callbackInfo.callbackIdx == 2147481337) { flag = true; break; } } } } Sim.HandleMessage(SimMessageHashes.SettleWorldGen, 0, null); bool result = SaveSim(settings, data, error_cb); onSettleComplete(cells, bgTemp, dcs); Sim.Shutdown(); return(result); }