809{
812
815
818
820
821
829
831 {
833 }
834
835 protected void Init()
836 {
839
840 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
841 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
842 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
843 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
844 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
845 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
846 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
847 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
848 RegisterNetSyncVariableBool("m_Reversed");
849 }
850
852 {
853 super.EEInit();
854
855
857 }
858
860 {
861 super.EEItemLocationChanged(oldLoc, newLoc);
862
864 {
866 {
867 if (
g_Game.IsDedicatedServer())
868 SetSynchDirty();
869
870
872 }
873 }
874 }
875
877 {
878 super.EEItemAttached(item, slot_name);
879
881 {
884 {
886 if (battery)
887 {
888 float batteryEnergy = battery.GetCompEM().GetEnergy();
890 {
892 GetCompEM().SwitchOn();
893 }
894
896 }
897 }
898 }
899 }
900
902 {
903 super.EEItemDetached(item, slot_name);
904
906 {
909 {
911 GetCompEM().SwitchOff();
912
914 }
915 }
916 }
917
919 {
920 super.OnWasAttached(parent, slot_id);
921
923 {
926 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
927 {
929 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
930 {
932 GetCompEM().SwitchOn();
933 }
934
935 if (parent && parent.CanUseConstruction())
936 {
938 if (buildingBase)
939 {
941 }
942 }
943 }
944
946 }
947 }
948
950 {
951 super.OnWasDetached(parent, slot_id);
952
954 {
956 if (GetCompEM().IsWorking())
957 GetCompEM().SwitchOff();
958
960 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
961 {
965 }
966
968 }
969 }
970
972 {
974 return false;
975
976 return true;
977 }
978
980 {
983 if (doorsInfoMap && doorsInfoMap.Count() > 0)
984 {
985 int doorIndex = -1;
988 {
989 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
990 {
992 {
993 doorIndex = doorInfoIndex;
994 doorInfo = doorInfoData;
995 break;
996 }
997 }
998
999 if (doorIndex != -1)
1000 break;
1001 }
1002
1003 if (doorIndex > -1)
1004 {
1006 }
1007
1010 if (rebuilding && doorInfo)
1011 {
1013 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1014 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1015 {
1016 m_Reversed = reversibleDoorPart.IsReversedLocal();
1017 }
1018 }
1019 }
1020 }
1021
1024 {
1026 {
1029 return false;
1030 }
1031
1032 return true;
1033 }
1034
1036 {
1037 super.OnWorkStop();
1038
1040 {
1043
1045 }
1046 }
1047
1049 {
1050 super.OnWorkStart();
1051
1053 {
1055 }
1056 }
1057
1058 override void OnWork(
float consumed_energy)
1059 {
1060 super.OnWork(consumed_energy);
1061
1063 {
1065 if (battery)
1066 {
1067 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1068 {
1069 GetCompEM().SwitchOff();
1071 }
1072
1075 {
1077 SetSynchDirty();
1078 }
1079 }
1080 }
1081 }
1082
1085 {
1087 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1088
1089
1090 if (
g_Game.IsMultiplayer())
1091 {
1092 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1093 }
1094 else
1095 {
1096 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1097 }
1098
1101 if (parent.MemoryPointExists(
slotName))
1102 {
1103 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1104 }
1105 else
1106 {
1108 }
1109
1111 PlaceOnSurface();
1112 }
1113
1115 {
1117 return battery;
1118 }
1119
1121 {
1122 return true;
1123 }
1124
1126 {
1127 return true;
1128 }
1129
1131 {
1132 return true;
1133 }
1134
1136 {
1138 }
1139
1141 {
1142 return true;
1143 }
1144
1146 {
1147 return GetCompEM().IsWorking();
1148 }
1149
1151 {
1153 }
1154
1156 {
1158 }
1159
1161 {
1163 }
1164
1166 {
1168 }
1169
1171 {
1173 }
1174
1176 {
1178 }
1179
1181 {
1183 }
1184
1186 {
1188 }
1189
1191 {
1193 }
1194
1196 {
1198 }
1199
1201 {
1203 }
1204
1206 {
1208 }
1209
1211 {
1213 }
1214
1218 {
1219 if (!player)
1220 return false;
1221
1223 return false;
1224
1226
1228 }
1229
1231 {
1232 EntityAI hierarchyParent = GetHierarchyRoot();
1233 if (hierarchyParent.CanUseConstruction())
1234 return true;
1235
1236 if (BroadcastedBunker.Cast(hierarchyParent))
1237 return true;
1238
1239 return false;
1240 }
1241
1243 {
1245 }
1246
1248 {
1250 if (!battery)
1251 return 0.0;
1252
1253 float energy = battery.GetCompEM().GetEnergy();
1254 float energyMax = battery.GetCompEM().GetEnergyMax();
1255
1256 if (energyMax <= 0)
1257 return 0.0;
1258
1259 return (energy / energyMax) * 100.0;
1260 }
1261
1263 {
1266 }
1267
1269 {
1271 {
1274 }
1275 }
1276
1278 {
1279 super.SetActions();
1280
1282 }
1283
1285 {
1286 super.OnRPC(sender, rpc_type, ctx);
1287
1289 }
1290
1292 {
1293 super.OnStoreSave(ctx);
1294
1296 }
1297
1299 {
1300 if (!super.OnStoreLoad(ctx, version))
1301 return false;
1302
1304 return false;
1305
1306 return true;
1307 }
1308
1310 {
1311 super.AfterStoreLoad();
1312
1314 {
1316 {
1318 }
1319 else
1320 {
1322 }
1323 }
1324
1326 }
1327
1329 {
1330 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1331
1333 }
1334
1336 {
1337 super.OnVariablesSynchronized();
1338
1340 {
1342 if (uiAction != CodeLockUIAction.NONE)
1343 {
1345 }
1346 }
1347 }
1348
1350 {
1351 return true;
1352 }
1353
1355 {
1356 super.InitItemSounds();
1357
1365 }
1366
1367
1369 {
1370 GetInventory().CreateInInventory("Battery9V");
1371 }
1372}
1373
1375{
1376 override void Init()
1377 {
1379
1380 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1382
1383 if (bunkerConfig && bunkerConfig.bunkerSettings)
1384 {
1386 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1389 }
1390
1392 }
1393
1395 {
1396 return false;
1397 }
1398
1400 {
1401 return false;
1402 }
1403
1405 {
1406 return false;
1407 }
1408
1411
1413 {
1414 return false;
1415 }
1416
1418 {
1419 return true;
1420 }
1421
1423 {
1424 return true;
1425 }
1426
1428 {
1429 return true;
1430 }
1431
1433 {
1435 }
1436
1438 {
1442 }
1443}
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.