1129{
1132
1135
1138
1140
1141
1149
1151 {
1153 }
1154
1155 protected void Init()
1156 {
1159
1160 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1161 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1162 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1163 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1164 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1165 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1166 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1167 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1168 RegisterNetSyncVariableBool("m_Reversed");
1169 }
1170
1172 {
1173 super.EEInit();
1174
1175
1177 }
1178
1180 {
1181 super.EEItemLocationChanged(oldLoc, newLoc);
1182
1184 {
1186 {
1187 if (
g_Game.IsDedicatedServer())
1188 SetSynchDirty();
1189
1190
1192 }
1193 }
1194 }
1195
1197 {
1198 super.EEItemAttached(item, slot_name);
1199
1201 {
1204 {
1206 if (battery)
1207 {
1208 float batteryEnergy = battery.GetCompEM().GetEnergy();
1210 {
1212 GetCompEM().SwitchOn();
1213 }
1214
1216 }
1217 }
1218 }
1219 }
1220
1222 {
1223 super.EEItemDetached(item, slot_name);
1224
1226 {
1229 {
1231 GetCompEM().SwitchOff();
1232
1234 }
1235 }
1236 }
1237
1239 {
1240 super.OnWasAttached(parent, slot_id);
1241
1243 {
1246 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1247 {
1249 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1250 {
1252 GetCompEM().SwitchOn();
1253 }
1254
1255 if (parent && parent.CanUseConstruction())
1256 {
1258 if (buildingBase)
1259 {
1261 }
1262 }
1263 }
1264
1266 }
1267 }
1268
1270 {
1271 super.OnWasDetached(parent, slot_id);
1272
1274 {
1276 if (GetCompEM().IsWorking())
1277 GetCompEM().SwitchOff();
1278
1280 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1281 {
1285 }
1286
1288 }
1289 }
1290
1292 {
1294 return false;
1295
1296 return true;
1297 }
1298
1300 {
1303 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1304 {
1305 int doorIndex = -1;
1308 {
1309 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1310 {
1312 {
1313 doorIndex = doorInfoIndex;
1314 doorInfo = doorInfoData;
1315 break;
1316 }
1317 }
1318
1319 if (doorIndex != -1)
1320 break;
1321 }
1322
1323 if (doorIndex > -1)
1324 {
1326 }
1327
1330 if (rebuilding && doorInfo)
1331 {
1333 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1334 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1335 {
1336 m_Reversed = reversibleDoorPart.IsReversedLocal();
1337 }
1338 }
1339 }
1340 }
1341
1344 {
1346 {
1349 return false;
1350 }
1351
1352 return true;
1353 }
1354
1356 {
1357 super.OnWorkStop();
1358
1360 {
1363
1365 }
1366 }
1367
1369 {
1370 super.OnWorkStart();
1371
1373 {
1375 }
1376 }
1377
1378 override void OnWork(
float consumed_energy)
1379 {
1380 super.OnWork(consumed_energy);
1381
1383 {
1385 if (battery)
1386 {
1387 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1388 {
1389 GetCompEM().SwitchOff();
1391 }
1392
1395 {
1397 SetSynchDirty();
1398 }
1399 }
1400 }
1401 }
1402
1405 {
1407 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1408
1409
1410 if (
g_Game.IsMultiplayer())
1411 {
1412 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1413 }
1414 else
1415 {
1416 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1417 }
1418
1421 if (parent.MemoryPointExists(
slotName))
1422 {
1423 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1424 }
1425 else
1426 {
1428 }
1429
1431 PlaceOnSurface();
1432 }
1433
1435 {
1437 return battery;
1438 }
1439
1441 {
1442 return true;
1443 }
1444
1446 {
1447 return true;
1448 }
1449
1451 {
1452 return true;
1453 }
1454
1456 {
1458 }
1459
1461 {
1462 return true;
1463 }
1464
1466 {
1467 return GetCompEM().IsWorking();
1468 }
1469
1471 {
1473 }
1474
1476 {
1478 }
1479
1481 {
1483 }
1484
1486 {
1488 }
1489
1491 {
1493 }
1494
1496 {
1498 }
1499
1501 {
1503 }
1504
1506 {
1508 }
1509
1511 {
1513 }
1514
1516 {
1518 }
1519
1521 {
1523 }
1524
1526 {
1528 }
1529
1531 {
1533 }
1534
1538 {
1539 if (!player)
1540 return false;
1541
1543 return false;
1544
1546
1548 }
1549
1551 {
1552 EntityAI hierarchyParent = GetHierarchyRoot();
1553 if (hierarchyParent.CanUseConstruction())
1554 return true;
1555
1556 if (BroadcastedBunker.Cast(hierarchyParent))
1557 return true;
1558
1559 return false;
1560 }
1561
1563 {
1565 }
1566
1568 {
1570 if (!battery)
1571 return 0.0;
1572
1573 float energy = battery.GetCompEM().GetEnergy();
1574 float energyMax = battery.GetCompEM().GetEnergyMax();
1575
1576 if (energyMax <= 0)
1577 return 0.0;
1578
1579 return (energy / energyMax) * 100.0;
1580 }
1581
1583 {
1586 }
1587
1589 {
1591 {
1594 }
1595 }
1596
1598 {
1599 super.SetActions();
1600
1602 }
1603
1605 {
1606 super.OnRPC(sender, rpc_type, ctx);
1607
1609 }
1610
1612 {
1613 super.OnStoreSave(ctx);
1614
1616 }
1617
1619 {
1620 if (!super.OnStoreLoad(ctx, version))
1621 return false;
1622
1624 return false;
1625
1626 return true;
1627 }
1628
1630 {
1631 super.AfterStoreLoad();
1632
1634 {
1636 {
1638 }
1639 else
1640 {
1642 }
1643 }
1644
1646 }
1647
1649 {
1650 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1651
1653 }
1654
1656 {
1657 super.OnVariablesSynchronized();
1658
1660 {
1662 if (uiAction != CodeLockUIAction.NONE)
1663 {
1665 }
1666 }
1667 }
1668
1670 {
1671 return true;
1672 }
1673
1675 {
1676 super.InitItemSounds();
1677
1685 }
1686
1687
1689 {
1690 GetInventory().CreateInInventory("Battery9V");
1691 }
1692}
1693
1695{
1696 override void Init()
1697 {
1699
1700 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1702
1703 if (bunkerConfig && bunkerConfig.bunkerSettings)
1704 {
1706 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1709 }
1710
1712 }
1713
1715 {
1716 return false;
1717 }
1718
1720 {
1721 return false;
1722 }
1723
1725 {
1726 return false;
1727 }
1728
1731
1733 {
1734 return false;
1735 }
1736
1738 {
1739 return true;
1740 }
1741
1743 {
1744 return true;
1745 }
1746
1748 {
1749 return true;
1750 }
1751
1753 {
1755 }
1756
1758 {
1762 }
1763}
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.