911{
914
917
920
922
923
931
933 {
935 }
936
937 protected void Init()
938 {
941
942 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
943 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
944 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
945 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
946 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
947 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
948 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
949 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
950 RegisterNetSyncVariableBool("m_Reversed");
951 }
952
954 {
955 super.EEInit();
956
957
959 }
960
962 {
963 super.EEItemLocationChanged(oldLoc, newLoc);
964
966 {
968 {
969 if (
g_Game.IsDedicatedServer())
970 SetSynchDirty();
971
972
974 }
975 }
976 }
977
979 {
980 super.EEItemAttached(item, slot_name);
981
983 {
986 {
988 if (battery)
989 {
990 float batteryEnergy = battery.GetCompEM().GetEnergy();
992 {
994 GetCompEM().SwitchOn();
995 }
996
998 }
999 }
1000 }
1001 }
1002
1004 {
1005 super.EEItemDetached(item, slot_name);
1006
1008 {
1011 {
1013 GetCompEM().SwitchOff();
1014
1016 }
1017 }
1018 }
1019
1021 {
1022 super.OnWasAttached(parent, slot_id);
1023
1025 {
1028 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1029 {
1031 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1032 {
1034 GetCompEM().SwitchOn();
1035 }
1036
1037 if (parent && parent.CanUseConstruction())
1038 {
1040 if (buildingBase)
1041 {
1043 }
1044 }
1045 }
1046
1048 }
1049 }
1050
1052 {
1053 super.OnWasDetached(parent, slot_id);
1054
1056 {
1058 if (GetCompEM().IsWorking())
1059 GetCompEM().SwitchOff();
1060
1062 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1063 {
1067 }
1068
1070 }
1071 }
1072
1074 {
1076 return false;
1077
1078 return true;
1079 }
1080
1082 {
1085 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1086 {
1087 int doorIndex = -1;
1090 {
1091 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1092 {
1094 {
1095 doorIndex = doorInfoIndex;
1096 doorInfo = doorInfoData;
1097 break;
1098 }
1099 }
1100
1101 if (doorIndex != -1)
1102 break;
1103 }
1104
1105 if (doorIndex > -1)
1106 {
1108 }
1109
1112 if (rebuilding && doorInfo)
1113 {
1115 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1116 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1117 {
1118 m_Reversed = reversibleDoorPart.IsReversedLocal();
1119 }
1120 }
1121 }
1122 }
1123
1126 {
1128 {
1131 return false;
1132 }
1133
1134 return true;
1135 }
1136
1138 {
1139 super.OnWorkStop();
1140
1142 {
1145
1147 }
1148 }
1149
1151 {
1152 super.OnWorkStart();
1153
1155 {
1157 }
1158 }
1159
1160 override void OnWork(
float consumed_energy)
1161 {
1162 super.OnWork(consumed_energy);
1163
1165 {
1167 if (battery)
1168 {
1169 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1170 {
1171 GetCompEM().SwitchOff();
1173 }
1174
1177 {
1179 SetSynchDirty();
1180 }
1181 }
1182 }
1183 }
1184
1187 {
1189 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1190
1191
1192 if (
g_Game.IsMultiplayer())
1193 {
1194 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1195 }
1196 else
1197 {
1198 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1199 }
1200
1203 if (parent.MemoryPointExists(
slotName))
1204 {
1205 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1206 }
1207 else
1208 {
1210 }
1211
1213 PlaceOnSurface();
1214 }
1215
1217 {
1219 return battery;
1220 }
1221
1223 {
1224 return true;
1225 }
1226
1228 {
1229 return true;
1230 }
1231
1233 {
1234 return true;
1235 }
1236
1238 {
1240 }
1241
1243 {
1244 return true;
1245 }
1246
1248 {
1249 return GetCompEM().IsWorking();
1250 }
1251
1253 {
1255 }
1256
1258 {
1260 }
1261
1263 {
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
1320 {
1321 if (!player)
1322 return false;
1323
1325 return false;
1326
1328
1330 }
1331
1333 {
1334 EntityAI hierarchyParent = GetHierarchyRoot();
1335 if (hierarchyParent.CanUseConstruction())
1336 return true;
1337
1338 if (BroadcastedBunker.Cast(hierarchyParent))
1339 return true;
1340
1341 return false;
1342 }
1343
1345 {
1347 }
1348
1350 {
1352 if (!battery)
1353 return 0.0;
1354
1355 float energy = battery.GetCompEM().GetEnergy();
1356 float energyMax = battery.GetCompEM().GetEnergyMax();
1357
1358 if (energyMax <= 0)
1359 return 0.0;
1360
1361 return (energy / energyMax) * 100.0;
1362 }
1363
1365 {
1368 }
1369
1371 {
1373 {
1376 }
1377 }
1378
1380 {
1381 super.SetActions();
1382
1384 }
1385
1387 {
1388 super.OnRPC(sender, rpc_type, ctx);
1389
1391 }
1392
1394 {
1395 super.OnStoreSave(ctx);
1396
1398 }
1399
1401 {
1402 if (!super.OnStoreLoad(ctx, version))
1403 return false;
1404
1406 return false;
1407
1408 return true;
1409 }
1410
1412 {
1413 super.AfterStoreLoad();
1414
1416 {
1418 {
1420 }
1421 else
1422 {
1424 }
1425 }
1426
1428 }
1429
1431 {
1432 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1433
1435 }
1436
1438 {
1439 super.OnVariablesSynchronized();
1440
1442 {
1444 if (uiAction != CodeLockUIAction.NONE)
1445 {
1447 }
1448 }
1449 }
1450
1452 {
1453 return true;
1454 }
1455
1457 {
1458 super.InitItemSounds();
1459
1467 }
1468
1469
1471 {
1472 GetInventory().CreateInInventory("Battery9V");
1473 }
1474}
1475
1477{
1478 override void Init()
1479 {
1481
1482 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1484
1485 if (bunkerConfig && bunkerConfig.bunkerSettings)
1486 {
1488 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1491 }
1492
1494 }
1495
1497 {
1498 return false;
1499 }
1500
1502 {
1503 return false;
1504 }
1505
1507 {
1508 return false;
1509 }
1510
1513
1515 {
1516 return false;
1517 }
1518
1520 {
1521 return true;
1522 }
1523
1525 {
1526 return true;
1527 }
1528
1530 {
1531 return true;
1532 }
1533
1535 {
1537 }
1538
1540 {
1544 }
1545}
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.