Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
SubsystemDoorBlockBehavior.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
7
8 public static Random m_random = new();
9
10 public override int[] HandledBlocks => [56, 57, 58];
11
12 public bool OpenCloseDoor(int x, int y, int z, bool open) {
13 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y, z);
14 int num = Terrain.ExtractContents(cellValue);
15 if (BlocksManager.Blocks[num] is DoorBlock) {
16 int data = DoorBlock.SetOpen(Terrain.ExtractData(cellValue), open);
17 int value = Terrain.ReplaceData(cellValue, data);
18 SubsystemTerrain.ChangeCell(x, y, z, value);
19 string name = open ? "Audio/Doors/DoorOpen" : "Audio/Doors/DoorClose";
20 SubsystemTerrain.Project.FindSubsystem<SubsystemAudio>(true)
21 .PlaySound(name, 0.7f, m_random.Float(-0.1f, 0.1f), new Vector3(x, y, z), 4f, true);
22 return true;
23 }
24 return false;
25 }
26
27 public bool IsDoorElectricallyConnected(int x, int y, int z) {
28 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y, z);
29 int num = Terrain.ExtractContents(cellValue);
30 int data = Terrain.ExtractData(cellValue);
31 if (BlocksManager.Blocks[num] is DoorBlock) {
32 int num2 = DoorBlock.IsBottomPart(SubsystemTerrain.Terrain, x, y, z) ? y : y - 1;
33 for (int i = num2; i <= num2 + 1; i++) {
34 ElectricElement electricElement = m_subsystemElectricity.GetElectricElement(x, i, z, DoorBlock.GetHingeFace(data));
35 if (electricElement != null
36 && electricElement.Connections.Count > 0) {
37 return true;
38 }
39 }
40 }
41 return false;
42 }
43
44 public override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner) {
45 CellFace cellFace = raycastResult.CellFace;
46 int cellValue = SubsystemTerrain.Terrain.GetCellValue(cellFace.X, cellFace.Y, cellFace.Z);
47 int num = Terrain.ExtractContents(cellValue);
48 int data = Terrain.ExtractData(cellValue);
49 if (num == 56
50 || !IsDoorElectricallyConnected(cellFace.X, cellFace.Y, cellFace.Z)) {
51 bool open = DoorBlock.GetOpen(data);
52 return OpenCloseDoor(cellFace.X, cellFace.Y, cellFace.Z, !open);
53 }
54 return true;
55 }
56
57 public override void OnBlockAdded(int value, int oldValue, int x, int y, int z) {
58 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y - 1, z);
59 int cellValue2 = SubsystemTerrain.Terrain.GetCellValue(x, y + 1, z);
61 && Terrain.ExtractContents(cellValue2) == 0) {
62 SubsystemTerrain.ChangeCell(x, y + 1, z, value);
63 }
64 }
65
66 public override void OnBlockRemoved(int value, int newValue, int x, int y, int z) {
67 if (DoorBlock.IsTopPart(SubsystemTerrain.Terrain, x, y, z)) {
68 SubsystemTerrain.ChangeCell(x, y - 1, z, 0);
69 }
70 if (DoorBlock.IsBottomPart(SubsystemTerrain.Terrain, x, y, z)) {
71 SubsystemTerrain.ChangeCell(x, y + 1, z, 0);
72 }
73 }
74
75 public override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ) {
76 int cellValue = SubsystemTerrain.Terrain.GetCellValue(x, y, z);
77 int num = Terrain.ExtractContents(cellValue);
78 Block obj = BlocksManager.Blocks[num];
79 int data = Terrain.ExtractData(cellValue);
80 if (!(obj is DoorBlock)) {
81 return;
82 }
83 if (neighborX == x
84 && neighborY == y
85 && neighborZ == z) {
86 if (DoorBlock.IsBottomPart(SubsystemTerrain.Terrain, x, y, z)) {
87 int value = Terrain.ReplaceData(SubsystemTerrain.Terrain.GetCellValue(x, y + 1, z), data);
88 SubsystemTerrain.ChangeCell(x, y + 1, z, value);
89 }
90 if (DoorBlock.IsTopPart(SubsystemTerrain.Terrain, x, y, z)) {
91 int value2 = Terrain.ReplaceData(SubsystemTerrain.Terrain.GetCellValue(x, y - 1, z), data);
92 SubsystemTerrain.ChangeCell(x, y - 1, z, value2);
93 }
94 }
95 if (DoorBlock.IsBottomPart(SubsystemTerrain.Terrain, x, y, z)) {
96 int cellValue2 = SubsystemTerrain.Terrain.GetCellValue(x, y - 1, z);
97 if (BlocksManager.Blocks[Terrain.ExtractContents(cellValue2)].IsNonAttachable(cellValue2)) {
98 SubsystemTerrain.DestroyCell(
99 0,
100 x,
101 y,
102 z,
103 0,
104 false,
105 false
106 );
107 }
108 }
109 if (!DoorBlock.IsBottomPart(SubsystemTerrain.Terrain, x, y, z)
110 && !DoorBlock.IsTopPart(SubsystemTerrain.Terrain, x, y, z)) {
111 SubsystemTerrain.DestroyCell(
112 0,
113 x,
114 y,
115 z,
116 0,
117 false,
118 false
119 );
120 }
121 }
122
123 public override void Load(ValuesDictionary valuesDictionary) {
124 base.Load(valuesDictionary);
126 }
127 }
128}
virtual bool IsNonAttachable(int value)
static int SetOpen(int data, bool open)
static bool IsBottomPart(Terrain terrain, int x, int y, int z)
static bool GetOpen(int data)
static int GetHingeFace(int data)
static bool IsTopPart(Terrain terrain, int x, int y, int z)
List< ElectricConnection > Connections
override void OnBlockRemoved(int value, int newValue, int x, int y, int z)
override void OnBlockAdded(int value, int oldValue, int x, int y, int z)
override void Load(ValuesDictionary valuesDictionary)
override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
bool OpenCloseDoor(int x, int y, int z, bool open)
override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner)
static int ExtractContents(int value)
static int ReplaceData(int value, int data)
static int ExtractData(int value)
ValuesDictionary ValuesDictionary