1045{
1048
1051
1054
1056
1057
1065
1067 {
1069 }
1070
1071 protected void Init()
1072 {
1075
1076 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1077 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1078 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1079 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1080 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1081 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1082 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1083 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1084 RegisterNetSyncVariableBool("m_Reversed");
1085 }
1086
1088 {
1089 super.EEInit();
1090
1091
1093 }
1094
1096 {
1097 super.EEItemLocationChanged(oldLoc, newLoc);
1098
1100 {
1102 {
1103 if (
g_Game.IsDedicatedServer())
1104 SetSynchDirty();
1105
1106
1108 }
1109 }
1110 }
1111
1113 {
1114 super.EEItemAttached(item, slot_name);
1115
1117 {
1120 {
1122 if (battery)
1123 {
1124 float batteryEnergy = battery.GetCompEM().GetEnergy();
1126 {
1128 GetCompEM().SwitchOn();
1129 }
1130
1132 }
1133 }
1134 }
1135 }
1136
1138 {
1139 super.EEItemDetached(item, slot_name);
1140
1142 {
1145 {
1147 GetCompEM().SwitchOff();
1148
1150 }
1151 }
1152 }
1153
1155 {
1156 super.OnWasAttached(parent, slot_id);
1157
1159 {
1162 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1163 {
1165 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1166 {
1168 GetCompEM().SwitchOn();
1169 }
1170
1171 if (parent && parent.CanUseConstruction())
1172 {
1174 if (buildingBase)
1175 {
1177 }
1178 }
1179 }
1180
1182 }
1183 }
1184
1186 {
1187 super.OnWasDetached(parent, slot_id);
1188
1190 {
1192 if (GetCompEM().IsWorking())
1193 GetCompEM().SwitchOff();
1194
1196 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1197 {
1201 }
1202
1204 }
1205 }
1206
1208 {
1210 return false;
1211
1212 return true;
1213 }
1214
1216 {
1219 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1220 {
1221 int doorIndex = -1;
1224 {
1225 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1226 {
1228 {
1229 doorIndex = doorInfoIndex;
1230 doorInfo = doorInfoData;
1231 break;
1232 }
1233 }
1234
1235 if (doorIndex != -1)
1236 break;
1237 }
1238
1239 if (doorIndex > -1)
1240 {
1242 }
1243
1246 if (rebuilding && doorInfo)
1247 {
1249 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1250 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1251 {
1252 m_Reversed = reversibleDoorPart.IsReversedLocal();
1253 }
1254 }
1255 }
1256 }
1257
1260 {
1262 {
1265 return false;
1266 }
1267
1268 return true;
1269 }
1270
1272 {
1273 super.OnWorkStop();
1274
1276 {
1279
1281 }
1282 }
1283
1285 {
1286 super.OnWorkStart();
1287
1289 {
1291 }
1292 }
1293
1294 override void OnWork(
float consumed_energy)
1295 {
1296 super.OnWork(consumed_energy);
1297
1299 {
1301 if (battery)
1302 {
1303 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1304 {
1305 GetCompEM().SwitchOff();
1307 }
1308
1311 {
1313 SetSynchDirty();
1314 }
1315 }
1316 }
1317 }
1318
1321 {
1323 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1324
1325
1326 if (
g_Game.IsMultiplayer())
1327 {
1328 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1329 }
1330 else
1331 {
1332 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1333 }
1334
1337 if (parent.MemoryPointExists(
slotName))
1338 {
1339 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1340 }
1341 else
1342 {
1344 }
1345
1347 PlaceOnSurface();
1348 }
1349
1351 {
1353 return battery;
1354 }
1355
1357 {
1358 return true;
1359 }
1360
1362 {
1363 return true;
1364 }
1365
1367 {
1368 return true;
1369 }
1370
1372 {
1374 }
1375
1377 {
1378 return true;
1379 }
1380
1382 {
1383 return GetCompEM().IsWorking();
1384 }
1385
1387 {
1389 }
1390
1392 {
1394 }
1395
1397 {
1399 }
1400
1402 {
1404 }
1405
1407 {
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
1454 {
1455 if (!player)
1456 return false;
1457
1459 return false;
1460
1462
1464 }
1465
1467 {
1468 EntityAI hierarchyParent = GetHierarchyRoot();
1469 if (hierarchyParent.CanUseConstruction())
1470 return true;
1471
1472 if (BroadcastedBunker.Cast(hierarchyParent))
1473 return true;
1474
1475 return false;
1476 }
1477
1479 {
1481 }
1482
1484 {
1486 if (!battery)
1487 return 0.0;
1488
1489 float energy = battery.GetCompEM().GetEnergy();
1490 float energyMax = battery.GetCompEM().GetEnergyMax();
1491
1492 if (energyMax <= 0)
1493 return 0.0;
1494
1495 return (energy / energyMax) * 100.0;
1496 }
1497
1499 {
1502 }
1503
1505 {
1507 {
1510 }
1511 }
1512
1514 {
1515 super.SetActions();
1516
1518 }
1519
1521 {
1522 super.OnRPC(sender, rpc_type, ctx);
1523
1525 }
1526
1528 {
1529 super.OnStoreSave(ctx);
1530
1532 }
1533
1535 {
1536 if (!super.OnStoreLoad(ctx, version))
1537 return false;
1538
1540 return false;
1541
1542 return true;
1543 }
1544
1546 {
1547 super.AfterStoreLoad();
1548
1550 {
1552 {
1554 }
1555 else
1556 {
1558 }
1559 }
1560
1562 }
1563
1565 {
1566 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1567
1569 }
1570
1572 {
1573 super.OnVariablesSynchronized();
1574
1576 {
1578 if (uiAction != CodeLockUIAction.NONE)
1579 {
1581 }
1582 }
1583 }
1584
1586 {
1587 return true;
1588 }
1589
1591 {
1592 super.InitItemSounds();
1593
1601 }
1602
1603
1605 {
1606 GetInventory().CreateInInventory("Battery9V");
1607 }
1608}
1609
1611{
1612 override void Init()
1613 {
1615
1616 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1618
1619 if (bunkerConfig && bunkerConfig.bunkerSettings)
1620 {
1622 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1625 }
1626
1628 }
1629
1631 {
1632 return false;
1633 }
1634
1636 {
1637 return false;
1638 }
1639
1641 {
1642 return false;
1643 }
1644
1647
1649 {
1650 return false;
1651 }
1652
1654 {
1655 return true;
1656 }
1657
1659 {
1660 return true;
1661 }
1662
1664 {
1665 return true;
1666 }
1667
1669 {
1671 }
1672
1674 {
1678 }
1679}
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.