1110{
1113
1116
1119
1121
1122
1130
1132 {
1134 }
1135
1136 protected void Init()
1137 {
1140
1141 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1142 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1143 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1144 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1145 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1146 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1147 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1148 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1149 RegisterNetSyncVariableBool("m_Reversed");
1150 }
1151
1153 {
1154 super.EEInit();
1155
1156
1158 }
1159
1161 {
1162 super.EEItemLocationChanged(oldLoc, newLoc);
1163
1165 {
1167 {
1168 if (
g_Game.IsDedicatedServer())
1169 SetSynchDirty();
1170
1171
1173 }
1174 }
1175 }
1176
1178 {
1179 super.EEItemAttached(item, slot_name);
1180
1182 {
1185 {
1187 if (battery)
1188 {
1189 float batteryEnergy = battery.GetCompEM().GetEnergy();
1191 {
1193 GetCompEM().SwitchOn();
1194 }
1195
1197 }
1198 }
1199 }
1200 }
1201
1203 {
1204 super.EEItemDetached(item, slot_name);
1205
1207 {
1210 {
1212 GetCompEM().SwitchOff();
1213
1215 }
1216 }
1217 }
1218
1220 {
1221 super.OnWasAttached(parent, slot_id);
1222
1224 {
1227 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1228 {
1230 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1231 {
1233 GetCompEM().SwitchOn();
1234 }
1235
1236 if (parent && parent.CanUseConstruction())
1237 {
1239 if (buildingBase)
1240 {
1242 }
1243 }
1244 }
1245
1247 }
1248 }
1249
1251 {
1252 super.OnWasDetached(parent, slot_id);
1253
1255 {
1257 if (GetCompEM().IsWorking())
1258 GetCompEM().SwitchOff();
1259
1261 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1262 {
1266 }
1267
1269 }
1270 }
1271
1273 {
1275 return false;
1276
1277 return true;
1278 }
1279
1281 {
1284 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1285 {
1286 int doorIndex = -1;
1289 {
1290 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1291 {
1293 {
1294 doorIndex = doorInfoIndex;
1295 doorInfo = doorInfoData;
1296 break;
1297 }
1298 }
1299
1300 if (doorIndex != -1)
1301 break;
1302 }
1303
1304 if (doorIndex > -1)
1305 {
1307 }
1308
1311 if (rebuilding && doorInfo)
1312 {
1314 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1315 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1316 {
1317 m_Reversed = reversibleDoorPart.IsReversedLocal();
1318 }
1319 }
1320 }
1321 }
1322
1325 {
1327 {
1330 return false;
1331 }
1332
1333 return true;
1334 }
1335
1337 {
1338 super.OnWorkStop();
1339
1341 {
1344
1346 }
1347 }
1348
1350 {
1351 super.OnWorkStart();
1352
1354 {
1356 }
1357 }
1358
1359 override void OnWork(
float consumed_energy)
1360 {
1361 super.OnWork(consumed_energy);
1362
1364 {
1366 if (battery)
1367 {
1368 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1369 {
1370 GetCompEM().SwitchOff();
1372 }
1373
1376 {
1378 SetSynchDirty();
1379 }
1380 }
1381 }
1382 }
1383
1386 {
1388 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1389
1390
1391 if (
g_Game.IsMultiplayer())
1392 {
1393 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1394 }
1395 else
1396 {
1397 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1398 }
1399
1402 if (parent.MemoryPointExists(
slotName))
1403 {
1404 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1405 }
1406 else
1407 {
1409 }
1410
1412 PlaceOnSurface();
1413 }
1414
1416 {
1418 return battery;
1419 }
1420
1422 {
1423 return true;
1424 }
1425
1427 {
1428 return true;
1429 }
1430
1432 {
1433 return true;
1434 }
1435
1437 {
1439 }
1440
1442 {
1443 return true;
1444 }
1445
1447 {
1448 return GetCompEM().IsWorking();
1449 }
1450
1452 {
1454 }
1455
1457 {
1459 }
1460
1462 {
1464 }
1465
1467 {
1469 }
1470
1472 {
1474 }
1475
1477 {
1479 }
1480
1482 {
1484 }
1485
1487 {
1489 }
1490
1492 {
1494 }
1495
1497 {
1499 }
1500
1502 {
1504 }
1505
1507 {
1509 }
1510
1512 {
1514 }
1515
1519 {
1520 if (!player)
1521 return false;
1522
1524 return false;
1525
1527
1529 }
1530
1532 {
1533 EntityAI hierarchyParent = GetHierarchyRoot();
1534 if (hierarchyParent.CanUseConstruction())
1535 return true;
1536
1537 if (BroadcastedBunker.Cast(hierarchyParent))
1538 return true;
1539
1540 return false;
1541 }
1542
1544 {
1546 }
1547
1549 {
1551 if (!battery)
1552 return 0.0;
1553
1554 float energy = battery.GetCompEM().GetEnergy();
1555 float energyMax = battery.GetCompEM().GetEnergyMax();
1556
1557 if (energyMax <= 0)
1558 return 0.0;
1559
1560 return (energy / energyMax) * 100.0;
1561 }
1562
1564 {
1567 }
1568
1570 {
1572 {
1575 }
1576 }
1577
1579 {
1580 super.SetActions();
1581
1583 }
1584
1586 {
1587 super.OnRPC(sender, rpc_type, ctx);
1588
1590 }
1591
1593 {
1594 super.OnStoreSave(ctx);
1595
1597 }
1598
1600 {
1601 if (!super.OnStoreLoad(ctx, version))
1602 return false;
1603
1605 return false;
1606
1607 return true;
1608 }
1609
1611 {
1612 super.AfterStoreLoad();
1613
1615 {
1617 {
1619 }
1620 else
1621 {
1623 }
1624 }
1625
1627 }
1628
1630 {
1631 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1632
1634 }
1635
1637 {
1638 super.OnVariablesSynchronized();
1639
1641 {
1643 if (uiAction != CodeLockUIAction.NONE)
1644 {
1646 }
1647 }
1648 }
1649
1651 {
1652 return true;
1653 }
1654
1656 {
1657 super.InitItemSounds();
1658
1666 }
1667
1668
1670 {
1671 GetInventory().CreateInInventory("Battery9V");
1672 }
1673}
1674
1676{
1677 override void Init()
1678 {
1680
1681 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1683
1684 if (bunkerConfig && bunkerConfig.bunkerSettings)
1685 {
1687 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1690 }
1691
1693 }
1694
1696 {
1697 return false;
1698 }
1699
1701 {
1702 return false;
1703 }
1704
1706 {
1707 return false;
1708 }
1709
1712
1714 {
1715 return false;
1716 }
1717
1719 {
1720 return true;
1721 }
1722
1724 {
1725 return true;
1726 }
1727
1729 {
1730 return true;
1731 }
1732
1734 {
1736 }
1737
1739 {
1743 }
1744}
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.