956{
959
962
965
967
968
976
978 {
980 }
981
982 protected void Init()
983 {
986
987 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
988 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
989 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
990 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
991 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
992 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
993 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
994 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
995 RegisterNetSyncVariableBool("m_Reversed");
996 }
997
999 {
1000 super.EEInit();
1001
1002
1004 }
1005
1007 {
1008 super.EEItemLocationChanged(oldLoc, newLoc);
1009
1011 {
1013 {
1014 if (
g_Game.IsDedicatedServer())
1015 SetSynchDirty();
1016
1017
1019 }
1020 }
1021 }
1022
1024 {
1025 super.EEItemAttached(item, slot_name);
1026
1028 {
1031 {
1033 if (battery)
1034 {
1035 float batteryEnergy = battery.GetCompEM().GetEnergy();
1037 {
1039 GetCompEM().SwitchOn();
1040 }
1041
1043 }
1044 }
1045 }
1046 }
1047
1049 {
1050 super.EEItemDetached(item, slot_name);
1051
1053 {
1056 {
1058 GetCompEM().SwitchOff();
1059
1061 }
1062 }
1063 }
1064
1066 {
1067 super.OnWasAttached(parent, slot_id);
1068
1070 {
1073 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1074 {
1076 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1077 {
1079 GetCompEM().SwitchOn();
1080 }
1081
1082 if (parent && parent.CanUseConstruction())
1083 {
1085 if (buildingBase)
1086 {
1088 }
1089 }
1090 }
1091
1093 }
1094 }
1095
1097 {
1098 super.OnWasDetached(parent, slot_id);
1099
1101 {
1103 if (GetCompEM().IsWorking())
1104 GetCompEM().SwitchOff();
1105
1107 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1108 {
1112 }
1113
1115 }
1116 }
1117
1119 {
1121 return false;
1122
1123 return true;
1124 }
1125
1127 {
1130 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1131 {
1132 int doorIndex = -1;
1135 {
1136 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1137 {
1139 {
1140 doorIndex = doorInfoIndex;
1141 doorInfo = doorInfoData;
1142 break;
1143 }
1144 }
1145
1146 if (doorIndex != -1)
1147 break;
1148 }
1149
1150 if (doorIndex > -1)
1151 {
1153 }
1154
1157 if (rebuilding && doorInfo)
1158 {
1160 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1161 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1162 {
1163 m_Reversed = reversibleDoorPart.IsReversedLocal();
1164 }
1165 }
1166 }
1167 }
1168
1171 {
1173 {
1176 return false;
1177 }
1178
1179 return true;
1180 }
1181
1183 {
1184 super.OnWorkStop();
1185
1187 {
1190
1192 }
1193 }
1194
1196 {
1197 super.OnWorkStart();
1198
1200 {
1202 }
1203 }
1204
1205 override void OnWork(
float consumed_energy)
1206 {
1207 super.OnWork(consumed_energy);
1208
1210 {
1212 if (battery)
1213 {
1214 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1215 {
1216 GetCompEM().SwitchOff();
1218 }
1219
1222 {
1224 SetSynchDirty();
1225 }
1226 }
1227 }
1228 }
1229
1232 {
1234 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1235
1236
1237 if (
g_Game.IsMultiplayer())
1238 {
1239 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1240 }
1241 else
1242 {
1243 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1244 }
1245
1248 if (parent.MemoryPointExists(
slotName))
1249 {
1250 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1251 }
1252 else
1253 {
1255 }
1256
1258 PlaceOnSurface();
1259 }
1260
1262 {
1264 return battery;
1265 }
1266
1268 {
1269 return true;
1270 }
1271
1273 {
1274 return true;
1275 }
1276
1278 {
1279 return true;
1280 }
1281
1283 {
1285 }
1286
1288 {
1289 return true;
1290 }
1291
1293 {
1294 return GetCompEM().IsWorking();
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
1343 {
1345 }
1346
1348 {
1350 }
1351
1353 {
1355 }
1356
1358 {
1360 }
1361
1365 {
1366 if (!player)
1367 return false;
1368
1370 return false;
1371
1373
1375 }
1376
1378 {
1379 EntityAI hierarchyParent = GetHierarchyRoot();
1380 if (hierarchyParent.CanUseConstruction())
1381 return true;
1382
1383 if (BroadcastedBunker.Cast(hierarchyParent))
1384 return true;
1385
1386 return false;
1387 }
1388
1390 {
1392 }
1393
1395 {
1397 if (!battery)
1398 return 0.0;
1399
1400 float energy = battery.GetCompEM().GetEnergy();
1401 float energyMax = battery.GetCompEM().GetEnergyMax();
1402
1403 if (energyMax <= 0)
1404 return 0.0;
1405
1406 return (energy / energyMax) * 100.0;
1407 }
1408
1410 {
1413 }
1414
1416 {
1418 {
1421 }
1422 }
1423
1425 {
1426 super.SetActions();
1427
1429 }
1430
1432 {
1433 super.OnRPC(sender, rpc_type, ctx);
1434
1436 }
1437
1439 {
1440 super.OnStoreSave(ctx);
1441
1443 }
1444
1446 {
1447 if (!super.OnStoreLoad(ctx, version))
1448 return false;
1449
1451 return false;
1452
1453 return true;
1454 }
1455
1457 {
1458 super.AfterStoreLoad();
1459
1461 {
1463 {
1465 }
1466 else
1467 {
1469 }
1470 }
1471
1473 }
1474
1476 {
1477 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1478
1480 }
1481
1483 {
1484 super.OnVariablesSynchronized();
1485
1487 {
1489 if (uiAction != CodeLockUIAction.NONE)
1490 {
1492 }
1493 }
1494 }
1495
1497 {
1498 return true;
1499 }
1500
1502 {
1503 super.InitItemSounds();
1504
1512 }
1513
1514
1516 {
1517 GetInventory().CreateInInventory("Battery9V");
1518 }
1519}
1520
1522{
1523 override void Init()
1524 {
1526
1527 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1529
1530 if (bunkerConfig && bunkerConfig.bunkerSettings)
1531 {
1533 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1536 }
1537
1539 }
1540
1542 {
1543 return false;
1544 }
1545
1547 {
1548 return false;
1549 }
1550
1552 {
1553 return false;
1554 }
1555
1558
1560 {
1561 return false;
1562 }
1563
1565 {
1566 return true;
1567 }
1568
1570 {
1571 return true;
1572 }
1573
1575 {
1576 return true;
1577 }
1578
1580 {
1582 }
1583
1585 {
1589 }
1590}
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.