Get door index of the door this lock can manipulate fo ther attached lock based on related attachment slot from AdditionalDoorInfosHolder data
740{
743
746
749
751
752
760
762 {
764 }
765
766 protected void Init()
767 {
770
771 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
772 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
773 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
774 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
775 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
776 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
777 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
778 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
779 RegisterNetSyncVariableBool("m_Reversed");
780 }
781
783 {
784 super.EEInit();
785
786
788 }
789
791 {
792 super.EEItemLocationChanged(oldLoc, newLoc);
793
795 {
797 {
798 if (
g_Game.IsDedicatedServer())
799 SetSynchDirty();
800
801
803 }
804 }
805 }
806
808 {
809 super.EEItemAttached(item, slot_name);
810
812 {
815 {
817 if (battery)
818 {
819 float batteryEnergy = battery.GetCompEM().GetEnergy();
821 {
823 GetCompEM().SwitchOn();
824 }
825
827 }
828 }
829 }
830 }
831
833 {
834 super.EEItemDetached(item, slot_name);
835
837 {
840 {
842 GetCompEM().SwitchOff();
843
845 }
846 }
847 }
848
850 {
851 super.OnWasAttached(parent, slot_id);
852
854 {
857 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
858 {
860 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
861 {
863 GetCompEM().SwitchOn();
864 }
865
866 if (parent && parent.CanUseConstruction())
867 {
869 if (buildingBase)
870 {
872 }
873 }
874 }
875
877 }
878 }
879
881 {
882 super.OnWasDetached(parent, slot_id);
883
885 {
887 if (GetCompEM().IsWorking())
888 GetCompEM().SwitchOff();
889
891 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
892 {
896 }
897
899 }
900 }
901
903 {
905 return false;
906
907 return true;
908 }
909
911 {
914 if (doorsInfoMap && doorsInfoMap.Count() > 0)
915 {
916 int doorIndex = -1;
919 {
920 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
921 {
923 {
924 doorIndex = doorInfoIndex;
925 doorInfo = doorInfoData;
926 break;
927 }
928 }
929
930 if (doorIndex != -1)
931 break;
932 }
933
934 if (doorIndex > -1)
935 {
937 }
938
941 if (rebuilding && doorInfo)
942 {
944 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
945 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
946 {
947 m_Reversed = reversibleDoorPart.IsReversedLocal();
948 }
949 }
950 }
951 }
952
955 {
957 {
960 return false;
961 }
962
963 return true;
964 }
965
967 {
968 super.OnWorkStop();
969
971 {
974
976 }
977 }
978
980 {
981 super.OnWorkStart();
982
984 {
986 }
987 }
988
989 override void OnWork(
float consumed_energy)
990 {
991 super.OnWork(consumed_energy);
992
994 {
996 if (battery)
997 {
998 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
999 {
1000 GetCompEM().SwitchOff();
1002 }
1003
1006 {
1008 SetSynchDirty();
1009 }
1010 }
1011 }
1012 }
1013
1016 {
1018 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1019
1020
1021 if (
g_Game.IsMultiplayer())
1022 {
1023 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1024 }
1025 else
1026 {
1027 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1028 }
1029
1032 if (parent.MemoryPointExists(
slotName))
1033 {
1034 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1035 }
1036 else
1037 {
1039 }
1040
1042 PlaceOnSurface();
1043 }
1044
1046 {
1048 return battery;
1049 }
1050
1052 {
1053 return true;
1054 }
1055
1057 {
1058 return true;
1059 }
1060
1062 {
1063 return true;
1064 }
1065
1067 {
1069 }
1070
1072 {
1073 return true;
1074 }
1075
1077 {
1078 return GetCompEM().IsWorking();
1079 }
1080
1082 {
1084 }
1085
1087 {
1089 }
1090
1092 {
1094 }
1095
1097 {
1099 }
1100
1102 {
1104 }
1105
1107 {
1109 }
1110
1112 {
1114 }
1115
1117 {
1119 }
1120
1122 {
1124 }
1125
1127 {
1129 }
1130
1132 {
1134 }
1135
1137 {
1139 }
1140
1142 {
1144 }
1145
1149 {
1150 if (!player)
1151 return false;
1152
1154 return false;
1155
1157
1159 }
1160
1162 {
1163 EntityAI hierarchyParent = GetHierarchyRoot();
1164 if (hierarchyParent.CanUseConstruction())
1165 return true;
1166
1167 if (BroadcastedBunker.Cast(hierarchyParent))
1168 return true;
1169
1170 return false;
1171 }
1172
1174 {
1176 }
1177
1179 {
1181 if (!battery)
1182 return 0.0;
1183
1184 float energy = battery.GetCompEM().GetEnergy();
1185 float energyMax = battery.GetCompEM().GetEnergyMax();
1186
1187 if (energyMax <= 0)
1188 return 0.0;
1189
1190 return (energy / energyMax) * 100.0;
1191 }
1192
1194 {
1197 }
1198
1200 {
1202 {
1205 }
1206 }
1207
1209 {
1210 super.SetActions();
1211
1213 }
1214
1216 {
1217 super.OnRPC(sender, rpc_type, ctx);
1218
1220 }
1221
1223 {
1224 super.OnStoreSave(ctx);
1225
1227 }
1228
1230 {
1231 if (!super.OnStoreLoad(ctx, version))
1232 return false;
1233
1235 return false;
1236
1237 return true;
1238 }
1239
1241 {
1242 super.AfterStoreLoad();
1243
1245 {
1247 {
1249 }
1250 else
1251 {
1253 }
1254 }
1255
1257 }
1258
1260 {
1261 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1262
1264 }
1265
1267 {
1268 super.OnVariablesSynchronized();
1269
1271 {
1273 if (uiAction != CodeLockUIAction.NONE)
1274 {
1276 }
1277 }
1278 }
1279
1281 {
1282 return true;
1283 }
1284
1286 {
1287 super.InitItemSounds();
1288
1296 }
1297
1298
1300 {
1301 GetInventory().CreateInInventory("Battery9V");
1302 }
1303}
1304
1306{
1307 override void Init()
1308 {
1310
1311 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1313
1314 if (bunkerConfig && bunkerConfig.bunkerSettings)
1315 {
1317 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1320 }
1321
1323 }
1324
1326 {
1327 return false;
1328 }
1329
1331 {
1332 return false;
1333 }
1334
1336 {
1337 return false;
1338 }
1339
1342
1344 {
1345 return false;
1346 }
1347
1349 {
1350 return true;
1351 }
1352
1354 {
1355 return true;
1356 }
1357
1359 {
1360 return true;
1361 }
1362
1364 {
1366 }
1367
1369 {
1373 }
1374}
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.