DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
CodeLock.c
См. документацию.
2{
3 const string MEMPOINT_INSIDE = "inside";
4 const string MEMPOINT_CENTER = "ce_center";
5
6 protected const string ATTACHMENT_SLOT_BATTERY = "BatteryD";
7 protected const string SELECTION_NAME_BACK = "back";
8
11
12 protected bool m_Reversed = false;
13
14 // Sounds
15 private const string CODELOCK_ACCESS_SOUND = "digitalLock_beep_Access_SoundSet";
16 private const string CODELOCK_LOCK_SOUND = "digitalLock_mechanism_Lock_SoundSet";
17 private const string CODELOCK_UNLOCK_SOUND = "digitalLock_mechanism_Unlock_SoundSet";
18 private const string CODELOCK_ERROR_SOUND = "digitalLock_beep_Error_SoundSet";
19 private const string CODELOCK_DIGITS_SOUND = "digitalLock_buttons_Digits_SoundSet";
20 private const string CODELOCK_CLEAR_SOUND = "digitalLock_button_Clear_SoundSet";
21 private const string CODELOCK_CONFIRM_SOUND = "digitalLock_button_Key_confirm_SoundSet";
22
24 {
25 Init();
26 }
27
28 protected void Init()
29 {
32
33 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
34 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
35 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
36 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
37 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
38 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
39 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
40 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
41 RegisterNetSyncVariableBool("m_Reversed");
42 }
43
44 override void EEInit()
45 {
46 super.EEInit();
47
48 // Set visuals on init
50 }
51
52 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
53 {
54 super.EEItemLocationChanged(oldLoc, newLoc);
55
56 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
57 {
58 if (newLoc.GetType() != InventoryLocationType.ATTACHMENT)
59 {
60 if (g_Game.IsDedicatedServer())
61 SetSynchDirty();
62
63 // Force update since animation need too change
65 }
66 }
67 }
68
69 override void EEItemAttached(EntityAI item, string slot_name)
70 {
71 super.EEItemAttached(item, slot_name);
72
73 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
74 {
76 if (slot_name == ATTACHMENT_SLOT_BATTERY)
77 {
78 Battery9V battery = Battery9V.Cast(item);
79 if (battery)
80 {
81 float batteryEnergy = battery.GetCompEM().GetEnergy();
82 if (batteryEnergy > 0 && HasValidParent())
83 {
84 m_CodeLockComponent.SetStage(CodeLockStage.SETTING);
85 GetCompEM().SwitchOn();
86 }
87
89 }
90 }
91 }
92 }
93
94 override void EEItemDetached(EntityAI item, string slot_name)
95 {
96 super.EEItemDetached(item, slot_name);
97
98 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
99 {
101 if (slot_name == ATTACHMENT_SLOT_BATTERY)
102 {
103 m_CodeLockComponent.SetStage(CodeLockStage.NONE);
104 GetCompEM().SwitchOff();
105
107 }
108 }
109 }
110
111 override void OnWasAttached(EntityAI parent, int slot_id)
112 {
113 super.OnWasAttached(parent, slot_id);
114
115 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
116 {
118 string slotName = InventorySlots.GetSlotName(slot_id);
119 if (slotName.IndexOf("Att_CodeLock") > -1)
120 {
121 Battery9V battery = GetBattery();
122 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
123 {
124 m_CodeLockComponent.SetStage(CodeLockStage.SETTING);
125 GetCompEM().SwitchOn();
126 }
127
128 if (parent && parent.CanUseConstruction())
129 {
130 BuildingBase buildingBase = BuildingBase.Cast(parent);
131 if (buildingBase)
132 {
133 SetDoorInfoFromSlot(buildingBase, slotName);
134 }
135 }
136 }
137
139 }
140 }
141
142 override void OnWasDetached(EntityAI parent, int slot_id)
143 {
144 super.OnWasDetached(parent, slot_id);
145
146 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
147 {
149 if (GetCompEM().IsWorking())
150 GetCompEM().SwitchOff();
151
152 string slotName = InventorySlots.GetSlotName(slot_id);
153 if (slotName.IndexOf("Att_CodeLock") > -1)
154 {
155 m_Reversed = false;
156 m_CodeLockComponent.StopAllTimers();
157 m_CodeLockComponent.OnParentDetached();
158 }
159
161 }
162 }
163
164 override bool CanDetachAttachment(EntityAI parent)
165 {
166 if (IsLocked())
167 return false;
168
169 return true;
170 }
171
172 protected void SetDoorInfoFromSlot(BuildingBase buildingBase, string slotName)
173 {
174 map<int, ref AdditionalDoorInfo> doorsInfoMap = buildingBase.GetDoorInfoHolder().GetDoorInfoMap();
176 if (doorsInfoMap && doorsInfoMap.Count() > 0)
177 {
178 int doorIndex = -1;
179 AdditionalDoorInfo doorInfo;
180 foreach(int doorInfoIndex, AdditionalDoorInfo doorInfoData: doorsInfoMap)
181 {
182 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
183 {
184 if (relatedSlotName == slotName)
185 {
186 doorIndex = doorInfoIndex;
187 doorInfo = doorInfoData;
188 break;
189 }
190 }
191
192 if (doorIndex != -1)
193 break;
194 }
195
196 if (doorIndex > -1)
197 {
198 m_CodeLockComponent.SetDoorIndex(doorIndex);
199 }
200
202 Rebuilding rebuilding = Rebuilding.Cast(buildingBase.GetConstructionBasic());
203 if (rebuilding && doorInfo)
204 {
205 ConstructionPart constructionPart = rebuilding.GetConstructionPart(doorInfo.m_DoorConstructionPartName);
206 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
207 if (constructionPart && Class.CastTo(reversibleDoorPart, constructionPart))
208 {
209 m_Reversed = reversibleDoorPart.IsReversedLocal();
210 }
211 }
212 }
213 }
214
216 bool CanDetachCodeLock(notnull PlayerBase player, int componentIndex)
217 {
218 if (HasValidParent() && !IsLocked())
219 {
221 if (!GetReversedState() && !MiscGameplayFunctions.MemPointDirectionalCheck(player, this, DigitalCodeLock.MEMPOINT_CENTER, DigitalCodeLock.MEMPOINT_INSIDE))
222 return false;
223 }
224
225 return true;
226 }
227
228 override void OnWorkStop()
229 {
230 super.OnWorkStop();
231
232 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
233 {
234 m_CodeLockComponent.StopAllTimers();
235 m_CodeLockComponent.OnParentReset(false);
236
238 }
239 }
240
241 override void OnWorkStart()
242 {
243 super.OnWorkStart();
244
245 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
246 {
248 }
249 }
250
251 override void OnWork(float consumed_energy)
252 {
253 super.OnWork(consumed_energy);
254
255 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
256 {
257 Battery9V battery = GetBattery();
258 if (battery)
259 {
260 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
261 {
262 GetCompEM().SwitchOff();
263 m_CodeLockComponent.SetLockState(false, false);
264 }
265
266 float energyPercent = GetBatteryEnergy();
267 if (m_VisualManager.HasBatteryLevelChanged())
268 {
270 SetSynchDirty();
271 }
272 }
273 }
274 }
275
278 {
279 InventoryLocation inventoryLocation = new InventoryLocation;
280 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
281
282 //drop entity from attachment slot
283 if (g_Game.IsMultiplayer())
284 {
285 parent.GetInventory().DropEntity(InventoryMode.SERVER, parent, this);
286 }
287 else
288 {
289 parent.GetInventory().DropEntity(InventoryMode.LOCAL, parent, this);
290 }
291
292 vector groundPos;
293 string slotName = InventorySlots.GetSlotName(inventoryLocation.GetSlot());
294 if (parent.MemoryPointExists(slotName))
295 {
296 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(slotName));
297 }
298 else
299 {
300 groundPos = GetPosition();
301 }
302
303 SetPosition(groundPos);
304 PlaceOnSurface();
305 }
306
308 {
309 Battery9V battery = Battery9V.Cast(GetInventory().FindAttachment(Battery9V.SLOT_ID));
310 return battery;
311 }
312
314 {
315 return true;
316 }
317
319 {
320 return true;
321 }
322
324 {
325 return true;
326 }
327
329 {
330 return GetBattery() != null;
331 }
332
334 {
335 return true;
336 }
337
339 {
340 return GetCompEM().IsWorking();
341 }
342
343 bool HasPIN()
344 {
345 return m_CodeLockComponent.HasPIN();
346 }
347
348 string GetInputPIN()
349 {
350 return m_CodeLockComponent.GetInputPIN();
351 }
352
353 string GetLockPIN()
354 {
355 return m_CodeLockComponent.GetLockPIN();
356 }
357
358 void ResetPIN()
359 {
360 m_CodeLockComponent.ResetPIN();
361 }
362
363 void SetLockState(bool state)
364 {
365 m_CodeLockComponent.SetLockState(state);
366 }
367
372
373 bool IsLocked()
374 {
375 return m_CodeLockComponent.IsLocked();
376 }
377
379 {
380 return m_CodeLockComponent.GetStage();
381 }
382
384 {
385 return m_CodeLockComponent.HasBruteForceProtection();
386 }
387
389 {
390 return m_CodeLockComponent.ShouldHandleBruteForce();
391 }
392
394 {
395 return m_CodeLockComponent.GetWrongCodeCount();
396 }
397
399 {
400 return m_CodeLockComponent.GetMinLockPINLength();
401 }
402
404 {
405 return m_Reversed;
406 }
407
411 {
412 if (!player)
413 return false;
414
415 if (!MemoryPointExists(MEMPOINT_CENTER) || !MemoryPointExists(MEMPOINT_INSIDE))
416 return false;
417
418 bool playerOnInsideSide = MiscGameplayFunctions.MemPointDirectionalCheck(player, this, MEMPOINT_CENTER, MEMPOINT_INSIDE);
419
420 return playerOnInsideSide != GetReversedState();
421 }
422
424 {
425 EntityAI hierarchyParent = GetHierarchyRoot();
426 if (hierarchyParent.CanUseConstruction())
427 return true;
428
429 if (BroadcastedBunker.Cast(hierarchyParent))
430 return true;
431
432 return false;
433 }
434
439
441 {
442 Battery9V battery = GetBattery();
443 if (!battery)
444 return 0.0;
445
446 float energy = battery.GetCompEM().GetEnergy();
447 float energyMax = battery.GetCompEM().GetEnergyMax();
448
449 if (energyMax <= 0)
450 return 0.0;
451
452 return (energy / energyMax) * 100.0;
453 }
454
456 {
457 if (m_VisualManager)
458 m_VisualManager.UpdateVisuals();
459 }
460
462 {
463 if (m_VisualManager)
464 {
465 m_VisualManager.MarkDirty();
466 m_VisualManager.UpdateVisuals();
467 }
468 }
469
470 override void SetActions()
471 {
472 super.SetActions();
473
475 }
476
477 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
478 {
479 super.OnRPC(sender, rpc_type, ctx);
480
481 m_CodeLockComponent.OnRPC(sender, rpc_type, ctx);
482 }
483
485 {
486 super.OnStoreSave(ctx);
487
488 m_CodeLockComponent.OnStoreSave(ctx);
489 }
490
491 override bool OnStoreLoad(ParamsReadContext ctx, int version)
492 {
493 if (!super.OnStoreLoad(ctx, version))
494 return false;
495
496 if (!m_CodeLockComponent.OnStoreLoad(ctx, version))
497 return false;
498
499 return true;
500 }
501
502 override void AfterStoreLoad()
503 {
504 super.AfterStoreLoad();
505
506 if (HasBattery())
507 {
508 if (HasPIN())
509 {
510 m_CodeLockComponent.SetStage(CodeLockStage.NORMAL);
511 }
512 else
513 {
514 m_CodeLockComponent.SetStage(CodeLockStage.SETTING);
515 }
516 }
517
519 }
520
521 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
522 {
523 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
524
526 }
527
529 {
530 super.OnVariablesSynchronized();
531
533 {
534 CodeLockUIAction uiAction = m_CodeLockComponent.GetUIAction();
535 if (uiAction != CodeLockUIAction.NONE)
536 {
537 m_CodeLockComponent.CheckUIActionClient();
538 }
539 }
540 }
541
542 override bool IsExternalLockType()
543 {
544 return true;
545 }
546
547 override void InitItemSounds()
548 {
549 super.InitItemSounds();
550
551 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_ACCESS, CODELOCK_ACCESS_SOUND);
552 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_LOCK, CODELOCK_LOCK_SOUND);
553 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_UNLOCK, CODELOCK_UNLOCK_SOUND);
554 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_ERROR, CODELOCK_ERROR_SOUND);
555 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_CONFIRM_INPUT, CODELOCK_CONFIRM_SOUND);
556 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_CLEAR_INPUT, CODELOCK_CLEAR_SOUND);
557 GetItemSoundHandler().AddSound(SoundConstants.ITEM_DIGITAL_LOCK_DIGIT_INPUT, CODELOCK_DIGITS_SOUND);
558 }
559
560 //Debug menu Spawn Ground Special
561 override void OnDebugSpawn()
562 {
563 GetInventory().CreateInInventory("Battery9V");
564 }
565}
566
567class DigitalCodeLock_Bunker : DigitalCodeLock
568{
569 override void Init()
571 super.Init();
572
573 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
574 int pinCodeLength = CodeLockComponent.MIN_LOCK_PIN_LENGTH;
575
576 if (bunkerConfig && bunkerConfig.bunkerSettings)
579 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
580 if (pinCodeLength > CodeLockComponent.MAX_LOCK_PIN_LENGTH)
581 pinCodeLength = CodeLockComponent.MAX_LOCK_PIN_LENGTH;
584 m_CodeLockComponent.SetMinimalPinCodeLength(pinCodeLength);
587 override bool CanBeLocked()
589 return false;
591
592 override bool CanSetCode()
593 {
594 return false;
595 }
596
597 override bool CanDetachAttachment(EntityAI parent)
598 {
599 return false;
600 }
601
603 override void OnWasDetached(EntityAI parent, int slot_id) {}
604
605 override bool NeedBattery()
606 {
607 return false;
608 }
609
610 override bool HasBattery()
612 return true;
613 }
614
615 override bool HasEnergy()
616 {
617 return true;
618 }
620 override bool ShowZonesHealth()
621 {
622 return true;
623 }
624
625 bool SetLockCode(string pin)
626 {
627 return m_CodeLockComponent.SetLockCode(pin);
628 }
629
630 void Disable()
631 {
632 m_CodeLockComponent.SetStage(CodeLockStage.NONE);
633 SetAnimationPhase(CodeLockVisualManager.CODELOCK_ANIMATED_GREEN_LIGHT, 1.0);
634 SetAnimationPhase(CodeLockVisualManager.CODELOCK_ANIMATED_RED_LIGHT, 1.0);
635 }
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
class LogManager EntityAI
void BuildingBase()
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
PlayerSpawnPreset slotName
void Disable()
Определения CodeLock.c:630
bool SetLockCode(string pin)
Определения CodeLock.c:625
ref CodeLockComponent m_CodeLockComponent
Определения CodeLock.c:576
void CodeLockComponent(notnull EntityAI parent, int minLockPinLength=MIN_LOCK_PIN_LENGTH)
Определения CodeLockComponent.c:51
CodeLockStage
Определения CodeLockComponent.c:5
void CodeLockVisualManager(DigitalCodeLock codeLock, CodeLockComponent component)
Определения CodeLockVisualManager.c:63
DayZGame g_Game
Определения DayZGame.c:4074
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:4407
string m_DoorConstructionPartName
memory point name for limiting open/close actions on the door/window
Определения AdditionalDoorsInfo.c:9
Single door info.
Определения AdditionalDoorsInfo.c:3
static int SLOT_ID
Определения Battery9V.c:3
Определения Battery9V.c:2
static BunkerBroadcastConfigInstance GetData()
Определения CfgBunkerBroadcastHandler.c:46
Super root of all classes in Enforce script.
Определения EnScript.c:11
Instanced construction part data classes for dynamic data, statics now stored on EntityType level in ...
Определения ConstructionPart.c:4
override void EEItemAttached(EntityAI item, string slot_name)
Определения CodeLock.c:69
override void OnDebugSpawn()
Определения CodeLock.c:561
CodeLockComponent GetCodeLockComponent()
Определения CodeLock.c:368
bool HasBruteForceProtection()
Определения CodeLock.c:383
bool HasPIN()
Определения CodeLock.c:343
string GetLockPIN()
Определения CodeLock.c:353
bool m_Reversed
Определения CodeLock.c:12
ref CodeLockVisualManager m_VisualManager
Определения CodeLock.c:10
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения CodeLock.c:491
bool ShouldHandleBruteForce()
Определения CodeLock.c:388
override void OnWasAttached(EntityAI parent, int slot_id)
Определения CodeLock.c:111
override void OnStoreSave(ParamsWriteContext ctx)
Определения CodeLock.c:484
bool HasValidParent()
Определения CodeLock.c:423
override void OnWorkStart()
Определения CodeLock.c:241
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения CodeLock.c:477
void DigitalCodeLock()
Определения CodeLock.c:23
void ResetPIN()
Определения CodeLock.c:358
const string SELECTION_NAME_BACK
Определения CodeLock.c:7
void Init()
Определения CodeLock.c:28
override void OnWork(float consumed_energy)
Определения CodeLock.c:251
bool IsPlayerOnBackside(PlayerBase player)
Определения CodeLock.c:410
override bool IsExternalLockType()
Определения CodeLock.c:542
const string CODELOCK_DIGITS_SOUND
Определения CodeLock.c:19
const string CODELOCK_ACCESS_SOUND
Определения CodeLock.c:15
const string CODELOCK_ERROR_SOUND
Определения CodeLock.c:18
const string ATTACHMENT_SLOT_BATTERY
Определения CodeLock.c:6
override void OnWorkStop()
Определения CodeLock.c:228
const string CODELOCK_CLEAR_SOUND
Определения CodeLock.c:20
Battery9V GetBattery()
Определения CodeLock.c:307
bool HasBattery()
Определения CodeLock.c:328
bool CanBeLocked()
Определения CodeLock.c:313
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения CodeLock.c:52
bool CanDetachCodeLock(notnull PlayerBase player, int componentIndex)
Condition check called from ActionTakeItem and ActionTakeItemToHands.
Определения CodeLock.c:216
float GetBatteryEnergy()
Определения CodeLock.c:440
bool GetReversedState()
Определения CodeLock.c:403
const string CODELOCK_CONFIRM_SOUND
Определения CodeLock.c:21
override void OnVariablesSynchronized()
Определения CodeLock.c:528
override void EEInit()
Определения CodeLock.c:44
bool HasEnergy()
Определения CodeLock.c:338
const string MEMPOINT_INSIDE
Определения CodeLock.c:3
void UpdateVisuals()
Определения CodeLock.c:455
void SetDoorInfoFromSlot(BuildingBase buildingBase, string slotName)
Определения CodeLock.c:172
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения CodeLock.c:521
const string CODELOCK_LOCK_SOUND
Определения CodeLock.c:16
bool CanSetCode()
Определения CodeLock.c:323
int GetMinLockPINLength()
Определения CodeLock.c:398
int GetWrongCodeCount()
Определения CodeLock.c:393
CodeLockStage GetStage()
Определения CodeLock.c:378
override void InitItemSounds()
Определения CodeLock.c:547
CodeLockVisualManager GetVisualManager()
Определения CodeLock.c:435
override void SetActions()
Определения CodeLock.c:470
bool CanBeUnlocked()
Определения CodeLock.c:318
void SetLockState(bool state)
Определения CodeLock.c:363
override void EEItemDetached(EntityAI item, string slot_name)
Определения CodeLock.c:94
bool IsLocked()
Определения CodeLock.c:373
ref CodeLockComponent m_CodeLockComponent
Определения CodeLock.c:9
string GetInputPIN()
Определения CodeLock.c:348
void ForceFullVisualsUpdate()
Определения CodeLock.c:461
override void AfterStoreLoad()
Определения CodeLock.c:502
const string CODELOCK_UNLOCK_SOUND
Определения CodeLock.c:17
const string MEMPOINT_CENTER
Определения CodeLock.c:4
void UnlockOnServer(EntityAI parent)
Unlock AND drop.
Определения CodeLock.c:277
bool NeedBattery()
Определения CodeLock.c:333
override void OnWasDetached(EntityAI parent, int slot_id)
Определения CodeLock.c:142
override bool CanDetachAttachment(EntityAI parent)
Определения CodeLock.c:164
Определения CodeLock.c:2
proto native int GetSlot()
returns slot id if current type is Attachment
InventoryLocation.
Определения InventoryLocation.c:30
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
Определения InventorySlots.c:6
override bool ShowZonesHealth()
Определения PlayerBaseClient.c:2
The class that will be instanced (moddable)
Определения gameplay.c:389
Определения Rebuilding.c:2
Определения Transport.c:70
Определения EnConvert.c:119
Serializer ParamsReadContext
Определения gameplay.c:15
Serializer ParamsWriteContext
Определения gameplay.c:16
proto native void SetPosition(vector position)
Set the world position of the Effect.
Определения Effect.c:463
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473