1029{
1032
1035
1038
1040
1041
1049
1051 {
1053 }
1054
1055 protected void Init()
1056 {
1059
1060 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1061 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1062 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1063 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1064 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1065 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1066 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1067 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1068 RegisterNetSyncVariableBool("m_Reversed");
1069 }
1070
1072 {
1073 super.EEInit();
1074
1075
1077 }
1078
1080 {
1081 super.EEItemLocationChanged(oldLoc, newLoc);
1082
1084 {
1086 {
1087 if (
g_Game.IsDedicatedServer())
1088 SetSynchDirty();
1089
1090
1092 }
1093 }
1094 }
1095
1097 {
1098 super.EEItemAttached(item, slot_name);
1099
1101 {
1104 {
1106 if (battery)
1107 {
1108 float batteryEnergy = battery.GetCompEM().GetEnergy();
1110 {
1112 GetCompEM().SwitchOn();
1113 }
1114
1116 }
1117 }
1118 }
1119 }
1120
1122 {
1123 super.EEItemDetached(item, slot_name);
1124
1126 {
1129 {
1131 GetCompEM().SwitchOff();
1132
1134 }
1135 }
1136 }
1137
1139 {
1140 super.OnWasAttached(parent, slot_id);
1141
1143 {
1146 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1147 {
1149 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1150 {
1152 GetCompEM().SwitchOn();
1153 }
1154
1155 if (parent && parent.CanUseConstruction())
1156 {
1158 if (buildingBase)
1159 {
1161 }
1162 }
1163 }
1164
1166 }
1167 }
1168
1170 {
1171 super.OnWasDetached(parent, slot_id);
1172
1174 {
1176 if (GetCompEM().IsWorking())
1177 GetCompEM().SwitchOff();
1178
1180 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1181 {
1185 }
1186
1188 }
1189 }
1190
1192 {
1194 return false;
1195
1196 return true;
1197 }
1198
1200 {
1203 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1204 {
1205 int doorIndex = -1;
1208 {
1209 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1210 {
1212 {
1213 doorIndex = doorInfoIndex;
1214 doorInfo = doorInfoData;
1215 break;
1216 }
1217 }
1218
1219 if (doorIndex != -1)
1220 break;
1221 }
1222
1223 if (doorIndex > -1)
1224 {
1226 }
1227
1230 if (rebuilding && doorInfo)
1231 {
1233 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1234 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1235 {
1236 m_Reversed = reversibleDoorPart.IsReversedLocal();
1237 }
1238 }
1239 }
1240 }
1241
1244 {
1246 {
1249 return false;
1250 }
1251
1252 return true;
1253 }
1254
1256 {
1257 super.OnWorkStop();
1258
1260 {
1263
1265 }
1266 }
1267
1269 {
1270 super.OnWorkStart();
1271
1273 {
1275 }
1276 }
1277
1278 override void OnWork(
float consumed_energy)
1279 {
1280 super.OnWork(consumed_energy);
1281
1283 {
1285 if (battery)
1286 {
1287 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1288 {
1289 GetCompEM().SwitchOff();
1291 }
1292
1295 {
1297 SetSynchDirty();
1298 }
1299 }
1300 }
1301 }
1302
1305 {
1307 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1308
1309
1310 if (
g_Game.IsMultiplayer())
1311 {
1312 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1313 }
1314 else
1315 {
1316 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1317 }
1318
1321 if (parent.MemoryPointExists(
slotName))
1322 {
1323 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1324 }
1325 else
1326 {
1328 }
1329
1331 PlaceOnSurface();
1332 }
1333
1335 {
1337 return battery;
1338 }
1339
1341 {
1342 return true;
1343 }
1344
1346 {
1347 return true;
1348 }
1349
1351 {
1352 return true;
1353 }
1354
1356 {
1358 }
1359
1361 {
1362 return true;
1363 }
1364
1366 {
1367 return GetCompEM().IsWorking();
1368 }
1369
1371 {
1373 }
1374
1376 {
1378 }
1379
1381 {
1383 }
1384
1386 {
1388 }
1389
1391 {
1393 }
1394
1396 {
1398 }
1399
1401 {
1403 }
1404
1406 {
1408 }
1409
1411 {
1413 }
1414
1416 {
1418 }
1419
1421 {
1423 }
1424
1426 {
1428 }
1429
1431 {
1433 }
1434
1438 {
1439 if (!player)
1440 return false;
1441
1443 return false;
1444
1446
1448 }
1449
1451 {
1452 EntityAI hierarchyParent = GetHierarchyRoot();
1453 if (hierarchyParent.CanUseConstruction())
1454 return true;
1455
1456 if (BroadcastedBunker.Cast(hierarchyParent))
1457 return true;
1458
1459 return false;
1460 }
1461
1463 {
1465 }
1466
1468 {
1470 if (!battery)
1471 return 0.0;
1472
1473 float energy = battery.GetCompEM().GetEnergy();
1474 float energyMax = battery.GetCompEM().GetEnergyMax();
1475
1476 if (energyMax <= 0)
1477 return 0.0;
1478
1479 return (energy / energyMax) * 100.0;
1480 }
1481
1483 {
1486 }
1487
1489 {
1491 {
1494 }
1495 }
1496
1498 {
1499 super.SetActions();
1500
1502 }
1503
1505 {
1506 super.OnRPC(sender, rpc_type, ctx);
1507
1509 }
1510
1512 {
1513 super.OnStoreSave(ctx);
1514
1516 }
1517
1519 {
1520 if (!super.OnStoreLoad(ctx, version))
1521 return false;
1522
1524 return false;
1525
1526 return true;
1527 }
1528
1530 {
1531 super.AfterStoreLoad();
1532
1534 {
1536 {
1538 }
1539 else
1540 {
1542 }
1543 }
1544
1546 }
1547
1549 {
1550 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1551
1553 }
1554
1556 {
1557 super.OnVariablesSynchronized();
1558
1560 {
1562 if (uiAction != CodeLockUIAction.NONE)
1563 {
1565 }
1566 }
1567 }
1568
1570 {
1571 return true;
1572 }
1573
1575 {
1576 super.InitItemSounds();
1577
1585 }
1586
1587
1589 {
1590 GetInventory().CreateInInventory("Battery9V");
1591 }
1592}
1593
1595{
1596 override void Init()
1597 {
1599
1600 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1602
1603 if (bunkerConfig && bunkerConfig.bunkerSettings)
1604 {
1606 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1609 }
1610
1612 }
1613
1615 {
1616 return false;
1617 }
1618
1620 {
1621 return false;
1622 }
1623
1625 {
1626 return false;
1627 }
1628
1631
1633 {
1634 return false;
1635 }
1636
1638 {
1639 return true;
1640 }
1641
1643 {
1644 return true;
1645 }
1646
1648 {
1649 return true;
1650 }
1651
1653 {
1655 }
1656
1658 {
1662 }
1663}
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.