916{
919
922
925
927
928
936
938 {
940 }
941
942 protected void Init()
943 {
946
947 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
948 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
949 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
950 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
951 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
952 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
953 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
954 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
955 RegisterNetSyncVariableBool("m_Reversed");
956 }
957
959 {
960 super.EEInit();
961
962
964 }
965
967 {
968 super.EEItemLocationChanged(oldLoc, newLoc);
969
971 {
973 {
974 if (
g_Game.IsDedicatedServer())
975 SetSynchDirty();
976
977
979 }
980 }
981 }
982
984 {
985 super.EEItemAttached(item, slot_name);
986
988 {
991 {
993 if (battery)
994 {
995 float batteryEnergy = battery.GetCompEM().GetEnergy();
997 {
999 GetCompEM().SwitchOn();
1000 }
1001
1003 }
1004 }
1005 }
1006 }
1007
1009 {
1010 super.EEItemDetached(item, slot_name);
1011
1013 {
1016 {
1018 GetCompEM().SwitchOff();
1019
1021 }
1022 }
1023 }
1024
1026 {
1027 super.OnWasAttached(parent, slot_id);
1028
1030 {
1033 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1034 {
1036 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1037 {
1039 GetCompEM().SwitchOn();
1040 }
1041
1042 if (parent && parent.CanUseConstruction())
1043 {
1045 if (buildingBase)
1046 {
1048 }
1049 }
1050 }
1051
1053 }
1054 }
1055
1057 {
1058 super.OnWasDetached(parent, slot_id);
1059
1061 {
1063 if (GetCompEM().IsWorking())
1064 GetCompEM().SwitchOff();
1065
1067 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1068 {
1072 }
1073
1075 }
1076 }
1077
1079 {
1081 return false;
1082
1083 return true;
1084 }
1085
1087 {
1090 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1091 {
1092 int doorIndex = -1;
1095 {
1096 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1097 {
1099 {
1100 doorIndex = doorInfoIndex;
1101 doorInfo = doorInfoData;
1102 break;
1103 }
1104 }
1105
1106 if (doorIndex != -1)
1107 break;
1108 }
1109
1110 if (doorIndex > -1)
1111 {
1113 }
1114
1117 if (rebuilding && doorInfo)
1118 {
1120 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1121 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1122 {
1123 m_Reversed = reversibleDoorPart.IsReversedLocal();
1124 }
1125 }
1126 }
1127 }
1128
1131 {
1133 {
1136 return false;
1137 }
1138
1139 return true;
1140 }
1141
1143 {
1144 super.OnWorkStop();
1145
1147 {
1150
1152 }
1153 }
1154
1156 {
1157 super.OnWorkStart();
1158
1160 {
1162 }
1163 }
1164
1165 override void OnWork(
float consumed_energy)
1166 {
1167 super.OnWork(consumed_energy);
1168
1170 {
1172 if (battery)
1173 {
1174 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1175 {
1176 GetCompEM().SwitchOff();
1178 }
1179
1182 {
1184 SetSynchDirty();
1185 }
1186 }
1187 }
1188 }
1189
1192 {
1194 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1195
1196
1197 if (
g_Game.IsMultiplayer())
1198 {
1199 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1200 }
1201 else
1202 {
1203 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1204 }
1205
1208 if (parent.MemoryPointExists(
slotName))
1209 {
1210 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1211 }
1212 else
1213 {
1215 }
1216
1218 PlaceOnSurface();
1219 }
1220
1222 {
1224 return battery;
1225 }
1226
1228 {
1229 return true;
1230 }
1231
1233 {
1234 return true;
1235 }
1236
1238 {
1239 return true;
1240 }
1241
1243 {
1245 }
1246
1248 {
1249 return true;
1250 }
1251
1253 {
1254 return GetCompEM().IsWorking();
1255 }
1256
1258 {
1260 }
1261
1263 {
1265 }
1266
1268 {
1270 }
1271
1273 {
1275 }
1276
1278 {
1280 }
1281
1283 {
1285 }
1286
1288 {
1290 }
1291
1293 {
1295 }
1296
1298 {
1300 }
1301
1303 {
1305 }
1306
1308 {
1310 }
1311
1313 {
1315 }
1316
1318 {
1320 }
1321
1325 {
1326 if (!player)
1327 return false;
1328
1330 return false;
1331
1333
1335 }
1336
1338 {
1339 EntityAI hierarchyParent = GetHierarchyRoot();
1340 if (hierarchyParent.CanUseConstruction())
1341 return true;
1342
1343 if (BroadcastedBunker.Cast(hierarchyParent))
1344 return true;
1345
1346 return false;
1347 }
1348
1350 {
1352 }
1353
1355 {
1357 if (!battery)
1358 return 0.0;
1359
1360 float energy = battery.GetCompEM().GetEnergy();
1361 float energyMax = battery.GetCompEM().GetEnergyMax();
1362
1363 if (energyMax <= 0)
1364 return 0.0;
1365
1366 return (energy / energyMax) * 100.0;
1367 }
1368
1370 {
1373 }
1374
1376 {
1378 {
1381 }
1382 }
1383
1385 {
1386 super.SetActions();
1387
1389 }
1390
1392 {
1393 super.OnRPC(sender, rpc_type, ctx);
1394
1396 }
1397
1399 {
1400 super.OnStoreSave(ctx);
1401
1403 }
1404
1406 {
1407 if (!super.OnStoreLoad(ctx, version))
1408 return false;
1409
1411 return false;
1412
1413 return true;
1414 }
1415
1417 {
1418 super.AfterStoreLoad();
1419
1421 {
1423 {
1425 }
1426 else
1427 {
1429 }
1430 }
1431
1433 }
1434
1436 {
1437 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1438
1440 }
1441
1443 {
1444 super.OnVariablesSynchronized();
1445
1447 {
1449 if (uiAction != CodeLockUIAction.NONE)
1450 {
1452 }
1453 }
1454 }
1455
1457 {
1458 return true;
1459 }
1460
1462 {
1463 super.InitItemSounds();
1464
1472 }
1473
1474
1476 {
1477 GetInventory().CreateInInventory("Battery9V");
1478 }
1479}
1480
1482{
1483 override void Init()
1484 {
1486
1487 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1489
1490 if (bunkerConfig && bunkerConfig.bunkerSettings)
1491 {
1493 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1496 }
1497
1499 }
1500
1502 {
1503 return false;
1504 }
1505
1507 {
1508 return false;
1509 }
1510
1512 {
1513 return false;
1514 }
1515
1518
1520 {
1521 return false;
1522 }
1523
1525 {
1526 return true;
1527 }
1528
1530 {
1531 return true;
1532 }
1533
1535 {
1536 return true;
1537 }
1538
1540 {
1542 }
1543
1545 {
1549 }
1550}
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.