901{
904
907
910
912
913
921
923 {
925 }
926
927 protected void Init()
928 {
931
932 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
933 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
934 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
935 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
936 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
937 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
938 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
939 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
940 RegisterNetSyncVariableBool("m_Reversed");
941 }
942
944 {
945 super.EEInit();
946
947
949 }
950
952 {
953 super.EEItemLocationChanged(oldLoc, newLoc);
954
956 {
958 {
959 if (
g_Game.IsDedicatedServer())
960 SetSynchDirty();
961
962
964 }
965 }
966 }
967
969 {
970 super.EEItemAttached(item, slot_name);
971
973 {
976 {
978 if (battery)
979 {
980 float batteryEnergy = battery.GetCompEM().GetEnergy();
982 {
984 GetCompEM().SwitchOn();
985 }
986
988 }
989 }
990 }
991 }
992
994 {
995 super.EEItemDetached(item, slot_name);
996
998 {
1001 {
1003 GetCompEM().SwitchOff();
1004
1006 }
1007 }
1008 }
1009
1011 {
1012 super.OnWasAttached(parent, slot_id);
1013
1015 {
1018 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1019 {
1021 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1022 {
1024 GetCompEM().SwitchOn();
1025 }
1026
1027 if (parent && parent.CanUseConstruction())
1028 {
1030 if (buildingBase)
1031 {
1033 }
1034 }
1035 }
1036
1038 }
1039 }
1040
1042 {
1043 super.OnWasDetached(parent, slot_id);
1044
1046 {
1048 if (GetCompEM().IsWorking())
1049 GetCompEM().SwitchOff();
1050
1052 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1053 {
1057 }
1058
1060 }
1061 }
1062
1064 {
1066 return false;
1067
1068 return true;
1069 }
1070
1072 {
1075 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1076 {
1077 int doorIndex = -1;
1080 {
1081 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1082 {
1084 {
1085 doorIndex = doorInfoIndex;
1086 doorInfo = doorInfoData;
1087 break;
1088 }
1089 }
1090
1091 if (doorIndex != -1)
1092 break;
1093 }
1094
1095 if (doorIndex > -1)
1096 {
1098 }
1099
1102 if (rebuilding && doorInfo)
1103 {
1105 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1106 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1107 {
1108 m_Reversed = reversibleDoorPart.IsReversedLocal();
1109 }
1110 }
1111 }
1112 }
1113
1116 {
1118 {
1121 return false;
1122 }
1123
1124 return true;
1125 }
1126
1128 {
1129 super.OnWorkStop();
1130
1132 {
1135
1137 }
1138 }
1139
1141 {
1142 super.OnWorkStart();
1143
1145 {
1147 }
1148 }
1149
1150 override void OnWork(
float consumed_energy)
1151 {
1152 super.OnWork(consumed_energy);
1153
1155 {
1157 if (battery)
1158 {
1159 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1160 {
1161 GetCompEM().SwitchOff();
1163 }
1164
1167 {
1169 SetSynchDirty();
1170 }
1171 }
1172 }
1173 }
1174
1177 {
1179 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1180
1181
1182 if (
g_Game.IsMultiplayer())
1183 {
1184 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1185 }
1186 else
1187 {
1188 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1189 }
1190
1193 if (parent.MemoryPointExists(
slotName))
1194 {
1195 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1196 }
1197 else
1198 {
1200 }
1201
1203 PlaceOnSurface();
1204 }
1205
1207 {
1209 return battery;
1210 }
1211
1213 {
1214 return true;
1215 }
1216
1218 {
1219 return true;
1220 }
1221
1223 {
1224 return true;
1225 }
1226
1228 {
1230 }
1231
1233 {
1234 return true;
1235 }
1236
1238 {
1239 return GetCompEM().IsWorking();
1240 }
1241
1243 {
1245 }
1246
1248 {
1250 }
1251
1253 {
1255 }
1256
1258 {
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
1310 {
1311 if (!player)
1312 return false;
1313
1315 return false;
1316
1318
1320 }
1321
1323 {
1324 EntityAI hierarchyParent = GetHierarchyRoot();
1325 if (hierarchyParent.CanUseConstruction())
1326 return true;
1327
1328 if (BroadcastedBunker.Cast(hierarchyParent))
1329 return true;
1330
1331 return false;
1332 }
1333
1335 {
1337 }
1338
1340 {
1342 if (!battery)
1343 return 0.0;
1344
1345 float energy = battery.GetCompEM().GetEnergy();
1346 float energyMax = battery.GetCompEM().GetEnergyMax();
1347
1348 if (energyMax <= 0)
1349 return 0.0;
1350
1351 return (energy / energyMax) * 100.0;
1352 }
1353
1355 {
1358 }
1359
1361 {
1363 {
1366 }
1367 }
1368
1370 {
1371 super.SetActions();
1372
1374 }
1375
1377 {
1378 super.OnRPC(sender, rpc_type, ctx);
1379
1381 }
1382
1384 {
1385 super.OnStoreSave(ctx);
1386
1388 }
1389
1391 {
1392 if (!super.OnStoreLoad(ctx, version))
1393 return false;
1394
1396 return false;
1397
1398 return true;
1399 }
1400
1402 {
1403 super.AfterStoreLoad();
1404
1406 {
1408 {
1410 }
1411 else
1412 {
1414 }
1415 }
1416
1418 }
1419
1421 {
1422 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1423
1425 }
1426
1428 {
1429 super.OnVariablesSynchronized();
1430
1432 {
1434 if (uiAction != CodeLockUIAction.NONE)
1435 {
1437 }
1438 }
1439 }
1440
1442 {
1443 return true;
1444 }
1445
1447 {
1448 super.InitItemSounds();
1449
1457 }
1458
1459
1461 {
1462 GetInventory().CreateInInventory("Battery9V");
1463 }
1464}
1465
1467{
1468 override void Init()
1469 {
1471
1472 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1474
1475 if (bunkerConfig && bunkerConfig.bunkerSettings)
1476 {
1478 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1481 }
1482
1484 }
1485
1487 {
1488 return false;
1489 }
1490
1492 {
1493 return false;
1494 }
1495
1497 {
1498 return false;
1499 }
1500
1503
1505 {
1506 return false;
1507 }
1508
1510 {
1511 return true;
1512 }
1513
1515 {
1516 return true;
1517 }
1518
1520 {
1521 return true;
1522 }
1523
1525 {
1527 }
1528
1530 {
1534 }
1535}
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.