784{
787
790
793
795
796
804
806 {
808 }
809
810 protected void Init()
811 {
814
815 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
816 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
817 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
818 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
819 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
820 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
821 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
822 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
823 RegisterNetSyncVariableBool("m_Reversed");
824 }
825
827 {
828 super.EEInit();
829
830
832 }
833
835 {
836 super.EEItemLocationChanged(oldLoc, newLoc);
837
839 {
841 {
842 if (
g_Game.IsDedicatedServer())
843 SetSynchDirty();
844
845
847 }
848 }
849 }
850
852 {
853 super.EEItemAttached(item, slot_name);
854
856 {
859 {
861 if (battery)
862 {
863 float batteryEnergy = battery.GetCompEM().GetEnergy();
865 {
867 GetCompEM().SwitchOn();
868 }
869
871 }
872 }
873 }
874 }
875
877 {
878 super.EEItemDetached(item, slot_name);
879
881 {
884 {
886 GetCompEM().SwitchOff();
887
889 }
890 }
891 }
892
894 {
895 super.OnWasAttached(parent, slot_id);
896
898 {
901 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
902 {
904 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
905 {
907 GetCompEM().SwitchOn();
908 }
909
910 if (parent && parent.CanUseConstruction())
911 {
913 if (buildingBase)
914 {
916 }
917 }
918 }
919
921 }
922 }
923
925 {
926 super.OnWasDetached(parent, slot_id);
927
929 {
931 if (GetCompEM().IsWorking())
932 GetCompEM().SwitchOff();
933
935 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
936 {
940 }
941
943 }
944 }
945
947 {
949 return false;
950
951 return true;
952 }
953
955 {
958 if (doorsInfoMap && doorsInfoMap.Count() > 0)
959 {
960 int doorIndex = -1;
963 {
964 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
965 {
967 {
968 doorIndex = doorInfoIndex;
969 doorInfo = doorInfoData;
970 break;
971 }
972 }
973
974 if (doorIndex != -1)
975 break;
976 }
977
978 if (doorIndex > -1)
979 {
981 }
982
985 if (rebuilding && doorInfo)
986 {
988 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
989 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
990 {
991 m_Reversed = reversibleDoorPart.IsReversedLocal();
992 }
993 }
994 }
995 }
996
999 {
1001 {
1004 return false;
1005 }
1006
1007 return true;
1008 }
1009
1011 {
1012 super.OnWorkStop();
1013
1015 {
1018
1020 }
1021 }
1022
1024 {
1025 super.OnWorkStart();
1026
1028 {
1030 }
1031 }
1032
1033 override void OnWork(
float consumed_energy)
1034 {
1035 super.OnWork(consumed_energy);
1036
1038 {
1040 if (battery)
1041 {
1042 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1043 {
1044 GetCompEM().SwitchOff();
1046 }
1047
1050 {
1052 SetSynchDirty();
1053 }
1054 }
1055 }
1056 }
1057
1060 {
1062 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1063
1064
1065 if (
g_Game.IsMultiplayer())
1066 {
1067 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1068 }
1069 else
1070 {
1071 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1072 }
1073
1076 if (parent.MemoryPointExists(
slotName))
1077 {
1078 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1079 }
1080 else
1081 {
1083 }
1084
1086 PlaceOnSurface();
1087 }
1088
1090 {
1092 return battery;
1093 }
1094
1096 {
1097 return true;
1098 }
1099
1101 {
1102 return true;
1103 }
1104
1106 {
1107 return true;
1108 }
1109
1111 {
1113 }
1114
1116 {
1117 return true;
1118 }
1119
1121 {
1122 return GetCompEM().IsWorking();
1123 }
1124
1126 {
1128 }
1129
1131 {
1133 }
1134
1136 {
1138 }
1139
1141 {
1143 }
1144
1146 {
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
1193 {
1194 if (!player)
1195 return false;
1196
1198 return false;
1199
1201
1203 }
1204
1206 {
1207 EntityAI hierarchyParent = GetHierarchyRoot();
1208 if (hierarchyParent.CanUseConstruction())
1209 return true;
1210
1211 if (BroadcastedBunker.Cast(hierarchyParent))
1212 return true;
1213
1214 return false;
1215 }
1216
1218 {
1220 }
1221
1223 {
1225 if (!battery)
1226 return 0.0;
1227
1228 float energy = battery.GetCompEM().GetEnergy();
1229 float energyMax = battery.GetCompEM().GetEnergyMax();
1230
1231 if (energyMax <= 0)
1232 return 0.0;
1233
1234 return (energy / energyMax) * 100.0;
1235 }
1236
1238 {
1241 }
1242
1244 {
1246 {
1249 }
1250 }
1251
1253 {
1254 super.SetActions();
1255
1257 }
1258
1260 {
1261 super.OnRPC(sender, rpc_type, ctx);
1262
1264 }
1265
1267 {
1268 super.OnStoreSave(ctx);
1269
1271 }
1272
1274 {
1275 if (!super.OnStoreLoad(ctx, version))
1276 return false;
1277
1279 return false;
1280
1281 return true;
1282 }
1283
1285 {
1286 super.AfterStoreLoad();
1287
1289 {
1291 {
1293 }
1294 else
1295 {
1297 }
1298 }
1299
1301 }
1302
1304 {
1305 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1306
1308 }
1309
1311 {
1312 super.OnVariablesSynchronized();
1313
1315 {
1317 if (uiAction != CodeLockUIAction.NONE)
1318 {
1320 }
1321 }
1322 }
1323
1325 {
1326 return true;
1327 }
1328
1330 {
1331 super.InitItemSounds();
1332
1340 }
1341
1342
1344 {
1345 GetInventory().CreateInInventory("Battery9V");
1346 }
1347}
1348
1350{
1351 override void Init()
1352 {
1354
1355 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1357
1358 if (bunkerConfig && bunkerConfig.bunkerSettings)
1359 {
1361 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1364 }
1365
1367 }
1368
1370 {
1371 return false;
1372 }
1373
1375 {
1376 return false;
1377 }
1378
1380 {
1381 return false;
1382 }
1383
1386
1388 {
1389 return false;
1390 }
1391
1393 {
1394 return true;
1395 }
1396
1398 {
1399 return true;
1400 }
1401
1403 {
1404 return true;
1405 }
1406
1408 {
1410 }
1411
1413 {
1417 }
1418}
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.