819{
822
825
828
830
831
839
841 {
843 }
844
845 protected void Init()
846 {
849
850 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
851 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
852 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
853 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
854 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
855 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
856 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
857 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
858 RegisterNetSyncVariableBool("m_Reversed");
859 }
860
862 {
863 super.EEInit();
864
865
867 }
868
870 {
871 super.EEItemLocationChanged(oldLoc, newLoc);
872
874 {
876 {
877 if (
g_Game.IsDedicatedServer())
878 SetSynchDirty();
879
880
882 }
883 }
884 }
885
887 {
888 super.EEItemAttached(item, slot_name);
889
891 {
894 {
896 if (battery)
897 {
898 float batteryEnergy = battery.GetCompEM().GetEnergy();
900 {
902 GetCompEM().SwitchOn();
903 }
904
906 }
907 }
908 }
909 }
910
912 {
913 super.EEItemDetached(item, slot_name);
914
916 {
919 {
921 GetCompEM().SwitchOff();
922
924 }
925 }
926 }
927
929 {
930 super.OnWasAttached(parent, slot_id);
931
933 {
936 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
937 {
939 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
940 {
942 GetCompEM().SwitchOn();
943 }
944
945 if (parent && parent.CanUseConstruction())
946 {
948 if (buildingBase)
949 {
951 }
952 }
953 }
954
956 }
957 }
958
960 {
961 super.OnWasDetached(parent, slot_id);
962
964 {
966 if (GetCompEM().IsWorking())
967 GetCompEM().SwitchOff();
968
970 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
971 {
975 }
976
978 }
979 }
980
982 {
984 return false;
985
986 return true;
987 }
988
990 {
993 if (doorsInfoMap && doorsInfoMap.Count() > 0)
994 {
995 int doorIndex = -1;
998 {
999 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1000 {
1002 {
1003 doorIndex = doorInfoIndex;
1004 doorInfo = doorInfoData;
1005 break;
1006 }
1007 }
1008
1009 if (doorIndex != -1)
1010 break;
1011 }
1012
1013 if (doorIndex > -1)
1014 {
1016 }
1017
1020 if (rebuilding && doorInfo)
1021 {
1023 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1024 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1025 {
1026 m_Reversed = reversibleDoorPart.IsReversedLocal();
1027 }
1028 }
1029 }
1030 }
1031
1034 {
1036 {
1039 return false;
1040 }
1041
1042 return true;
1043 }
1044
1046 {
1047 super.OnWorkStop();
1048
1050 {
1053
1055 }
1056 }
1057
1059 {
1060 super.OnWorkStart();
1061
1063 {
1065 }
1066 }
1067
1068 override void OnWork(
float consumed_energy)
1069 {
1070 super.OnWork(consumed_energy);
1071
1073 {
1075 if (battery)
1076 {
1077 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1078 {
1079 GetCompEM().SwitchOff();
1081 }
1082
1085 {
1087 SetSynchDirty();
1088 }
1089 }
1090 }
1091 }
1092
1095 {
1097 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1098
1099
1100 if (
g_Game.IsMultiplayer())
1101 {
1102 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1103 }
1104 else
1105 {
1106 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1107 }
1108
1111 if (parent.MemoryPointExists(
slotName))
1112 {
1113 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1114 }
1115 else
1116 {
1118 }
1119
1121 PlaceOnSurface();
1122 }
1123
1125 {
1127 return battery;
1128 }
1129
1131 {
1132 return true;
1133 }
1134
1136 {
1137 return true;
1138 }
1139
1141 {
1142 return true;
1143 }
1144
1146 {
1148 }
1149
1151 {
1152 return true;
1153 }
1154
1156 {
1157 return GetCompEM().IsWorking();
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
1216 {
1218 }
1219
1221 {
1223 }
1224
1228 {
1229 if (!player)
1230 return false;
1231
1233 return false;
1234
1236
1238 }
1239
1241 {
1242 EntityAI hierarchyParent = GetHierarchyRoot();
1243 if (hierarchyParent.CanUseConstruction())
1244 return true;
1245
1246 if (BroadcastedBunker.Cast(hierarchyParent))
1247 return true;
1248
1249 return false;
1250 }
1251
1253 {
1255 }
1256
1258 {
1260 if (!battery)
1261 return 0.0;
1262
1263 float energy = battery.GetCompEM().GetEnergy();
1264 float energyMax = battery.GetCompEM().GetEnergyMax();
1265
1266 if (energyMax <= 0)
1267 return 0.0;
1268
1269 return (energy / energyMax) * 100.0;
1270 }
1271
1273 {
1276 }
1277
1279 {
1281 {
1284 }
1285 }
1286
1288 {
1289 super.SetActions();
1290
1292 }
1293
1295 {
1296 super.OnRPC(sender, rpc_type, ctx);
1297
1299 }
1300
1302 {
1303 super.OnStoreSave(ctx);
1304
1306 }
1307
1309 {
1310 if (!super.OnStoreLoad(ctx, version))
1311 return false;
1312
1314 return false;
1315
1316 return true;
1317 }
1318
1320 {
1321 super.AfterStoreLoad();
1322
1324 {
1326 {
1328 }
1329 else
1330 {
1332 }
1333 }
1334
1336 }
1337
1339 {
1340 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1341
1343 }
1344
1346 {
1347 super.OnVariablesSynchronized();
1348
1350 {
1352 if (uiAction != CodeLockUIAction.NONE)
1353 {
1355 }
1356 }
1357 }
1358
1360 {
1361 return true;
1362 }
1363
1365 {
1366 super.InitItemSounds();
1367
1375 }
1376
1377
1379 {
1380 GetInventory().CreateInInventory("Battery9V");
1381 }
1382}
1383
1385{
1386 override void Init()
1387 {
1389
1390 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1392
1393 if (bunkerConfig && bunkerConfig.bunkerSettings)
1394 {
1396 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1399 }
1400
1402 }
1403
1405 {
1406 return false;
1407 }
1408
1410 {
1411 return false;
1412 }
1413
1415 {
1416 return false;
1417 }
1418
1421
1423 {
1424 return false;
1425 }
1426
1428 {
1429 return true;
1430 }
1431
1433 {
1434 return true;
1435 }
1436
1438 {
1439 return true;
1440 }
1441
1443 {
1445 }
1446
1448 {
1452 }
1453}
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.