951{
954
957
960
962
963
971
973 {
975 }
976
977 protected void Init()
978 {
981
982 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
983 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
984 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
985 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
986 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
987 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
988 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
989 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
990 RegisterNetSyncVariableBool("m_Reversed");
991 }
992
994 {
995 super.EEInit();
996
997
999 }
1000
1002 {
1003 super.EEItemLocationChanged(oldLoc, newLoc);
1004
1006 {
1008 {
1009 if (
g_Game.IsDedicatedServer())
1010 SetSynchDirty();
1011
1012
1014 }
1015 }
1016 }
1017
1019 {
1020 super.EEItemAttached(item, slot_name);
1021
1023 {
1026 {
1028 if (battery)
1029 {
1030 float batteryEnergy = battery.GetCompEM().GetEnergy();
1032 {
1034 GetCompEM().SwitchOn();
1035 }
1036
1038 }
1039 }
1040 }
1041 }
1042
1044 {
1045 super.EEItemDetached(item, slot_name);
1046
1048 {
1051 {
1053 GetCompEM().SwitchOff();
1054
1056 }
1057 }
1058 }
1059
1061 {
1062 super.OnWasAttached(parent, slot_id);
1063
1065 {
1068 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1069 {
1071 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1072 {
1074 GetCompEM().SwitchOn();
1075 }
1076
1077 if (parent && parent.CanUseConstruction())
1078 {
1080 if (buildingBase)
1081 {
1083 }
1084 }
1085 }
1086
1088 }
1089 }
1090
1092 {
1093 super.OnWasDetached(parent, slot_id);
1094
1096 {
1098 if (GetCompEM().IsWorking())
1099 GetCompEM().SwitchOff();
1100
1102 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1103 {
1107 }
1108
1110 }
1111 }
1112
1114 {
1116 return false;
1117
1118 return true;
1119 }
1120
1122 {
1125 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1126 {
1127 int doorIndex = -1;
1130 {
1131 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1132 {
1134 {
1135 doorIndex = doorInfoIndex;
1136 doorInfo = doorInfoData;
1137 break;
1138 }
1139 }
1140
1141 if (doorIndex != -1)
1142 break;
1143 }
1144
1145 if (doorIndex > -1)
1146 {
1148 }
1149
1152 if (rebuilding && doorInfo)
1153 {
1155 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1156 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1157 {
1158 m_Reversed = reversibleDoorPart.IsReversedLocal();
1159 }
1160 }
1161 }
1162 }
1163
1166 {
1168 {
1171 return false;
1172 }
1173
1174 return true;
1175 }
1176
1178 {
1179 super.OnWorkStop();
1180
1182 {
1185
1187 }
1188 }
1189
1191 {
1192 super.OnWorkStart();
1193
1195 {
1197 }
1198 }
1199
1200 override void OnWork(
float consumed_energy)
1201 {
1202 super.OnWork(consumed_energy);
1203
1205 {
1207 if (battery)
1208 {
1209 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1210 {
1211 GetCompEM().SwitchOff();
1213 }
1214
1217 {
1219 SetSynchDirty();
1220 }
1221 }
1222 }
1223 }
1224
1227 {
1229 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1230
1231
1232 if (
g_Game.IsMultiplayer())
1233 {
1234 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1235 }
1236 else
1237 {
1238 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1239 }
1240
1243 if (parent.MemoryPointExists(
slotName))
1244 {
1245 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1246 }
1247 else
1248 {
1250 }
1251
1253 PlaceOnSurface();
1254 }
1255
1257 {
1259 return battery;
1260 }
1261
1263 {
1264 return true;
1265 }
1266
1268 {
1269 return true;
1270 }
1271
1273 {
1274 return true;
1275 }
1276
1278 {
1280 }
1281
1283 {
1284 return true;
1285 }
1286
1288 {
1289 return GetCompEM().IsWorking();
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
1338 {
1340 }
1341
1343 {
1345 }
1346
1348 {
1350 }
1351
1353 {
1355 }
1356
1360 {
1361 if (!player)
1362 return false;
1363
1365 return false;
1366
1368
1370 }
1371
1373 {
1374 EntityAI hierarchyParent = GetHierarchyRoot();
1375 if (hierarchyParent.CanUseConstruction())
1376 return true;
1377
1378 if (BroadcastedBunker.Cast(hierarchyParent))
1379 return true;
1380
1381 return false;
1382 }
1383
1385 {
1387 }
1388
1390 {
1392 if (!battery)
1393 return 0.0;
1394
1395 float energy = battery.GetCompEM().GetEnergy();
1396 float energyMax = battery.GetCompEM().GetEnergyMax();
1397
1398 if (energyMax <= 0)
1399 return 0.0;
1400
1401 return (energy / energyMax) * 100.0;
1402 }
1403
1405 {
1408 }
1409
1411 {
1413 {
1416 }
1417 }
1418
1420 {
1421 super.SetActions();
1422
1424 }
1425
1427 {
1428 super.OnRPC(sender, rpc_type, ctx);
1429
1431 }
1432
1434 {
1435 super.OnStoreSave(ctx);
1436
1438 }
1439
1441 {
1442 if (!super.OnStoreLoad(ctx, version))
1443 return false;
1444
1446 return false;
1447
1448 return true;
1449 }
1450
1452 {
1453 super.AfterStoreLoad();
1454
1456 {
1458 {
1460 }
1461 else
1462 {
1464 }
1465 }
1466
1468 }
1469
1471 {
1472 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1473
1475 }
1476
1478 {
1479 super.OnVariablesSynchronized();
1480
1482 {
1484 if (uiAction != CodeLockUIAction.NONE)
1485 {
1487 }
1488 }
1489 }
1490
1492 {
1493 return true;
1494 }
1495
1497 {
1498 super.InitItemSounds();
1499
1507 }
1508
1509
1511 {
1512 GetInventory().CreateInInventory("Battery9V");
1513 }
1514}
1515
1517{
1518 override void Init()
1519 {
1521
1522 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1524
1525 if (bunkerConfig && bunkerConfig.bunkerSettings)
1526 {
1528 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1531 }
1532
1534 }
1535
1537 {
1538 return false;
1539 }
1540
1542 {
1543 return false;
1544 }
1545
1547 {
1548 return false;
1549 }
1550
1553
1555 {
1556 return false;
1557 }
1558
1560 {
1561 return true;
1562 }
1563
1565 {
1566 return true;
1567 }
1568
1570 {
1571 return true;
1572 }
1573
1575 {
1577 }
1578
1580 {
1584 }
1585}
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.