961{
964
967
970
972
973
981
983 {
985 }
986
987 protected void Init()
988 {
991
992 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
993 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
994 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
995 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
996 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
997 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
998 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
999 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1000 RegisterNetSyncVariableBool("m_Reversed");
1001 }
1002
1004 {
1005 super.EEInit();
1006
1007
1009 }
1010
1012 {
1013 super.EEItemLocationChanged(oldLoc, newLoc);
1014
1016 {
1018 {
1019 if (
g_Game.IsDedicatedServer())
1020 SetSynchDirty();
1021
1022
1024 }
1025 }
1026 }
1027
1029 {
1030 super.EEItemAttached(item, slot_name);
1031
1033 {
1036 {
1038 if (battery)
1039 {
1040 float batteryEnergy = battery.GetCompEM().GetEnergy();
1042 {
1044 GetCompEM().SwitchOn();
1045 }
1046
1048 }
1049 }
1050 }
1051 }
1052
1054 {
1055 super.EEItemDetached(item, slot_name);
1056
1058 {
1061 {
1063 GetCompEM().SwitchOff();
1064
1066 }
1067 }
1068 }
1069
1071 {
1072 super.OnWasAttached(parent, slot_id);
1073
1075 {
1078 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1079 {
1081 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1082 {
1084 GetCompEM().SwitchOn();
1085 }
1086
1087 if (parent && parent.CanUseConstruction())
1088 {
1090 if (buildingBase)
1091 {
1093 }
1094 }
1095 }
1096
1098 }
1099 }
1100
1102 {
1103 super.OnWasDetached(parent, slot_id);
1104
1106 {
1108 if (GetCompEM().IsWorking())
1109 GetCompEM().SwitchOff();
1110
1112 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1113 {
1117 }
1118
1120 }
1121 }
1122
1124 {
1126 return false;
1127
1128 return true;
1129 }
1130
1132 {
1135 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1136 {
1137 int doorIndex = -1;
1140 {
1141 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1142 {
1144 {
1145 doorIndex = doorInfoIndex;
1146 doorInfo = doorInfoData;
1147 break;
1148 }
1149 }
1150
1151 if (doorIndex != -1)
1152 break;
1153 }
1154
1155 if (doorIndex > -1)
1156 {
1158 }
1159
1162 if (rebuilding && doorInfo)
1163 {
1165 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1166 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1167 {
1168 m_Reversed = reversibleDoorPart.IsReversedLocal();
1169 }
1170 }
1171 }
1172 }
1173
1176 {
1178 {
1181 return false;
1182 }
1183
1184 return true;
1185 }
1186
1188 {
1189 super.OnWorkStop();
1190
1192 {
1195
1197 }
1198 }
1199
1201 {
1202 super.OnWorkStart();
1203
1205 {
1207 }
1208 }
1209
1210 override void OnWork(
float consumed_energy)
1211 {
1212 super.OnWork(consumed_energy);
1213
1215 {
1217 if (battery)
1218 {
1219 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1220 {
1221 GetCompEM().SwitchOff();
1223 }
1224
1227 {
1229 SetSynchDirty();
1230 }
1231 }
1232 }
1233 }
1234
1237 {
1239 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1240
1241
1242 if (
g_Game.IsMultiplayer())
1243 {
1244 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1245 }
1246 else
1247 {
1248 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1249 }
1250
1253 if (parent.MemoryPointExists(
slotName))
1254 {
1255 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1256 }
1257 else
1258 {
1260 }
1261
1263 PlaceOnSurface();
1264 }
1265
1267 {
1269 return battery;
1270 }
1271
1273 {
1274 return true;
1275 }
1276
1278 {
1279 return true;
1280 }
1281
1283 {
1284 return true;
1285 }
1286
1288 {
1290 }
1291
1293 {
1294 return true;
1295 }
1296
1298 {
1299 return GetCompEM().IsWorking();
1300 }
1301
1303 {
1305 }
1306
1308 {
1310 }
1311
1313 {
1315 }
1316
1318 {
1320 }
1321
1323 {
1325 }
1326
1328 {
1330 }
1331
1333 {
1335 }
1336
1338 {
1340 }
1341
1343 {
1345 }
1346
1348 {
1350 }
1351
1353 {
1355 }
1356
1358 {
1360 }
1361
1363 {
1365 }
1366
1370 {
1371 if (!player)
1372 return false;
1373
1375 return false;
1376
1378
1380 }
1381
1383 {
1384 EntityAI hierarchyParent = GetHierarchyRoot();
1385 if (hierarchyParent.CanUseConstruction())
1386 return true;
1387
1388 if (BroadcastedBunker.Cast(hierarchyParent))
1389 return true;
1390
1391 return false;
1392 }
1393
1395 {
1397 }
1398
1400 {
1402 if (!battery)
1403 return 0.0;
1404
1405 float energy = battery.GetCompEM().GetEnergy();
1406 float energyMax = battery.GetCompEM().GetEnergyMax();
1407
1408 if (energyMax <= 0)
1409 return 0.0;
1410
1411 return (energy / energyMax) * 100.0;
1412 }
1413
1415 {
1418 }
1419
1421 {
1423 {
1426 }
1427 }
1428
1430 {
1431 super.SetActions();
1432
1434 }
1435
1437 {
1438 super.OnRPC(sender, rpc_type, ctx);
1439
1441 }
1442
1444 {
1445 super.OnStoreSave(ctx);
1446
1448 }
1449
1451 {
1452 if (!super.OnStoreLoad(ctx, version))
1453 return false;
1454
1456 return false;
1457
1458 return true;
1459 }
1460
1462 {
1463 super.AfterStoreLoad();
1464
1466 {
1468 {
1470 }
1471 else
1472 {
1474 }
1475 }
1476
1478 }
1479
1481 {
1482 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1483
1485 }
1486
1488 {
1489 super.OnVariablesSynchronized();
1490
1492 {
1494 if (uiAction != CodeLockUIAction.NONE)
1495 {
1497 }
1498 }
1499 }
1500
1502 {
1503 return true;
1504 }
1505
1507 {
1508 super.InitItemSounds();
1509
1517 }
1518
1519
1521 {
1522 GetInventory().CreateInInventory("Battery9V");
1523 }
1524}
1525
1527{
1528 override void Init()
1529 {
1531
1532 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1534
1535 if (bunkerConfig && bunkerConfig.bunkerSettings)
1536 {
1538 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1541 }
1542
1544 }
1545
1547 {
1548 return false;
1549 }
1550
1552 {
1553 return false;
1554 }
1555
1557 {
1558 return false;
1559 }
1560
1563
1565 {
1566 return false;
1567 }
1568
1570 {
1571 return true;
1572 }
1573
1575 {
1576 return true;
1577 }
1578
1580 {
1581 return true;
1582 }
1583
1585 {
1587 }
1588
1590 {
1594 }
1595}
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.