Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemRotBlockBehavior.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
6 public const int MaxRot = 1;
7
9
11
12 public double m_lastRotTime;
13
14 public int m_rotStep;
15
16 public const float m_rotPeriod = 60f;
17
18 public bool m_isRotEnabled;
19
20 public override int[] HandledBlocks => [];
21
22 public override void Load(ValuesDictionary valuesDictionary) {
23 base.Load(valuesDictionary);
24 m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
26 m_lastRotTime = valuesDictionary.GetValue<double>("LastRotTime");
27 m_rotStep = valuesDictionary.GetValue<int>("RotStep");
28 m_subsystemItemsScanner.ItemsScanned += ItemsScanned;
29 m_isRotEnabled = m_subsystemGameInfo.WorldSettings.GameMode != 0 && m_subsystemGameInfo.WorldSettings.GameMode != GameMode.Adventure;
30 }
31
32 public override void Save(ValuesDictionary valuesDictionary) {
33 base.Save(valuesDictionary);
34 valuesDictionary.SetValue("LastRotTime", m_lastRotTime);
35 valuesDictionary.SetValue("RotStep", m_rotStep);
36 }
37
38 public override void OnPoll(int value, int x, int y, int z, int pollPass) {
39 if (m_isRotEnabled) {
40 int num = Terrain.ExtractContents(value);
41 Block block = BlocksManager.Blocks[num];
42 int rotPeriod = block.GetRotPeriod(value);
43 if (rotPeriod > 0
44 && pollPass % rotPeriod == 0) {
45 int num2 = block.GetDamage(value) + 1;
46 value = num2 > 1 ? block.GetDamageDestructionValue(value) : block.SetDamage(value, num2);
47 SubsystemTerrain.ChangeCell(x, y, z, value);
48 }
49 }
50 }
51
52 public void ItemsScanned(ReadOnlyList<ScannedItemData> items) {
53 int num = (int)((m_subsystemGameInfo.TotalElapsedGameTime - m_lastRotTime) / 60.0);
54 if (num > 0) {
55 if (m_isRotEnabled) {
56 foreach (ScannedItemData item in items) {
57 int num2 = Terrain.ExtractContents(item.Value);
58 Block block = BlocksManager.Blocks[num2];
59 int rotPeriod = block.GetRotPeriod(item.Value);
60 if (rotPeriod > 0) {
61 int num3 = block.GetDamage(item.Value);
62 for (int i = 0; i < num; i++) {
63 if (num3 > 1) {
64 break;
65 }
66 if ((i + m_rotStep) % rotPeriod == 0) {
67 num3++;
68 }
69 }
70 if (num3 <= 1) {
71 m_subsystemItemsScanner.TryModifyItem(item, block.SetDamage(item.Value, num3));
72 }
73 else {
74 m_subsystemItemsScanner.TryModifyItem(item, block.GetDamageDestructionValue(item.Value));
75 }
76 }
77 }
78 }
79 m_rotStep += num;
80 m_lastRotTime += num * 60f;
81 }
82 }
83 }
84}
virtual int SetDamage(int value, int damage)
virtual int GetDamage(int value)
virtual int GetRotPeriod(int value)
virtual int GetDamageDestructionValue(int value)
override void Save(ValuesDictionary valuesDictionary)
override void Load(ValuesDictionary valuesDictionary)
void ItemsScanned(ReadOnlyList< ScannedItemData > items)
override void OnPoll(int value, int x, int y, int z, int pollPass)
virtual void ChangeCell(int x, int y, int z, int value, bool updateModificationCounter=true, MovingBlock movingBlock=null)
static int ExtractContents(int value)
ValuesDictionary ValuesDictionary