875{
878
881
884
886
887
895
897 {
899 }
900
901 protected void Init()
902 {
905
906 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
907 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
908 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
909 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
910 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
911 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
912 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
913 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
914 RegisterNetSyncVariableBool("m_Reversed");
915 }
916
918 {
919 super.EEInit();
920
921
923 }
924
926 {
927 super.EEItemLocationChanged(oldLoc, newLoc);
928
930 {
932 {
933 if (
g_Game.IsDedicatedServer())
934 SetSynchDirty();
935
936
938 }
939 }
940 }
941
943 {
944 super.EEItemAttached(item, slot_name);
945
947 {
950 {
952 if (battery)
953 {
954 float batteryEnergy = battery.GetCompEM().GetEnergy();
956 {
958 GetCompEM().SwitchOn();
959 }
960
962 }
963 }
964 }
965 }
966
968 {
969 super.EEItemDetached(item, slot_name);
970
972 {
975 {
977 GetCompEM().SwitchOff();
978
980 }
981 }
982 }
983
985 {
986 super.OnWasAttached(parent, slot_id);
987
989 {
992 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
993 {
995 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
996 {
998 GetCompEM().SwitchOn();
999 }
1000
1001 if (parent && parent.CanUseConstruction())
1002 {
1004 if (buildingBase)
1005 {
1007 }
1008 }
1009 }
1010
1012 }
1013 }
1014
1016 {
1017 super.OnWasDetached(parent, slot_id);
1018
1020 {
1022 if (GetCompEM().IsWorking())
1023 GetCompEM().SwitchOff();
1024
1026 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1027 {
1031 }
1032
1034 }
1035 }
1036
1038 {
1040 return false;
1041
1042 return true;
1043 }
1044
1046 {
1049 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1050 {
1051 int doorIndex = -1;
1054 {
1055 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1056 {
1058 {
1059 doorIndex = doorInfoIndex;
1060 doorInfo = doorInfoData;
1061 break;
1062 }
1063 }
1064
1065 if (doorIndex != -1)
1066 break;
1067 }
1068
1069 if (doorIndex > -1)
1070 {
1072 }
1073
1076 if (rebuilding && doorInfo)
1077 {
1079 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1080 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1081 {
1082 m_Reversed = reversibleDoorPart.IsReversedLocal();
1083 }
1084 }
1085 }
1086 }
1087
1090 {
1092 {
1095 return false;
1096 }
1097
1098 return true;
1099 }
1100
1102 {
1103 super.OnWorkStop();
1104
1106 {
1109
1111 }
1112 }
1113
1115 {
1116 super.OnWorkStart();
1117
1119 {
1121 }
1122 }
1123
1124 override void OnWork(
float consumed_energy)
1125 {
1126 super.OnWork(consumed_energy);
1127
1129 {
1131 if (battery)
1132 {
1133 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1134 {
1135 GetCompEM().SwitchOff();
1137 }
1138
1141 {
1143 SetSynchDirty();
1144 }
1145 }
1146 }
1147 }
1148
1151 {
1153 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1154
1155
1156 if (
g_Game.IsMultiplayer())
1157 {
1158 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1159 }
1160 else
1161 {
1162 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1163 }
1164
1167 if (parent.MemoryPointExists(
slotName))
1168 {
1169 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1170 }
1171 else
1172 {
1174 }
1175
1177 PlaceOnSurface();
1178 }
1179
1181 {
1183 return battery;
1184 }
1185
1187 {
1188 return true;
1189 }
1190
1192 {
1193 return true;
1194 }
1195
1197 {
1198 return true;
1199 }
1200
1202 {
1204 }
1205
1207 {
1208 return true;
1209 }
1210
1212 {
1213 return GetCompEM().IsWorking();
1214 }
1215
1217 {
1219 }
1220
1222 {
1224 }
1225
1227 {
1229 }
1230
1232 {
1234 }
1235
1237 {
1239 }
1240
1242 {
1244 }
1245
1247 {
1249 }
1250
1252 {
1254 }
1255
1257 {
1259 }
1260
1262 {
1264 }
1265
1267 {
1269 }
1270
1272 {
1274 }
1275
1277 {
1279 }
1280
1284 {
1285 if (!player)
1286 return false;
1287
1289 return false;
1290
1292
1294 }
1295
1297 {
1298 EntityAI hierarchyParent = GetHierarchyRoot();
1299 if (hierarchyParent.CanUseConstruction())
1300 return true;
1301
1302 if (BroadcastedBunker.Cast(hierarchyParent))
1303 return true;
1304
1305 return false;
1306 }
1307
1309 {
1311 }
1312
1314 {
1316 if (!battery)
1317 return 0.0;
1318
1319 float energy = battery.GetCompEM().GetEnergy();
1320 float energyMax = battery.GetCompEM().GetEnergyMax();
1321
1322 if (energyMax <= 0)
1323 return 0.0;
1324
1325 return (energy / energyMax) * 100.0;
1326 }
1327
1329 {
1332 }
1333
1335 {
1337 {
1340 }
1341 }
1342
1344 {
1345 super.SetActions();
1346
1348 }
1349
1351 {
1352 super.OnRPC(sender, rpc_type, ctx);
1353
1355 }
1356
1358 {
1359 super.OnStoreSave(ctx);
1360
1362 }
1363
1365 {
1366 if (!super.OnStoreLoad(ctx, version))
1367 return false;
1368
1370 return false;
1371
1372 return true;
1373 }
1374
1376 {
1377 super.AfterStoreLoad();
1378
1380 {
1382 {
1384 }
1385 else
1386 {
1388 }
1389 }
1390
1392 }
1393
1395 {
1396 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1397
1399 }
1400
1402 {
1403 super.OnVariablesSynchronized();
1404
1406 {
1408 if (uiAction != CodeLockUIAction.NONE)
1409 {
1411 }
1412 }
1413 }
1414
1416 {
1417 return true;
1418 }
1419
1421 {
1422 super.InitItemSounds();
1423
1431 }
1432
1433
1435 {
1436 GetInventory().CreateInInventory("Battery9V");
1437 }
1438}
1439
1441{
1442 override void Init()
1443 {
1445
1446 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1448
1449 if (bunkerConfig && bunkerConfig.bunkerSettings)
1450 {
1452 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1455 }
1456
1458 }
1459
1461 {
1462 return false;
1463 }
1464
1466 {
1467 return false;
1468 }
1469
1471 {
1472 return false;
1473 }
1474
1477
1479 {
1480 return false;
1481 }
1482
1484 {
1485 return true;
1486 }
1487
1489 {
1490 return true;
1491 }
1492
1494 {
1495 return true;
1496 }
1497
1499 {
1501 }
1502
1504 {
1508 }
1509}
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.