1008{
1011
1014
1017
1019
1020
1028
1030 {
1032 }
1033
1034 protected void Init()
1035 {
1038
1039 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1040 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1041 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1042 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1043 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1044 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1045 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1046 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1047 RegisterNetSyncVariableBool("m_Reversed");
1048 }
1049
1051 {
1052 super.EEInit();
1053
1054
1056 }
1057
1059 {
1060 super.EEItemLocationChanged(oldLoc, newLoc);
1061
1063 {
1065 {
1066 if (
g_Game.IsDedicatedServer())
1067 SetSynchDirty();
1068
1069
1071 }
1072 }
1073 }
1074
1076 {
1077 super.EEItemAttached(item, slot_name);
1078
1080 {
1083 {
1085 if (battery)
1086 {
1087 float batteryEnergy = battery.GetCompEM().GetEnergy();
1089 {
1091 GetCompEM().SwitchOn();
1092 }
1093
1095 }
1096 }
1097 }
1098 }
1099
1101 {
1102 super.EEItemDetached(item, slot_name);
1103
1105 {
1108 {
1110 GetCompEM().SwitchOff();
1111
1113 }
1114 }
1115 }
1116
1118 {
1119 super.OnWasAttached(parent, slot_id);
1120
1122 {
1125 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1126 {
1128 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1129 {
1131 GetCompEM().SwitchOn();
1132 }
1133
1134 if (parent && parent.CanUseConstruction())
1135 {
1137 if (buildingBase)
1138 {
1140 }
1141 }
1142 }
1143
1145 }
1146 }
1147
1149 {
1150 super.OnWasDetached(parent, slot_id);
1151
1153 {
1155 if (GetCompEM().IsWorking())
1156 GetCompEM().SwitchOff();
1157
1159 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1160 {
1164 }
1165
1167 }
1168 }
1169
1171 {
1173 return false;
1174
1175 return true;
1176 }
1177
1179 {
1182 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1183 {
1184 int doorIndex = -1;
1187 {
1188 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1189 {
1191 {
1192 doorIndex = doorInfoIndex;
1193 doorInfo = doorInfoData;
1194 break;
1195 }
1196 }
1197
1198 if (doorIndex != -1)
1199 break;
1200 }
1201
1202 if (doorIndex > -1)
1203 {
1205 }
1206
1209 if (rebuilding && doorInfo)
1210 {
1212 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1213 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1214 {
1215 m_Reversed = reversibleDoorPart.IsReversedLocal();
1216 }
1217 }
1218 }
1219 }
1220
1223 {
1225 {
1228 return false;
1229 }
1230
1231 return true;
1232 }
1233
1235 {
1236 super.OnWorkStop();
1237
1239 {
1242
1244 }
1245 }
1246
1248 {
1249 super.OnWorkStart();
1250
1252 {
1254 }
1255 }
1256
1257 override void OnWork(
float consumed_energy)
1258 {
1259 super.OnWork(consumed_energy);
1260
1262 {
1264 if (battery)
1265 {
1266 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1267 {
1268 GetCompEM().SwitchOff();
1270 }
1271
1274 {
1276 SetSynchDirty();
1277 }
1278 }
1279 }
1280 }
1281
1284 {
1286 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1287
1288
1289 if (
g_Game.IsMultiplayer())
1290 {
1291 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1292 }
1293 else
1294 {
1295 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1296 }
1297
1300 if (parent.MemoryPointExists(
slotName))
1301 {
1302 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1303 }
1304 else
1305 {
1307 }
1308
1310 PlaceOnSurface();
1311 }
1312
1314 {
1316 return battery;
1317 }
1318
1320 {
1321 return true;
1322 }
1323
1325 {
1326 return true;
1327 }
1328
1330 {
1331 return true;
1332 }
1333
1335 {
1337 }
1338
1340 {
1341 return true;
1342 }
1343
1345 {
1346 return GetCompEM().IsWorking();
1347 }
1348
1350 {
1352 }
1353
1355 {
1357 }
1358
1360 {
1362 }
1363
1365 {
1367 }
1368
1370 {
1372 }
1373
1375 {
1377 }
1378
1380 {
1382 }
1383
1385 {
1387 }
1388
1390 {
1392 }
1393
1395 {
1397 }
1398
1400 {
1402 }
1403
1405 {
1407 }
1408
1410 {
1412 }
1413
1417 {
1418 if (!player)
1419 return false;
1420
1422 return false;
1423
1425
1427 }
1428
1430 {
1431 EntityAI hierarchyParent = GetHierarchyRoot();
1432 if (hierarchyParent.CanUseConstruction())
1433 return true;
1434
1435 if (BroadcastedBunker.Cast(hierarchyParent))
1436 return true;
1437
1438 return false;
1439 }
1440
1442 {
1444 }
1445
1447 {
1449 if (!battery)
1450 return 0.0;
1451
1452 float energy = battery.GetCompEM().GetEnergy();
1453 float energyMax = battery.GetCompEM().GetEnergyMax();
1454
1455 if (energyMax <= 0)
1456 return 0.0;
1457
1458 return (energy / energyMax) * 100.0;
1459 }
1460
1462 {
1465 }
1466
1468 {
1470 {
1473 }
1474 }
1475
1477 {
1478 super.SetActions();
1479
1481 }
1482
1484 {
1485 super.OnRPC(sender, rpc_type, ctx);
1486
1488 }
1489
1491 {
1492 super.OnStoreSave(ctx);
1493
1495 }
1496
1498 {
1499 if (!super.OnStoreLoad(ctx, version))
1500 return false;
1501
1503 return false;
1504
1505 return true;
1506 }
1507
1509 {
1510 super.AfterStoreLoad();
1511
1513 {
1515 {
1517 }
1518 else
1519 {
1521 }
1522 }
1523
1525 }
1526
1528 {
1529 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1530
1532 }
1533
1535 {
1536 super.OnVariablesSynchronized();
1537
1539 {
1541 if (uiAction != CodeLockUIAction.NONE)
1542 {
1544 }
1545 }
1546 }
1547
1549 {
1550 return true;
1551 }
1552
1554 {
1555 super.InitItemSounds();
1556
1564 }
1565
1566
1568 {
1569 GetInventory().CreateInInventory("Battery9V");
1570 }
1571}
1572
1574{
1575 override void Init()
1576 {
1578
1579 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1581
1582 if (bunkerConfig && bunkerConfig.bunkerSettings)
1583 {
1585 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1588 }
1589
1591 }
1592
1594 {
1595 return false;
1596 }
1597
1599 {
1600 return false;
1601 }
1602
1604 {
1605 return false;
1606 }
1607
1610
1612 {
1613 return false;
1614 }
1615
1617 {
1618 return true;
1619 }
1620
1622 {
1623 return true;
1624 }
1625
1627 {
1628 return true;
1629 }
1630
1632 {
1634 }
1635
1637 {
1641 }
1642}
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.