1052{
1055
1058
1061
1063
1064
1072
1074 {
1076 }
1077
1078 protected void Init()
1079 {
1082
1083 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1084 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1085 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1086 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1087 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1088 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1089 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1090 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1091 RegisterNetSyncVariableBool("m_Reversed");
1092 }
1093
1095 {
1096 super.EEInit();
1097
1098
1100 }
1101
1103 {
1104 super.EEItemLocationChanged(oldLoc, newLoc);
1105
1107 {
1109 {
1110 if (
g_Game.IsDedicatedServer())
1111 SetSynchDirty();
1112
1113
1115 }
1116 }
1117 }
1118
1120 {
1121 super.EEItemAttached(item, slot_name);
1122
1124 {
1127 {
1129 if (battery)
1130 {
1131 float batteryEnergy = battery.GetCompEM().GetEnergy();
1133 {
1135 GetCompEM().SwitchOn();
1136 }
1137
1139 }
1140 }
1141 }
1142 }
1143
1145 {
1146 super.EEItemDetached(item, slot_name);
1147
1149 {
1152 {
1154 GetCompEM().SwitchOff();
1155
1157 }
1158 }
1159 }
1160
1162 {
1163 super.OnWasAttached(parent, slot_id);
1164
1166 {
1169 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1170 {
1172 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1173 {
1175 GetCompEM().SwitchOn();
1176 }
1177
1178 if (parent && parent.CanUseConstruction())
1179 {
1181 if (buildingBase)
1182 {
1184 }
1185 }
1186 }
1187
1189 }
1190 }
1191
1193 {
1194 super.OnWasDetached(parent, slot_id);
1195
1197 {
1199 if (GetCompEM().IsWorking())
1200 GetCompEM().SwitchOff();
1201
1203 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1204 {
1208 }
1209
1211 }
1212 }
1213
1215 {
1217 return false;
1218
1219 return true;
1220 }
1221
1223 {
1226 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1227 {
1228 int doorIndex = -1;
1231 {
1232 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1233 {
1235 {
1236 doorIndex = doorInfoIndex;
1237 doorInfo = doorInfoData;
1238 break;
1239 }
1240 }
1241
1242 if (doorIndex != -1)
1243 break;
1244 }
1245
1246 if (doorIndex > -1)
1247 {
1249 }
1250
1253 if (rebuilding && doorInfo)
1254 {
1256 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1257 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1258 {
1259 m_Reversed = reversibleDoorPart.IsReversedLocal();
1260 }
1261 }
1262 }
1263 }
1264
1267 {
1269 {
1272 return false;
1273 }
1274
1275 return true;
1276 }
1277
1279 {
1280 super.OnWorkStop();
1281
1283 {
1286
1288 }
1289 }
1290
1292 {
1293 super.OnWorkStart();
1294
1296 {
1298 }
1299 }
1300
1301 override void OnWork(
float consumed_energy)
1302 {
1303 super.OnWork(consumed_energy);
1304
1306 {
1308 if (battery)
1309 {
1310 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1311 {
1312 GetCompEM().SwitchOff();
1314 }
1315
1318 {
1320 SetSynchDirty();
1321 }
1322 }
1323 }
1324 }
1325
1328 {
1330 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1331
1332
1333 if (
g_Game.IsMultiplayer())
1334 {
1335 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1336 }
1337 else
1338 {
1339 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1340 }
1341
1344 if (parent.MemoryPointExists(
slotName))
1345 {
1346 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1347 }
1348 else
1349 {
1351 }
1352
1354 PlaceOnSurface();
1355 }
1356
1358 {
1360 return battery;
1361 }
1362
1364 {
1365 return true;
1366 }
1367
1369 {
1370 return true;
1371 }
1372
1374 {
1375 return true;
1376 }
1377
1379 {
1381 }
1382
1384 {
1385 return true;
1386 }
1387
1389 {
1390 return GetCompEM().IsWorking();
1391 }
1392
1394 {
1396 }
1397
1399 {
1401 }
1402
1404 {
1406 }
1407
1409 {
1411 }
1412
1414 {
1416 }
1417
1419 {
1421 }
1422
1424 {
1426 }
1427
1429 {
1431 }
1432
1434 {
1436 }
1437
1439 {
1441 }
1442
1444 {
1446 }
1447
1449 {
1451 }
1452
1454 {
1456 }
1457
1461 {
1462 if (!player)
1463 return false;
1464
1466 return false;
1467
1469
1471 }
1472
1474 {
1475 EntityAI hierarchyParent = GetHierarchyRoot();
1476 if (hierarchyParent.CanUseConstruction())
1477 return true;
1478
1479 if (BroadcastedBunker.Cast(hierarchyParent))
1480 return true;
1481
1482 return false;
1483 }
1484
1486 {
1488 }
1489
1491 {
1493 if (!battery)
1494 return 0.0;
1495
1496 float energy = battery.GetCompEM().GetEnergy();
1497 float energyMax = battery.GetCompEM().GetEnergyMax();
1498
1499 if (energyMax <= 0)
1500 return 0.0;
1501
1502 return (energy / energyMax) * 100.0;
1503 }
1504
1506 {
1509 }
1510
1512 {
1514 {
1517 }
1518 }
1519
1521 {
1522 super.SetActions();
1523
1525 }
1526
1528 {
1529 super.OnRPC(sender, rpc_type, ctx);
1530
1532 }
1533
1535 {
1536 super.OnStoreSave(ctx);
1537
1539 }
1540
1542 {
1543 if (!super.OnStoreLoad(ctx, version))
1544 return false;
1545
1547 return false;
1548
1549 return true;
1550 }
1551
1553 {
1554 super.AfterStoreLoad();
1555
1557 {
1559 {
1561 }
1562 else
1563 {
1565 }
1566 }
1567
1569 }
1570
1572 {
1573 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1574
1576 }
1577
1579 {
1580 super.OnVariablesSynchronized();
1581
1583 {
1585 if (uiAction != CodeLockUIAction.NONE)
1586 {
1588 }
1589 }
1590 }
1591
1593 {
1594 return true;
1595 }
1596
1598 {
1599 super.InitItemSounds();
1600
1608 }
1609
1610
1612 {
1613 GetInventory().CreateInInventory("Battery9V");
1614 }
1615}
1616
1618{
1619 override void Init()
1620 {
1622
1623 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1625
1626 if (bunkerConfig && bunkerConfig.bunkerSettings)
1627 {
1629 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1632 }
1633
1635 }
1636
1638 {
1639 return false;
1640 }
1641
1643 {
1644 return false;
1645 }
1646
1648 {
1649 return false;
1650 }
1651
1654
1656 {
1657 return false;
1658 }
1659
1661 {
1662 return true;
1663 }
1664
1666 {
1667 return true;
1668 }
1669
1671 {
1672 return true;
1673 }
1674
1676 {
1678 }
1679
1681 {
1685 }
1686}
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.