796{
799
802
805
807
808
816
818 {
820 }
821
822 protected void Init()
823 {
826
827 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
828 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
829 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
830 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
831 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
832 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
833 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
834 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
835 RegisterNetSyncVariableBool("m_Reversed");
836 }
837
839 {
840 super.EEInit();
841
842
844 }
845
847 {
848 super.EEItemLocationChanged(oldLoc, newLoc);
849
851 {
853 {
854 if (
g_Game.IsDedicatedServer())
855 SetSynchDirty();
856
857
859 }
860 }
861 }
862
864 {
865 super.EEItemAttached(item, slot_name);
866
868 {
871 {
873 if (battery)
874 {
875 float batteryEnergy = battery.GetCompEM().GetEnergy();
877 {
879 GetCompEM().SwitchOn();
880 }
881
883 }
884 }
885 }
886 }
887
889 {
890 super.EEItemDetached(item, slot_name);
891
893 {
896 {
898 GetCompEM().SwitchOff();
899
901 }
902 }
903 }
904
906 {
907 super.OnWasAttached(parent, slot_id);
908
910 {
913 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
914 {
916 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
917 {
919 GetCompEM().SwitchOn();
920 }
921
922 if (parent && parent.CanUseConstruction())
923 {
925 if (buildingBase)
926 {
928 }
929 }
930 }
931
933 }
934 }
935
937 {
938 super.OnWasDetached(parent, slot_id);
939
941 {
943 if (GetCompEM().IsWorking())
944 GetCompEM().SwitchOff();
945
947 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
948 {
952 }
953
955 }
956 }
957
959 {
961 return false;
962
963 return true;
964 }
965
967 {
970 if (doorsInfoMap && doorsInfoMap.Count() > 0)
971 {
972 int doorIndex = -1;
975 {
976 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
977 {
979 {
980 doorIndex = doorInfoIndex;
981 doorInfo = doorInfoData;
982 break;
983 }
984 }
985
986 if (doorIndex != -1)
987 break;
988 }
989
990 if (doorIndex > -1)
991 {
993 }
994
997 if (rebuilding && doorInfo)
998 {
1000 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1001 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1002 {
1003 m_Reversed = reversibleDoorPart.IsReversedLocal();
1004 }
1005 }
1006 }
1007 }
1008
1011 {
1013 {
1016 return false;
1017 }
1018
1019 return true;
1020 }
1021
1023 {
1024 super.OnWorkStop();
1025
1027 {
1030
1032 }
1033 }
1034
1036 {
1037 super.OnWorkStart();
1038
1040 {
1042 }
1043 }
1044
1045 override void OnWork(
float consumed_energy)
1046 {
1047 super.OnWork(consumed_energy);
1048
1050 {
1052 if (battery)
1053 {
1054 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1055 {
1056 GetCompEM().SwitchOff();
1058 }
1059
1062 {
1064 SetSynchDirty();
1065 }
1066 }
1067 }
1068 }
1069
1072 {
1074 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1075
1076
1077 if (
g_Game.IsMultiplayer())
1078 {
1079 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1080 }
1081 else
1082 {
1083 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1084 }
1085
1088 if (parent.MemoryPointExists(
slotName))
1089 {
1090 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1091 }
1092 else
1093 {
1095 }
1096
1098 PlaceOnSurface();
1099 }
1100
1102 {
1104 return battery;
1105 }
1106
1108 {
1109 return true;
1110 }
1111
1113 {
1114 return true;
1115 }
1116
1118 {
1119 return true;
1120 }
1121
1123 {
1125 }
1126
1128 {
1129 return true;
1130 }
1131
1133 {
1134 return GetCompEM().IsWorking();
1135 }
1136
1138 {
1140 }
1141
1143 {
1145 }
1146
1148 {
1150 }
1151
1153 {
1155 }
1156
1158 {
1160 }
1161
1163 {
1165 }
1166
1168 {
1170 }
1171
1173 {
1175 }
1176
1178 {
1180 }
1181
1183 {
1185 }
1186
1188 {
1190 }
1191
1193 {
1195 }
1196
1198 {
1200 }
1201
1205 {
1206 if (!player)
1207 return false;
1208
1210 return false;
1211
1213
1215 }
1216
1218 {
1219 EntityAI hierarchyParent = GetHierarchyRoot();
1220 if (hierarchyParent.CanUseConstruction())
1221 return true;
1222
1223 if (BroadcastedBunker.Cast(hierarchyParent))
1224 return true;
1225
1226 return false;
1227 }
1228
1230 {
1232 }
1233
1235 {
1237 if (!battery)
1238 return 0.0;
1239
1240 float energy = battery.GetCompEM().GetEnergy();
1241 float energyMax = battery.GetCompEM().GetEnergyMax();
1242
1243 if (energyMax <= 0)
1244 return 0.0;
1245
1246 return (energy / energyMax) * 100.0;
1247 }
1248
1250 {
1253 }
1254
1256 {
1258 {
1261 }
1262 }
1263
1265 {
1266 super.SetActions();
1267
1269 }
1270
1272 {
1273 super.OnRPC(sender, rpc_type, ctx);
1274
1276 }
1277
1279 {
1280 super.OnStoreSave(ctx);
1281
1283 }
1284
1286 {
1287 if (!super.OnStoreLoad(ctx, version))
1288 return false;
1289
1291 return false;
1292
1293 return true;
1294 }
1295
1297 {
1298 super.AfterStoreLoad();
1299
1301 {
1303 {
1305 }
1306 else
1307 {
1309 }
1310 }
1311
1313 }
1314
1316 {
1317 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1318
1320 }
1321
1323 {
1324 super.OnVariablesSynchronized();
1325
1327 {
1329 if (uiAction != CodeLockUIAction.NONE)
1330 {
1332 }
1333 }
1334 }
1335
1337 {
1338 return true;
1339 }
1340
1342 {
1343 super.InitItemSounds();
1344
1352 }
1353
1354
1356 {
1357 GetInventory().CreateInInventory("Battery9V");
1358 }
1359}
1360
1362{
1363 override void Init()
1364 {
1366
1367 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1369
1370 if (bunkerConfig && bunkerConfig.bunkerSettings)
1371 {
1373 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1376 }
1377
1379 }
1380
1382 {
1383 return false;
1384 }
1385
1387 {
1388 return false;
1389 }
1390
1392 {
1393 return false;
1394 }
1395
1398
1400 {
1401 return false;
1402 }
1403
1405 {
1406 return true;
1407 }
1408
1410 {
1411 return true;
1412 }
1413
1415 {
1416 return true;
1417 }
1418
1420 {
1422 }
1423
1425 {
1429 }
1430}
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.