1059{
1062
1065
1068
1070
1071
1079
1081 {
1083 }
1084
1085 protected void Init()
1086 {
1089
1090 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1091 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1092 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1093 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1094 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1095 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1096 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1097 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1098 RegisterNetSyncVariableBool("m_Reversed");
1099 }
1100
1102 {
1103 super.EEInit();
1104
1105
1107 }
1108
1110 {
1111 super.EEItemLocationChanged(oldLoc, newLoc);
1112
1114 {
1116 {
1117 if (
g_Game.IsDedicatedServer())
1118 SetSynchDirty();
1119
1120
1122 }
1123 }
1124 }
1125
1127 {
1128 super.EEItemAttached(item, slot_name);
1129
1131 {
1134 {
1136 if (battery)
1137 {
1138 float batteryEnergy = battery.GetCompEM().GetEnergy();
1140 {
1142 GetCompEM().SwitchOn();
1143 }
1144
1146 }
1147 }
1148 }
1149 }
1150
1152 {
1153 super.EEItemDetached(item, slot_name);
1154
1156 {
1159 {
1161 GetCompEM().SwitchOff();
1162
1164 }
1165 }
1166 }
1167
1169 {
1170 super.OnWasAttached(parent, slot_id);
1171
1173 {
1176 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1177 {
1179 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1180 {
1182 GetCompEM().SwitchOn();
1183 }
1184
1185 if (parent && parent.CanUseConstruction())
1186 {
1188 if (buildingBase)
1189 {
1191 }
1192 }
1193 }
1194
1196 }
1197 }
1198
1200 {
1201 super.OnWasDetached(parent, slot_id);
1202
1204 {
1206 if (GetCompEM().IsWorking())
1207 GetCompEM().SwitchOff();
1208
1210 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1211 {
1215 }
1216
1218 }
1219 }
1220
1222 {
1224 return false;
1225
1226 return true;
1227 }
1228
1230 {
1233 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1234 {
1235 int doorIndex = -1;
1238 {
1239 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1240 {
1242 {
1243 doorIndex = doorInfoIndex;
1244 doorInfo = doorInfoData;
1245 break;
1246 }
1247 }
1248
1249 if (doorIndex != -1)
1250 break;
1251 }
1252
1253 if (doorIndex > -1)
1254 {
1256 }
1257
1260 if (rebuilding && doorInfo)
1261 {
1263 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1264 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1265 {
1266 m_Reversed = reversibleDoorPart.IsReversedLocal();
1267 }
1268 }
1269 }
1270 }
1271
1274 {
1276 {
1279 return false;
1280 }
1281
1282 return true;
1283 }
1284
1286 {
1287 super.OnWorkStop();
1288
1290 {
1293
1295 }
1296 }
1297
1299 {
1300 super.OnWorkStart();
1301
1303 {
1305 }
1306 }
1307
1308 override void OnWork(
float consumed_energy)
1309 {
1310 super.OnWork(consumed_energy);
1311
1313 {
1315 if (battery)
1316 {
1317 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1318 {
1319 GetCompEM().SwitchOff();
1321 }
1322
1325 {
1327 SetSynchDirty();
1328 }
1329 }
1330 }
1331 }
1332
1335 {
1337 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1338
1339
1340 if (
g_Game.IsMultiplayer())
1341 {
1342 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1343 }
1344 else
1345 {
1346 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1347 }
1348
1351 if (parent.MemoryPointExists(
slotName))
1352 {
1353 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1354 }
1355 else
1356 {
1358 }
1359
1361 PlaceOnSurface();
1362 }
1363
1365 {
1367 return battery;
1368 }
1369
1371 {
1372 return true;
1373 }
1374
1376 {
1377 return true;
1378 }
1379
1381 {
1382 return true;
1383 }
1384
1386 {
1388 }
1389
1391 {
1392 return true;
1393 }
1394
1396 {
1397 return GetCompEM().IsWorking();
1398 }
1399
1401 {
1403 }
1404
1406 {
1408 }
1409
1411 {
1413 }
1414
1416 {
1418 }
1419
1421 {
1423 }
1424
1426 {
1428 }
1429
1431 {
1433 }
1434
1436 {
1438 }
1439
1441 {
1443 }
1444
1446 {
1448 }
1449
1451 {
1453 }
1454
1456 {
1458 }
1459
1461 {
1463 }
1464
1468 {
1469 if (!player)
1470 return false;
1471
1473 return false;
1474
1476
1478 }
1479
1481 {
1482 EntityAI hierarchyParent = GetHierarchyRoot();
1483 if (hierarchyParent.CanUseConstruction())
1484 return true;
1485
1486 if (BroadcastedBunker.Cast(hierarchyParent))
1487 return true;
1488
1489 return false;
1490 }
1491
1493 {
1495 }
1496
1498 {
1500 if (!battery)
1501 return 0.0;
1502
1503 float energy = battery.GetCompEM().GetEnergy();
1504 float energyMax = battery.GetCompEM().GetEnergyMax();
1505
1506 if (energyMax <= 0)
1507 return 0.0;
1508
1509 return (energy / energyMax) * 100.0;
1510 }
1511
1513 {
1516 }
1517
1519 {
1521 {
1524 }
1525 }
1526
1528 {
1529 super.SetActions();
1530
1532 }
1533
1535 {
1536 super.OnRPC(sender, rpc_type, ctx);
1537
1539 }
1540
1542 {
1543 super.OnStoreSave(ctx);
1544
1546 }
1547
1549 {
1550 if (!super.OnStoreLoad(ctx, version))
1551 return false;
1552
1554 return false;
1555
1556 return true;
1557 }
1558
1560 {
1561 super.AfterStoreLoad();
1562
1564 {
1566 {
1568 }
1569 else
1570 {
1572 }
1573 }
1574
1576 }
1577
1579 {
1580 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1581
1583 }
1584
1586 {
1587 super.OnVariablesSynchronized();
1588
1590 {
1592 if (uiAction != CodeLockUIAction.NONE)
1593 {
1595 }
1596 }
1597 }
1598
1600 {
1601 return true;
1602 }
1603
1605 {
1606 super.InitItemSounds();
1607
1615 }
1616
1617
1619 {
1620 GetInventory().CreateInInventory("Battery9V");
1621 }
1622}
1623
1625{
1626 override void Init()
1627 {
1629
1630 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1632
1633 if (bunkerConfig && bunkerConfig.bunkerSettings)
1634 {
1636 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1639 }
1640
1642 }
1643
1645 {
1646 return false;
1647 }
1648
1650 {
1651 return false;
1652 }
1653
1655 {
1656 return false;
1657 }
1658
1661
1663 {
1664 return false;
1665 }
1666
1668 {
1669 return true;
1670 }
1671
1673 {
1674 return true;
1675 }
1676
1678 {
1679 return true;
1680 }
1681
1683 {
1685 }
1686
1688 {
1692 }
1693}
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.