1070{
1073
1076
1079
1081
1082
1090
1092 {
1094 }
1095
1096 protected void Init()
1097 {
1100
1101 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1102 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1103 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1104 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1105 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1106 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1107 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1108 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1109 RegisterNetSyncVariableBool("m_Reversed");
1110 }
1111
1113 {
1114 super.EEInit();
1115
1116
1118 }
1119
1121 {
1122 super.EEItemLocationChanged(oldLoc, newLoc);
1123
1125 {
1127 {
1128 if (
g_Game.IsDedicatedServer())
1129 SetSynchDirty();
1130
1131
1133 }
1134 }
1135 }
1136
1138 {
1139 super.EEItemAttached(item, slot_name);
1140
1142 {
1145 {
1147 if (battery)
1148 {
1149 float batteryEnergy = battery.GetCompEM().GetEnergy();
1151 {
1153 GetCompEM().SwitchOn();
1154 }
1155
1157 }
1158 }
1159 }
1160 }
1161
1163 {
1164 super.EEItemDetached(item, slot_name);
1165
1167 {
1170 {
1172 GetCompEM().SwitchOff();
1173
1175 }
1176 }
1177 }
1178
1180 {
1181 super.OnWasAttached(parent, slot_id);
1182
1184 {
1187 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1188 {
1190 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1191 {
1193 GetCompEM().SwitchOn();
1194 }
1195
1196 if (parent && parent.CanUseConstruction())
1197 {
1199 if (buildingBase)
1200 {
1202 }
1203 }
1204 }
1205
1207 }
1208 }
1209
1211 {
1212 super.OnWasDetached(parent, slot_id);
1213
1215 {
1217 if (GetCompEM().IsWorking())
1218 GetCompEM().SwitchOff();
1219
1221 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1222 {
1226 }
1227
1229 }
1230 }
1231
1233 {
1235 return false;
1236
1237 return true;
1238 }
1239
1241 {
1244 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1245 {
1246 int doorIndex = -1;
1249 {
1250 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1251 {
1253 {
1254 doorIndex = doorInfoIndex;
1255 doorInfo = doorInfoData;
1256 break;
1257 }
1258 }
1259
1260 if (doorIndex != -1)
1261 break;
1262 }
1263
1264 if (doorIndex > -1)
1265 {
1267 }
1268
1271 if (rebuilding && doorInfo)
1272 {
1274 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1275 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1276 {
1277 m_Reversed = reversibleDoorPart.IsReversedLocal();
1278 }
1279 }
1280 }
1281 }
1282
1285 {
1287 {
1290 return false;
1291 }
1292
1293 return true;
1294 }
1295
1297 {
1298 super.OnWorkStop();
1299
1301 {
1304
1306 }
1307 }
1308
1310 {
1311 super.OnWorkStart();
1312
1314 {
1316 }
1317 }
1318
1319 override void OnWork(
float consumed_energy)
1320 {
1321 super.OnWork(consumed_energy);
1322
1324 {
1326 if (battery)
1327 {
1328 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1329 {
1330 GetCompEM().SwitchOff();
1332 }
1333
1336 {
1338 SetSynchDirty();
1339 }
1340 }
1341 }
1342 }
1343
1346 {
1348 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1349
1350
1351 if (
g_Game.IsMultiplayer())
1352 {
1353 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1354 }
1355 else
1356 {
1357 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1358 }
1359
1362 if (parent.MemoryPointExists(
slotName))
1363 {
1364 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1365 }
1366 else
1367 {
1369 }
1370
1372 PlaceOnSurface();
1373 }
1374
1376 {
1378 return battery;
1379 }
1380
1382 {
1383 return true;
1384 }
1385
1387 {
1388 return true;
1389 }
1390
1392 {
1393 return true;
1394 }
1395
1397 {
1399 }
1400
1402 {
1403 return true;
1404 }
1405
1407 {
1408 return GetCompEM().IsWorking();
1409 }
1410
1412 {
1414 }
1415
1417 {
1419 }
1420
1422 {
1424 }
1425
1427 {
1429 }
1430
1432 {
1434 }
1435
1437 {
1439 }
1440
1442 {
1444 }
1445
1447 {
1449 }
1450
1452 {
1454 }
1455
1457 {
1459 }
1460
1462 {
1464 }
1465
1467 {
1469 }
1470
1472 {
1474 }
1475
1479 {
1480 if (!player)
1481 return false;
1482
1484 return false;
1485
1487
1489 }
1490
1492 {
1493 EntityAI hierarchyParent = GetHierarchyRoot();
1494 if (hierarchyParent.CanUseConstruction())
1495 return true;
1496
1497 if (BroadcastedBunker.Cast(hierarchyParent))
1498 return true;
1499
1500 return false;
1501 }
1502
1504 {
1506 }
1507
1509 {
1511 if (!battery)
1512 return 0.0;
1513
1514 float energy = battery.GetCompEM().GetEnergy();
1515 float energyMax = battery.GetCompEM().GetEnergyMax();
1516
1517 if (energyMax <= 0)
1518 return 0.0;
1519
1520 return (energy / energyMax) * 100.0;
1521 }
1522
1524 {
1527 }
1528
1530 {
1532 {
1535 }
1536 }
1537
1539 {
1540 super.SetActions();
1541
1543 }
1544
1546 {
1547 super.OnRPC(sender, rpc_type, ctx);
1548
1550 }
1551
1553 {
1554 super.OnStoreSave(ctx);
1555
1557 }
1558
1560 {
1561 if (!super.OnStoreLoad(ctx, version))
1562 return false;
1563
1565 return false;
1566
1567 return true;
1568 }
1569
1571 {
1572 super.AfterStoreLoad();
1573
1575 {
1577 {
1579 }
1580 else
1581 {
1583 }
1584 }
1585
1587 }
1588
1590 {
1591 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1592
1594 }
1595
1597 {
1598 super.OnVariablesSynchronized();
1599
1601 {
1603 if (uiAction != CodeLockUIAction.NONE)
1604 {
1606 }
1607 }
1608 }
1609
1611 {
1612 return true;
1613 }
1614
1616 {
1617 super.InitItemSounds();
1618
1626 }
1627
1628
1630 {
1631 GetInventory().CreateInInventory("Battery9V");
1632 }
1633}
1634
1636{
1637 override void Init()
1638 {
1640
1641 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1643
1644 if (bunkerConfig && bunkerConfig.bunkerSettings)
1645 {
1647 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1650 }
1651
1653 }
1654
1656 {
1657 return false;
1658 }
1659
1661 {
1662 return false;
1663 }
1664
1666 {
1667 return false;
1668 }
1669
1672
1674 {
1675 return false;
1676 }
1677
1679 {
1680 return true;
1681 }
1682
1684 {
1685 return true;
1686 }
1687
1689 {
1690 return true;
1691 }
1692
1694 {
1696 }
1697
1699 {
1703 }
1704}
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.