1023{
1026
1029
1032
1034
1035
1043
1045 {
1047 }
1048
1049 protected void Init()
1050 {
1053
1054 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1055 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1056 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1057 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1058 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1059 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1060 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1061 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1062 RegisterNetSyncVariableBool("m_Reversed");
1063 }
1064
1066 {
1067 super.EEInit();
1068
1069
1071 }
1072
1074 {
1075 super.EEItemLocationChanged(oldLoc, newLoc);
1076
1078 {
1080 {
1081 if (
g_Game.IsDedicatedServer())
1082 SetSynchDirty();
1083
1084
1086 }
1087 }
1088 }
1089
1091 {
1092 super.EEItemAttached(item, slot_name);
1093
1095 {
1098 {
1100 if (battery)
1101 {
1102 float batteryEnergy = battery.GetCompEM().GetEnergy();
1104 {
1106 GetCompEM().SwitchOn();
1107 }
1108
1110 }
1111 }
1112 }
1113 }
1114
1116 {
1117 super.EEItemDetached(item, slot_name);
1118
1120 {
1123 {
1125 GetCompEM().SwitchOff();
1126
1128 }
1129 }
1130 }
1131
1133 {
1134 super.OnWasAttached(parent, slot_id);
1135
1137 {
1140 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1141 {
1143 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1144 {
1146 GetCompEM().SwitchOn();
1147 }
1148
1149 if (parent && parent.CanUseConstruction())
1150 {
1152 if (buildingBase)
1153 {
1155 }
1156 }
1157 }
1158
1160 }
1161 }
1162
1164 {
1165 super.OnWasDetached(parent, slot_id);
1166
1168 {
1170 if (GetCompEM().IsWorking())
1171 GetCompEM().SwitchOff();
1172
1174 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1175 {
1179 }
1180
1182 }
1183 }
1184
1186 {
1188 return false;
1189
1190 return true;
1191 }
1192
1194 {
1197 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1198 {
1199 int doorIndex = -1;
1202 {
1203 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1204 {
1206 {
1207 doorIndex = doorInfoIndex;
1208 doorInfo = doorInfoData;
1209 break;
1210 }
1211 }
1212
1213 if (doorIndex != -1)
1214 break;
1215 }
1216
1217 if (doorIndex > -1)
1218 {
1220 }
1221
1224 if (rebuilding && doorInfo)
1225 {
1227 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1228 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1229 {
1230 m_Reversed = reversibleDoorPart.IsReversedLocal();
1231 }
1232 }
1233 }
1234 }
1235
1238 {
1240 {
1243 return false;
1244 }
1245
1246 return true;
1247 }
1248
1250 {
1251 super.OnWorkStop();
1252
1254 {
1257
1259 }
1260 }
1261
1263 {
1264 super.OnWorkStart();
1265
1267 {
1269 }
1270 }
1271
1272 override void OnWork(
float consumed_energy)
1273 {
1274 super.OnWork(consumed_energy);
1275
1277 {
1279 if (battery)
1280 {
1281 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1282 {
1283 GetCompEM().SwitchOff();
1285 }
1286
1289 {
1291 SetSynchDirty();
1292 }
1293 }
1294 }
1295 }
1296
1299 {
1301 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1302
1303
1304 if (
g_Game.IsMultiplayer())
1305 {
1306 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1307 }
1308 else
1309 {
1310 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1311 }
1312
1315 if (parent.MemoryPointExists(
slotName))
1316 {
1317 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1318 }
1319 else
1320 {
1322 }
1323
1325 PlaceOnSurface();
1326 }
1327
1329 {
1331 return battery;
1332 }
1333
1335 {
1336 return true;
1337 }
1338
1340 {
1341 return true;
1342 }
1343
1345 {
1346 return true;
1347 }
1348
1350 {
1352 }
1353
1355 {
1356 return true;
1357 }
1358
1360 {
1361 return GetCompEM().IsWorking();
1362 }
1363
1365 {
1367 }
1368
1370 {
1372 }
1373
1375 {
1377 }
1378
1380 {
1382 }
1383
1385 {
1387 }
1388
1390 {
1392 }
1393
1395 {
1397 }
1398
1400 {
1402 }
1403
1405 {
1407 }
1408
1410 {
1412 }
1413
1415 {
1417 }
1418
1420 {
1422 }
1423
1425 {
1427 }
1428
1432 {
1433 if (!player)
1434 return false;
1435
1437 return false;
1438
1440
1442 }
1443
1445 {
1446 EntityAI hierarchyParent = GetHierarchyRoot();
1447 if (hierarchyParent.CanUseConstruction())
1448 return true;
1449
1450 if (BroadcastedBunker.Cast(hierarchyParent))
1451 return true;
1452
1453 return false;
1454 }
1455
1457 {
1459 }
1460
1462 {
1464 if (!battery)
1465 return 0.0;
1466
1467 float energy = battery.GetCompEM().GetEnergy();
1468 float energyMax = battery.GetCompEM().GetEnergyMax();
1469
1470 if (energyMax <= 0)
1471 return 0.0;
1472
1473 return (energy / energyMax) * 100.0;
1474 }
1475
1477 {
1480 }
1481
1483 {
1485 {
1488 }
1489 }
1490
1492 {
1493 super.SetActions();
1494
1496 }
1497
1499 {
1500 super.OnRPC(sender, rpc_type, ctx);
1501
1503 }
1504
1506 {
1507 super.OnStoreSave(ctx);
1508
1510 }
1511
1513 {
1514 if (!super.OnStoreLoad(ctx, version))
1515 return false;
1516
1518 return false;
1519
1520 return true;
1521 }
1522
1524 {
1525 super.AfterStoreLoad();
1526
1528 {
1530 {
1532 }
1533 else
1534 {
1536 }
1537 }
1538
1540 }
1541
1543 {
1544 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1545
1547 }
1548
1550 {
1551 super.OnVariablesSynchronized();
1552
1554 {
1556 if (uiAction != CodeLockUIAction.NONE)
1557 {
1559 }
1560 }
1561 }
1562
1564 {
1565 return true;
1566 }
1567
1569 {
1570 super.InitItemSounds();
1571
1579 }
1580
1581
1583 {
1584 GetInventory().CreateInInventory("Battery9V");
1585 }
1586}
1587
1589{
1590 override void Init()
1591 {
1593
1594 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1596
1597 if (bunkerConfig && bunkerConfig.bunkerSettings)
1598 {
1600 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1603 }
1604
1606 }
1607
1609 {
1610 return false;
1611 }
1612
1614 {
1615 return false;
1616 }
1617
1619 {
1620 return false;
1621 }
1622
1625
1627 {
1628 return false;
1629 }
1630
1632 {
1633 return true;
1634 }
1635
1637 {
1638 return true;
1639 }
1640
1642 {
1643 return true;
1644 }
1645
1647 {
1649 }
1650
1652 {
1656 }
1657}
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.