1089{
1092
1095
1098
1100
1101
1109
1111 {
1113 }
1114
1115 protected void Init()
1116 {
1119
1120 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1121 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1122 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1123 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1124 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1125 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1126 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1127 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1128 RegisterNetSyncVariableBool("m_Reversed");
1129 }
1130
1132 {
1133 super.EEInit();
1134
1135
1137 }
1138
1140 {
1141 super.EEItemLocationChanged(oldLoc, newLoc);
1142
1144 {
1146 {
1147 if (
g_Game.IsDedicatedServer())
1148 SetSynchDirty();
1149
1150
1152 }
1153 }
1154 }
1155
1157 {
1158 super.EEItemAttached(item, slot_name);
1159
1161 {
1164 {
1166 if (battery)
1167 {
1168 float batteryEnergy = battery.GetCompEM().GetEnergy();
1170 {
1172 GetCompEM().SwitchOn();
1173 }
1174
1176 }
1177 }
1178 }
1179 }
1180
1182 {
1183 super.EEItemDetached(item, slot_name);
1184
1186 {
1189 {
1191 GetCompEM().SwitchOff();
1192
1194 }
1195 }
1196 }
1197
1199 {
1200 super.OnWasAttached(parent, slot_id);
1201
1203 {
1206 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1207 {
1209 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1210 {
1212 GetCompEM().SwitchOn();
1213 }
1214
1215 if (parent && parent.CanUseConstruction())
1216 {
1218 if (buildingBase)
1219 {
1221 }
1222 }
1223 }
1224
1226 }
1227 }
1228
1230 {
1231 super.OnWasDetached(parent, slot_id);
1232
1234 {
1236 if (GetCompEM().IsWorking())
1237 GetCompEM().SwitchOff();
1238
1240 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1241 {
1245 }
1246
1248 }
1249 }
1250
1252 {
1254 return false;
1255
1256 return true;
1257 }
1258
1260 {
1263 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1264 {
1265 int doorIndex = -1;
1268 {
1269 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1270 {
1272 {
1273 doorIndex = doorInfoIndex;
1274 doorInfo = doorInfoData;
1275 break;
1276 }
1277 }
1278
1279 if (doorIndex != -1)
1280 break;
1281 }
1282
1283 if (doorIndex > -1)
1284 {
1286 }
1287
1290 if (rebuilding && doorInfo)
1291 {
1293 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1294 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1295 {
1296 m_Reversed = reversibleDoorPart.IsReversedLocal();
1297 }
1298 }
1299 }
1300 }
1301
1304 {
1306 {
1309 return false;
1310 }
1311
1312 return true;
1313 }
1314
1316 {
1317 super.OnWorkStop();
1318
1320 {
1323
1325 }
1326 }
1327
1329 {
1330 super.OnWorkStart();
1331
1333 {
1335 }
1336 }
1337
1338 override void OnWork(
float consumed_energy)
1339 {
1340 super.OnWork(consumed_energy);
1341
1343 {
1345 if (battery)
1346 {
1347 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1348 {
1349 GetCompEM().SwitchOff();
1351 }
1352
1355 {
1357 SetSynchDirty();
1358 }
1359 }
1360 }
1361 }
1362
1365 {
1367 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1368
1369
1370 if (
g_Game.IsMultiplayer())
1371 {
1372 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1373 }
1374 else
1375 {
1376 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1377 }
1378
1381 if (parent.MemoryPointExists(
slotName))
1382 {
1383 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1384 }
1385 else
1386 {
1388 }
1389
1391 PlaceOnSurface();
1392 }
1393
1395 {
1397 return battery;
1398 }
1399
1401 {
1402 return true;
1403 }
1404
1406 {
1407 return true;
1408 }
1409
1411 {
1412 return true;
1413 }
1414
1416 {
1418 }
1419
1421 {
1422 return true;
1423 }
1424
1426 {
1427 return GetCompEM().IsWorking();
1428 }
1429
1431 {
1433 }
1434
1436 {
1438 }
1439
1441 {
1443 }
1444
1446 {
1448 }
1449
1451 {
1453 }
1454
1456 {
1458 }
1459
1461 {
1463 }
1464
1466 {
1468 }
1469
1471 {
1473 }
1474
1476 {
1478 }
1479
1481 {
1483 }
1484
1486 {
1488 }
1489
1491 {
1493 }
1494
1498 {
1499 if (!player)
1500 return false;
1501
1503 return false;
1504
1506
1508 }
1509
1511 {
1512 EntityAI hierarchyParent = GetHierarchyRoot();
1513 if (hierarchyParent.CanUseConstruction())
1514 return true;
1515
1516 if (BroadcastedBunker.Cast(hierarchyParent))
1517 return true;
1518
1519 return false;
1520 }
1521
1523 {
1525 }
1526
1528 {
1530 if (!battery)
1531 return 0.0;
1532
1533 float energy = battery.GetCompEM().GetEnergy();
1534 float energyMax = battery.GetCompEM().GetEnergyMax();
1535
1536 if (energyMax <= 0)
1537 return 0.0;
1538
1539 return (energy / energyMax) * 100.0;
1540 }
1541
1543 {
1546 }
1547
1549 {
1551 {
1554 }
1555 }
1556
1558 {
1559 super.SetActions();
1560
1562 }
1563
1565 {
1566 super.OnRPC(sender, rpc_type, ctx);
1567
1569 }
1570
1572 {
1573 super.OnStoreSave(ctx);
1574
1576 }
1577
1579 {
1580 if (!super.OnStoreLoad(ctx, version))
1581 return false;
1582
1584 return false;
1585
1586 return true;
1587 }
1588
1590 {
1591 super.AfterStoreLoad();
1592
1594 {
1596 {
1598 }
1599 else
1600 {
1602 }
1603 }
1604
1606 }
1607
1609 {
1610 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1611
1613 }
1614
1616 {
1617 super.OnVariablesSynchronized();
1618
1620 {
1622 if (uiAction != CodeLockUIAction.NONE)
1623 {
1625 }
1626 }
1627 }
1628
1630 {
1631 return true;
1632 }
1633
1635 {
1636 super.InitItemSounds();
1637
1645 }
1646
1647
1649 {
1650 GetInventory().CreateInInventory("Battery9V");
1651 }
1652}
1653
1655{
1656 override void Init()
1657 {
1659
1660 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1662
1663 if (bunkerConfig && bunkerConfig.bunkerSettings)
1664 {
1666 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1669 }
1670
1672 }
1673
1675 {
1676 return false;
1677 }
1678
1680 {
1681 return false;
1682 }
1683
1685 {
1686 return false;
1687 }
1688
1691
1693 {
1694 return false;
1695 }
1696
1698 {
1699 return true;
1700 }
1701
1703 {
1704 return true;
1705 }
1706
1708 {
1709 return true;
1710 }
1711
1713 {
1715 }
1716
1718 {
1722 }
1723}
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.