Start energy consumption once code lock is attached with a battery and the lock parent can have a construction component
679{
682
685
688
690
691
699
701 {
703 }
704
705 protected void Init()
706 {
709
710 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
711 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
712 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
713 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
714 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
715 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
716 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
717 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
718 RegisterNetSyncVariableBool("m_Reversed");
719 }
720
722 {
723 super.EEInit();
724
725
727 }
728
730 {
731 super.EEItemLocationChanged(oldLoc, newLoc);
732
734 {
736 {
737 if (
g_Game.IsDedicatedServer())
738 SetSynchDirty();
739
740
742 }
743 }
744 }
745
747 {
748 super.EEItemAttached(item, slot_name);
749
751 {
754 {
756 if (battery)
757 {
758 float batteryEnergy = battery.GetCompEM().GetEnergy();
760 {
762 GetCompEM().SwitchOn();
763 }
764
766 }
767 }
768 }
769 }
770
772 {
773 super.EEItemDetached(item, slot_name);
774
776 {
779 {
781 GetCompEM().SwitchOff();
782
784 }
785 }
786 }
787
789 {
790 super.OnWasAttached(parent, slot_id);
791
793 {
796 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
797 {
799 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
800 {
802 GetCompEM().SwitchOn();
803 }
804
805 if (parent && parent.CanUseConstruction())
806 {
808 if (buildingBase)
809 {
811 }
812 }
813 }
814
816 }
817 }
818
820 {
821 super.OnWasDetached(parent, slot_id);
822
824 {
826 if (GetCompEM().IsWorking())
827 GetCompEM().SwitchOff();
828
830 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
831 {
835 }
836
838 }
839 }
840
842 {
844 return false;
845
846 return true;
847 }
848
850 {
853 if (doorsInfoMap && doorsInfoMap.Count() > 0)
854 {
855 int doorIndex = -1;
858 {
859 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
860 {
862 {
863 doorIndex = doorInfoIndex;
864 doorInfo = doorInfoData;
865 break;
866 }
867 }
868
869 if (doorIndex != -1)
870 break;
871 }
872
873 if (doorIndex > -1)
874 {
876 }
877
880 if (rebuilding && doorInfo)
881 {
883 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
884 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
885 {
886 m_Reversed = reversibleDoorPart.IsReversedLocal();
887 }
888 }
889 }
890 }
891
894 {
896 {
899 return false;
900 }
901
902 return true;
903 }
904
906 {
907 super.OnWorkStop();
908
910 {
913
915 }
916 }
917
919 {
920 super.OnWorkStart();
921
923 {
925 }
926 }
927
928 override void OnWork(
float consumed_energy)
929 {
930 super.OnWork(consumed_energy);
931
933 {
935 if (battery)
936 {
937 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
938 {
939 GetCompEM().SwitchOff();
941 }
942
945 {
947 SetSynchDirty();
948 }
949 }
950 }
951 }
952
955 {
957 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
958
959
960 if (
g_Game.IsMultiplayer())
961 {
962 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
963 }
964 else
965 {
966 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
967 }
968
971 if (parent.MemoryPointExists(
slotName))
972 {
973 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
974 }
975 else
976 {
978 }
979
981 PlaceOnSurface();
982 }
983
985 {
987 return battery;
988 }
989
991 {
992 return true;
993 }
994
996 {
997 return true;
998 }
999
1001 {
1002 return true;
1003 }
1004
1006 {
1008 }
1009
1011 {
1012 return true;
1013 }
1014
1016 {
1017 return GetCompEM().IsWorking();
1018 }
1019
1021 {
1023 }
1024
1026 {
1028 }
1029
1031 {
1033 }
1034
1036 {
1038 }
1039
1041 {
1043 }
1044
1046 {
1048 }
1049
1051 {
1053 }
1054
1056 {
1058 }
1059
1061 {
1063 }
1064
1066 {
1068 }
1069
1071 {
1073 }
1074
1076 {
1078 }
1079
1081 {
1083 }
1084
1088 {
1089 if (!player)
1090 return false;
1091
1093 return false;
1094
1096
1098 }
1099
1101 {
1102 EntityAI hierarchyParent = GetHierarchyRoot();
1103 if (hierarchyParent.CanUseConstruction())
1104 return true;
1105
1106 if (BroadcastedBunker.Cast(hierarchyParent))
1107 return true;
1108
1109 return false;
1110 }
1111
1113 {
1115 }
1116
1118 {
1120 if (!battery)
1121 return 0.0;
1122
1123 float energy = battery.GetCompEM().GetEnergy();
1124 float energyMax = battery.GetCompEM().GetEnergyMax();
1125
1126 if (energyMax <= 0)
1127 return 0.0;
1128
1129 return (energy / energyMax) * 100.0;
1130 }
1131
1133 {
1136 }
1137
1139 {
1141 {
1144 }
1145 }
1146
1148 {
1149 super.SetActions();
1150
1152 }
1153
1155 {
1156 super.OnRPC(sender, rpc_type, ctx);
1157
1159 }
1160
1162 {
1163 super.OnStoreSave(ctx);
1164
1166 }
1167
1169 {
1170 if (!super.OnStoreLoad(ctx, version))
1171 return false;
1172
1174 return false;
1175
1176 return true;
1177 }
1178
1180 {
1181 super.AfterStoreLoad();
1182
1184 {
1186 {
1188 }
1189 else
1190 {
1192 }
1193 }
1194
1196 }
1197
1199 {
1200 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1201
1203 }
1204
1206 {
1207 super.OnVariablesSynchronized();
1208
1210 {
1212 if (uiAction != CodeLockUIAction.NONE)
1213 {
1215 }
1216 }
1217 }
1218
1220 {
1221 return true;
1222 }
1223
1225 {
1226 super.InitItemSounds();
1227
1235 }
1236
1237
1239 {
1240 GetInventory().CreateInInventory("Battery9V");
1241 }
1242}
1243
1245{
1246 override void Init()
1247 {
1249
1250 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1252
1253 if (bunkerConfig && bunkerConfig.bunkerSettings)
1254 {
1256 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1259 }
1260
1262 }
1263
1265 {
1266 return false;
1267 }
1268
1270 {
1271 return false;
1272 }
1273
1275 {
1276 return false;
1277 }
1278
1281
1283 {
1284 return false;
1285 }
1286
1288 {
1289 return true;
1290 }
1291
1293 {
1294 return true;
1295 }
1296
1298 {
1299 return true;
1300 }
1301
1303 {
1305 }
1306
1308 {
1312 }
1313}
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.