Checks whether the given player is standing on the physical (non-keypad) side of the lock Fails closed when the required memory points are not available
978{
981
984
987
989
990
998
1000 {
1002 }
1003
1004 protected void Init()
1005 {
1008
1009 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1010 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1011 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1012 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1013 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1014 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1015 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1016 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1017 RegisterNetSyncVariableBool("m_Reversed");
1018 }
1019
1021 {
1022 super.EEInit();
1023
1024
1026 }
1027
1029 {
1030 super.EEItemLocationChanged(oldLoc, newLoc);
1031
1033 {
1035 {
1036 if (
g_Game.IsDedicatedServer())
1037 SetSynchDirty();
1038
1039
1041 }
1042 }
1043 }
1044
1046 {
1047 super.EEItemAttached(item, slot_name);
1048
1050 {
1053 {
1055 if (battery)
1056 {
1057 float batteryEnergy = battery.GetCompEM().GetEnergy();
1059 {
1061 GetCompEM().SwitchOn();
1062 }
1063
1065 }
1066 }
1067 }
1068 }
1069
1071 {
1072 super.EEItemDetached(item, slot_name);
1073
1075 {
1078 {
1080 GetCompEM().SwitchOff();
1081
1083 }
1084 }
1085 }
1086
1088 {
1089 super.OnWasAttached(parent, slot_id);
1090
1092 {
1095 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1096 {
1098 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1099 {
1101 GetCompEM().SwitchOn();
1102 }
1103
1104 if (parent && parent.CanUseConstruction())
1105 {
1107 if (buildingBase)
1108 {
1110 }
1111 }
1112 }
1113
1115 }
1116 }
1117
1119 {
1120 super.OnWasDetached(parent, slot_id);
1121
1123 {
1125 if (GetCompEM().IsWorking())
1126 GetCompEM().SwitchOff();
1127
1129 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1130 {
1134 }
1135
1137 }
1138 }
1139
1141 {
1143 return false;
1144
1145 return true;
1146 }
1147
1149 {
1152 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1153 {
1154 int doorIndex = -1;
1157 {
1158 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1159 {
1161 {
1162 doorIndex = doorInfoIndex;
1163 doorInfo = doorInfoData;
1164 break;
1165 }
1166 }
1167
1168 if (doorIndex != -1)
1169 break;
1170 }
1171
1172 if (doorIndex > -1)
1173 {
1175 }
1176
1179 if (rebuilding && doorInfo)
1180 {
1182 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1183 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1184 {
1185 m_Reversed = reversibleDoorPart.IsReversedLocal();
1186 }
1187 }
1188 }
1189 }
1190
1193 {
1195 {
1198 return false;
1199 }
1200
1201 return true;
1202 }
1203
1205 {
1206 super.OnWorkStop();
1207
1209 {
1212
1214 }
1215 }
1216
1218 {
1219 super.OnWorkStart();
1220
1222 {
1224 }
1225 }
1226
1227 override void OnWork(
float consumed_energy)
1228 {
1229 super.OnWork(consumed_energy);
1230
1232 {
1234 if (battery)
1235 {
1236 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1237 {
1238 GetCompEM().SwitchOff();
1240 }
1241
1244 {
1246 SetSynchDirty();
1247 }
1248 }
1249 }
1250 }
1251
1254 {
1256 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1257
1258
1259 if (
g_Game.IsMultiplayer())
1260 {
1261 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1262 }
1263 else
1264 {
1265 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1266 }
1267
1270 if (parent.MemoryPointExists(
slotName))
1271 {
1272 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1273 }
1274 else
1275 {
1277 }
1278
1280 PlaceOnSurface();
1281 }
1282
1284 {
1286 return battery;
1287 }
1288
1290 {
1291 return true;
1292 }
1293
1295 {
1296 return true;
1297 }
1298
1300 {
1301 return true;
1302 }
1303
1305 {
1307 }
1308
1310 {
1311 return true;
1312 }
1313
1315 {
1316 return GetCompEM().IsWorking();
1317 }
1318
1320 {
1322 }
1323
1325 {
1327 }
1328
1330 {
1332 }
1333
1335 {
1337 }
1338
1340 {
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
1387 {
1388 if (!player)
1389 return false;
1390
1392 return false;
1393
1395
1397 }
1398
1400 {
1401 EntityAI hierarchyParent = GetHierarchyRoot();
1402 if (hierarchyParent.CanUseConstruction())
1403 return true;
1404
1405 if (BroadcastedBunker.Cast(hierarchyParent))
1406 return true;
1407
1408 return false;
1409 }
1410
1412 {
1414 }
1415
1417 {
1419 if (!battery)
1420 return 0.0;
1421
1422 float energy = battery.GetCompEM().GetEnergy();
1423 float energyMax = battery.GetCompEM().GetEnergyMax();
1424
1425 if (energyMax <= 0)
1426 return 0.0;
1427
1428 return (energy / energyMax) * 100.0;
1429 }
1430
1432 {
1435 }
1436
1438 {
1440 {
1443 }
1444 }
1445
1447 {
1448 super.SetActions();
1449
1451 }
1452
1454 {
1455 super.OnRPC(sender, rpc_type, ctx);
1456
1458 }
1459
1461 {
1462 super.OnStoreSave(ctx);
1463
1465 }
1466
1468 {
1469 if (!super.OnStoreLoad(ctx, version))
1470 return false;
1471
1473 return false;
1474
1475 return true;
1476 }
1477
1479 {
1480 super.AfterStoreLoad();
1481
1483 {
1485 {
1487 }
1488 else
1489 {
1491 }
1492 }
1493
1495 }
1496
1498 {
1499 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1500
1502 }
1503
1505 {
1506 super.OnVariablesSynchronized();
1507
1509 {
1511 if (uiAction != CodeLockUIAction.NONE)
1512 {
1514 }
1515 }
1516 }
1517
1519 {
1520 return true;
1521 }
1522
1524 {
1525 super.InitItemSounds();
1526
1534 }
1535
1536
1538 {
1539 GetInventory().CreateInInventory("Battery9V");
1540 }
1541}
1542
1544{
1545 override void Init()
1546 {
1548
1549 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1551
1552 if (bunkerConfig && bunkerConfig.bunkerSettings)
1553 {
1555 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1558 }
1559
1561 }
1562
1564 {
1565 return false;
1566 }
1567
1569 {
1570 return false;
1571 }
1572
1574 {
1575 return false;
1576 }
1577
1580
1582 {
1583 return false;
1584 }
1585
1587 {
1588 return true;
1589 }
1590
1592 {
1593 return true;
1594 }
1595
1597 {
1598 return true;
1599 }
1600
1602 {
1604 }
1605
1607 {
1611 }
1612}
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.