926{
929
932
935
937
938
946
948 {
950 }
951
952 protected void Init()
953 {
956
957 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
958 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
959 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
960 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
961 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
962 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
963 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
964 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
965 RegisterNetSyncVariableBool("m_Reversed");
966 }
967
969 {
970 super.EEInit();
971
972
974 }
975
977 {
978 super.EEItemLocationChanged(oldLoc, newLoc);
979
981 {
983 {
984 if (
g_Game.IsDedicatedServer())
985 SetSynchDirty();
986
987
989 }
990 }
991 }
992
994 {
995 super.EEItemAttached(item, slot_name);
996
998 {
1001 {
1003 if (battery)
1004 {
1005 float batteryEnergy = battery.GetCompEM().GetEnergy();
1007 {
1009 GetCompEM().SwitchOn();
1010 }
1011
1013 }
1014 }
1015 }
1016 }
1017
1019 {
1020 super.EEItemDetached(item, slot_name);
1021
1023 {
1026 {
1028 GetCompEM().SwitchOff();
1029
1031 }
1032 }
1033 }
1034
1036 {
1037 super.OnWasAttached(parent, slot_id);
1038
1040 {
1043 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1044 {
1046 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1047 {
1049 GetCompEM().SwitchOn();
1050 }
1051
1052 if (parent && parent.CanUseConstruction())
1053 {
1055 if (buildingBase)
1056 {
1058 }
1059 }
1060 }
1061
1063 }
1064 }
1065
1067 {
1068 super.OnWasDetached(parent, slot_id);
1069
1071 {
1073 if (GetCompEM().IsWorking())
1074 GetCompEM().SwitchOff();
1075
1077 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1078 {
1082 }
1083
1085 }
1086 }
1087
1089 {
1091 return false;
1092
1093 return true;
1094 }
1095
1097 {
1100 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1101 {
1102 int doorIndex = -1;
1105 {
1106 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1107 {
1109 {
1110 doorIndex = doorInfoIndex;
1111 doorInfo = doorInfoData;
1112 break;
1113 }
1114 }
1115
1116 if (doorIndex != -1)
1117 break;
1118 }
1119
1120 if (doorIndex > -1)
1121 {
1123 }
1124
1127 if (rebuilding && doorInfo)
1128 {
1130 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1131 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1132 {
1133 m_Reversed = reversibleDoorPart.IsReversedLocal();
1134 }
1135 }
1136 }
1137 }
1138
1141 {
1143 {
1146 return false;
1147 }
1148
1149 return true;
1150 }
1151
1153 {
1154 super.OnWorkStop();
1155
1157 {
1160
1162 }
1163 }
1164
1166 {
1167 super.OnWorkStart();
1168
1170 {
1172 }
1173 }
1174
1175 override void OnWork(
float consumed_energy)
1176 {
1177 super.OnWork(consumed_energy);
1178
1180 {
1182 if (battery)
1183 {
1184 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1185 {
1186 GetCompEM().SwitchOff();
1188 }
1189
1192 {
1194 SetSynchDirty();
1195 }
1196 }
1197 }
1198 }
1199
1202 {
1204 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1205
1206
1207 if (
g_Game.IsMultiplayer())
1208 {
1209 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1210 }
1211 else
1212 {
1213 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1214 }
1215
1218 if (parent.MemoryPointExists(
slotName))
1219 {
1220 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1221 }
1222 else
1223 {
1225 }
1226
1228 PlaceOnSurface();
1229 }
1230
1232 {
1234 return battery;
1235 }
1236
1238 {
1239 return true;
1240 }
1241
1243 {
1244 return true;
1245 }
1246
1248 {
1249 return true;
1250 }
1251
1253 {
1255 }
1256
1258 {
1259 return true;
1260 }
1261
1263 {
1264 return GetCompEM().IsWorking();
1265 }
1266
1268 {
1270 }
1271
1273 {
1275 }
1276
1278 {
1280 }
1281
1283 {
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
1335 {
1336 if (!player)
1337 return false;
1338
1340 return false;
1341
1343
1345 }
1346
1348 {
1349 EntityAI hierarchyParent = GetHierarchyRoot();
1350 if (hierarchyParent.CanUseConstruction())
1351 return true;
1352
1353 if (BroadcastedBunker.Cast(hierarchyParent))
1354 return true;
1355
1356 return false;
1357 }
1358
1360 {
1362 }
1363
1365 {
1367 if (!battery)
1368 return 0.0;
1369
1370 float energy = battery.GetCompEM().GetEnergy();
1371 float energyMax = battery.GetCompEM().GetEnergyMax();
1372
1373 if (energyMax <= 0)
1374 return 0.0;
1375
1376 return (energy / energyMax) * 100.0;
1377 }
1378
1380 {
1383 }
1384
1386 {
1388 {
1391 }
1392 }
1393
1395 {
1396 super.SetActions();
1397
1399 }
1400
1402 {
1403 super.OnRPC(sender, rpc_type, ctx);
1404
1406 }
1407
1409 {
1410 super.OnStoreSave(ctx);
1411
1413 }
1414
1416 {
1417 if (!super.OnStoreLoad(ctx, version))
1418 return false;
1419
1421 return false;
1422
1423 return true;
1424 }
1425
1427 {
1428 super.AfterStoreLoad();
1429
1431 {
1433 {
1435 }
1436 else
1437 {
1439 }
1440 }
1441
1443 }
1444
1446 {
1447 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1448
1450 }
1451
1453 {
1454 super.OnVariablesSynchronized();
1455
1457 {
1459 if (uiAction != CodeLockUIAction.NONE)
1460 {
1462 }
1463 }
1464 }
1465
1467 {
1468 return true;
1469 }
1470
1472 {
1473 super.InitItemSounds();
1474
1482 }
1483
1484
1486 {
1487 GetInventory().CreateInInventory("Battery9V");
1488 }
1489}
1490
1492{
1493 override void Init()
1494 {
1496
1497 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1499
1500 if (bunkerConfig && bunkerConfig.bunkerSettings)
1501 {
1503 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1506 }
1507
1509 }
1510
1512 {
1513 return false;
1514 }
1515
1517 {
1518 return false;
1519 }
1520
1522 {
1523 return false;
1524 }
1525
1528
1530 {
1531 return false;
1532 }
1533
1535 {
1536 return true;
1537 }
1538
1540 {
1541 return true;
1542 }
1543
1545 {
1546 return true;
1547 }
1548
1550 {
1552 }
1553
1555 {
1559 }
1560}
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.