931{
934
937
940
942
943
951
953 {
955 }
956
957 protected void Init()
958 {
961
962 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
963 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
964 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
965 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
966 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
967 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
968 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
969 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
970 RegisterNetSyncVariableBool("m_Reversed");
971 }
972
974 {
975 super.EEInit();
976
977
979 }
980
982 {
983 super.EEItemLocationChanged(oldLoc, newLoc);
984
986 {
988 {
989 if (
g_Game.IsDedicatedServer())
990 SetSynchDirty();
991
992
994 }
995 }
996 }
997
999 {
1000 super.EEItemAttached(item, slot_name);
1001
1003 {
1006 {
1008 if (battery)
1009 {
1010 float batteryEnergy = battery.GetCompEM().GetEnergy();
1012 {
1014 GetCompEM().SwitchOn();
1015 }
1016
1018 }
1019 }
1020 }
1021 }
1022
1024 {
1025 super.EEItemDetached(item, slot_name);
1026
1028 {
1031 {
1033 GetCompEM().SwitchOff();
1034
1036 }
1037 }
1038 }
1039
1041 {
1042 super.OnWasAttached(parent, slot_id);
1043
1045 {
1048 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1049 {
1051 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1052 {
1054 GetCompEM().SwitchOn();
1055 }
1056
1057 if (parent && parent.CanUseConstruction())
1058 {
1060 if (buildingBase)
1061 {
1063 }
1064 }
1065 }
1066
1068 }
1069 }
1070
1072 {
1073 super.OnWasDetached(parent, slot_id);
1074
1076 {
1078 if (GetCompEM().IsWorking())
1079 GetCompEM().SwitchOff();
1080
1082 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1083 {
1087 }
1088
1090 }
1091 }
1092
1094 {
1096 return false;
1097
1098 return true;
1099 }
1100
1102 {
1105 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1106 {
1107 int doorIndex = -1;
1110 {
1111 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1112 {
1114 {
1115 doorIndex = doorInfoIndex;
1116 doorInfo = doorInfoData;
1117 break;
1118 }
1119 }
1120
1121 if (doorIndex != -1)
1122 break;
1123 }
1124
1125 if (doorIndex > -1)
1126 {
1128 }
1129
1132 if (rebuilding && doorInfo)
1133 {
1135 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1136 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1137 {
1138 m_Reversed = reversibleDoorPart.IsReversedLocal();
1139 }
1140 }
1141 }
1142 }
1143
1146 {
1148 {
1151 return false;
1152 }
1153
1154 return true;
1155 }
1156
1158 {
1159 super.OnWorkStop();
1160
1162 {
1165
1167 }
1168 }
1169
1171 {
1172 super.OnWorkStart();
1173
1175 {
1177 }
1178 }
1179
1180 override void OnWork(
float consumed_energy)
1181 {
1182 super.OnWork(consumed_energy);
1183
1185 {
1187 if (battery)
1188 {
1189 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1190 {
1191 GetCompEM().SwitchOff();
1193 }
1194
1197 {
1199 SetSynchDirty();
1200 }
1201 }
1202 }
1203 }
1204
1207 {
1209 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1210
1211
1212 if (
g_Game.IsMultiplayer())
1213 {
1214 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1215 }
1216 else
1217 {
1218 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1219 }
1220
1223 if (parent.MemoryPointExists(
slotName))
1224 {
1225 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1226 }
1227 else
1228 {
1230 }
1231
1233 PlaceOnSurface();
1234 }
1235
1237 {
1239 return battery;
1240 }
1241
1243 {
1244 return true;
1245 }
1246
1248 {
1249 return true;
1250 }
1251
1253 {
1254 return true;
1255 }
1256
1258 {
1260 }
1261
1263 {
1264 return true;
1265 }
1266
1268 {
1269 return GetCompEM().IsWorking();
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
1323 {
1325 }
1326
1328 {
1330 }
1331
1333 {
1335 }
1336
1340 {
1341 if (!player)
1342 return false;
1343
1345 return false;
1346
1348
1350 }
1351
1353 {
1354 EntityAI hierarchyParent = GetHierarchyRoot();
1355 if (hierarchyParent.CanUseConstruction())
1356 return true;
1357
1358 if (BroadcastedBunker.Cast(hierarchyParent))
1359 return true;
1360
1361 return false;
1362 }
1363
1365 {
1367 }
1368
1370 {
1372 if (!battery)
1373 return 0.0;
1374
1375 float energy = battery.GetCompEM().GetEnergy();
1376 float energyMax = battery.GetCompEM().GetEnergyMax();
1377
1378 if (energyMax <= 0)
1379 return 0.0;
1380
1381 return (energy / energyMax) * 100.0;
1382 }
1383
1385 {
1388 }
1389
1391 {
1393 {
1396 }
1397 }
1398
1400 {
1401 super.SetActions();
1402
1404 }
1405
1407 {
1408 super.OnRPC(sender, rpc_type, ctx);
1409
1411 }
1412
1414 {
1415 super.OnStoreSave(ctx);
1416
1418 }
1419
1421 {
1422 if (!super.OnStoreLoad(ctx, version))
1423 return false;
1424
1426 return false;
1427
1428 return true;
1429 }
1430
1432 {
1433 super.AfterStoreLoad();
1434
1436 {
1438 {
1440 }
1441 else
1442 {
1444 }
1445 }
1446
1448 }
1449
1451 {
1452 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1453
1455 }
1456
1458 {
1459 super.OnVariablesSynchronized();
1460
1462 {
1464 if (uiAction != CodeLockUIAction.NONE)
1465 {
1467 }
1468 }
1469 }
1470
1472 {
1473 return true;
1474 }
1475
1477 {
1478 super.InitItemSounds();
1479
1487 }
1488
1489
1491 {
1492 GetInventory().CreateInInventory("Battery9V");
1493 }
1494}
1495
1497{
1498 override void Init()
1499 {
1501
1502 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1504
1505 if (bunkerConfig && bunkerConfig.bunkerSettings)
1506 {
1508 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1511 }
1512
1514 }
1515
1517 {
1518 return false;
1519 }
1520
1522 {
1523 return false;
1524 }
1525
1527 {
1528 return false;
1529 }
1530
1533
1535 {
1536 return false;
1537 }
1538
1540 {
1541 return true;
1542 }
1543
1545 {
1546 return true;
1547 }
1548
1550 {
1551 return true;
1552 }
1553
1555 {
1557 }
1558
1560 {
1564 }
1565}
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.