1096{
1099
1102
1105
1107
1108
1116
1118 {
1120 }
1121
1122 protected void Init()
1123 {
1126
1127 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1128 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1129 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1130 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1131 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1132 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1133 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1134 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1135 RegisterNetSyncVariableBool("m_Reversed");
1136 }
1137
1139 {
1140 super.EEInit();
1141
1142
1144 }
1145
1147 {
1148 super.EEItemLocationChanged(oldLoc, newLoc);
1149
1151 {
1153 {
1154 if (
g_Game.IsDedicatedServer())
1155 SetSynchDirty();
1156
1157
1159 }
1160 }
1161 }
1162
1164 {
1165 super.EEItemAttached(item, slot_name);
1166
1168 {
1171 {
1173 if (battery)
1174 {
1175 float batteryEnergy = battery.GetCompEM().GetEnergy();
1177 {
1179 GetCompEM().SwitchOn();
1180 }
1181
1183 }
1184 }
1185 }
1186 }
1187
1189 {
1190 super.EEItemDetached(item, slot_name);
1191
1193 {
1196 {
1198 GetCompEM().SwitchOff();
1199
1201 }
1202 }
1203 }
1204
1206 {
1207 super.OnWasAttached(parent, slot_id);
1208
1210 {
1213 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1214 {
1216 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1217 {
1219 GetCompEM().SwitchOn();
1220 }
1221
1222 if (parent && parent.CanUseConstruction())
1223 {
1225 if (buildingBase)
1226 {
1228 }
1229 }
1230 }
1231
1233 }
1234 }
1235
1237 {
1238 super.OnWasDetached(parent, slot_id);
1239
1241 {
1243 if (GetCompEM().IsWorking())
1244 GetCompEM().SwitchOff();
1245
1247 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1248 {
1252 }
1253
1255 }
1256 }
1257
1259 {
1261 return false;
1262
1263 return true;
1264 }
1265
1267 {
1270 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1271 {
1272 int doorIndex = -1;
1275 {
1276 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1277 {
1279 {
1280 doorIndex = doorInfoIndex;
1281 doorInfo = doorInfoData;
1282 break;
1283 }
1284 }
1285
1286 if (doorIndex != -1)
1287 break;
1288 }
1289
1290 if (doorIndex > -1)
1291 {
1293 }
1294
1297 if (rebuilding && doorInfo)
1298 {
1300 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1301 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1302 {
1303 m_Reversed = reversibleDoorPart.IsReversedLocal();
1304 }
1305 }
1306 }
1307 }
1308
1311 {
1313 {
1316 return false;
1317 }
1318
1319 return true;
1320 }
1321
1323 {
1324 super.OnWorkStop();
1325
1327 {
1330
1332 }
1333 }
1334
1336 {
1337 super.OnWorkStart();
1338
1340 {
1342 }
1343 }
1344
1345 override void OnWork(
float consumed_energy)
1346 {
1347 super.OnWork(consumed_energy);
1348
1350 {
1352 if (battery)
1353 {
1354 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1355 {
1356 GetCompEM().SwitchOff();
1358 }
1359
1362 {
1364 SetSynchDirty();
1365 }
1366 }
1367 }
1368 }
1369
1372 {
1374 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1375
1376
1377 if (
g_Game.IsMultiplayer())
1378 {
1379 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1380 }
1381 else
1382 {
1383 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1384 }
1385
1388 if (parent.MemoryPointExists(
slotName))
1389 {
1390 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1391 }
1392 else
1393 {
1395 }
1396
1398 PlaceOnSurface();
1399 }
1400
1402 {
1404 return battery;
1405 }
1406
1408 {
1409 return true;
1410 }
1411
1413 {
1414 return true;
1415 }
1416
1418 {
1419 return true;
1420 }
1421
1423 {
1425 }
1426
1428 {
1429 return true;
1430 }
1431
1433 {
1434 return GetCompEM().IsWorking();
1435 }
1436
1438 {
1440 }
1441
1443 {
1445 }
1446
1448 {
1450 }
1451
1453 {
1455 }
1456
1458 {
1460 }
1461
1463 {
1465 }
1466
1468 {
1470 }
1471
1473 {
1475 }
1476
1478 {
1480 }
1481
1483 {
1485 }
1486
1488 {
1490 }
1491
1493 {
1495 }
1496
1498 {
1500 }
1501
1505 {
1506 if (!player)
1507 return false;
1508
1510 return false;
1511
1513
1515 }
1516
1518 {
1519 EntityAI hierarchyParent = GetHierarchyRoot();
1520 if (hierarchyParent.CanUseConstruction())
1521 return true;
1522
1523 if (BroadcastedBunker.Cast(hierarchyParent))
1524 return true;
1525
1526 return false;
1527 }
1528
1530 {
1532 }
1533
1535 {
1537 if (!battery)
1538 return 0.0;
1539
1540 float energy = battery.GetCompEM().GetEnergy();
1541 float energyMax = battery.GetCompEM().GetEnergyMax();
1542
1543 if (energyMax <= 0)
1544 return 0.0;
1545
1546 return (energy / energyMax) * 100.0;
1547 }
1548
1550 {
1553 }
1554
1556 {
1558 {
1561 }
1562 }
1563
1565 {
1566 super.SetActions();
1567
1569 }
1570
1572 {
1573 super.OnRPC(sender, rpc_type, ctx);
1574
1576 }
1577
1579 {
1580 super.OnStoreSave(ctx);
1581
1583 }
1584
1586 {
1587 if (!super.OnStoreLoad(ctx, version))
1588 return false;
1589
1591 return false;
1592
1593 return true;
1594 }
1595
1597 {
1598 super.AfterStoreLoad();
1599
1601 {
1603 {
1605 }
1606 else
1607 {
1609 }
1610 }
1611
1613 }
1614
1616 {
1617 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1618
1620 }
1621
1623 {
1624 super.OnVariablesSynchronized();
1625
1627 {
1629 if (uiAction != CodeLockUIAction.NONE)
1630 {
1632 }
1633 }
1634 }
1635
1637 {
1638 return true;
1639 }
1640
1642 {
1643 super.InitItemSounds();
1644
1652 }
1653
1654
1656 {
1657 GetInventory().CreateInInventory("Battery9V");
1658 }
1659}
1660
1662{
1663 override void Init()
1664 {
1666
1667 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1669
1670 if (bunkerConfig && bunkerConfig.bunkerSettings)
1671 {
1673 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1676 }
1677
1679 }
1680
1682 {
1683 return false;
1684 }
1685
1687 {
1688 return false;
1689 }
1690
1692 {
1693 return false;
1694 }
1695
1698
1700 {
1701 return false;
1702 }
1703
1705 {
1706 return true;
1707 }
1708
1710 {
1711 return true;
1712 }
1713
1715 {
1716 return true;
1717 }
1718
1720 {
1722 }
1723
1725 {
1729 }
1730}
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.