Unlock AND drop.
845{
848
851
854
856
857
865
867 {
869 }
870
871 protected void Init()
872 {
875
876 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
877 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
878 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
879 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
880 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
881 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
882 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
883 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
884 RegisterNetSyncVariableBool("m_Reversed");
885 }
886
888 {
889 super.EEInit();
890
891
893 }
894
896 {
897 super.EEItemLocationChanged(oldLoc, newLoc);
898
900 {
902 {
903 if (
g_Game.IsDedicatedServer())
904 SetSynchDirty();
905
906
908 }
909 }
910 }
911
913 {
914 super.EEItemAttached(item, slot_name);
915
917 {
920 {
922 if (battery)
923 {
924 float batteryEnergy = battery.GetCompEM().GetEnergy();
926 {
928 GetCompEM().SwitchOn();
929 }
930
932 }
933 }
934 }
935 }
936
938 {
939 super.EEItemDetached(item, slot_name);
940
942 {
945 {
947 GetCompEM().SwitchOff();
948
950 }
951 }
952 }
953
955 {
956 super.OnWasAttached(parent, slot_id);
957
959 {
962 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
963 {
965 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
966 {
968 GetCompEM().SwitchOn();
969 }
970
971 if (parent && parent.CanUseConstruction())
972 {
974 if (buildingBase)
975 {
977 }
978 }
979 }
980
982 }
983 }
984
986 {
987 super.OnWasDetached(parent, slot_id);
988
990 {
992 if (GetCompEM().IsWorking())
993 GetCompEM().SwitchOff();
994
996 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
997 {
1001 }
1002
1004 }
1005 }
1006
1008 {
1010 return false;
1011
1012 return true;
1013 }
1014
1016 {
1019 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1020 {
1021 int doorIndex = -1;
1024 {
1025 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1026 {
1028 {
1029 doorIndex = doorInfoIndex;
1030 doorInfo = doorInfoData;
1031 break;
1032 }
1033 }
1034
1035 if (doorIndex != -1)
1036 break;
1037 }
1038
1039 if (doorIndex > -1)
1040 {
1042 }
1043
1046 if (rebuilding && doorInfo)
1047 {
1049 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1050 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1051 {
1052 m_Reversed = reversibleDoorPart.IsReversedLocal();
1053 }
1054 }
1055 }
1056 }
1057
1060 {
1062 {
1065 return false;
1066 }
1067
1068 return true;
1069 }
1070
1072 {
1073 super.OnWorkStop();
1074
1076 {
1079
1081 }
1082 }
1083
1085 {
1086 super.OnWorkStart();
1087
1089 {
1091 }
1092 }
1093
1094 override void OnWork(
float consumed_energy)
1095 {
1096 super.OnWork(consumed_energy);
1097
1099 {
1101 if (battery)
1102 {
1103 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1104 {
1105 GetCompEM().SwitchOff();
1107 }
1108
1111 {
1113 SetSynchDirty();
1114 }
1115 }
1116 }
1117 }
1118
1121 {
1123 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1124
1125
1126 if (
g_Game.IsMultiplayer())
1127 {
1128 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1129 }
1130 else
1131 {
1132 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1133 }
1134
1137 if (parent.MemoryPointExists(
slotName))
1138 {
1139 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1140 }
1141 else
1142 {
1144 }
1145
1147 PlaceOnSurface();
1148 }
1149
1151 {
1153 return battery;
1154 }
1155
1157 {
1158 return true;
1159 }
1160
1162 {
1163 return true;
1164 }
1165
1167 {
1168 return true;
1169 }
1170
1172 {
1174 }
1175
1177 {
1178 return true;
1179 }
1180
1182 {
1183 return GetCompEM().IsWorking();
1184 }
1185
1187 {
1189 }
1190
1192 {
1194 }
1195
1197 {
1199 }
1200
1202 {
1204 }
1205
1207 {
1209 }
1210
1212 {
1214 }
1215
1217 {
1219 }
1220
1222 {
1224 }
1225
1227 {
1229 }
1230
1232 {
1234 }
1235
1237 {
1239 }
1240
1242 {
1244 }
1245
1247 {
1249 }
1250
1254 {
1255 if (!player)
1256 return false;
1257
1259 return false;
1260
1262
1264 }
1265
1267 {
1268 EntityAI hierarchyParent = GetHierarchyRoot();
1269 if (hierarchyParent.CanUseConstruction())
1270 return true;
1271
1272 if (BroadcastedBunker.Cast(hierarchyParent))
1273 return true;
1274
1275 return false;
1276 }
1277
1279 {
1281 }
1282
1284 {
1286 if (!battery)
1287 return 0.0;
1288
1289 float energy = battery.GetCompEM().GetEnergy();
1290 float energyMax = battery.GetCompEM().GetEnergyMax();
1291
1292 if (energyMax <= 0)
1293 return 0.0;
1294
1295 return (energy / energyMax) * 100.0;
1296 }
1297
1299 {
1302 }
1303
1305 {
1307 {
1310 }
1311 }
1312
1314 {
1315 super.SetActions();
1316
1318 }
1319
1321 {
1322 super.OnRPC(sender, rpc_type, ctx);
1323
1325 }
1326
1328 {
1329 super.OnStoreSave(ctx);
1330
1332 }
1333
1335 {
1336 if (!super.OnStoreLoad(ctx, version))
1337 return false;
1338
1340 return false;
1341
1342 return true;
1343 }
1344
1346 {
1347 super.AfterStoreLoad();
1348
1350 {
1352 {
1354 }
1355 else
1356 {
1358 }
1359 }
1360
1362 }
1363
1365 {
1366 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1367
1369 }
1370
1372 {
1373 super.OnVariablesSynchronized();
1374
1376 {
1378 if (uiAction != CodeLockUIAction.NONE)
1379 {
1381 }
1382 }
1383 }
1384
1386 {
1387 return true;
1388 }
1389
1391 {
1392 super.InitItemSounds();
1393
1401 }
1402
1403
1405 {
1406 GetInventory().CreateInInventory("Battery9V");
1407 }
1408}
1409
1411{
1412 override void Init()
1413 {
1415
1416 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1418
1419 if (bunkerConfig && bunkerConfig.bunkerSettings)
1420 {
1422 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1425 }
1426
1428 }
1429
1431 {
1432 return false;
1433 }
1434
1436 {
1437 return false;
1438 }
1439
1441 {
1442 return false;
1443 }
1444
1447
1449 {
1450 return false;
1451 }
1452
1454 {
1455 return true;
1456 }
1457
1459 {
1460 return true;
1461 }
1462
1464 {
1465 return true;
1466 }
1467
1469 {
1471 }
1472
1474 {
1478 }
1479}
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.