896{
899
902
905
907
908
916
918 {
920 }
921
922 protected void Init()
923 {
926
927 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
928 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
929 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
930 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
931 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
932 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
933 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
934 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
935 RegisterNetSyncVariableBool("m_Reversed");
936 }
937
939 {
940 super.EEInit();
941
942
944 }
945
947 {
948 super.EEItemLocationChanged(oldLoc, newLoc);
949
951 {
953 {
954 if (
g_Game.IsDedicatedServer())
955 SetSynchDirty();
956
957
959 }
960 }
961 }
962
964 {
965 super.EEItemAttached(item, slot_name);
966
968 {
971 {
973 if (battery)
974 {
975 float batteryEnergy = battery.GetCompEM().GetEnergy();
977 {
979 GetCompEM().SwitchOn();
980 }
981
983 }
984 }
985 }
986 }
987
989 {
990 super.EEItemDetached(item, slot_name);
991
993 {
996 {
998 GetCompEM().SwitchOff();
999
1001 }
1002 }
1003 }
1004
1006 {
1007 super.OnWasAttached(parent, slot_id);
1008
1010 {
1013 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1014 {
1016 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1017 {
1019 GetCompEM().SwitchOn();
1020 }
1021
1022 if (parent && parent.CanUseConstruction())
1023 {
1025 if (buildingBase)
1026 {
1028 }
1029 }
1030 }
1031
1033 }
1034 }
1035
1037 {
1038 super.OnWasDetached(parent, slot_id);
1039
1041 {
1043 if (GetCompEM().IsWorking())
1044 GetCompEM().SwitchOff();
1045
1047 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1048 {
1052 }
1053
1055 }
1056 }
1057
1059 {
1061 return false;
1062
1063 return true;
1064 }
1065
1067 {
1070 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1071 {
1072 int doorIndex = -1;
1075 {
1076 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1077 {
1079 {
1080 doorIndex = doorInfoIndex;
1081 doorInfo = doorInfoData;
1082 break;
1083 }
1084 }
1085
1086 if (doorIndex != -1)
1087 break;
1088 }
1089
1090 if (doorIndex > -1)
1091 {
1093 }
1094
1097 if (rebuilding && doorInfo)
1098 {
1100 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1101 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1102 {
1103 m_Reversed = reversibleDoorPart.IsReversedLocal();
1104 }
1105 }
1106 }
1107 }
1108
1111 {
1113 {
1116 return false;
1117 }
1118
1119 return true;
1120 }
1121
1123 {
1124 super.OnWorkStop();
1125
1127 {
1130
1132 }
1133 }
1134
1136 {
1137 super.OnWorkStart();
1138
1140 {
1142 }
1143 }
1144
1145 override void OnWork(
float consumed_energy)
1146 {
1147 super.OnWork(consumed_energy);
1148
1150 {
1152 if (battery)
1153 {
1154 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1155 {
1156 GetCompEM().SwitchOff();
1158 }
1159
1162 {
1164 SetSynchDirty();
1165 }
1166 }
1167 }
1168 }
1169
1172 {
1174 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1175
1176
1177 if (
g_Game.IsMultiplayer())
1178 {
1179 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1180 }
1181 else
1182 {
1183 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1184 }
1185
1188 if (parent.MemoryPointExists(
slotName))
1189 {
1190 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1191 }
1192 else
1193 {
1195 }
1196
1198 PlaceOnSurface();
1199 }
1200
1202 {
1204 return battery;
1205 }
1206
1208 {
1209 return true;
1210 }
1211
1213 {
1214 return true;
1215 }
1216
1218 {
1219 return true;
1220 }
1221
1223 {
1225 }
1226
1228 {
1229 return true;
1230 }
1231
1233 {
1234 return GetCompEM().IsWorking();
1235 }
1236
1238 {
1240 }
1241
1243 {
1245 }
1246
1248 {
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
1305 {
1306 if (!player)
1307 return false;
1308
1310 return false;
1311
1313
1315 }
1316
1318 {
1319 EntityAI hierarchyParent = GetHierarchyRoot();
1320 if (hierarchyParent.CanUseConstruction())
1321 return true;
1322
1323 if (BroadcastedBunker.Cast(hierarchyParent))
1324 return true;
1325
1326 return false;
1327 }
1328
1330 {
1332 }
1333
1335 {
1337 if (!battery)
1338 return 0.0;
1339
1340 float energy = battery.GetCompEM().GetEnergy();
1341 float energyMax = battery.GetCompEM().GetEnergyMax();
1342
1343 if (energyMax <= 0)
1344 return 0.0;
1345
1346 return (energy / energyMax) * 100.0;
1347 }
1348
1350 {
1353 }
1354
1356 {
1358 {
1361 }
1362 }
1363
1365 {
1366 super.SetActions();
1367
1369 }
1370
1372 {
1373 super.OnRPC(sender, rpc_type, ctx);
1374
1376 }
1377
1379 {
1380 super.OnStoreSave(ctx);
1381
1383 }
1384
1386 {
1387 if (!super.OnStoreLoad(ctx, version))
1388 return false;
1389
1391 return false;
1392
1393 return true;
1394 }
1395
1397 {
1398 super.AfterStoreLoad();
1399
1401 {
1403 {
1405 }
1406 else
1407 {
1409 }
1410 }
1411
1413 }
1414
1416 {
1417 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1418
1420 }
1421
1423 {
1424 super.OnVariablesSynchronized();
1425
1427 {
1429 if (uiAction != CodeLockUIAction.NONE)
1430 {
1432 }
1433 }
1434 }
1435
1437 {
1438 return true;
1439 }
1440
1442 {
1443 super.InitItemSounds();
1444
1452 }
1453
1454
1456 {
1457 GetInventory().CreateInInventory("Battery9V");
1458 }
1459}
1460
1462{
1463 override void Init()
1464 {
1466
1467 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1469
1470 if (bunkerConfig && bunkerConfig.bunkerSettings)
1471 {
1473 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1476 }
1477
1479 }
1480
1482 {
1483 return false;
1484 }
1485
1487 {
1488 return false;
1489 }
1490
1492 {
1493 return false;
1494 }
1495
1498
1500 {
1501 return false;
1502 }
1503
1505 {
1506 return true;
1507 }
1508
1510 {
1511 return true;
1512 }
1513
1515 {
1516 return true;
1517 }
1518
1520 {
1522 }
1523
1525 {
1529 }
1530}
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.