1003{
1006
1009
1012
1014
1015
1023
1025 {
1027 }
1028
1029 protected void Init()
1030 {
1033
1034 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1035 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1036 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1037 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1038 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1039 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1040 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1041 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1042 RegisterNetSyncVariableBool("m_Reversed");
1043 }
1044
1046 {
1047 super.EEInit();
1048
1049
1051 }
1052
1054 {
1055 super.EEItemLocationChanged(oldLoc, newLoc);
1056
1058 {
1060 {
1061 if (
g_Game.IsDedicatedServer())
1062 SetSynchDirty();
1063
1064
1066 }
1067 }
1068 }
1069
1071 {
1072 super.EEItemAttached(item, slot_name);
1073
1075 {
1078 {
1080 if (battery)
1081 {
1082 float batteryEnergy = battery.GetCompEM().GetEnergy();
1084 {
1086 GetCompEM().SwitchOn();
1087 }
1088
1090 }
1091 }
1092 }
1093 }
1094
1096 {
1097 super.EEItemDetached(item, slot_name);
1098
1100 {
1103 {
1105 GetCompEM().SwitchOff();
1106
1108 }
1109 }
1110 }
1111
1113 {
1114 super.OnWasAttached(parent, slot_id);
1115
1117 {
1120 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1121 {
1123 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1124 {
1126 GetCompEM().SwitchOn();
1127 }
1128
1129 if (parent && parent.CanUseConstruction())
1130 {
1132 if (buildingBase)
1133 {
1135 }
1136 }
1137 }
1138
1140 }
1141 }
1142
1144 {
1145 super.OnWasDetached(parent, slot_id);
1146
1148 {
1150 if (GetCompEM().IsWorking())
1151 GetCompEM().SwitchOff();
1152
1154 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1155 {
1159 }
1160
1162 }
1163 }
1164
1166 {
1168 return false;
1169
1170 return true;
1171 }
1172
1174 {
1177 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1178 {
1179 int doorIndex = -1;
1182 {
1183 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1184 {
1186 {
1187 doorIndex = doorInfoIndex;
1188 doorInfo = doorInfoData;
1189 break;
1190 }
1191 }
1192
1193 if (doorIndex != -1)
1194 break;
1195 }
1196
1197 if (doorIndex > -1)
1198 {
1200 }
1201
1204 if (rebuilding && doorInfo)
1205 {
1207 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1208 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1209 {
1210 m_Reversed = reversibleDoorPart.IsReversedLocal();
1211 }
1212 }
1213 }
1214 }
1215
1218 {
1220 {
1223 return false;
1224 }
1225
1226 return true;
1227 }
1228
1230 {
1231 super.OnWorkStop();
1232
1234 {
1237
1239 }
1240 }
1241
1243 {
1244 super.OnWorkStart();
1245
1247 {
1249 }
1250 }
1251
1252 override void OnWork(
float consumed_energy)
1253 {
1254 super.OnWork(consumed_energy);
1255
1257 {
1259 if (battery)
1260 {
1261 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1262 {
1263 GetCompEM().SwitchOff();
1265 }
1266
1269 {
1271 SetSynchDirty();
1272 }
1273 }
1274 }
1275 }
1276
1279 {
1281 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1282
1283
1284 if (
g_Game.IsMultiplayer())
1285 {
1286 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1287 }
1288 else
1289 {
1290 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1291 }
1292
1295 if (parent.MemoryPointExists(
slotName))
1296 {
1297 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1298 }
1299 else
1300 {
1302 }
1303
1305 PlaceOnSurface();
1306 }
1307
1309 {
1311 return battery;
1312 }
1313
1315 {
1316 return true;
1317 }
1318
1320 {
1321 return true;
1322 }
1323
1325 {
1326 return true;
1327 }
1328
1330 {
1332 }
1333
1335 {
1336 return true;
1337 }
1338
1340 {
1341 return GetCompEM().IsWorking();
1342 }
1343
1345 {
1347 }
1348
1350 {
1352 }
1353
1355 {
1357 }
1358
1360 {
1362 }
1363
1365 {
1367 }
1368
1370 {
1372 }
1373
1375 {
1377 }
1378
1380 {
1382 }
1383
1385 {
1387 }
1388
1390 {
1392 }
1393
1395 {
1397 }
1398
1400 {
1402 }
1403
1405 {
1407 }
1408
1412 {
1413 if (!player)
1414 return false;
1415
1417 return false;
1418
1420
1422 }
1423
1425 {
1426 EntityAI hierarchyParent = GetHierarchyRoot();
1427 if (hierarchyParent.CanUseConstruction())
1428 return true;
1429
1430 if (BroadcastedBunker.Cast(hierarchyParent))
1431 return true;
1432
1433 return false;
1434 }
1435
1437 {
1439 }
1440
1442 {
1444 if (!battery)
1445 return 0.0;
1446
1447 float energy = battery.GetCompEM().GetEnergy();
1448 float energyMax = battery.GetCompEM().GetEnergyMax();
1449
1450 if (energyMax <= 0)
1451 return 0.0;
1452
1453 return (energy / energyMax) * 100.0;
1454 }
1455
1457 {
1460 }
1461
1463 {
1465 {
1468 }
1469 }
1470
1472 {
1473 super.SetActions();
1474
1476 }
1477
1479 {
1480 super.OnRPC(sender, rpc_type, ctx);
1481
1483 }
1484
1486 {
1487 super.OnStoreSave(ctx);
1488
1490 }
1491
1493 {
1494 if (!super.OnStoreLoad(ctx, version))
1495 return false;
1496
1498 return false;
1499
1500 return true;
1501 }
1502
1504 {
1505 super.AfterStoreLoad();
1506
1508 {
1510 {
1512 }
1513 else
1514 {
1516 }
1517 }
1518
1520 }
1521
1523 {
1524 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1525
1527 }
1528
1530 {
1531 super.OnVariablesSynchronized();
1532
1534 {
1536 if (uiAction != CodeLockUIAction.NONE)
1537 {
1539 }
1540 }
1541 }
1542
1544 {
1545 return true;
1546 }
1547
1549 {
1550 super.InitItemSounds();
1551
1559 }
1560
1561
1563 {
1564 GetInventory().CreateInInventory("Battery9V");
1565 }
1566}
1567
1569{
1570 override void Init()
1571 {
1573
1574 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1576
1577 if (bunkerConfig && bunkerConfig.bunkerSettings)
1578 {
1580 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1583 }
1584
1586 }
1587
1589 {
1590 return false;
1591 }
1592
1594 {
1595 return false;
1596 }
1597
1599 {
1600 return false;
1601 }
1602
1605
1607 {
1608 return false;
1609 }
1610
1612 {
1613 return true;
1614 }
1615
1617 {
1618 return true;
1619 }
1620
1622 {
1623 return true;
1624 }
1625
1627 {
1629 }
1630
1632 {
1636 }
1637}
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.