941{
944
947
950
952
953
961
963 {
965 }
966
967 protected void Init()
968 {
971
972 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
973 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
974 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
975 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
976 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
977 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
978 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
979 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
980 RegisterNetSyncVariableBool("m_Reversed");
981 }
982
984 {
985 super.EEInit();
986
987
989 }
990
992 {
993 super.EEItemLocationChanged(oldLoc, newLoc);
994
996 {
998 {
999 if (
g_Game.IsDedicatedServer())
1000 SetSynchDirty();
1001
1002
1004 }
1005 }
1006 }
1007
1009 {
1010 super.EEItemAttached(item, slot_name);
1011
1013 {
1016 {
1018 if (battery)
1019 {
1020 float batteryEnergy = battery.GetCompEM().GetEnergy();
1022 {
1024 GetCompEM().SwitchOn();
1025 }
1026
1028 }
1029 }
1030 }
1031 }
1032
1034 {
1035 super.EEItemDetached(item, slot_name);
1036
1038 {
1041 {
1043 GetCompEM().SwitchOff();
1044
1046 }
1047 }
1048 }
1049
1051 {
1052 super.OnWasAttached(parent, slot_id);
1053
1055 {
1058 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1059 {
1061 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1062 {
1064 GetCompEM().SwitchOn();
1065 }
1066
1067 if (parent && parent.CanUseConstruction())
1068 {
1070 if (buildingBase)
1071 {
1073 }
1074 }
1075 }
1076
1078 }
1079 }
1080
1082 {
1083 super.OnWasDetached(parent, slot_id);
1084
1086 {
1088 if (GetCompEM().IsWorking())
1089 GetCompEM().SwitchOff();
1090
1092 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1093 {
1097 }
1098
1100 }
1101 }
1102
1104 {
1106 return false;
1107
1108 return true;
1109 }
1110
1112 {
1115 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1116 {
1117 int doorIndex = -1;
1120 {
1121 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1122 {
1124 {
1125 doorIndex = doorInfoIndex;
1126 doorInfo = doorInfoData;
1127 break;
1128 }
1129 }
1130
1131 if (doorIndex != -1)
1132 break;
1133 }
1134
1135 if (doorIndex > -1)
1136 {
1138 }
1139
1142 if (rebuilding && doorInfo)
1143 {
1145 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1146 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1147 {
1148 m_Reversed = reversibleDoorPart.IsReversedLocal();
1149 }
1150 }
1151 }
1152 }
1153
1156 {
1158 {
1161 return false;
1162 }
1163
1164 return true;
1165 }
1166
1168 {
1169 super.OnWorkStop();
1170
1172 {
1175
1177 }
1178 }
1179
1181 {
1182 super.OnWorkStart();
1183
1185 {
1187 }
1188 }
1189
1190 override void OnWork(
float consumed_energy)
1191 {
1192 super.OnWork(consumed_energy);
1193
1195 {
1197 if (battery)
1198 {
1199 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1200 {
1201 GetCompEM().SwitchOff();
1203 }
1204
1207 {
1209 SetSynchDirty();
1210 }
1211 }
1212 }
1213 }
1214
1217 {
1219 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1220
1221
1222 if (
g_Game.IsMultiplayer())
1223 {
1224 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1225 }
1226 else
1227 {
1228 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1229 }
1230
1233 if (parent.MemoryPointExists(
slotName))
1234 {
1235 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1236 }
1237 else
1238 {
1240 }
1241
1243 PlaceOnSurface();
1244 }
1245
1247 {
1249 return battery;
1250 }
1251
1253 {
1254 return true;
1255 }
1256
1258 {
1259 return true;
1260 }
1261
1263 {
1264 return true;
1265 }
1266
1268 {
1270 }
1271
1273 {
1274 return true;
1275 }
1276
1278 {
1279 return GetCompEM().IsWorking();
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
1343 {
1345 }
1346
1350 {
1351 if (!player)
1352 return false;
1353
1355 return false;
1356
1358
1360 }
1361
1363 {
1364 EntityAI hierarchyParent = GetHierarchyRoot();
1365 if (hierarchyParent.CanUseConstruction())
1366 return true;
1367
1368 if (BroadcastedBunker.Cast(hierarchyParent))
1369 return true;
1370
1371 return false;
1372 }
1373
1375 {
1377 }
1378
1380 {
1382 if (!battery)
1383 return 0.0;
1384
1385 float energy = battery.GetCompEM().GetEnergy();
1386 float energyMax = battery.GetCompEM().GetEnergyMax();
1387
1388 if (energyMax <= 0)
1389 return 0.0;
1390
1391 return (energy / energyMax) * 100.0;
1392 }
1393
1395 {
1398 }
1399
1401 {
1403 {
1406 }
1407 }
1408
1410 {
1411 super.SetActions();
1412
1414 }
1415
1417 {
1418 super.OnRPC(sender, rpc_type, ctx);
1419
1421 }
1422
1424 {
1425 super.OnStoreSave(ctx);
1426
1428 }
1429
1431 {
1432 if (!super.OnStoreLoad(ctx, version))
1433 return false;
1434
1436 return false;
1437
1438 return true;
1439 }
1440
1442 {
1443 super.AfterStoreLoad();
1444
1446 {
1448 {
1450 }
1451 else
1452 {
1454 }
1455 }
1456
1458 }
1459
1461 {
1462 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1463
1465 }
1466
1468 {
1469 super.OnVariablesSynchronized();
1470
1472 {
1474 if (uiAction != CodeLockUIAction.NONE)
1475 {
1477 }
1478 }
1479 }
1480
1482 {
1483 return true;
1484 }
1485
1487 {
1488 super.InitItemSounds();
1489
1497 }
1498
1499
1501 {
1502 GetInventory().CreateInInventory("Battery9V");
1503 }
1504}
1505
1507{
1508 override void Init()
1509 {
1511
1512 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1514
1515 if (bunkerConfig && bunkerConfig.bunkerSettings)
1516 {
1518 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1521 }
1522
1524 }
1525
1527 {
1528 return false;
1529 }
1530
1532 {
1533 return false;
1534 }
1535
1537 {
1538 return false;
1539 }
1540
1543
1545 {
1546 return false;
1547 }
1548
1550 {
1551 return true;
1552 }
1553
1555 {
1556 return true;
1557 }
1558
1560 {
1561 return true;
1562 }
1563
1565 {
1567 }
1568
1570 {
1574 }
1575}
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.