886{
889
892
895
897
898
906
908 {
910 }
911
912 protected void Init()
913 {
916
917 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
918 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
919 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
920 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
921 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
922 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
923 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
924 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
925 RegisterNetSyncVariableBool("m_Reversed");
926 }
927
929 {
930 super.EEInit();
931
932
934 }
935
937 {
938 super.EEItemLocationChanged(oldLoc, newLoc);
939
941 {
943 {
944 if (
g_Game.IsDedicatedServer())
945 SetSynchDirty();
946
947
949 }
950 }
951 }
952
954 {
955 super.EEItemAttached(item, slot_name);
956
958 {
961 {
963 if (battery)
964 {
965 float batteryEnergy = battery.GetCompEM().GetEnergy();
967 {
969 GetCompEM().SwitchOn();
970 }
971
973 }
974 }
975 }
976 }
977
979 {
980 super.EEItemDetached(item, slot_name);
981
983 {
986 {
988 GetCompEM().SwitchOff();
989
991 }
992 }
993 }
994
996 {
997 super.OnWasAttached(parent, slot_id);
998
1000 {
1003 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1004 {
1006 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1007 {
1009 GetCompEM().SwitchOn();
1010 }
1011
1012 if (parent && parent.CanUseConstruction())
1013 {
1015 if (buildingBase)
1016 {
1018 }
1019 }
1020 }
1021
1023 }
1024 }
1025
1027 {
1028 super.OnWasDetached(parent, slot_id);
1029
1031 {
1033 if (GetCompEM().IsWorking())
1034 GetCompEM().SwitchOff();
1035
1037 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1038 {
1042 }
1043
1045 }
1046 }
1047
1049 {
1051 return false;
1052
1053 return true;
1054 }
1055
1057 {
1060 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1061 {
1062 int doorIndex = -1;
1065 {
1066 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1067 {
1069 {
1070 doorIndex = doorInfoIndex;
1071 doorInfo = doorInfoData;
1072 break;
1073 }
1074 }
1075
1076 if (doorIndex != -1)
1077 break;
1078 }
1079
1080 if (doorIndex > -1)
1081 {
1083 }
1084
1087 if (rebuilding && doorInfo)
1088 {
1090 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1091 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1092 {
1093 m_Reversed = reversibleDoorPart.IsReversedLocal();
1094 }
1095 }
1096 }
1097 }
1098
1101 {
1103 {
1106 return false;
1107 }
1108
1109 return true;
1110 }
1111
1113 {
1114 super.OnWorkStop();
1115
1117 {
1120
1122 }
1123 }
1124
1126 {
1127 super.OnWorkStart();
1128
1130 {
1132 }
1133 }
1134
1135 override void OnWork(
float consumed_energy)
1136 {
1137 super.OnWork(consumed_energy);
1138
1140 {
1142 if (battery)
1143 {
1144 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1145 {
1146 GetCompEM().SwitchOff();
1148 }
1149
1152 {
1154 SetSynchDirty();
1155 }
1156 }
1157 }
1158 }
1159
1162 {
1164 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1165
1166
1167 if (
g_Game.IsMultiplayer())
1168 {
1169 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1170 }
1171 else
1172 {
1173 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1174 }
1175
1178 if (parent.MemoryPointExists(
slotName))
1179 {
1180 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1181 }
1182 else
1183 {
1185 }
1186
1188 PlaceOnSurface();
1189 }
1190
1192 {
1194 return battery;
1195 }
1196
1198 {
1199 return true;
1200 }
1201
1203 {
1204 return true;
1205 }
1206
1208 {
1209 return true;
1210 }
1211
1213 {
1215 }
1216
1218 {
1219 return true;
1220 }
1221
1223 {
1224 return GetCompEM().IsWorking();
1225 }
1226
1228 {
1230 }
1231
1233 {
1235 }
1236
1238 {
1240 }
1241
1243 {
1245 }
1246
1248 {
1250 }
1251
1253 {
1255 }
1256
1258 {
1260 }
1261
1263 {
1265 }
1266
1268 {
1270 }
1271
1273 {
1275 }
1276
1278 {
1280 }
1281
1283 {
1285 }
1286
1288 {
1290 }
1291
1295 {
1296 if (!player)
1297 return false;
1298
1300 return false;
1301
1303
1305 }
1306
1308 {
1309 EntityAI hierarchyParent = GetHierarchyRoot();
1310 if (hierarchyParent.CanUseConstruction())
1311 return true;
1312
1313 if (BroadcastedBunker.Cast(hierarchyParent))
1314 return true;
1315
1316 return false;
1317 }
1318
1320 {
1322 }
1323
1325 {
1327 if (!battery)
1328 return 0.0;
1329
1330 float energy = battery.GetCompEM().GetEnergy();
1331 float energyMax = battery.GetCompEM().GetEnergyMax();
1332
1333 if (energyMax <= 0)
1334 return 0.0;
1335
1336 return (energy / energyMax) * 100.0;
1337 }
1338
1340 {
1343 }
1344
1346 {
1348 {
1351 }
1352 }
1353
1355 {
1356 super.SetActions();
1357
1359 }
1360
1362 {
1363 super.OnRPC(sender, rpc_type, ctx);
1364
1366 }
1367
1369 {
1370 super.OnStoreSave(ctx);
1371
1373 }
1374
1376 {
1377 if (!super.OnStoreLoad(ctx, version))
1378 return false;
1379
1381 return false;
1382
1383 return true;
1384 }
1385
1387 {
1388 super.AfterStoreLoad();
1389
1391 {
1393 {
1395 }
1396 else
1397 {
1399 }
1400 }
1401
1403 }
1404
1406 {
1407 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1408
1410 }
1411
1413 {
1414 super.OnVariablesSynchronized();
1415
1417 {
1419 if (uiAction != CodeLockUIAction.NONE)
1420 {
1422 }
1423 }
1424 }
1425
1427 {
1428 return true;
1429 }
1430
1432 {
1433 super.InitItemSounds();
1434
1442 }
1443
1444
1446 {
1447 GetInventory().CreateInInventory("Battery9V");
1448 }
1449}
1450
1452{
1453 override void Init()
1454 {
1456
1457 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1459
1460 if (bunkerConfig && bunkerConfig.bunkerSettings)
1461 {
1463 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1466 }
1467
1469 }
1470
1472 {
1473 return false;
1474 }
1475
1477 {
1478 return false;
1479 }
1480
1482 {
1483 return false;
1484 }
1485
1488
1490 {
1491 return false;
1492 }
1493
1495 {
1496 return true;
1497 }
1498
1500 {
1501 return true;
1502 }
1503
1505 {
1506 return true;
1507 }
1508
1510 {
1512 }
1513
1515 {
1519 }
1520}
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.