881{
884
887
890
892
893
901
903 {
905 }
906
907 protected void Init()
908 {
911
912 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
913 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
914 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
915 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
916 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
917 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
918 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
919 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
920 RegisterNetSyncVariableBool("m_Reversed");
921 }
922
924 {
925 super.EEInit();
926
927
929 }
930
932 {
933 super.EEItemLocationChanged(oldLoc, newLoc);
934
936 {
938 {
939 if (
g_Game.IsDedicatedServer())
940 SetSynchDirty();
941
942
944 }
945 }
946 }
947
949 {
950 super.EEItemAttached(item, slot_name);
951
953 {
956 {
958 if (battery)
959 {
960 float batteryEnergy = battery.GetCompEM().GetEnergy();
962 {
964 GetCompEM().SwitchOn();
965 }
966
968 }
969 }
970 }
971 }
972
974 {
975 super.EEItemDetached(item, slot_name);
976
978 {
981 {
983 GetCompEM().SwitchOff();
984
986 }
987 }
988 }
989
991 {
992 super.OnWasAttached(parent, slot_id);
993
995 {
998 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
999 {
1001 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1002 {
1004 GetCompEM().SwitchOn();
1005 }
1006
1007 if (parent && parent.CanUseConstruction())
1008 {
1010 if (buildingBase)
1011 {
1013 }
1014 }
1015 }
1016
1018 }
1019 }
1020
1022 {
1023 super.OnWasDetached(parent, slot_id);
1024
1026 {
1028 if (GetCompEM().IsWorking())
1029 GetCompEM().SwitchOff();
1030
1032 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1033 {
1037 }
1038
1040 }
1041 }
1042
1044 {
1046 return false;
1047
1048 return true;
1049 }
1050
1052 {
1055 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1056 {
1057 int doorIndex = -1;
1060 {
1061 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1062 {
1064 {
1065 doorIndex = doorInfoIndex;
1066 doorInfo = doorInfoData;
1067 break;
1068 }
1069 }
1070
1071 if (doorIndex != -1)
1072 break;
1073 }
1074
1075 if (doorIndex > -1)
1076 {
1078 }
1079
1082 if (rebuilding && doorInfo)
1083 {
1085 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1086 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1087 {
1088 m_Reversed = reversibleDoorPart.IsReversedLocal();
1089 }
1090 }
1091 }
1092 }
1093
1096 {
1098 {
1101 return false;
1102 }
1103
1104 return true;
1105 }
1106
1108 {
1109 super.OnWorkStop();
1110
1112 {
1115
1117 }
1118 }
1119
1121 {
1122 super.OnWorkStart();
1123
1125 {
1127 }
1128 }
1129
1130 override void OnWork(
float consumed_energy)
1131 {
1132 super.OnWork(consumed_energy);
1133
1135 {
1137 if (battery)
1138 {
1139 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1140 {
1141 GetCompEM().SwitchOff();
1143 }
1144
1147 {
1149 SetSynchDirty();
1150 }
1151 }
1152 }
1153 }
1154
1157 {
1159 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1160
1161
1162 if (
g_Game.IsMultiplayer())
1163 {
1164 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1165 }
1166 else
1167 {
1168 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1169 }
1170
1173 if (parent.MemoryPointExists(
slotName))
1174 {
1175 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1176 }
1177 else
1178 {
1180 }
1181
1183 PlaceOnSurface();
1184 }
1185
1187 {
1189 return battery;
1190 }
1191
1193 {
1194 return true;
1195 }
1196
1198 {
1199 return true;
1200 }
1201
1203 {
1204 return true;
1205 }
1206
1208 {
1210 }
1211
1213 {
1214 return true;
1215 }
1216
1218 {
1219 return GetCompEM().IsWorking();
1220 }
1221
1223 {
1225 }
1226
1228 {
1230 }
1231
1233 {
1235 }
1236
1238 {
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
1290 {
1291 if (!player)
1292 return false;
1293
1295 return false;
1296
1298
1300 }
1301
1303 {
1304 EntityAI hierarchyParent = GetHierarchyRoot();
1305 if (hierarchyParent.CanUseConstruction())
1306 return true;
1307
1308 if (BroadcastedBunker.Cast(hierarchyParent))
1309 return true;
1310
1311 return false;
1312 }
1313
1315 {
1317 }
1318
1320 {
1322 if (!battery)
1323 return 0.0;
1324
1325 float energy = battery.GetCompEM().GetEnergy();
1326 float energyMax = battery.GetCompEM().GetEnergyMax();
1327
1328 if (energyMax <= 0)
1329 return 0.0;
1330
1331 return (energy / energyMax) * 100.0;
1332 }
1333
1335 {
1338 }
1339
1341 {
1343 {
1346 }
1347 }
1348
1350 {
1351 super.SetActions();
1352
1354 }
1355
1357 {
1358 super.OnRPC(sender, rpc_type, ctx);
1359
1361 }
1362
1364 {
1365 super.OnStoreSave(ctx);
1366
1368 }
1369
1371 {
1372 if (!super.OnStoreLoad(ctx, version))
1373 return false;
1374
1376 return false;
1377
1378 return true;
1379 }
1380
1382 {
1383 super.AfterStoreLoad();
1384
1386 {
1388 {
1390 }
1391 else
1392 {
1394 }
1395 }
1396
1398 }
1399
1401 {
1402 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1403
1405 }
1406
1408 {
1409 super.OnVariablesSynchronized();
1410
1412 {
1414 if (uiAction != CodeLockUIAction.NONE)
1415 {
1417 }
1418 }
1419 }
1420
1422 {
1423 return true;
1424 }
1425
1427 {
1428 super.InitItemSounds();
1429
1437 }
1438
1439
1441 {
1442 GetInventory().CreateInInventory("Battery9V");
1443 }
1444}
1445
1447{
1448 override void Init()
1449 {
1451
1452 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1454
1455 if (bunkerConfig && bunkerConfig.bunkerSettings)
1456 {
1458 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1461 }
1462
1464 }
1465
1467 {
1468 return false;
1469 }
1470
1472 {
1473 return false;
1474 }
1475
1477 {
1478 return false;
1479 }
1480
1483
1485 {
1486 return false;
1487 }
1488
1490 {
1491 return true;
1492 }
1493
1495 {
1496 return true;
1497 }
1498
1500 {
1501 return true;
1502 }
1503
1505 {
1507 }
1508
1510 {
1514 }
1515}
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.