946{
949
952
955
957
958
966
968 {
970 }
971
972 protected void Init()
973 {
976
977 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
978 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
979 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
980 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
981 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
982 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
983 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
984 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
985 RegisterNetSyncVariableBool("m_Reversed");
986 }
987
989 {
990 super.EEInit();
991
992
994 }
995
997 {
998 super.EEItemLocationChanged(oldLoc, newLoc);
999
1001 {
1003 {
1004 if (
g_Game.IsDedicatedServer())
1005 SetSynchDirty();
1006
1007
1009 }
1010 }
1011 }
1012
1014 {
1015 super.EEItemAttached(item, slot_name);
1016
1018 {
1021 {
1023 if (battery)
1024 {
1025 float batteryEnergy = battery.GetCompEM().GetEnergy();
1027 {
1029 GetCompEM().SwitchOn();
1030 }
1031
1033 }
1034 }
1035 }
1036 }
1037
1039 {
1040 super.EEItemDetached(item, slot_name);
1041
1043 {
1046 {
1048 GetCompEM().SwitchOff();
1049
1051 }
1052 }
1053 }
1054
1056 {
1057 super.OnWasAttached(parent, slot_id);
1058
1060 {
1063 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1064 {
1066 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1067 {
1069 GetCompEM().SwitchOn();
1070 }
1071
1072 if (parent && parent.CanUseConstruction())
1073 {
1075 if (buildingBase)
1076 {
1078 }
1079 }
1080 }
1081
1083 }
1084 }
1085
1087 {
1088 super.OnWasDetached(parent, slot_id);
1089
1091 {
1093 if (GetCompEM().IsWorking())
1094 GetCompEM().SwitchOff();
1095
1097 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1098 {
1102 }
1103
1105 }
1106 }
1107
1109 {
1111 return false;
1112
1113 return true;
1114 }
1115
1117 {
1120 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1121 {
1122 int doorIndex = -1;
1125 {
1126 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1127 {
1129 {
1130 doorIndex = doorInfoIndex;
1131 doorInfo = doorInfoData;
1132 break;
1133 }
1134 }
1135
1136 if (doorIndex != -1)
1137 break;
1138 }
1139
1140 if (doorIndex > -1)
1141 {
1143 }
1144
1147 if (rebuilding && doorInfo)
1148 {
1150 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1151 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1152 {
1153 m_Reversed = reversibleDoorPart.IsReversedLocal();
1154 }
1155 }
1156 }
1157 }
1158
1161 {
1163 {
1166 return false;
1167 }
1168
1169 return true;
1170 }
1171
1173 {
1174 super.OnWorkStop();
1175
1177 {
1180
1182 }
1183 }
1184
1186 {
1187 super.OnWorkStart();
1188
1190 {
1192 }
1193 }
1194
1195 override void OnWork(
float consumed_energy)
1196 {
1197 super.OnWork(consumed_energy);
1198
1200 {
1202 if (battery)
1203 {
1204 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1205 {
1206 GetCompEM().SwitchOff();
1208 }
1209
1212 {
1214 SetSynchDirty();
1215 }
1216 }
1217 }
1218 }
1219
1222 {
1224 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1225
1226
1227 if (
g_Game.IsMultiplayer())
1228 {
1229 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1230 }
1231 else
1232 {
1233 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1234 }
1235
1238 if (parent.MemoryPointExists(
slotName))
1239 {
1240 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1241 }
1242 else
1243 {
1245 }
1246
1248 PlaceOnSurface();
1249 }
1250
1252 {
1254 return battery;
1255 }
1256
1258 {
1259 return true;
1260 }
1261
1263 {
1264 return true;
1265 }
1266
1268 {
1269 return true;
1270 }
1271
1273 {
1275 }
1276
1278 {
1279 return true;
1280 }
1281
1283 {
1284 return GetCompEM().IsWorking();
1285 }
1286
1288 {
1290 }
1291
1293 {
1295 }
1296
1298 {
1300 }
1301
1303 {
1305 }
1306
1308 {
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
1355 {
1356 if (!player)
1357 return false;
1358
1360 return false;
1361
1363
1365 }
1366
1368 {
1369 EntityAI hierarchyParent = GetHierarchyRoot();
1370 if (hierarchyParent.CanUseConstruction())
1371 return true;
1372
1373 if (BroadcastedBunker.Cast(hierarchyParent))
1374 return true;
1375
1376 return false;
1377 }
1378
1380 {
1382 }
1383
1385 {
1387 if (!battery)
1388 return 0.0;
1389
1390 float energy = battery.GetCompEM().GetEnergy();
1391 float energyMax = battery.GetCompEM().GetEnergyMax();
1392
1393 if (energyMax <= 0)
1394 return 0.0;
1395
1396 return (energy / energyMax) * 100.0;
1397 }
1398
1400 {
1403 }
1404
1406 {
1408 {
1411 }
1412 }
1413
1415 {
1416 super.SetActions();
1417
1419 }
1420
1422 {
1423 super.OnRPC(sender, rpc_type, ctx);
1424
1426 }
1427
1429 {
1430 super.OnStoreSave(ctx);
1431
1433 }
1434
1436 {
1437 if (!super.OnStoreLoad(ctx, version))
1438 return false;
1439
1441 return false;
1442
1443 return true;
1444 }
1445
1447 {
1448 super.AfterStoreLoad();
1449
1451 {
1453 {
1455 }
1456 else
1457 {
1459 }
1460 }
1461
1463 }
1464
1466 {
1467 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1468
1470 }
1471
1473 {
1474 super.OnVariablesSynchronized();
1475
1477 {
1479 if (uiAction != CodeLockUIAction.NONE)
1480 {
1482 }
1483 }
1484 }
1485
1487 {
1488 return true;
1489 }
1490
1492 {
1493 super.InitItemSounds();
1494
1502 }
1503
1504
1506 {
1507 GetInventory().CreateInInventory("Battery9V");
1508 }
1509}
1510
1512{
1513 override void Init()
1514 {
1516
1517 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1519
1520 if (bunkerConfig && bunkerConfig.bunkerSettings)
1521 {
1523 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1526 }
1527
1529 }
1530
1532 {
1533 return false;
1534 }
1535
1537 {
1538 return false;
1539 }
1540
1542 {
1543 return false;
1544 }
1545
1548
1550 {
1551 return false;
1552 }
1553
1555 {
1556 return true;
1557 }
1558
1560 {
1561 return true;
1562 }
1563
1565 {
1566 return true;
1567 }
1568
1570 {
1572 }
1573
1575 {
1579 }
1580}
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.