966{
969
972
975
977
978
986
988 {
990 }
991
992 protected void Init()
993 {
996
997 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
998 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
999 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1000 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1001 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1002 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1003 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1004 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1005 RegisterNetSyncVariableBool("m_Reversed");
1006 }
1007
1009 {
1010 super.EEInit();
1011
1012
1014 }
1015
1017 {
1018 super.EEItemLocationChanged(oldLoc, newLoc);
1019
1021 {
1023 {
1024 if (
g_Game.IsDedicatedServer())
1025 SetSynchDirty();
1026
1027
1029 }
1030 }
1031 }
1032
1034 {
1035 super.EEItemAttached(item, slot_name);
1036
1038 {
1041 {
1043 if (battery)
1044 {
1045 float batteryEnergy = battery.GetCompEM().GetEnergy();
1047 {
1049 GetCompEM().SwitchOn();
1050 }
1051
1053 }
1054 }
1055 }
1056 }
1057
1059 {
1060 super.EEItemDetached(item, slot_name);
1061
1063 {
1066 {
1068 GetCompEM().SwitchOff();
1069
1071 }
1072 }
1073 }
1074
1076 {
1077 super.OnWasAttached(parent, slot_id);
1078
1080 {
1083 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1084 {
1086 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1087 {
1089 GetCompEM().SwitchOn();
1090 }
1091
1092 if (parent && parent.CanUseConstruction())
1093 {
1095 if (buildingBase)
1096 {
1098 }
1099 }
1100 }
1101
1103 }
1104 }
1105
1107 {
1108 super.OnWasDetached(parent, slot_id);
1109
1111 {
1113 if (GetCompEM().IsWorking())
1114 GetCompEM().SwitchOff();
1115
1117 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1118 {
1122 }
1123
1125 }
1126 }
1127
1129 {
1131 return false;
1132
1133 return true;
1134 }
1135
1137 {
1140 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1141 {
1142 int doorIndex = -1;
1145 {
1146 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1147 {
1149 {
1150 doorIndex = doorInfoIndex;
1151 doorInfo = doorInfoData;
1152 break;
1153 }
1154 }
1155
1156 if (doorIndex != -1)
1157 break;
1158 }
1159
1160 if (doorIndex > -1)
1161 {
1163 }
1164
1167 if (rebuilding && doorInfo)
1168 {
1170 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1171 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1172 {
1173 m_Reversed = reversibleDoorPart.IsReversedLocal();
1174 }
1175 }
1176 }
1177 }
1178
1181 {
1183 {
1186 return false;
1187 }
1188
1189 return true;
1190 }
1191
1193 {
1194 super.OnWorkStop();
1195
1197 {
1200
1202 }
1203 }
1204
1206 {
1207 super.OnWorkStart();
1208
1210 {
1212 }
1213 }
1214
1215 override void OnWork(
float consumed_energy)
1216 {
1217 super.OnWork(consumed_energy);
1218
1220 {
1222 if (battery)
1223 {
1224 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1225 {
1226 GetCompEM().SwitchOff();
1228 }
1229
1232 {
1234 SetSynchDirty();
1235 }
1236 }
1237 }
1238 }
1239
1242 {
1244 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1245
1246
1247 if (
g_Game.IsMultiplayer())
1248 {
1249 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1250 }
1251 else
1252 {
1253 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1254 }
1255
1258 if (parent.MemoryPointExists(
slotName))
1259 {
1260 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1261 }
1262 else
1263 {
1265 }
1266
1268 PlaceOnSurface();
1269 }
1270
1272 {
1274 return battery;
1275 }
1276
1278 {
1279 return true;
1280 }
1281
1283 {
1284 return true;
1285 }
1286
1288 {
1289 return true;
1290 }
1291
1293 {
1295 }
1296
1298 {
1299 return true;
1300 }
1301
1303 {
1304 return GetCompEM().IsWorking();
1305 }
1306
1308 {
1310 }
1311
1313 {
1315 }
1316
1318 {
1320 }
1321
1323 {
1325 }
1326
1328 {
1330 }
1331
1333 {
1335 }
1336
1338 {
1340 }
1341
1343 {
1345 }
1346
1348 {
1350 }
1351
1353 {
1355 }
1356
1358 {
1360 }
1361
1363 {
1365 }
1366
1368 {
1370 }
1371
1375 {
1376 if (!player)
1377 return false;
1378
1380 return false;
1381
1383
1385 }
1386
1388 {
1389 EntityAI hierarchyParent = GetHierarchyRoot();
1390 if (hierarchyParent.CanUseConstruction())
1391 return true;
1392
1393 if (BroadcastedBunker.Cast(hierarchyParent))
1394 return true;
1395
1396 return false;
1397 }
1398
1400 {
1402 }
1403
1405 {
1407 if (!battery)
1408 return 0.0;
1409
1410 float energy = battery.GetCompEM().GetEnergy();
1411 float energyMax = battery.GetCompEM().GetEnergyMax();
1412
1413 if (energyMax <= 0)
1414 return 0.0;
1415
1416 return (energy / energyMax) * 100.0;
1417 }
1418
1420 {
1423 }
1424
1426 {
1428 {
1431 }
1432 }
1433
1435 {
1436 super.SetActions();
1437
1439 }
1440
1442 {
1443 super.OnRPC(sender, rpc_type, ctx);
1444
1446 }
1447
1449 {
1450 super.OnStoreSave(ctx);
1451
1453 }
1454
1456 {
1457 if (!super.OnStoreLoad(ctx, version))
1458 return false;
1459
1461 return false;
1462
1463 return true;
1464 }
1465
1467 {
1468 super.AfterStoreLoad();
1469
1471 {
1473 {
1475 }
1476 else
1477 {
1479 }
1480 }
1481
1483 }
1484
1486 {
1487 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1488
1490 }
1491
1493 {
1494 super.OnVariablesSynchronized();
1495
1497 {
1499 if (uiAction != CodeLockUIAction.NONE)
1500 {
1502 }
1503 }
1504 }
1505
1507 {
1508 return true;
1509 }
1510
1512 {
1513 super.InitItemSounds();
1514
1522 }
1523
1524
1526 {
1527 GetInventory().CreateInInventory("Battery9V");
1528 }
1529}
1530
1532{
1533 override void Init()
1534 {
1536
1537 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1539
1540 if (bunkerConfig && bunkerConfig.bunkerSettings)
1541 {
1543 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1546 }
1547
1549 }
1550
1552 {
1553 return false;
1554 }
1555
1557 {
1558 return false;
1559 }
1560
1562 {
1563 return false;
1564 }
1565
1568
1570 {
1571 return false;
1572 }
1573
1575 {
1576 return true;
1577 }
1578
1580 {
1581 return true;
1582 }
1583
1585 {
1586 return true;
1587 }
1588
1590 {
1592 }
1593
1595 {
1599 }
1600}
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
void AddAction(typename actionName)
PlayerSpawnPreset slotName
override void EEItemDetached(EntityAI item, string slot_name)
override void OnStoreSave(ParamsWriteContext ctx)
override void SetActions()
override void EEItemAttached(EntityAI item, string slot_name)
override void OnWasDetached(EntityAI parent, int slot_id)
overrides the base behavior - intentional
const string CODELOCK_UNLOCK_SOUND
void UnlockOnServer(EntityAI parent)
Unlock AND drop.
override void OnWorkStop()
CodeLockVisualManager GetVisualManager()
bool HasBruteForceProtection()
const string SELECTION_NAME_BACK
const string MEMPOINT_INSIDE
override void OnWork(float consumed_energy)
const string CODELOCK_DIGITS_SOUND
bool SetLockCode(string pin)
bool IsPlayerOnBackside(PlayerBase player)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
const string CODELOCK_CONFIRM_SOUND
void SetLockState(bool state)
void ForceFullVisualsUpdate()
bool CanDetachCodeLock(notnull PlayerBase player, int componentIndex)
Condition check called from ActionTakeItem and ActionTakeItemToHands.
ref CodeLockVisualManager m_VisualManager
override void OnWasAttached(EntityAI parent, int slot_id)
bool ShouldHandleBruteForce()
ref CodeLockComponent m_CodeLockComponent
override void InitItemSounds()
override bool CanDetachAttachment(EntityAI parent)
void SetDoorInfoFromSlot(BuildingBase buildingBase, string slotName)
const string MEMPOINT_CENTER
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override void OnVariablesSynchronized()
CodeLockComponent GetCodeLockComponent()
override void AfterStoreLoad()
const string CODELOCK_CLEAR_SOUND
override bool IsExternalLockType()
const string ATTACHMENT_SLOT_BATTERY
DigitalCodeLock ItemBase Init()
single position related to each particular attachment group
const string CODELOCK_ERROR_SOUND
int GetMinLockPINLength()
const string CODELOCK_ACCESS_SOUND
override void OnDebugSpawn()
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
const string CODELOCK_LOCK_SOUND
override void OnWorkStart()
void CodeLockComponent(notnull EntityAI parent, int minLockPinLength=MIN_LOCK_PIN_LENGTH)
void CodeLockVisualManager(DigitalCodeLock codeLock, CodeLockComponent component)
InventoryLocationType
types of Inventory Location
ItemSoundHandler GetItemSoundHandler()
string m_DoorConstructionPartName
memory point name for limiting open/close actions on the door/window
Super root of all classes in Enforce script.
Instanced construction part data classes for dynamic data, statics now stored on EntityType level in ...
const string MEMPOINT_INSIDE
const string MEMPOINT_CENTER
override void OnWasDetached(EntityAI parent, int slot_id)
override bool CanDetachAttachment(EntityAI parent)
proto native int GetSlot()
returns slot id if current type is Attachment
static proto native owned string GetSlotName(int id)
converts slot_id to string
provides access to slot configuration
override bool ShowZonesHealth()
The class that will be instanced (moddable)
Serializer ParamsReadContext
Serializer ParamsWriteContext
proto native void SetPosition(vector position)
Set the world position of the Effect.
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.