991{
994
997
1000
1002
1003
1011
1013 {
1015 }
1016
1017 protected void Init()
1018 {
1021
1022 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1023 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1024 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1025 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1026 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1027 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1028 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1029 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1030 RegisterNetSyncVariableBool("m_Reversed");
1031 }
1032
1034 {
1035 super.EEInit();
1036
1037
1039 }
1040
1042 {
1043 super.EEItemLocationChanged(oldLoc, newLoc);
1044
1046 {
1048 {
1049 if (
g_Game.IsDedicatedServer())
1050 SetSynchDirty();
1051
1052
1054 }
1055 }
1056 }
1057
1059 {
1060 super.EEItemAttached(item, slot_name);
1061
1063 {
1066 {
1068 if (battery)
1069 {
1070 float batteryEnergy = battery.GetCompEM().GetEnergy();
1072 {
1074 GetCompEM().SwitchOn();
1075 }
1076
1078 }
1079 }
1080 }
1081 }
1082
1084 {
1085 super.EEItemDetached(item, slot_name);
1086
1088 {
1091 {
1093 GetCompEM().SwitchOff();
1094
1096 }
1097 }
1098 }
1099
1101 {
1102 super.OnWasAttached(parent, slot_id);
1103
1105 {
1108 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1109 {
1111 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1112 {
1114 GetCompEM().SwitchOn();
1115 }
1116
1117 if (parent && parent.CanUseConstruction())
1118 {
1120 if (buildingBase)
1121 {
1123 }
1124 }
1125 }
1126
1128 }
1129 }
1130
1132 {
1133 super.OnWasDetached(parent, slot_id);
1134
1136 {
1138 if (GetCompEM().IsWorking())
1139 GetCompEM().SwitchOff();
1140
1142 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1143 {
1147 }
1148
1150 }
1151 }
1152
1154 {
1156 return false;
1157
1158 return true;
1159 }
1160
1162 {
1165 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1166 {
1167 int doorIndex = -1;
1170 {
1171 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1172 {
1174 {
1175 doorIndex = doorInfoIndex;
1176 doorInfo = doorInfoData;
1177 break;
1178 }
1179 }
1180
1181 if (doorIndex != -1)
1182 break;
1183 }
1184
1185 if (doorIndex > -1)
1186 {
1188 }
1189
1192 if (rebuilding && doorInfo)
1193 {
1195 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1196 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1197 {
1198 m_Reversed = reversibleDoorPart.IsReversedLocal();
1199 }
1200 }
1201 }
1202 }
1203
1206 {
1208 {
1211 return false;
1212 }
1213
1214 return true;
1215 }
1216
1218 {
1219 super.OnWorkStop();
1220
1222 {
1225
1227 }
1228 }
1229
1231 {
1232 super.OnWorkStart();
1233
1235 {
1237 }
1238 }
1239
1240 override void OnWork(
float consumed_energy)
1241 {
1242 super.OnWork(consumed_energy);
1243
1245 {
1247 if (battery)
1248 {
1249 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1250 {
1251 GetCompEM().SwitchOff();
1253 }
1254
1257 {
1259 SetSynchDirty();
1260 }
1261 }
1262 }
1263 }
1264
1267 {
1269 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1270
1271
1272 if (
g_Game.IsMultiplayer())
1273 {
1274 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1275 }
1276 else
1277 {
1278 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1279 }
1280
1283 if (parent.MemoryPointExists(
slotName))
1284 {
1285 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1286 }
1287 else
1288 {
1290 }
1291
1293 PlaceOnSurface();
1294 }
1295
1297 {
1299 return battery;
1300 }
1301
1303 {
1304 return true;
1305 }
1306
1308 {
1309 return true;
1310 }
1311
1313 {
1314 return true;
1315 }
1316
1318 {
1320 }
1321
1323 {
1324 return true;
1325 }
1326
1328 {
1329 return GetCompEM().IsWorking();
1330 }
1331
1333 {
1335 }
1336
1338 {
1340 }
1341
1343 {
1345 }
1346
1348 {
1350 }
1351
1353 {
1355 }
1356
1358 {
1360 }
1361
1363 {
1365 }
1366
1368 {
1370 }
1371
1373 {
1375 }
1376
1378 {
1380 }
1381
1383 {
1385 }
1386
1388 {
1390 }
1391
1393 {
1395 }
1396
1400 {
1401 if (!player)
1402 return false;
1403
1405 return false;
1406
1408
1410 }
1411
1413 {
1414 EntityAI hierarchyParent = GetHierarchyRoot();
1415 if (hierarchyParent.CanUseConstruction())
1416 return true;
1417
1418 if (BroadcastedBunker.Cast(hierarchyParent))
1419 return true;
1420
1421 return false;
1422 }
1423
1425 {
1427 }
1428
1430 {
1432 if (!battery)
1433 return 0.0;
1434
1435 float energy = battery.GetCompEM().GetEnergy();
1436 float energyMax = battery.GetCompEM().GetEnergyMax();
1437
1438 if (energyMax <= 0)
1439 return 0.0;
1440
1441 return (energy / energyMax) * 100.0;
1442 }
1443
1445 {
1448 }
1449
1451 {
1453 {
1456 }
1457 }
1458
1460 {
1461 super.SetActions();
1462
1464 }
1465
1467 {
1468 super.OnRPC(sender, rpc_type, ctx);
1469
1471 }
1472
1474 {
1475 super.OnStoreSave(ctx);
1476
1478 }
1479
1481 {
1482 if (!super.OnStoreLoad(ctx, version))
1483 return false;
1484
1486 return false;
1487
1488 return true;
1489 }
1490
1492 {
1493 super.AfterStoreLoad();
1494
1496 {
1498 {
1500 }
1501 else
1502 {
1504 }
1505 }
1506
1508 }
1509
1511 {
1512 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1513
1515 }
1516
1518 {
1519 super.OnVariablesSynchronized();
1520
1522 {
1524 if (uiAction != CodeLockUIAction.NONE)
1525 {
1527 }
1528 }
1529 }
1530
1532 {
1533 return true;
1534 }
1535
1537 {
1538 super.InitItemSounds();
1539
1547 }
1548
1549
1551 {
1552 GetInventory().CreateInInventory("Battery9V");
1553 }
1554}
1555
1557{
1558 override void Init()
1559 {
1561
1562 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1564
1565 if (bunkerConfig && bunkerConfig.bunkerSettings)
1566 {
1568 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1571 }
1572
1574 }
1575
1577 {
1578 return false;
1579 }
1580
1582 {
1583 return false;
1584 }
1585
1587 {
1588 return false;
1589 }
1590
1593
1595 {
1596 return false;
1597 }
1598
1600 {
1601 return true;
1602 }
1603
1605 {
1606 return true;
1607 }
1608
1610 {
1611 return true;
1612 }
1613
1615 {
1617 }
1618
1620 {
1624 }
1625}
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.