936{
939
942
945
947
948
956
958 {
960 }
961
962 protected void Init()
963 {
966
967 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
968 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
969 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
970 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
971 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
972 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
973 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
974 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
975 RegisterNetSyncVariableBool("m_Reversed");
976 }
977
979 {
980 super.EEInit();
981
982
984 }
985
987 {
988 super.EEItemLocationChanged(oldLoc, newLoc);
989
991 {
993 {
994 if (
g_Game.IsDedicatedServer())
995 SetSynchDirty();
996
997
999 }
1000 }
1001 }
1002
1004 {
1005 super.EEItemAttached(item, slot_name);
1006
1008 {
1011 {
1013 if (battery)
1014 {
1015 float batteryEnergy = battery.GetCompEM().GetEnergy();
1017 {
1019 GetCompEM().SwitchOn();
1020 }
1021
1023 }
1024 }
1025 }
1026 }
1027
1029 {
1030 super.EEItemDetached(item, slot_name);
1031
1033 {
1036 {
1038 GetCompEM().SwitchOff();
1039
1041 }
1042 }
1043 }
1044
1046 {
1047 super.OnWasAttached(parent, slot_id);
1048
1050 {
1053 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1054 {
1056 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1057 {
1059 GetCompEM().SwitchOn();
1060 }
1061
1062 if (parent && parent.CanUseConstruction())
1063 {
1065 if (buildingBase)
1066 {
1068 }
1069 }
1070 }
1071
1073 }
1074 }
1075
1077 {
1078 super.OnWasDetached(parent, slot_id);
1079
1081 {
1083 if (GetCompEM().IsWorking())
1084 GetCompEM().SwitchOff();
1085
1087 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1088 {
1092 }
1093
1095 }
1096 }
1097
1099 {
1101 return false;
1102
1103 return true;
1104 }
1105
1107 {
1110 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1111 {
1112 int doorIndex = -1;
1115 {
1116 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1117 {
1119 {
1120 doorIndex = doorInfoIndex;
1121 doorInfo = doorInfoData;
1122 break;
1123 }
1124 }
1125
1126 if (doorIndex != -1)
1127 break;
1128 }
1129
1130 if (doorIndex > -1)
1131 {
1133 }
1134
1137 if (rebuilding && doorInfo)
1138 {
1140 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1141 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1142 {
1143 m_Reversed = reversibleDoorPart.IsReversedLocal();
1144 }
1145 }
1146 }
1147 }
1148
1151 {
1153 {
1156 return false;
1157 }
1158
1159 return true;
1160 }
1161
1163 {
1164 super.OnWorkStop();
1165
1167 {
1170
1172 }
1173 }
1174
1176 {
1177 super.OnWorkStart();
1178
1180 {
1182 }
1183 }
1184
1185 override void OnWork(
float consumed_energy)
1186 {
1187 super.OnWork(consumed_energy);
1188
1190 {
1192 if (battery)
1193 {
1194 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1195 {
1196 GetCompEM().SwitchOff();
1198 }
1199
1202 {
1204 SetSynchDirty();
1205 }
1206 }
1207 }
1208 }
1209
1212 {
1214 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1215
1216
1217 if (
g_Game.IsMultiplayer())
1218 {
1219 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1220 }
1221 else
1222 {
1223 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1224 }
1225
1228 if (parent.MemoryPointExists(
slotName))
1229 {
1230 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1231 }
1232 else
1233 {
1235 }
1236
1238 PlaceOnSurface();
1239 }
1240
1242 {
1244 return battery;
1245 }
1246
1248 {
1249 return true;
1250 }
1251
1253 {
1254 return true;
1255 }
1256
1258 {
1259 return true;
1260 }
1261
1263 {
1265 }
1266
1268 {
1269 return true;
1270 }
1271
1273 {
1274 return GetCompEM().IsWorking();
1275 }
1276
1278 {
1280 }
1281
1283 {
1285 }
1286
1288 {
1290 }
1291
1293 {
1295 }
1296
1298 {
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
1345 {
1346 if (!player)
1347 return false;
1348
1350 return false;
1351
1353
1355 }
1356
1358 {
1359 EntityAI hierarchyParent = GetHierarchyRoot();
1360 if (hierarchyParent.CanUseConstruction())
1361 return true;
1362
1363 if (BroadcastedBunker.Cast(hierarchyParent))
1364 return true;
1365
1366 return false;
1367 }
1368
1370 {
1372 }
1373
1375 {
1377 if (!battery)
1378 return 0.0;
1379
1380 float energy = battery.GetCompEM().GetEnergy();
1381 float energyMax = battery.GetCompEM().GetEnergyMax();
1382
1383 if (energyMax <= 0)
1384 return 0.0;
1385
1386 return (energy / energyMax) * 100.0;
1387 }
1388
1390 {
1393 }
1394
1396 {
1398 {
1401 }
1402 }
1403
1405 {
1406 super.SetActions();
1407
1409 }
1410
1412 {
1413 super.OnRPC(sender, rpc_type, ctx);
1414
1416 }
1417
1419 {
1420 super.OnStoreSave(ctx);
1421
1423 }
1424
1426 {
1427 if (!super.OnStoreLoad(ctx, version))
1428 return false;
1429
1431 return false;
1432
1433 return true;
1434 }
1435
1437 {
1438 super.AfterStoreLoad();
1439
1441 {
1443 {
1445 }
1446 else
1447 {
1449 }
1450 }
1451
1453 }
1454
1456 {
1457 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1458
1460 }
1461
1463 {
1464 super.OnVariablesSynchronized();
1465
1467 {
1469 if (uiAction != CodeLockUIAction.NONE)
1470 {
1472 }
1473 }
1474 }
1475
1477 {
1478 return true;
1479 }
1480
1482 {
1483 super.InitItemSounds();
1484
1492 }
1493
1494
1496 {
1497 GetInventory().CreateInInventory("Battery9V");
1498 }
1499}
1500
1502{
1503 override void Init()
1504 {
1506
1507 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1509
1510 if (bunkerConfig && bunkerConfig.bunkerSettings)
1511 {
1513 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1516 }
1517
1519 }
1520
1522 {
1523 return false;
1524 }
1525
1527 {
1528 return false;
1529 }
1530
1532 {
1533 return false;
1534 }
1535
1538
1540 {
1541 return false;
1542 }
1543
1545 {
1546 return true;
1547 }
1548
1550 {
1551 return true;
1552 }
1553
1555 {
1556 return true;
1557 }
1558
1560 {
1562 }
1563
1565 {
1569 }
1570}
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.