1038{
1041
1044
1047
1049
1050
1058
1060 {
1062 }
1063
1064 protected void Init()
1065 {
1068
1069 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1070 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1071 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1072 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1073 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1074 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1075 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1076 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1077 RegisterNetSyncVariableBool("m_Reversed");
1078 }
1079
1081 {
1082 super.EEInit();
1083
1084
1086 }
1087
1089 {
1090 super.EEItemLocationChanged(oldLoc, newLoc);
1091
1093 {
1095 {
1096 if (
g_Game.IsDedicatedServer())
1097 SetSynchDirty();
1098
1099
1101 }
1102 }
1103 }
1104
1106 {
1107 super.EEItemAttached(item, slot_name);
1108
1110 {
1113 {
1115 if (battery)
1116 {
1117 float batteryEnergy = battery.GetCompEM().GetEnergy();
1119 {
1121 GetCompEM().SwitchOn();
1122 }
1123
1125 }
1126 }
1127 }
1128 }
1129
1131 {
1132 super.EEItemDetached(item, slot_name);
1133
1135 {
1138 {
1140 GetCompEM().SwitchOff();
1141
1143 }
1144 }
1145 }
1146
1148 {
1149 super.OnWasAttached(parent, slot_id);
1150
1152 {
1155 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1156 {
1158 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1159 {
1161 GetCompEM().SwitchOn();
1162 }
1163
1164 if (parent && parent.CanUseConstruction())
1165 {
1167 if (buildingBase)
1168 {
1170 }
1171 }
1172 }
1173
1175 }
1176 }
1177
1179 {
1180 super.OnWasDetached(parent, slot_id);
1181
1183 {
1185 if (GetCompEM().IsWorking())
1186 GetCompEM().SwitchOff();
1187
1189 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1190 {
1194 }
1195
1197 }
1198 }
1199
1201 {
1203 return false;
1204
1205 return true;
1206 }
1207
1209 {
1212 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1213 {
1214 int doorIndex = -1;
1217 {
1218 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1219 {
1221 {
1222 doorIndex = doorInfoIndex;
1223 doorInfo = doorInfoData;
1224 break;
1225 }
1226 }
1227
1228 if (doorIndex != -1)
1229 break;
1230 }
1231
1232 if (doorIndex > -1)
1233 {
1235 }
1236
1239 if (rebuilding && doorInfo)
1240 {
1242 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1243 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1244 {
1245 m_Reversed = reversibleDoorPart.IsReversedLocal();
1246 }
1247 }
1248 }
1249 }
1250
1253 {
1255 {
1258 return false;
1259 }
1260
1261 return true;
1262 }
1263
1265 {
1266 super.OnWorkStop();
1267
1269 {
1272
1274 }
1275 }
1276
1278 {
1279 super.OnWorkStart();
1280
1282 {
1284 }
1285 }
1286
1287 override void OnWork(
float consumed_energy)
1288 {
1289 super.OnWork(consumed_energy);
1290
1292 {
1294 if (battery)
1295 {
1296 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1297 {
1298 GetCompEM().SwitchOff();
1300 }
1301
1304 {
1306 SetSynchDirty();
1307 }
1308 }
1309 }
1310 }
1311
1314 {
1316 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1317
1318
1319 if (
g_Game.IsMultiplayer())
1320 {
1321 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1322 }
1323 else
1324 {
1325 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1326 }
1327
1330 if (parent.MemoryPointExists(
slotName))
1331 {
1332 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1333 }
1334 else
1335 {
1337 }
1338
1340 PlaceOnSurface();
1341 }
1342
1344 {
1346 return battery;
1347 }
1348
1350 {
1351 return true;
1352 }
1353
1355 {
1356 return true;
1357 }
1358
1360 {
1361 return true;
1362 }
1363
1365 {
1367 }
1368
1370 {
1371 return true;
1372 }
1373
1375 {
1376 return GetCompEM().IsWorking();
1377 }
1378
1380 {
1382 }
1383
1385 {
1387 }
1388
1390 {
1392 }
1393
1395 {
1397 }
1398
1400 {
1402 }
1403
1405 {
1407 }
1408
1410 {
1412 }
1413
1415 {
1417 }
1418
1420 {
1422 }
1423
1425 {
1427 }
1428
1430 {
1432 }
1433
1435 {
1437 }
1438
1440 {
1442 }
1443
1447 {
1448 if (!player)
1449 return false;
1450
1452 return false;
1453
1455
1457 }
1458
1460 {
1461 EntityAI hierarchyParent = GetHierarchyRoot();
1462 if (hierarchyParent.CanUseConstruction())
1463 return true;
1464
1465 if (BroadcastedBunker.Cast(hierarchyParent))
1466 return true;
1467
1468 return false;
1469 }
1470
1472 {
1474 }
1475
1477 {
1479 if (!battery)
1480 return 0.0;
1481
1482 float energy = battery.GetCompEM().GetEnergy();
1483 float energyMax = battery.GetCompEM().GetEnergyMax();
1484
1485 if (energyMax <= 0)
1486 return 0.0;
1487
1488 return (energy / energyMax) * 100.0;
1489 }
1490
1492 {
1495 }
1496
1498 {
1500 {
1503 }
1504 }
1505
1507 {
1508 super.SetActions();
1509
1511 }
1512
1514 {
1515 super.OnRPC(sender, rpc_type, ctx);
1516
1518 }
1519
1521 {
1522 super.OnStoreSave(ctx);
1523
1525 }
1526
1528 {
1529 if (!super.OnStoreLoad(ctx, version))
1530 return false;
1531
1533 return false;
1534
1535 return true;
1536 }
1537
1539 {
1540 super.AfterStoreLoad();
1541
1543 {
1545 {
1547 }
1548 else
1549 {
1551 }
1552 }
1553
1555 }
1556
1558 {
1559 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1560
1562 }
1563
1565 {
1566 super.OnVariablesSynchronized();
1567
1569 {
1571 if (uiAction != CodeLockUIAction.NONE)
1572 {
1574 }
1575 }
1576 }
1577
1579 {
1580 return true;
1581 }
1582
1584 {
1585 super.InitItemSounds();
1586
1594 }
1595
1596
1598 {
1599 GetInventory().CreateInInventory("Battery9V");
1600 }
1601}
1602
1604{
1605 override void Init()
1606 {
1608
1609 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1611
1612 if (bunkerConfig && bunkerConfig.bunkerSettings)
1613 {
1615 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1618 }
1619
1621 }
1622
1624 {
1625 return false;
1626 }
1627
1629 {
1630 return false;
1631 }
1632
1634 {
1635 return false;
1636 }
1637
1640
1642 {
1643 return false;
1644 }
1645
1647 {
1648 return true;
1649 }
1650
1652 {
1653 return true;
1654 }
1655
1657 {
1658 return true;
1659 }
1660
1662 {
1664 }
1665
1667 {
1671 }
1672}
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.