1115{
1118
1121
1124
1126
1127
1135
1137 {
1139 }
1140
1141 protected void Init()
1142 {
1145
1146 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1147 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1148 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1149 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1150 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1151 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1152 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1153 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1154 RegisterNetSyncVariableBool("m_Reversed");
1155 }
1156
1158 {
1159 super.EEInit();
1160
1161
1163 }
1164
1166 {
1167 super.EEItemLocationChanged(oldLoc, newLoc);
1168
1170 {
1172 {
1173 if (
g_Game.IsDedicatedServer())
1174 SetSynchDirty();
1175
1176
1178 }
1179 }
1180 }
1181
1183 {
1184 super.EEItemAttached(item, slot_name);
1185
1187 {
1190 {
1192 if (battery)
1193 {
1194 float batteryEnergy = battery.GetCompEM().GetEnergy();
1196 {
1198 GetCompEM().SwitchOn();
1199 }
1200
1202 }
1203 }
1204 }
1205 }
1206
1208 {
1209 super.EEItemDetached(item, slot_name);
1210
1212 {
1215 {
1217 GetCompEM().SwitchOff();
1218
1220 }
1221 }
1222 }
1223
1225 {
1226 super.OnWasAttached(parent, slot_id);
1227
1229 {
1232 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1233 {
1235 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1236 {
1238 GetCompEM().SwitchOn();
1239 }
1240
1241 if (parent && parent.CanUseConstruction())
1242 {
1244 if (buildingBase)
1245 {
1247 }
1248 }
1249 }
1250
1252 }
1253 }
1254
1256 {
1257 super.OnWasDetached(parent, slot_id);
1258
1260 {
1262 if (GetCompEM().IsWorking())
1263 GetCompEM().SwitchOff();
1264
1266 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1267 {
1271 }
1272
1274 }
1275 }
1276
1278 {
1280 return false;
1281
1282 return true;
1283 }
1284
1286 {
1289 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1290 {
1291 int doorIndex = -1;
1294 {
1295 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1296 {
1298 {
1299 doorIndex = doorInfoIndex;
1300 doorInfo = doorInfoData;
1301 break;
1302 }
1303 }
1304
1305 if (doorIndex != -1)
1306 break;
1307 }
1308
1309 if (doorIndex > -1)
1310 {
1312 }
1313
1316 if (rebuilding && doorInfo)
1317 {
1319 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1320 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1321 {
1322 m_Reversed = reversibleDoorPart.IsReversedLocal();
1323 }
1324 }
1325 }
1326 }
1327
1330 {
1332 {
1335 return false;
1336 }
1337
1338 return true;
1339 }
1340
1342 {
1343 super.OnWorkStop();
1344
1346 {
1349
1351 }
1352 }
1353
1355 {
1356 super.OnWorkStart();
1357
1359 {
1361 }
1362 }
1363
1364 override void OnWork(
float consumed_energy)
1365 {
1366 super.OnWork(consumed_energy);
1367
1369 {
1371 if (battery)
1372 {
1373 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1374 {
1375 GetCompEM().SwitchOff();
1377 }
1378
1381 {
1383 SetSynchDirty();
1384 }
1385 }
1386 }
1387 }
1388
1391 {
1393 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1394
1395
1396 if (
g_Game.IsMultiplayer())
1397 {
1398 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1399 }
1400 else
1401 {
1402 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1403 }
1404
1407 if (parent.MemoryPointExists(
slotName))
1408 {
1409 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1410 }
1411 else
1412 {
1414 }
1415
1417 PlaceOnSurface();
1418 }
1419
1421 {
1423 return battery;
1424 }
1425
1427 {
1428 return true;
1429 }
1430
1432 {
1433 return true;
1434 }
1435
1437 {
1438 return true;
1439 }
1440
1442 {
1444 }
1445
1447 {
1448 return true;
1449 }
1450
1452 {
1453 return GetCompEM().IsWorking();
1454 }
1455
1457 {
1459 }
1460
1462 {
1464 }
1465
1467 {
1469 }
1470
1472 {
1474 }
1475
1477 {
1479 }
1480
1482 {
1484 }
1485
1487 {
1489 }
1490
1492 {
1494 }
1495
1497 {
1499 }
1500
1502 {
1504 }
1505
1507 {
1509 }
1510
1512 {
1514 }
1515
1517 {
1519 }
1520
1524 {
1525 if (!player)
1526 return false;
1527
1529 return false;
1530
1532
1534 }
1535
1537 {
1538 EntityAI hierarchyParent = GetHierarchyRoot();
1539 if (hierarchyParent.CanUseConstruction())
1540 return true;
1541
1542 if (BroadcastedBunker.Cast(hierarchyParent))
1543 return true;
1544
1545 return false;
1546 }
1547
1549 {
1551 }
1552
1554 {
1556 if (!battery)
1557 return 0.0;
1558
1559 float energy = battery.GetCompEM().GetEnergy();
1560 float energyMax = battery.GetCompEM().GetEnergyMax();
1561
1562 if (energyMax <= 0)
1563 return 0.0;
1564
1565 return (energy / energyMax) * 100.0;
1566 }
1567
1569 {
1572 }
1573
1575 {
1577 {
1580 }
1581 }
1582
1584 {
1585 super.SetActions();
1586
1588 }
1589
1591 {
1592 super.OnRPC(sender, rpc_type, ctx);
1593
1595 }
1596
1598 {
1599 super.OnStoreSave(ctx);
1600
1602 }
1603
1605 {
1606 if (!super.OnStoreLoad(ctx, version))
1607 return false;
1608
1610 return false;
1611
1612 return true;
1613 }
1614
1616 {
1617 super.AfterStoreLoad();
1618
1620 {
1622 {
1624 }
1625 else
1626 {
1628 }
1629 }
1630
1632 }
1633
1635 {
1636 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1637
1639 }
1640
1642 {
1643 super.OnVariablesSynchronized();
1644
1646 {
1648 if (uiAction != CodeLockUIAction.NONE)
1649 {
1651 }
1652 }
1653 }
1654
1656 {
1657 return true;
1658 }
1659
1661 {
1662 super.InitItemSounds();
1663
1671 }
1672
1673
1675 {
1676 GetInventory().CreateInInventory("Battery9V");
1677 }
1678}
1679
1681{
1682 override void Init()
1683 {
1685
1686 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1688
1689 if (bunkerConfig && bunkerConfig.bunkerSettings)
1690 {
1692 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1695 }
1696
1698 }
1699
1701 {
1702 return false;
1703 }
1704
1706 {
1707 return false;
1708 }
1709
1711 {
1712 return false;
1713 }
1714
1717
1719 {
1720 return false;
1721 }
1722
1724 {
1725 return true;
1726 }
1727
1729 {
1730 return true;
1731 }
1732
1734 {
1735 return true;
1736 }
1737
1739 {
1741 }
1742
1744 {
1748 }
1749}
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.