732{
735
738
741
743
744
752
754 {
756 }
757
758 protected void Init()
759 {
762
763 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
764 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
765 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
766 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
767 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
768 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
769 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
770 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
771 RegisterNetSyncVariableBool("m_Reversed");
772 }
773
775 {
776 super.EEInit();
777
778
780 }
781
783 {
784 super.EEItemLocationChanged(oldLoc, newLoc);
785
787 {
789 {
790 if (
g_Game.IsDedicatedServer())
791 SetSynchDirty();
792
793
795 }
796 }
797 }
798
800 {
801 super.EEItemAttached(item, slot_name);
802
804 {
807 {
809 if (battery)
810 {
811 float batteryEnergy = battery.GetCompEM().GetEnergy();
813 {
815 GetCompEM().SwitchOn();
816 }
817
819 }
820 }
821 }
822 }
823
825 {
826 super.EEItemDetached(item, slot_name);
827
829 {
832 {
834 GetCompEM().SwitchOff();
835
837 }
838 }
839 }
840
842 {
843 super.OnWasAttached(parent, slot_id);
844
846 {
849 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
850 {
852 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
853 {
855 GetCompEM().SwitchOn();
856 }
857
858 if (parent && parent.CanUseConstruction())
859 {
861 if (buildingBase)
862 {
864 }
865 }
866 }
867
869 }
870 }
871
873 {
874 super.OnWasDetached(parent, slot_id);
875
877 {
879 if (GetCompEM().IsWorking())
880 GetCompEM().SwitchOff();
881
883 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
884 {
888 }
889
891 }
892 }
893
895 {
897 return false;
898
899 return true;
900 }
901
903 {
906 if (doorsInfoMap && doorsInfoMap.Count() > 0)
907 {
908 int doorIndex = -1;
911 {
912 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
913 {
915 {
916 doorIndex = doorInfoIndex;
917 doorInfo = doorInfoData;
918 break;
919 }
920 }
921
922 if (doorIndex != -1)
923 break;
924 }
925
926 if (doorIndex > -1)
927 {
929 }
930
933 if (rebuilding && doorInfo)
934 {
936 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
937 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
938 {
939 m_Reversed = reversibleDoorPart.IsReversedLocal();
940 }
941 }
942 }
943 }
944
947 {
949 {
952 return false;
953 }
954
955 return true;
956 }
957
959 {
960 super.OnWorkStop();
961
963 {
966
968 }
969 }
970
972 {
973 super.OnWorkStart();
974
976 {
978 }
979 }
980
981 override void OnWork(
float consumed_energy)
982 {
983 super.OnWork(consumed_energy);
984
986 {
988 if (battery)
989 {
990 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
991 {
992 GetCompEM().SwitchOff();
994 }
995
998 {
1000 SetSynchDirty();
1001 }
1002 }
1003 }
1004 }
1005
1008 {
1010 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1011
1012
1013 if (
g_Game.IsMultiplayer())
1014 {
1015 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1016 }
1017 else
1018 {
1019 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1020 }
1021
1024 if (parent.MemoryPointExists(
slotName))
1025 {
1026 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1027 }
1028 else
1029 {
1031 }
1032
1034 PlaceOnSurface();
1035 }
1036
1038 {
1040 return battery;
1041 }
1042
1044 {
1045 return true;
1046 }
1047
1049 {
1050 return true;
1051 }
1052
1054 {
1055 return true;
1056 }
1057
1059 {
1061 }
1062
1064 {
1065 return true;
1066 }
1067
1069 {
1070 return GetCompEM().IsWorking();
1071 }
1072
1074 {
1076 }
1077
1079 {
1081 }
1082
1084 {
1086 }
1087
1089 {
1091 }
1092
1094 {
1096 }
1097
1099 {
1101 }
1102
1104 {
1106 }
1107
1109 {
1111 }
1112
1114 {
1116 }
1117
1119 {
1121 }
1122
1124 {
1126 }
1127
1129 {
1131 }
1132
1134 {
1136 }
1137
1141 {
1142 if (!player)
1143 return false;
1144
1146 return false;
1147
1149
1151 }
1152
1154 {
1155 EntityAI hierarchyParent = GetHierarchyRoot();
1156 if (hierarchyParent.CanUseConstruction())
1157 return true;
1158
1159 if (BroadcastedBunker.Cast(hierarchyParent))
1160 return true;
1161
1162 return false;
1163 }
1164
1166 {
1168 }
1169
1171 {
1173 if (!battery)
1174 return 0.0;
1175
1176 float energy = battery.GetCompEM().GetEnergy();
1177 float energyMax = battery.GetCompEM().GetEnergyMax();
1178
1179 if (energyMax <= 0)
1180 return 0.0;
1181
1182 return (energy / energyMax) * 100.0;
1183 }
1184
1186 {
1189 }
1190
1192 {
1194 {
1197 }
1198 }
1199
1201 {
1202 super.SetActions();
1203
1205 }
1206
1208 {
1209 super.OnRPC(sender, rpc_type, ctx);
1210
1212 }
1213
1215 {
1216 super.OnStoreSave(ctx);
1217
1219 }
1220
1222 {
1223 if (!super.OnStoreLoad(ctx, version))
1224 return false;
1225
1227 return false;
1228
1229 return true;
1230 }
1231
1233 {
1234 super.AfterStoreLoad();
1235
1237 {
1239 {
1241 }
1242 else
1243 {
1245 }
1246 }
1247
1249 }
1250
1252 {
1253 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1254
1256 }
1257
1259 {
1260 super.OnVariablesSynchronized();
1261
1263 {
1265 if (uiAction != CodeLockUIAction.NONE)
1266 {
1268 }
1269 }
1270 }
1271
1273 {
1274 return true;
1275 }
1276
1278 {
1279 super.InitItemSounds();
1280
1288 }
1289
1290
1292 {
1293 GetInventory().CreateInInventory("Battery9V");
1294 }
1295}
1296
1298{
1299 override void Init()
1300 {
1302
1303 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1305
1306 if (bunkerConfig && bunkerConfig.bunkerSettings)
1307 {
1309 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1312 }
1313
1315 }
1316
1318 {
1319 return false;
1320 }
1321
1323 {
1324 return false;
1325 }
1326
1328 {
1329 return false;
1330 }
1331
1334
1336 {
1337 return false;
1338 }
1339
1341 {
1342 return true;
1343 }
1344
1346 {
1347 return true;
1348 }
1349
1351 {
1352 return true;
1353 }
1354
1356 {
1358 }
1359
1361 {
1365 }
1366}
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.