971{
974
977
980
982
983
991
993 {
995 }
996
997 protected void Init()
998 {
1001
1002 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
1003 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
1004 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
1005 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
1006 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
1007 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
1008 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
1009 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
1010 RegisterNetSyncVariableBool("m_Reversed");
1011 }
1012
1014 {
1015 super.EEInit();
1016
1017
1019 }
1020
1022 {
1023 super.EEItemLocationChanged(oldLoc, newLoc);
1024
1026 {
1028 {
1029 if (
g_Game.IsDedicatedServer())
1030 SetSynchDirty();
1031
1032
1034 }
1035 }
1036 }
1037
1039 {
1040 super.EEItemAttached(item, slot_name);
1041
1043 {
1046 {
1048 if (battery)
1049 {
1050 float batteryEnergy = battery.GetCompEM().GetEnergy();
1052 {
1054 GetCompEM().SwitchOn();
1055 }
1056
1058 }
1059 }
1060 }
1061 }
1062
1064 {
1065 super.EEItemDetached(item, slot_name);
1066
1068 {
1071 {
1073 GetCompEM().SwitchOff();
1074
1076 }
1077 }
1078 }
1079
1081 {
1082 super.OnWasAttached(parent, slot_id);
1083
1085 {
1088 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1089 {
1091 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1092 {
1094 GetCompEM().SwitchOn();
1095 }
1096
1097 if (parent && parent.CanUseConstruction())
1098 {
1100 if (buildingBase)
1101 {
1103 }
1104 }
1105 }
1106
1108 }
1109 }
1110
1112 {
1113 super.OnWasDetached(parent, slot_id);
1114
1116 {
1118 if (GetCompEM().IsWorking())
1119 GetCompEM().SwitchOff();
1120
1122 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1123 {
1127 }
1128
1130 }
1131 }
1132
1134 {
1136 return false;
1137
1138 return true;
1139 }
1140
1142 {
1145 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1146 {
1147 int doorIndex = -1;
1150 {
1151 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1152 {
1154 {
1155 doorIndex = doorInfoIndex;
1156 doorInfo = doorInfoData;
1157 break;
1158 }
1159 }
1160
1161 if (doorIndex != -1)
1162 break;
1163 }
1164
1165 if (doorIndex > -1)
1166 {
1168 }
1169
1172 if (rebuilding && doorInfo)
1173 {
1175 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1176 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1177 {
1178 m_Reversed = reversibleDoorPart.IsReversedLocal();
1179 }
1180 }
1181 }
1182 }
1183
1186 {
1188 {
1191 return false;
1192 }
1193
1194 return true;
1195 }
1196
1198 {
1199 super.OnWorkStop();
1200
1202 {
1205
1207 }
1208 }
1209
1211 {
1212 super.OnWorkStart();
1213
1215 {
1217 }
1218 }
1219
1220 override void OnWork(
float consumed_energy)
1221 {
1222 super.OnWork(consumed_energy);
1223
1225 {
1227 if (battery)
1228 {
1229 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1230 {
1231 GetCompEM().SwitchOff();
1233 }
1234
1237 {
1239 SetSynchDirty();
1240 }
1241 }
1242 }
1243 }
1244
1247 {
1249 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1250
1251
1252 if (
g_Game.IsMultiplayer())
1253 {
1254 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1255 }
1256 else
1257 {
1258 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1259 }
1260
1263 if (parent.MemoryPointExists(
slotName))
1264 {
1265 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1266 }
1267 else
1268 {
1270 }
1271
1273 PlaceOnSurface();
1274 }
1275
1277 {
1279 return battery;
1280 }
1281
1283 {
1284 return true;
1285 }
1286
1288 {
1289 return true;
1290 }
1291
1293 {
1294 return true;
1295 }
1296
1298 {
1300 }
1301
1303 {
1304 return true;
1305 }
1306
1308 {
1309 return GetCompEM().IsWorking();
1310 }
1311
1313 {
1315 }
1316
1318 {
1320 }
1321
1323 {
1325 }
1326
1328 {
1330 }
1331
1333 {
1335 }
1336
1338 {
1340 }
1341
1343 {
1345 }
1346
1348 {
1350 }
1351
1353 {
1355 }
1356
1358 {
1360 }
1361
1363 {
1365 }
1366
1368 {
1370 }
1371
1373 {
1375 }
1376
1380 {
1381 if (!player)
1382 return false;
1383
1385 return false;
1386
1388
1390 }
1391
1393 {
1394 EntityAI hierarchyParent = GetHierarchyRoot();
1395 if (hierarchyParent.CanUseConstruction())
1396 return true;
1397
1398 if (BroadcastedBunker.Cast(hierarchyParent))
1399 return true;
1400
1401 return false;
1402 }
1403
1405 {
1407 }
1408
1410 {
1412 if (!battery)
1413 return 0.0;
1414
1415 float energy = battery.GetCompEM().GetEnergy();
1416 float energyMax = battery.GetCompEM().GetEnergyMax();
1417
1418 if (energyMax <= 0)
1419 return 0.0;
1420
1421 return (energy / energyMax) * 100.0;
1422 }
1423
1425 {
1428 }
1429
1431 {
1433 {
1436 }
1437 }
1438
1440 {
1441 super.SetActions();
1442
1444 }
1445
1447 {
1448 super.OnRPC(sender, rpc_type, ctx);
1449
1451 }
1452
1454 {
1455 super.OnStoreSave(ctx);
1456
1458 }
1459
1461 {
1462 if (!super.OnStoreLoad(ctx, version))
1463 return false;
1464
1466 return false;
1467
1468 return true;
1469 }
1470
1472 {
1473 super.AfterStoreLoad();
1474
1476 {
1478 {
1480 }
1481 else
1482 {
1484 }
1485 }
1486
1488 }
1489
1491 {
1492 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1493
1495 }
1496
1498 {
1499 super.OnVariablesSynchronized();
1500
1502 {
1504 if (uiAction != CodeLockUIAction.NONE)
1505 {
1507 }
1508 }
1509 }
1510
1512 {
1513 return true;
1514 }
1515
1517 {
1518 super.InitItemSounds();
1519
1527 }
1528
1529
1531 {
1532 GetInventory().CreateInInventory("Battery9V");
1533 }
1534}
1535
1537{
1538 override void Init()
1539 {
1541
1542 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1544
1545 if (bunkerConfig && bunkerConfig.bunkerSettings)
1546 {
1548 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1551 }
1552
1554 }
1555
1557 {
1558 return false;
1559 }
1560
1562 {
1563 return false;
1564 }
1565
1567 {
1568 return false;
1569 }
1570
1573
1575 {
1576 return false;
1577 }
1578
1580 {
1581 return true;
1582 }
1583
1585 {
1586 return true;
1587 }
1588
1590 {
1591 return true;
1592 }
1593
1595 {
1597 }
1598
1600 {
1604 }
1605}
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.