Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemFurnitureBlockBehavior.cs
浏览该文件的文档.
1using System.Globalization;
2using Engine;
5
6namespace Game {
8 public const int MaxFurnitureSetNameLength = 64;
9
11
13
15
17
19
21 public static string fName = "SubsystemFurnitureBlockBehavior";
22
23 public List<FurnitureSet> m_furnitureSets = [];
24
26
27 public Dictionary<Point3, List<FireParticleSystem>> m_particleSystemsByCell = [];
28
29 public override int[] HandledBlocks => [];
30
31 public ReadOnlyList<FurnitureSet> FurnitureSets => new(m_furnitureSets);
32
33 public FurnitureDesign GetDesign(int index) {
34 if (index < 0
35 || index >= m_furnitureDesigns.Length) {
36 return null;
37 }
38 return m_furnitureDesigns[index];
39 }
40
42 for (int i = 0; i < m_furnitureDesigns.Length; i++) {
43 if (m_furnitureDesigns[i] != null
44 && m_furnitureDesigns[i].Compare(design)) {
45 return m_furnitureDesigns[i];
46 }
47 }
48 return null;
49 }
50
52 FurnitureDesign furnitureDesign = FindMatchingDesign(design);
53 if (furnitureDesign != null
54 && design.CompareChain(furnitureDesign)) {
55 return furnitureDesign;
56 }
57 return null;
58 }
59
61 for (int i = 0; i < m_furnitureDesigns.Length; i++) {
62 if (m_furnitureDesigns[i] != null
63 && m_furnitureDesigns[i].Compare(design)) {
64 return m_furnitureDesigns[i];
65 }
66 }
67 for (int j = 0; j < m_furnitureDesigns.Length; j++) {
68 if (m_furnitureDesigns[j] == null) {
69 AddDesign(j, design);
70 return design;
71 }
72 }
74 for (int k = 0; k < m_furnitureDesigns.Length; k++) {
75 if (m_furnitureDesigns[k] == null) {
76 AddDesign(k, design);
77 return design;
78 }
79 }
80 return null;
81 }
82
83 public FurnitureDesign TryAddDesignChain(FurnitureDesign design, bool garbageCollectIfNeeded) {
84 FurnitureDesign furnitureDesign = FindMatchingDesignChain(design);
85 if (furnitureDesign != null) {
86 return furnitureDesign;
87 }
88 List<FurnitureDesign> list = design.ListChain();
89 if (garbageCollectIfNeeded && m_furnitureDesigns.Count(d => d == null) < list.Count) {
91 }
92 if (m_furnitureDesigns.Count(d => d == null) < list.Count) {
93 return null;
94 }
95 int num = 0;
96 for (int i = 0; i < m_furnitureDesigns.Length; i++) {
97 if (num >= list.Count) {
98 break;
99 }
100 if (m_furnitureDesigns[i] == null) {
101 AddDesign(i, list[num]);
102 num++;
103 }
104 }
105 if (num != list.Count) {
106 throw new InvalidOperationException("public error.");
107 }
108 return design;
109 }
110
111 public void ScanDesign(CellFace start, Vector3 direction, ComponentMiner componentMiner) {
112 FurnitureDesign design;
113 FurnitureDesign furnitureDesign = null;
114 Dictionary<Point3, int> valuesDictionary = new();
115 Point3 point = start.Point;
116 Point3 point2 = start.Point;
117 int startValue = SubsystemTerrain.Terrain.GetCellValue(start.Point.X, start.Point.Y, start.Point.Z);
118 int num = Terrain.ExtractContents(startValue);
119 bool designedFromExistingFurniture = false;
120 if (BlocksManager.Blocks[num] is FurnitureBlock) {
121 int designIndex = FurnitureBlock.GetDesignIndex(Terrain.ExtractData(startValue));
122 furnitureDesign = GetDesign(designIndex);
123 if (furnitureDesign == null) {
125 return;
126 }
127 design = furnitureDesign.Clone();
128 design.LinkedDesign = null;
129 design.InteractionMode = FurnitureInteractionMode.None;
130 designedFromExistingFurniture = true;
131 valuesDictionary.Add(start.Point, startValue);
132 }
133 else {
134 Stack<Point3> val = new();
135 val.Push(start.Point);
136 HashSet<Point3> scannedPoints = [];
137 while (val.Count > 0) {
138 Point3 key = val.Pop();
139 if (valuesDictionary.ContainsKey(key)
140 || !SubsystemTerrain.Terrain.IsCellValid(key.X, key.Y, key.Z)) {
141 continue;
142 }
143 int cellValue = SubsystemTerrain.Terrain.GetCellValueFast(key.X, key.Y, key.Z);
144 if (IsValueDisallowed(cellValue)) {
146 return;
147 }
148 TerrainChunk chunkAtCell = SubsystemTerrain.Terrain.GetChunkAtCell(key.X, key.Z);
149 if (IsValueAllowed(cellValue)) {
150 if (chunkAtCell == null
151 || chunkAtCell.State <= TerrainChunkState.InvalidContents4
152 || (!chunkAtCell.IsLoaded && chunkAtCell.ModificationCounter == 0)) {
154 return;
155 }
156 if (key.X < point.X) {
157 point.X = key.X;
158 }
159 if (key.Y < point.Y) {
160 point.Y = key.Y;
161 }
162 if (key.Z < point.Z) {
163 point.Z = key.Z;
164 }
165 if (key.X > point2.X) {
166 point2.X = key.X;
167 }
168 if (key.Y > point2.Y) {
169 point2.Y = key.Y;
170 }
171 if (key.Z > point2.Z) {
172 point2.Z = key.Z;
173 }
174 if (MathF.Abs(point.X - point2.X) >= FurnitureDesign.MaxResolution
175 || MathF.Abs(point.Y - point2.Y) >= FurnitureDesign.MaxResolution
176 || MathF.Abs(point.Z - point2.Z) >= FurnitureDesign.MaxResolution) {
178 return;
179 }
180 valuesDictionary[key] = cellValue;
181 Point3 p1 = new(key.X - 1, key.Y, key.Z);
182 if (scannedPoints.Add(p1)) {
183 val.Push(p1);
184 }
185 Point3 p2 = new(key.X + 1, key.Y, key.Z);
186 if (scannedPoints.Add(p2)) {
187 val.Push(p2);
188 }
189 Point3 p3 = new(key.X, key.Y - 1, key.Z);
190 if (scannedPoints.Add(p3)) {
191 val.Push(p3);
192 }
193 Point3 p4 = new(key.X, key.Y + 1, key.Z);
194 if (scannedPoints.Add(p4)) {
195 val.Push(p4);
196 }
197 Point3 p5 = new(key.X, key.Y, key.Z - 1);
198 if (scannedPoints.Add(p5)) {
199 val.Push(p5);
200 }
201 Point3 p6 = new(key.X, key.Y, key.Z + 1);
202 if (scannedPoints.Add(p6)) {
203 val.Push(p6);
204 }
205 }
206 }
207 if (valuesDictionary.Count == 0) {
209 return;
210 }
211 design = new FurnitureDesign(SubsystemTerrain);
212 Point3 point3 = point2 - point;
213 int num2 = MathUtils.Max(MathUtils.Max(point3.X, point3.Y, point3.Z) + 1, 2);
214 int[] array = new int[num2 * num2 * num2];
215 foreach (KeyValuePair<Point3, int> item in valuesDictionary) {
216 Point3 point4 = item.Key - point;
217 array[point4.X + point4.Y * num2 + point4.Z * num2 * num2] = item.Value;
218 }
219 design.SetValues(num2, array);
220 int steps = start.Face > 3 ? CellFace.Vector3ToFace(direction, 3) : CellFace.OppositeFace(start.Face);
221 design.Rotate(1, steps);
222 Point3 location = design.Box.Location;
223 Point3 point5 = new Point3(design.Resolution) - (design.Box.Location + design.Box.Size);
224 Point3 delta = new((point5.X - location.X) / 2, -location.Y, (point5.Z - location.Z) / 2);
225 design.Shift(delta);
226 }
227 BuildFurnitureDialog dialog = new(
228 design,
229 furnitureDesign,
230 delegate(bool result) {
231 if (result) {
232 design = TryAddDesign(design);
233 if (design == null) {
235 }
236 else {
237 bool destroyDesignBlocks = m_subsystemGameInfo.WorldSettings.GameMode != 0;
238 int value = Terrain.MakeBlockValue(
239 227,
240 0,
242 );
243 int num3 = Math.Clamp(design.Resolution, 4, 8);
244 Matrix matrix = componentMiner.ComponentCreature.ComponentBody.Matrix;
245 Vector3 position = matrix.Translation + 1f * matrix.Forward + 1f * Vector3.UnitY;
246 int toolDamageCount = 1;
248 "OnFurnitureDesigned",
249 modLoader => {
250 modLoader.OnFurnitureDesigned(
251 design,
252 designedFromExistingFurniture,
253 ref num3,
254 ref destroyDesignBlocks,
255 ref toolDamageCount
256 );
257 return false;
258 }
259 );
261 int durabilityRemains = block.GetDurability(componentMiner.ActiveBlockValue)
262 - block.GetDamage(componentMiner.ActiveBlockValue)
263 + 1;
264 if (durabilityRemains < toolDamageCount) {
267 Color.White,
268 true,
269 false
270 );
271 }
272 else {
273 componentMiner.DamageActiveTool(toolDamageCount);
274 if (destroyDesignBlocks) {
275 foreach (KeyValuePair<Point3, int> item2 in valuesDictionary) {
276 SubsystemTerrain.DestroyCell(
277 0,
278 item2.Key.X,
279 item2.Key.Y,
280 item2.Key.Z,
281 0,
282 true,
283 true
284 );
285 }
286 }
287 m_subsystemPickables.AddPickable(value, num3, position, null, null);
288 componentMiner.Poke(false);
289 for (int i = 0; i < 3; i++) {
291 Time.FrameStartTime + i * 0.25f,
292 delegate { m_subsystemSoundMaterials.PlayImpactSound(startValue, new Vector3(start.Point), 1f); }
293 );
294 }
295 if (componentMiner.ComponentCreature.PlayerStats != null) {
296 componentMiner.ComponentCreature.PlayerStats.FurnitureItemsMade += num3;
297 }
298 }
299 }
300 }
301 }
302 );
303 if (componentMiner.ComponentPlayer != null) {
304 DialogsManager.ShowDialog(componentMiner.ComponentPlayer.GuiWidget, dialog);
305 }
306 }
307
308 public void SwitchToNextState(int x, int y, int z, bool playSound) {
309 HashSet<Point3> hashSet = [];
310 List<Point3> list = [new(x, y, z)];
311 int num = 0;
312 while (num < list.Count
313 && num < 4096) {
314 Point3 item = list[num++];
315 if (!hashSet.Add(item)) {
316 continue;
317 }
318 int cellValue = SubsystemTerrain.Terrain.GetCellValue(item.X, item.Y, item.Z);
319 if (Terrain.ExtractContents(cellValue) != 227) {
320 continue;
321 }
322 int data = Terrain.ExtractData(cellValue);
323 int designIndex = FurnitureBlock.GetDesignIndex(data);
324 FurnitureDesign design = GetDesign(designIndex);
325 if (design != null
326 && design.LinkedDesign != null
327 && design.LinkedDesign.Index >= 0
328 && (list.Count == 1 || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate)) {
329 int data2 = FurnitureBlock.SetDesignIndex(
330 data,
331 design.LinkedDesign.Index,
334 );
335 int value = Terrain.ReplaceData(cellValue, data2);
336 SubsystemTerrain.ChangeCell(item.X, item.Y, item.Z, value);
337 if (design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate) {
338 list.Add(new Point3(item.X - 1, item.Y, item.Z));
339 list.Add(new Point3(item.X + 1, item.Y, item.Z));
340 list.Add(new Point3(item.X, item.Y - 1, item.Z));
341 list.Add(new Point3(item.X, item.Y + 1, item.Z));
342 list.Add(new Point3(item.X, item.Y, item.Z - 1));
343 list.Add(new Point3(item.X, item.Y, item.Z + 1));
344 }
345 }
346 }
347 if (playSound) {
348 m_subsystemAudio.PlaySound("Audio/BlockPlaced", 1f, 0f, new Vector3(x, y, z), 2f, true);
349 }
350 }
351
355
356 public FurnitureSet NewFurnitureSet(string name, string importedFrom) {
357 if (name.Length > MaxFurnitureSetNameLength) {
358 name = name.Substring(0, MaxFurnitureSetNameLength);
359 }
360 int num = 0;
361 while (FurnitureSets.FirstOrDefault(fs => fs.Name == name) != null) {
362 num++;
363 name = num > 0 ? name + num.ToString(CultureInfo.InvariantCulture) : name;
364 }
365 FurnitureSet furnitureSet = new() { Name = name, ImportedFrom = importedFrom };
366 m_furnitureSets.Add(furnitureSet);
367 return furnitureSet;
368 }
369
370 public void DeleteFurnitureSet(FurnitureSet furnitureSet) {
371 foreach (FurnitureDesign furnitureSetDesign in GetFurnitureSetDesigns(furnitureSet)) {
372 furnitureSetDesign.FurnitureSet = null;
373 }
374 m_furnitureSets.Remove(furnitureSet);
375 }
376
377 public void MoveFurnitureSet(FurnitureSet furnitureSet, int move) {
378 int num = m_furnitureSets.IndexOf(furnitureSet);
379 if (num >= 0) {
380 m_furnitureSets.RemoveAt(num);
381 m_furnitureSets.Insert(Math.Clamp(num + move, 0, m_furnitureSets.Count), furnitureSet);
382 }
383 }
384
385 public void AddToFurnitureSet(FurnitureDesign design, FurnitureSet furnitureSet) {
386 foreach (FurnitureDesign item in design.ListChain()) {
387 item.FurnitureSet = furnitureSet;
388 }
389 }
390
391 public IEnumerable<FurnitureDesign> GetFurnitureSetDesigns(FurnitureSet furnitureSet) {
392 return m_furnitureDesigns.Where(fd => fd != null && fd.FurnitureSet == furnitureSet);
393 }
394
395 public static List<FurnitureDesign> LoadFurnitureDesigns(SubsystemTerrain subsystemTerrain, ValuesDictionary valuesDictionary) {
396 List<FurnitureDesign> list = [];
397 foreach (KeyValuePair<string, object> item2 in valuesDictionary) {
398 int index = int.Parse(item2.Key, CultureInfo.InvariantCulture);
399 ValuesDictionary valuesDictionary2 = (ValuesDictionary)item2.Value;
400 FurnitureDesign item = new(index, subsystemTerrain, valuesDictionary2);
401 list.Add(item);
402 }
403 foreach (FurnitureDesign design in list) {
404 if (design.m_loadTimeLinkedDesignIndex >= 0) {
405 design.LinkedDesign = list.FirstOrDefault(d => d.Index == design.m_loadTimeLinkedDesignIndex);
406 }
407 }
408 return list;
409 }
410
411 public static void SaveFurnitureDesigns(ValuesDictionary valuesDictionary, ICollection<FurnitureDesign> designs) {
412 foreach (FurnitureDesign design in designs) {
413 valuesDictionary.SetValue(design.Index.ToString(CultureInfo.InvariantCulture), design.Save());
414 }
415 }
416
417 public override void OnBlockAdded(int value, int oldValue, int x, int y, int z) {
418 AddTerrainFurniture(value);
419 AddParticleSystems(value, x, y, z);
420 }
421
422 public override void OnBlockRemoved(int value, int newValue, int x, int y, int z) {
424 RemoveParticleSystems(x, y, z);
425 }
426
427 public override void OnBlockModified(int value, int oldValue, int x, int y, int z) {
428 RemoveTerrainFurniture(oldValue);
429 RemoveParticleSystems(x, y, z);
430 AddTerrainFurniture(value);
431 AddParticleSystems(value, x, y, z);
432 }
433
434 public override void OnBlockGenerated(int value, int x, int y, int z, bool isLoaded) {
435 if (!isLoaded) {
436 AddTerrainFurniture(value);
437 }
438 AddParticleSystems(value, x, y, z);
439 }
440
441 public override void OnChunkDiscarding(TerrainChunk chunk) {
442 List<Point3> list = [];
443 foreach (Point3 key in m_particleSystemsByCell.Keys) {
444 if (key.X >= chunk.Origin.X
445 && key.X < chunk.Origin.X + 16
446 && key.Z >= chunk.Origin.Y
447 && key.Z < chunk.Origin.Y + 16) {
448 list.Add(key);
449 }
450 }
451 foreach (Point3 item in list) {
452 RemoveParticleSystems(item.X, item.Y, item.Z);
453 }
454 }
455
456 public override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner) {
457 int cellValue = SubsystemTerrain.Terrain.GetCellValue(raycastResult.CellFace.X, raycastResult.CellFace.Y, raycastResult.CellFace.Z);
458 if (Terrain.ExtractContents(cellValue) == 227) {
459 int designIndex = FurnitureBlock.GetDesignIndex(Terrain.ExtractData(cellValue));
460 FurnitureDesign design = GetDesign(designIndex);
461 if (design != null
462 && (design.InteractionMode == FurnitureInteractionMode.Multistate
463 || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate)) {
464 SwitchToNextState(raycastResult.CellFace.X, raycastResult.CellFace.Y, raycastResult.CellFace.Z, true);
465 return true;
466 }
467 }
468 return false;
469 }
470
471 public override void Load(ValuesDictionary valuesDictionary) {
472 base.Load(valuesDictionary);
473 m_subsystemAudio = Project.FindSubsystem<SubsystemAudio>(true);
476 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
477 m_subsystemPickables = Project.FindSubsystem<SubsystemPickables>(true);
478 m_subsystemParticles = Project.FindSubsystem<SubsystemParticles>(true);
479 ValuesDictionary value = valuesDictionary.GetValue<ValuesDictionary>("FurnitureDesigns");
480 foreach (FurnitureDesign item in LoadFurnitureDesigns(SubsystemTerrain, value)) {
481 m_furnitureDesigns[item.Index] = item;
482 }
483 foreach (ValuesDictionary item2 in valuesDictionary.GetValue<ValuesDictionary>("FurnitureSets")
484 .Values.Where(v => v is ValuesDictionary)) {
485 string value2 = item2.GetValue<string>("Name");
486 string value3 = item2.GetValue<string>("ImportedFrom", null);
487 string value4 = item2.GetValue<string>("Indices");
488 int[] array = HumanReadableConverter.ValuesListFromString<int>(';', value4);
489 FurnitureSet furnitureSet = new() { Name = value2, ImportedFrom = value3 };
490 m_furnitureSets.Add(furnitureSet);
491 int[] array2 = array;
492 foreach (int num in array2) {
493 if (num >= 0
494 && num < m_furnitureDesigns.Length
495 && m_furnitureDesigns[num] != null) {
496 m_furnitureDesigns[num].FurnitureSet = furnitureSet;
497 }
498 }
499 }
500 m_subsystemItemsScanner.ItemsScanned += GarbageCollectDesigns;
501 }
502
503 public override void Save(ValuesDictionary valuesDictionary) {
504 base.Save(valuesDictionary);
506 ValuesDictionary valuesDictionary2 = new();
507 valuesDictionary.SetValue("FurnitureDesigns", valuesDictionary2);
508 SaveFurnitureDesigns(valuesDictionary2, m_furnitureDesigns.Where(d => d != null).ToArray());
509 ValuesDictionary valuesDictionary3 = new();
510 valuesDictionary.SetValue("FurnitureSets", valuesDictionary3);
511 int num = 0;
512 foreach (FurnitureSet furnitureSet in FurnitureSets) {
513 ValuesDictionary valuesDictionary4 = new();
514 valuesDictionary3.SetValue(num.ToString(CultureInfo.InvariantCulture), valuesDictionary4);
515 valuesDictionary4.SetValue("Name", furnitureSet.Name);
516 if (furnitureSet.ImportedFrom != null) {
517 valuesDictionary4.SetValue("ImportedFrom", furnitureSet.ImportedFrom);
518 }
519 string value = HumanReadableConverter.ValuesListToString(
520 ';',
521 (from d in GetFurnitureSetDesigns(furnitureSet) select d.Index).ToArray()
522 );
523 valuesDictionary4.SetValue("Indices", value);
524 num++;
525 }
526 }
527
528 public void AddDesign(int index, FurnitureDesign design) {
529 m_furnitureDesigns[index] = design;
530 design.Index = index;
531 design.m_terrainUseCount = 0;
532 }
533
534 public void AddTerrainFurniture(int value) {
535 if (Terrain.ExtractContents(value) == 227) {
536 int designIndex = FurnitureBlock.GetDesignIndex(Terrain.ExtractData(value));
537 if (designIndex < m_furnitureDesigns.Length) {
538 m_furnitureDesigns[designIndex].m_terrainUseCount++;
539 }
540 }
541 }
542
543 public void RemoveTerrainFurniture(int value) {
544 if (Terrain.ExtractContents(value) == 227) {
545 int designIndex = FurnitureBlock.GetDesignIndex(Terrain.ExtractData(value));
546 if (designIndex < m_furnitureDesigns.Length) {
547 m_furnitureDesigns[designIndex].m_terrainUseCount = MathUtils.Max(m_furnitureDesigns[designIndex].m_terrainUseCount - 1, 0);
548 }
549 }
550 }
551
552 public void GarbageCollectDesigns(ReadOnlyList<ScannedItemData> allExistingItems) {
553 for (int i = 0; i < m_furnitureDesigns.Length; i++) {
554 if (m_furnitureDesigns[i] != null) {
555 m_furnitureDesigns[i].m_gcUsed = m_furnitureDesigns[i].m_terrainUseCount > 0;
556 }
557 }
558 foreach (ScannedItemData item in allExistingItems) {
559 if (Terrain.ExtractContents(item.Value) == 227) {
560 int designIndex = FurnitureBlock.GetDesignIndex(Terrain.ExtractData(item.Value));
561 FurnitureDesign design = GetDesign(designIndex);
562 if (design != null) {
563 design.m_gcUsed = true;
564 }
565 }
566 }
567 for (int j = 0; j < m_furnitureDesigns.Length; j++) {
568 if (m_furnitureDesigns[j] != null
569 && m_furnitureDesigns[j].m_gcUsed) {
570 FurnitureDesign linkedDesign = m_furnitureDesigns[j].LinkedDesign;
571 while (linkedDesign != null
572 && !linkedDesign.m_gcUsed) {
573 linkedDesign.m_gcUsed = true;
574 linkedDesign = linkedDesign.LinkedDesign;
575 }
576 }
577 }
578 for (int k = 0; k < m_furnitureDesigns.Length; k++) {
579 if (m_furnitureDesigns[k] != null
580 && !m_furnitureDesigns[k].m_gcUsed
581 && m_furnitureDesigns[k].FurnitureSet == null) {
582 m_furnitureDesigns[k].Index = -1;
583 m_furnitureDesigns[k] = null;
584 }
585 }
586 }
587
588 public static bool IsValueAllowed(int value) {
589 int contents = Terrain.ExtractContents(value);
590 Block block = BlocksManager.Blocks[contents];
591 return block.CanBlockBeBuiltIntoFurniture(value);
592 }
593
594 public static bool IsValueDisallowed(int value) {
595 int num = Terrain.ExtractContents(value);
596 int data = Terrain.ExtractData(value);
597 if ((num == 18 || num == 92)
598 && FluidBlock.GetLevel(data) != 0
599 && FluidBlock.GetIsTop(data)) {
600 return true;
601 }
602 return false;
603 }
604
605 public void AddParticleSystems(int value, int x, int y, int z) {
606 if (Terrain.ExtractContents(value) != 227) {
607 return;
608 }
609 int data = Terrain.ExtractData(value);
610 int rotation = FurnitureBlock.GetRotation(data);
611 int designIndex = FurnitureBlock.GetDesignIndex(data);
612 FurnitureDesign design = GetDesign(designIndex);
613 if (design == null) {
614 return;
615 }
616 List<FireParticleSystem> list = [];
617 BoundingBox[] torchPoints = design.GetTorchPoints(rotation);
618 if (torchPoints.Length != 0) {
619 BoundingBox[] array = torchPoints;
620 for (int i = 0; i < array.Length; i++) {
621 BoundingBox boundingBox = array[i];
622 float num = (boundingBox.Size().X + boundingBox.Size().Y + boundingBox.Size().Z) / 3f;
623 float size = Math.Clamp(1.5f * num, 0.1f, 1f);
624 FireParticleSystem fireParticleSystem = new(new Vector3(x, y, z) + boundingBox.Center(), size, 32f);
625 m_subsystemParticles.AddParticleSystem(fireParticleSystem);
626 list.Add(fireParticleSystem);
627 }
628 }
629 if (list.Count > 0) {
630 m_particleSystemsByCell[new Point3(x, y, z)] = list;
631 }
632 }
633
634 public void RemoveParticleSystems(int x, int y, int z) {
635 if (m_particleSystemsByCell.TryGetValue(new Point3(x, y, z), out List<FireParticleSystem> value)) {
636 foreach (FireParticleSystem item in value) {
637 item.IsStopped = true;
638 }
639 m_particleSystemsByCell.Remove(new Point3(x, y, z));
640 }
641 }
642 }
643}
Engine.Vector3 Vector3
static int Max(int x1, int x2)
static void QueueTimeDelayedExecution(double time, Action action)
定义 Time.cs:69
static double FrameStartTime
定义 Time.cs:42
virtual bool CanBlockBeBuiltIntoFurniture(int value)
virtual int GetDamage(int value)
virtual int GetDurability(int value)
virtual void DisplaySmallMessage(string text, Color color, bool blinking, bool playNotificationSound)
ComponentPlayer ComponentPlayer
ComponentCreature ComponentCreature
virtual void Poke(bool forceRestart)
virtual void DamageActiveTool(int damageCount)
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
static bool GetIsTop(int data)
static int GetLevel(int data)
static int GetRotation(int data)
static int SetDesignIndex(int data, int designIndex, int shadowStrengthFactor, bool isLightEmitter)
static int GetDesignIndex(int data)
FurnitureInteractionMode InteractionMode
List< FurnitureDesign > ListChain()
bool CompareChain(FurnitureDesign other)
BoundingBox[] GetTorchPoints(int rotation)
void SetValues(int resolution, int[] values)
void Rotate(int axis, int steps)
static string Get(string className, int key)
获取在当前语言类名键对应的字符串
void MoveFurnitureSet(FurnitureSet furnitureSet, int move)
override void Load(ValuesDictionary valuesDictionary)
override void OnBlockGenerated(int value, int x, int y, int z, bool isLoaded)
static List< FurnitureDesign > LoadFurnitureDesigns(SubsystemTerrain subsystemTerrain, ValuesDictionary valuesDictionary)
IEnumerable< FurnitureDesign > GetFurnitureSetDesigns(FurnitureSet furnitureSet)
void SwitchToNextState(int x, int y, int z, bool playSound)
void AddParticleSystems(int value, int x, int y, int z)
FurnitureSet NewFurnitureSet(string name, string importedFrom)
void GarbageCollectDesigns(ReadOnlyList< ScannedItemData > allExistingItems)
override void OnBlockRemoved(int value, int newValue, int x, int y, int z)
FurnitureDesign FindMatchingDesignChain(FurnitureDesign design)
Dictionary< Point3, List< FireParticleSystem > > m_particleSystemsByCell
override void OnBlockAdded(int value, int oldValue, int x, int y, int z)
override void OnBlockModified(int value, int oldValue, int x, int y, int z)
void AddDesign(int index, FurnitureDesign design)
FurnitureDesign TryAddDesignChain(FurnitureDesign design, bool garbageCollectIfNeeded)
FurnitureDesign FindMatchingDesign(FurnitureDesign design)
FurnitureDesign TryAddDesign(FurnitureDesign design)
static void SaveFurnitureDesigns(ValuesDictionary valuesDictionary, ICollection< FurnitureDesign > designs)
void ScanDesign(CellFace start, Vector3 direction, ComponentMiner componentMiner)
override void Save(ValuesDictionary valuesDictionary)
void AddToFurnitureSet(FurnitureDesign design, FurnitureSet furnitureSet)
override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner)
TerrainChunkState State
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
static int MakeBlockValue(int contents)
static int ExtractData(int value)
ValuesDictionary ValuesDictionary
static void HookAction(string HookName, Func< ModLoader, bool > action)
执行Hook
Point3 Location
定义 Box.cs:17
Point3 Size
定义 Box.cs:26
static Color White
static readonly Vector3 UnitY
static int Vector3ToFace(Vector3 v, int maxFace=5)
static int OppositeFace(int face)