662{
665
668
671
673
674
682
684 {
686 }
687
688 protected void Init()
689 {
692
693 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
694 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
695 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
696 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
697 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
698 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
699 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
700 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
701 RegisterNetSyncVariableBool("m_Reversed");
702 }
703
705 {
706 super.EEInit();
707
708
710 }
711
713 {
714 super.EEItemLocationChanged(oldLoc, newLoc);
715
717 {
719 {
720 if (
g_Game.IsDedicatedServer())
721 SetSynchDirty();
722
723
725 }
726 }
727 }
728
730 {
731 super.EEItemAttached(item, slot_name);
732
734 {
737 {
739 if (battery)
740 {
741 float batteryEnergy = battery.GetCompEM().GetEnergy();
743 {
745 GetCompEM().SwitchOn();
746 }
747
749 }
750 }
751 }
752 }
753
755 {
756 super.EEItemDetached(item, slot_name);
757
759 {
762 {
764 GetCompEM().SwitchOff();
765
767 }
768 }
769 }
770
772 {
773 super.OnWasAttached(parent, slot_id);
774
776 {
779 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
780 {
782 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
783 {
785 GetCompEM().SwitchOn();
786 }
787
788 if (parent && parent.CanUseConstruction())
789 {
791 if (buildingBase)
792 {
794 }
795 }
796 }
797
799 }
800 }
801
803 {
804 super.OnWasDetached(parent, slot_id);
805
807 {
809 if (GetCompEM().IsWorking())
810 GetCompEM().SwitchOff();
811
813 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
814 {
818 }
819
821 }
822 }
823
825 {
827 return false;
828
829 return true;
830 }
831
833 {
836 if (doorsInfoMap && doorsInfoMap.Count() > 0)
837 {
838 int doorIndex = -1;
841 {
842 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
843 {
845 {
846 doorIndex = doorInfoIndex;
847 doorInfo = doorInfoData;
848 break;
849 }
850 }
851
852 if (doorIndex != -1)
853 break;
854 }
855
856 if (doorIndex > -1)
857 {
859 }
860
863 if (rebuilding && doorInfo)
864 {
866 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
867 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
868 {
869 m_Reversed = reversibleDoorPart.IsReversedLocal();
870 }
871 }
872 }
873 }
874
877 {
879 {
882 return false;
883 }
884
885 return true;
886 }
887
889 {
890 super.OnWorkStop();
891
893 {
896
898 }
899 }
900
902 {
903 super.OnWorkStart();
904
906 {
908 }
909 }
910
911 override void OnWork(
float consumed_energy)
912 {
913 super.OnWork(consumed_energy);
914
916 {
918 if (battery)
919 {
920 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
921 {
922 GetCompEM().SwitchOff();
924 }
925
928 {
930 SetSynchDirty();
931 }
932 }
933 }
934 }
935
938 {
940 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
941
942
943 if (
g_Game.IsMultiplayer())
944 {
945 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
946 }
947 else
948 {
949 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
950 }
951
954 if (parent.MemoryPointExists(
slotName))
955 {
956 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
957 }
958 else
959 {
961 }
962
964 PlaceOnSurface();
965 }
966
968 {
970 return battery;
971 }
972
974 {
975 return true;
976 }
977
979 {
980 return true;
981 }
982
984 {
985 return true;
986 }
987
989 {
991 }
992
994 {
995 return true;
996 }
997
999 {
1000 return GetCompEM().IsWorking();
1001 }
1002
1004 {
1006 }
1007
1009 {
1011 }
1012
1014 {
1016 }
1017
1019 {
1021 }
1022
1024 {
1026 }
1027
1029 {
1031 }
1032
1034 {
1036 }
1037
1039 {
1041 }
1042
1044 {
1046 }
1047
1049 {
1051 }
1052
1054 {
1056 }
1057
1059 {
1061 }
1062
1064 {
1066 }
1067
1071 {
1072 if (!player)
1073 return false;
1074
1076 return false;
1077
1079
1081 }
1082
1084 {
1085 EntityAI hierarchyParent = GetHierarchyRoot();
1086 if (hierarchyParent.CanUseConstruction())
1087 return true;
1088
1089 if (BroadcastedBunker.Cast(hierarchyParent))
1090 return true;
1091
1092 return false;
1093 }
1094
1096 {
1098 }
1099
1101 {
1103 if (!battery)
1104 return 0.0;
1105
1106 float energy = battery.GetCompEM().GetEnergy();
1107 float energyMax = battery.GetCompEM().GetEnergyMax();
1108
1109 if (energyMax <= 0)
1110 return 0.0;
1111
1112 return (energy / energyMax) * 100.0;
1113 }
1114
1116 {
1119 }
1120
1122 {
1124 {
1127 }
1128 }
1129
1131 {
1132 super.SetActions();
1133
1135 }
1136
1138 {
1139 super.OnRPC(sender, rpc_type, ctx);
1140
1142 }
1143
1145 {
1146 super.OnStoreSave(ctx);
1147
1149 }
1150
1152 {
1153 if (!super.OnStoreLoad(ctx, version))
1154 return false;
1155
1157 return false;
1158
1159 return true;
1160 }
1161
1163 {
1164 super.AfterStoreLoad();
1165
1167 {
1169 {
1171 }
1172 else
1173 {
1175 }
1176 }
1177
1179 }
1180
1182 {
1183 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1184
1186 }
1187
1189 {
1190 super.OnVariablesSynchronized();
1191
1193 {
1195 if (uiAction != CodeLockUIAction.NONE)
1196 {
1198 }
1199 }
1200 }
1201
1203 {
1204 return true;
1205 }
1206
1208 {
1209 super.InitItemSounds();
1210
1218 }
1219
1220
1222 {
1223 GetInventory().CreateInInventory("Battery9V");
1224 }
1225}
1226
1228{
1229 override void Init()
1230 {
1232
1233 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1235
1236 if (bunkerConfig && bunkerConfig.bunkerSettings)
1237 {
1239 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1242 }
1243
1245 }
1246
1248 {
1249 return false;
1250 }
1251
1253 {
1254 return false;
1255 }
1256
1258 {
1259 return false;
1260 }
1261
1264
1266 {
1267 return false;
1268 }
1269
1271 {
1272 return true;
1273 }
1274
1276 {
1277 return true;
1278 }
1279
1281 {
1282 return true;
1283 }
1284
1286 {
1288 }
1289
1291 {
1295 }
1296}
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.