710{
713
716
719
721
722
730
732 {
734 }
735
736 protected void Init()
737 {
740
741 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
742 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
743 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
744 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
745 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
746 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
747 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
748 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
749 RegisterNetSyncVariableBool("m_Reversed");
750 }
751
753 {
754 super.EEInit();
755
756
758 }
759
761 {
762 super.EEItemLocationChanged(oldLoc, newLoc);
763
765 {
767 {
768 if (
g_Game.IsDedicatedServer())
769 SetSynchDirty();
770
771
773 }
774 }
775 }
776
778 {
779 super.EEItemAttached(item, slot_name);
780
782 {
785 {
787 if (battery)
788 {
789 float batteryEnergy = battery.GetCompEM().GetEnergy();
791 {
793 GetCompEM().SwitchOn();
794 }
795
797 }
798 }
799 }
800 }
801
803 {
804 super.EEItemDetached(item, slot_name);
805
807 {
810 {
812 GetCompEM().SwitchOff();
813
815 }
816 }
817 }
818
820 {
821 super.OnWasAttached(parent, slot_id);
822
824 {
827 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
828 {
830 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
831 {
833 GetCompEM().SwitchOn();
834 }
835
836 if (parent && parent.CanUseConstruction())
837 {
839 if (buildingBase)
840 {
842 }
843 }
844 }
845
847 }
848 }
849
851 {
852 super.OnWasDetached(parent, slot_id);
853
855 {
857 if (GetCompEM().IsWorking())
858 GetCompEM().SwitchOff();
859
861 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
862 {
866 }
867
869 }
870 }
871
873 {
875 return false;
876
877 return true;
878 }
879
881 {
884 if (doorsInfoMap && doorsInfoMap.Count() > 0)
885 {
886 int doorIndex = -1;
889 {
890 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
891 {
893 {
894 doorIndex = doorInfoIndex;
895 doorInfo = doorInfoData;
896 break;
897 }
898 }
899
900 if (doorIndex != -1)
901 break;
902 }
903
904 if (doorIndex > -1)
905 {
907 }
908
911 if (rebuilding && doorInfo)
912 {
914 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
915 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
916 {
917 m_Reversed = reversibleDoorPart.IsReversedLocal();
918 }
919 }
920 }
921 }
922
925 {
927 {
930 return false;
931 }
932
933 return true;
934 }
935
937 {
938 super.OnWorkStop();
939
941 {
944
946 }
947 }
948
950 {
951 super.OnWorkStart();
952
954 {
956 }
957 }
958
959 override void OnWork(
float consumed_energy)
960 {
961 super.OnWork(consumed_energy);
962
964 {
966 if (battery)
967 {
968 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
969 {
970 GetCompEM().SwitchOff();
972 }
973
976 {
978 SetSynchDirty();
979 }
980 }
981 }
982 }
983
986 {
988 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
989
990
991 if (
g_Game.IsMultiplayer())
992 {
993 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
994 }
995 else
996 {
997 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
998 }
999
1002 if (parent.MemoryPointExists(
slotName))
1003 {
1004 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1005 }
1006 else
1007 {
1009 }
1010
1012 PlaceOnSurface();
1013 }
1014
1016 {
1018 return battery;
1019 }
1020
1022 {
1023 return true;
1024 }
1025
1027 {
1028 return true;
1029 }
1030
1032 {
1033 return true;
1034 }
1035
1037 {
1039 }
1040
1042 {
1043 return true;
1044 }
1045
1047 {
1048 return GetCompEM().IsWorking();
1049 }
1050
1052 {
1054 }
1055
1057 {
1059 }
1060
1062 {
1064 }
1065
1067 {
1069 }
1070
1072 {
1074 }
1075
1077 {
1079 }
1080
1082 {
1084 }
1085
1087 {
1089 }
1090
1092 {
1094 }
1095
1097 {
1099 }
1100
1102 {
1104 }
1105
1107 {
1109 }
1110
1112 {
1114 }
1115
1119 {
1120 if (!player)
1121 return false;
1122
1124 return false;
1125
1127
1129 }
1130
1132 {
1133 EntityAI hierarchyParent = GetHierarchyRoot();
1134 if (hierarchyParent.CanUseConstruction())
1135 return true;
1136
1137 if (BroadcastedBunker.Cast(hierarchyParent))
1138 return true;
1139
1140 return false;
1141 }
1142
1144 {
1146 }
1147
1149 {
1151 if (!battery)
1152 return 0.0;
1153
1154 float energy = battery.GetCompEM().GetEnergy();
1155 float energyMax = battery.GetCompEM().GetEnergyMax();
1156
1157 if (energyMax <= 0)
1158 return 0.0;
1159
1160 return (energy / energyMax) * 100.0;
1161 }
1162
1164 {
1167 }
1168
1170 {
1172 {
1175 }
1176 }
1177
1179 {
1180 super.SetActions();
1181
1183 }
1184
1186 {
1187 super.OnRPC(sender, rpc_type, ctx);
1188
1190 }
1191
1193 {
1194 super.OnStoreSave(ctx);
1195
1197 }
1198
1200 {
1201 if (!super.OnStoreLoad(ctx, version))
1202 return false;
1203
1205 return false;
1206
1207 return true;
1208 }
1209
1211 {
1212 super.AfterStoreLoad();
1213
1215 {
1217 {
1219 }
1220 else
1221 {
1223 }
1224 }
1225
1227 }
1228
1230 {
1231 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1232
1234 }
1235
1237 {
1238 super.OnVariablesSynchronized();
1239
1241 {
1243 if (uiAction != CodeLockUIAction.NONE)
1244 {
1246 }
1247 }
1248 }
1249
1251 {
1252 return true;
1253 }
1254
1256 {
1257 super.InitItemSounds();
1258
1266 }
1267
1268
1270 {
1271 GetInventory().CreateInInventory("Battery9V");
1272 }
1273}
1274
1276{
1277 override void Init()
1278 {
1280
1281 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1283
1284 if (bunkerConfig && bunkerConfig.bunkerSettings)
1285 {
1287 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1290 }
1291
1293 }
1294
1296 {
1297 return false;
1298 }
1299
1301 {
1302 return false;
1303 }
1304
1306 {
1307 return false;
1308 }
1309
1312
1314 {
1315 return false;
1316 }
1317
1319 {
1320 return true;
1321 }
1322
1324 {
1325 return true;
1326 }
1327
1329 {
1330 return true;
1331 }
1332
1334 {
1336 }
1337
1339 {
1343 }
1344}
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.