921{
924
927
930
932
933
941
943 {
945 }
946
947 protected void Init()
948 {
951
952 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
953 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
954 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
955 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
956 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
957 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
958 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
959 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
960 RegisterNetSyncVariableBool("m_Reversed");
961 }
962
964 {
965 super.EEInit();
966
967
969 }
970
972 {
973 super.EEItemLocationChanged(oldLoc, newLoc);
974
976 {
978 {
979 if (
g_Game.IsDedicatedServer())
980 SetSynchDirty();
981
982
984 }
985 }
986 }
987
989 {
990 super.EEItemAttached(item, slot_name);
991
993 {
996 {
998 if (battery)
999 {
1000 float batteryEnergy = battery.GetCompEM().GetEnergy();
1002 {
1004 GetCompEM().SwitchOn();
1005 }
1006
1008 }
1009 }
1010 }
1011 }
1012
1014 {
1015 super.EEItemDetached(item, slot_name);
1016
1018 {
1021 {
1023 GetCompEM().SwitchOff();
1024
1026 }
1027 }
1028 }
1029
1031 {
1032 super.OnWasAttached(parent, slot_id);
1033
1035 {
1038 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1039 {
1041 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1042 {
1044 GetCompEM().SwitchOn();
1045 }
1046
1047 if (parent && parent.CanUseConstruction())
1048 {
1050 if (buildingBase)
1051 {
1053 }
1054 }
1055 }
1056
1058 }
1059 }
1060
1062 {
1063 super.OnWasDetached(parent, slot_id);
1064
1066 {
1068 if (GetCompEM().IsWorking())
1069 GetCompEM().SwitchOff();
1070
1072 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1073 {
1077 }
1078
1080 }
1081 }
1082
1084 {
1086 return false;
1087
1088 return true;
1089 }
1090
1092 {
1095 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1096 {
1097 int doorIndex = -1;
1100 {
1101 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1102 {
1104 {
1105 doorIndex = doorInfoIndex;
1106 doorInfo = doorInfoData;
1107 break;
1108 }
1109 }
1110
1111 if (doorIndex != -1)
1112 break;
1113 }
1114
1115 if (doorIndex > -1)
1116 {
1118 }
1119
1122 if (rebuilding && doorInfo)
1123 {
1125 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1126 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1127 {
1128 m_Reversed = reversibleDoorPart.IsReversedLocal();
1129 }
1130 }
1131 }
1132 }
1133
1136 {
1138 {
1141 return false;
1142 }
1143
1144 return true;
1145 }
1146
1148 {
1149 super.OnWorkStop();
1150
1152 {
1155
1157 }
1158 }
1159
1161 {
1162 super.OnWorkStart();
1163
1165 {
1167 }
1168 }
1169
1170 override void OnWork(
float consumed_energy)
1171 {
1172 super.OnWork(consumed_energy);
1173
1175 {
1177 if (battery)
1178 {
1179 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1180 {
1181 GetCompEM().SwitchOff();
1183 }
1184
1187 {
1189 SetSynchDirty();
1190 }
1191 }
1192 }
1193 }
1194
1197 {
1199 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1200
1201
1202 if (
g_Game.IsMultiplayer())
1203 {
1204 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1205 }
1206 else
1207 {
1208 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1209 }
1210
1213 if (parent.MemoryPointExists(
slotName))
1214 {
1215 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1216 }
1217 else
1218 {
1220 }
1221
1223 PlaceOnSurface();
1224 }
1225
1227 {
1229 return battery;
1230 }
1231
1233 {
1234 return true;
1235 }
1236
1238 {
1239 return true;
1240 }
1241
1243 {
1244 return true;
1245 }
1246
1248 {
1250 }
1251
1253 {
1254 return true;
1255 }
1256
1258 {
1259 return GetCompEM().IsWorking();
1260 }
1261
1263 {
1265 }
1266
1268 {
1270 }
1271
1273 {
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
1330 {
1331 if (!player)
1332 return false;
1333
1335 return false;
1336
1338
1340 }
1341
1343 {
1344 EntityAI hierarchyParent = GetHierarchyRoot();
1345 if (hierarchyParent.CanUseConstruction())
1346 return true;
1347
1348 if (BroadcastedBunker.Cast(hierarchyParent))
1349 return true;
1350
1351 return false;
1352 }
1353
1355 {
1357 }
1358
1360 {
1362 if (!battery)
1363 return 0.0;
1364
1365 float energy = battery.GetCompEM().GetEnergy();
1366 float energyMax = battery.GetCompEM().GetEnergyMax();
1367
1368 if (energyMax <= 0)
1369 return 0.0;
1370
1371 return (energy / energyMax) * 100.0;
1372 }
1373
1375 {
1378 }
1379
1381 {
1383 {
1386 }
1387 }
1388
1390 {
1391 super.SetActions();
1392
1394 }
1395
1397 {
1398 super.OnRPC(sender, rpc_type, ctx);
1399
1401 }
1402
1404 {
1405 super.OnStoreSave(ctx);
1406
1408 }
1409
1411 {
1412 if (!super.OnStoreLoad(ctx, version))
1413 return false;
1414
1416 return false;
1417
1418 return true;
1419 }
1420
1422 {
1423 super.AfterStoreLoad();
1424
1426 {
1428 {
1430 }
1431 else
1432 {
1434 }
1435 }
1436
1438 }
1439
1441 {
1442 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1443
1445 }
1446
1448 {
1449 super.OnVariablesSynchronized();
1450
1452 {
1454 if (uiAction != CodeLockUIAction.NONE)
1455 {
1457 }
1458 }
1459 }
1460
1462 {
1463 return true;
1464 }
1465
1467 {
1468 super.InitItemSounds();
1469
1477 }
1478
1479
1481 {
1482 GetInventory().CreateInInventory("Battery9V");
1483 }
1484}
1485
1487{
1488 override void Init()
1489 {
1491
1492 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1494
1495 if (bunkerConfig && bunkerConfig.bunkerSettings)
1496 {
1498 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1501 }
1502
1504 }
1505
1507 {
1508 return false;
1509 }
1510
1512 {
1513 return false;
1514 }
1515
1517 {
1518 return false;
1519 }
1520
1523
1525 {
1526 return false;
1527 }
1528
1530 {
1531 return true;
1532 }
1533
1535 {
1536 return true;
1537 }
1538
1540 {
1541 return true;
1542 }
1543
1545 {
1547 }
1548
1550 {
1554 }
1555}
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.