DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
Bunker.c
См. документацию.
1class Bunker : House
2{
3 protected const float DOOR_AUTOCLOSE_TIME = 12;
4 private bool m_IsActive;
5
7
8 protected DigitalCodeLock_Bunker m_CodeLock;
9
10 void Bunker()
11 {
12 RegisterNetSyncVariableBool("m_IsActive");
13 }
14
15 // --------------------------------------------------------------------------------
16
18 {
19 return m_CodeLock.GetCodeLockComponent();
20 }
21
22 // --------------------------------------------------------------------------------
23
25 {
26 return m_CodeLock != null;
27 }
28
29 // --------------------------------------------------------------------------------
30
31 DigitalCodeLock_Bunker GetCodeLock()
32 {
33 return m_CodeLock;
34 }
35
36 // --------------------------------------------------------------------------------
37
38 override void DeferredInit()
39 {
40 super.DeferredInit();
41
42 g_Game.RegisterNetworkStaticObject(this);
43 }
44
45 // --------------------------------------------------------------------------------
46
47 override bool CanDoorBeOpened(notnull DoorManipulationParams params)
48 {
49 if (IsMainDoor(params.m_DoorIndex))
50 {
51 AdditionalDoorInfo doorInfo = GetDoorInfo(params.m_DoorIndex);
52 string memPointStartName = string.Format("%1_action", doorInfo.m_DoorType);
53 string memPointEndName = string.Format("%1_inside", doorInfo.m_DoorType);
54
55 bool insideAndInactive = MiscGameplayFunctions.MemPointDirectionalCheck(PlayerBase.Cast(params.m_Caller), this, memPointStartName, memPointEndName) && super.CanDoorBeOpened(params);
56 bool outside = m_IsActive && !GetCodeLock().IsLocked() && super.CanDoorBeOpened(params);
57
58 return insideAndInactive || outside;
59 }
60
61 return super.CanDoorBeOpened(params);
62 }
63
64 // --------------------------------------------------------------------------------
65
66 override bool CanDoorBeLocked(int doorIndex)
67 {
68 return false;
69 }
70
71 // --------------------------------------------------------------------------------
72
73 override void OnDoorOpenStart(DoorStartParams params)
74 {
75 if (!IsMainDoor(params.param1))
76 return;
77
80
81 Timer doorTimer = new Timer();
82 doorTimer.Run(DOOR_AUTOCLOSE_TIME, this, "AutoCloseDoor", new Param1<int>(params.param1));
83 m_AutoCloseTimers.Set(params.param1, doorTimer);
84 }
85
86 override void OnDoorCloseStart(DoorStartParams params)
87 {
88 if (HasCodeLock())
89 GetCodeLock().SetLockState(true);
90 }
91
92 // --------------------------------------------------------------------------------
93
94 void SetActive(bool isActive)
95 {
96 m_IsActive = isActive;
97 SetSynchDirty();
98 }
99
100 // --------------------------------------------------------------------------------
101
104 {
105 return 0;
106 }
107
108 // --------------------------------------------------------------------------------
109
110 protected bool IsMainDoor(int doorIndex)
111 {
112 return (doorIndex == GetMainDoorIndex());
113 }
114
115 // --------------------------------------------------------------------------------
116
117 protected void AutoCloseDoor(int doorIndex)
118 {
119 CloseDoor(doorIndex);
120 RemoveDoorTimer(doorIndex);
121 }
122
123 // --------------------------------------------------------------------------------
124
125 protected void RemoveDoorTimer(int doorIndex)
126 {
128 m_AutoCloseTimers.Remove(doorIndex);
129 }
130
131 // --------------------------------------------------------------------------------
132
133 void OnBunkerActivated(bool loadedAsActive, string codeLockCode)
134 {
135 DigitalCodeLock_Bunker codeLock = GetCodeLock();
136 codeLock.SetLockCode(codeLockCode);
137 codeLock.SetLockState(true);
138 SetActive(true);
139 }
140
141 // --------------------------------------------------------------------------------
142
144 {
145 DigitalCodeLock_Bunker codeLock = GetCodeLock();
146 codeLock.SetLockState(false);
147 codeLock.Disable();
148 SetActive(false);
149 }
150
151 // --------------------------------------------------------------------------------
152
153 #ifdef DIAG_DEVELOPER
154 override string GetDebugText()
155 {
156 string text = super.GetDebugText();
157
158 if (m_CodeLock)
159 {
160 text += string.Format("Code: %1\n", m_CodeLock.GetLockPIN());
161 text += string.Format("Active: %1\n", m_IsActive.ToString());
162 }
163
164 return text;
165 }
166 #endif
167
168}
169
170class BroadcastedBunker : Bunker
171{
172 protected static const int RESOLVE_CODELOCK_RETRY_DELAY = 200;
173
174 protected const string CODE_LOCK_ATTACHMENT_NAME = "att_codelock";
175 protected const string CRATE_SPAWN_POSITION_MEM_NAME = "storagecratepos";
176 protected const string STORAGE_BOX_CLASSNAME = "StorageBox_Wooden";
177
179
180 // --------------------------------------------------------------------------------
181
182
183 override void DeferredInit()
184 {
185 super.DeferredInit();
186
188 }
189
190 // --------------------------------------------------------------------------------
191
192 protected void ResolveCodeLock()
193 {
195 EntityAI attachment = GetInventory().FindAttachment(slotId);
196 if (attachment)
197 {
198 m_CodeLock = DigitalCodeLock_Bunker.Cast(attachment);
199 return;
200 }
201
202 if (g_Game.IsServer())
203 {
204 m_CodeLock = DigitalCodeLock_Bunker.Cast(GetInventory().CreateAttachmentEx("DigitalCodeLock_Bunker", slotId));
205 m_CodeLock.SetAnimationPhase(CodeLockVisualManager.CODELOCK_ANIMATED_ZIP, 1.0);
206 return;
207 }
208
211 }
212
213 // --------------------------------------------------------------------------------
214
215 override DigitalCodeLock_Bunker GetCodeLock()
216 {
217 if (!m_CodeLock)
218 {
220 m_CodeLock = DigitalCodeLock_Bunker.Cast(GetInventory().FindAttachment(slotId));
221 }
222
223 return m_CodeLock;
224 }
225
226 // --------------------------------------------------------------------------------
227
228 override protected void OnBunkerActivated(bool loadedAsActive, string codeLockCode)
229 {
230 bool wasInitialized = IsInitialized();
231
232 if (!wasInitialized)
233 return;
234
235 super.OnBunkerActivated(loadedAsActive, codeLockCode);
236
237 if (!m_StorageBox)
238 m_StorageBox = FindOrSpawnStorageBox(loadedAsActive);
239 }
240
241 // --------------------------------------------------------------------------------
242
243 override protected void OnBunkerDeactivated()
244 {
245 super.OnBunkerDeactivated();
246
247 if (m_StorageBox)
248 {
249 #ifndef SERVER
250 m_StorageBox.DeleteSafe();
251 #else
252 m_StorageBox.SetLifetime(5.0);
253 #endif
254 }
255 }
256
257 // --------------------------------------------------------------------------------
258
259 private EntityAI FindOrSpawnStorageBox(bool preferExisting)
260 {
261 if (preferExisting)
262 {
263 EntityAI existing = FindExistingStorageBox();
264 if (existing)
265 return existing;
266 }
267
268 return SpawnStorageBox();
269 }
270
271 // --------------------------------------------------------------------------------
272
274 {
275 if (!MemoryPointExists(CRATE_SPAWN_POSITION_MEM_NAME))
276 return null;
277
278 vector spawnPosWorld = ModelToWorld(GetMemoryPointPos(CRATE_SPAWN_POSITION_MEM_NAME));
279
280 array<Object> objects = new array<Object>();
281 array<CargoBase> proxyCargos = new array<CargoBase>();
282 g_Game.GetObjectsAtPosition3D(spawnPosWorld, 1.5, objects, proxyCargos);
283
284 float bestDist = 999999;
285 EntityAI bestBox = null;
286
287 foreach (Object obj : objects)
288 {
289 if (StorageBox_Colorbase.Cast(obj))
290 {
291 float dist = vector.Distance(spawnPosWorld, obj.GetWorldPosition());
292 if (dist < bestDist)
293 {
294 bestDist = dist;
295 bestBox = EntityAI.Cast(obj);
296 }
297 }
298 }
299
300 return bestBox;
301 }
302
303 // --------------------------------------------------------------------------------
304
306 {
307 if (!MemoryPointExists(CRATE_SPAWN_POSITION_MEM_NAME))
308 return null;
309
310 vector positionModel = GetMemoryPointPos(CRATE_SPAWN_POSITION_MEM_NAME);
311 vector positionWorld = ModelToWorld(positionModel);
312
314 if (storageBox)
315 {
316 vector directionModel = GetMemoryPointPos("storagecratedir");
317 vector directionWorld = ModelToWorld(directionModel);
318
319 vector forward = vector.Direction(positionWorld, directionWorld); // normalized vector
320
321 float yaw = Math.Atan2(forward[0], forward[2]) * Math.RAD2DEG;
322 vector orientation = Vector(yaw, 0.0, 0.0);
323
324 storageBox.SetOrientation(orientation);
325 }
326
327 return storageBox;
328 }
329}
330
331class Land_Bunker_Basement_Civilian : BroadcastedBunker {}
332class Land_Bunker_Basement_Storage : BroadcastedBunker {}
333class Land_Bunker_Basement_Medical : BroadcastedBunker {}
334class Land_Bunker_Shelter_Office : BroadcastedBunker {}
335class Land_Bunker_Shelter_Storage : BroadcastedBunker {}
336class Land_Bunker_Shelter_Medical : BroadcastedBunker {}
Param1< int > DoorStartParams
Определения 3_Game/DayZ/Entities/Building.c:1
const string STORAGE_BOX_CLASSNAME
Определения Bunker.c:176
EntityAI m_StorageBox
Определения Bunker.c:178
const string CODE_LOCK_ATTACHMENT_NAME
ms between client retries while waiting for the codelock attachment to replicate
Определения Bunker.c:174
const string CRATE_SPAWN_POSITION_MEM_NAME
Определения Bunker.c:175
EntityAI SpawnStorageBox()
Определения Bunker.c:305
void ResolveCodeLock()
Определения Bunker.c:192
EntityAI FindExistingStorageBox()
Определения Bunker.c:273
EntityAI FindOrSpawnStorageBox(bool preferExisting)
Определения Bunker.c:259
Bunker RESOLVE_CODELOCK_RETRY_DELAY
void OnBunkerDeactivated()
Определения Bunker.c:243
override DigitalCodeLock_Bunker GetCodeLock()
Определения Bunker.c:215
void OnBunkerActivated(bool loadedAsActive, string codeLockCode)
Определения Bunker.c:228
bool m_IsActive
Определения BunkerBroadcastComponent.c:157
const int ECE_EQUIP_CARGO
Определения CentralEconomy.c:22
const int ECE_UPDATEPATHGRAPH
Определения CentralEconomy.c:13
const int ECE_KEEPHEIGHT
Определения CentralEconomy.c:28
const int ECE_CREATEPHYSICS
Определения CentralEconomy.c:17
void CodeLockComponent(notnull EntityAI parent, int minLockPinLength=MIN_LOCK_PIN_LENGTH)
Определения CodeLockComponent.c:51
void CodeLockVisualManager(DigitalCodeLock codeLock, CodeLockComponent component)
Определения CodeLockVisualManager.c:63
enum CodeLockLightState m_CodeLock
override bool IsInitialized()
Определения CombinationLock.c:96
override void DeferredInit()
Определения ContaminatedArea.c:49
DayZGame g_Game
Определения DayZGame.c:4074
vector orientation
Определения DustKickupEffects.c:21
string GetDebugText()
Определения ModifierBase.c:71
void SetActive()
Определения TrapBase.c:413
string m_DoorType
Определения AdditionalDoorsInfo.c:6
Single door info.
Определения AdditionalDoorsInfo.c:3
void AutoCloseDoor(int doorIndex)
Определения Bunker.c:117
void OnBunkerDeactivated()
Определения Bunker.c:143
int GetMainDoorIndex()
adapt this to your lockable doors (model specific)
Определения Bunker.c:103
override bool CanDoorBeLocked(int doorIndex)
Определения Bunker.c:66
DigitalCodeLock_Bunker GetCodeLock()
Определения Bunker.c:31
override void OnDoorCloseStart(DoorStartParams params)
Определения Bunker.c:86
override bool CanDoorBeOpened(notnull DoorManipulationParams params)
Определения Bunker.c:47
ref map< int, ref Timer > m_AutoCloseTimers
Определения Bunker.c:6
const float DOOR_AUTOCLOSE_TIME
Определения Bunker.c:3
void SetActive(bool isActive)
Определения Bunker.c:94
DigitalCodeLock_Bunker m_CodeLock
Определения Bunker.c:8
override void OnDoorOpenStart(DoorStartParams params)
Определения Bunker.c:73
override void DeferredInit()
Определения Bunker.c:38
void OnBunkerActivated(bool loadedAsActive, string codeLockCode)
Определения Bunker.c:133
void RemoveDoorTimer(int doorIndex)
Определения Bunker.c:125
void Bunker()
Определения Bunker.c:10
bool m_IsActive
Определения Bunker.c:4
bool IsMainDoor(int doorIndex)
Определения Bunker.c:110
CodeLockComponent GetCodeLockComponent()
Определения Bunker.c:17
bool HasCodeLock()
Определения Bunker.c:24
Определения Bunker.c:2
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
provides access to slot configuration
Определения InventorySlots.c:6
Определения EnMath.c:7
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
Определения DayZPlayerImplement.c:39
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения Transport.c:70
static vector Direction(vector p1, vector p2)
Returns direction vector from point p1 to point p2.
Определения EnConvert.c:254
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
Определения EnConvert.c:119
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto float Atan2(float y, float x)
Returns angle in radians from tangent.
static const float RAD2DEG
Определения EnMath.c:16
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10