906{
909
912
915
917
918
926
928 {
930 }
931
932 protected void Init()
933 {
936
937 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
938 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
939 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
940 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
941 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
942 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
943 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
944 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
945 RegisterNetSyncVariableBool("m_Reversed");
946 }
947
949 {
950 super.EEInit();
951
952
954 }
955
957 {
958 super.EEItemLocationChanged(oldLoc, newLoc);
959
961 {
963 {
964 if (
g_Game.IsDedicatedServer())
965 SetSynchDirty();
966
967
969 }
970 }
971 }
972
974 {
975 super.EEItemAttached(item, slot_name);
976
978 {
981 {
983 if (battery)
984 {
985 float batteryEnergy = battery.GetCompEM().GetEnergy();
987 {
989 GetCompEM().SwitchOn();
990 }
991
993 }
994 }
995 }
996 }
997
999 {
1000 super.EEItemDetached(item, slot_name);
1001
1003 {
1006 {
1008 GetCompEM().SwitchOff();
1009
1011 }
1012 }
1013 }
1014
1016 {
1017 super.OnWasAttached(parent, slot_id);
1018
1020 {
1023 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1024 {
1026 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1027 {
1029 GetCompEM().SwitchOn();
1030 }
1031
1032 if (parent && parent.CanUseConstruction())
1033 {
1035 if (buildingBase)
1036 {
1038 }
1039 }
1040 }
1041
1043 }
1044 }
1045
1047 {
1048 super.OnWasDetached(parent, slot_id);
1049
1051 {
1053 if (GetCompEM().IsWorking())
1054 GetCompEM().SwitchOff();
1055
1057 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1058 {
1062 }
1063
1065 }
1066 }
1067
1069 {
1071 return false;
1072
1073 return true;
1074 }
1075
1077 {
1080 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1081 {
1082 int doorIndex = -1;
1085 {
1086 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1087 {
1089 {
1090 doorIndex = doorInfoIndex;
1091 doorInfo = doorInfoData;
1092 break;
1093 }
1094 }
1095
1096 if (doorIndex != -1)
1097 break;
1098 }
1099
1100 if (doorIndex > -1)
1101 {
1103 }
1104
1107 if (rebuilding && doorInfo)
1108 {
1110 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1111 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1112 {
1113 m_Reversed = reversibleDoorPart.IsReversedLocal();
1114 }
1115 }
1116 }
1117 }
1118
1121 {
1123 {
1126 return false;
1127 }
1128
1129 return true;
1130 }
1131
1133 {
1134 super.OnWorkStop();
1135
1137 {
1140
1142 }
1143 }
1144
1146 {
1147 super.OnWorkStart();
1148
1150 {
1152 }
1153 }
1154
1155 override void OnWork(
float consumed_energy)
1156 {
1157 super.OnWork(consumed_energy);
1158
1160 {
1162 if (battery)
1163 {
1164 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1165 {
1166 GetCompEM().SwitchOff();
1168 }
1169
1172 {
1174 SetSynchDirty();
1175 }
1176 }
1177 }
1178 }
1179
1182 {
1184 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1185
1186
1187 if (
g_Game.IsMultiplayer())
1188 {
1189 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1190 }
1191 else
1192 {
1193 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1194 }
1195
1198 if (parent.MemoryPointExists(
slotName))
1199 {
1200 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1201 }
1202 else
1203 {
1205 }
1206
1208 PlaceOnSurface();
1209 }
1210
1212 {
1214 return battery;
1215 }
1216
1218 {
1219 return true;
1220 }
1221
1223 {
1224 return true;
1225 }
1226
1228 {
1229 return true;
1230 }
1231
1233 {
1235 }
1236
1238 {
1239 return true;
1240 }
1241
1243 {
1244 return GetCompEM().IsWorking();
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
1303 {
1305 }
1306
1308 {
1310 }
1311
1315 {
1316 if (!player)
1317 return false;
1318
1320 return false;
1321
1323
1325 }
1326
1328 {
1329 EntityAI hierarchyParent = GetHierarchyRoot();
1330 if (hierarchyParent.CanUseConstruction())
1331 return true;
1332
1333 if (BroadcastedBunker.Cast(hierarchyParent))
1334 return true;
1335
1336 return false;
1337 }
1338
1340 {
1342 }
1343
1345 {
1347 if (!battery)
1348 return 0.0;
1349
1350 float energy = battery.GetCompEM().GetEnergy();
1351 float energyMax = battery.GetCompEM().GetEnergyMax();
1352
1353 if (energyMax <= 0)
1354 return 0.0;
1355
1356 return (energy / energyMax) * 100.0;
1357 }
1358
1360 {
1363 }
1364
1366 {
1368 {
1371 }
1372 }
1373
1375 {
1376 super.SetActions();
1377
1379 }
1380
1382 {
1383 super.OnRPC(sender, rpc_type, ctx);
1384
1386 }
1387
1389 {
1390 super.OnStoreSave(ctx);
1391
1393 }
1394
1396 {
1397 if (!super.OnStoreLoad(ctx, version))
1398 return false;
1399
1401 return false;
1402
1403 return true;
1404 }
1405
1407 {
1408 super.AfterStoreLoad();
1409
1411 {
1413 {
1415 }
1416 else
1417 {
1419 }
1420 }
1421
1423 }
1424
1426 {
1427 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1428
1430 }
1431
1433 {
1434 super.OnVariablesSynchronized();
1435
1437 {
1439 if (uiAction != CodeLockUIAction.NONE)
1440 {
1442 }
1443 }
1444 }
1445
1447 {
1448 return true;
1449 }
1450
1452 {
1453 super.InitItemSounds();
1454
1462 }
1463
1464
1466 {
1467 GetInventory().CreateInInventory("Battery9V");
1468 }
1469}
1470
1472{
1473 override void Init()
1474 {
1476
1477 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1479
1480 if (bunkerConfig && bunkerConfig.bunkerSettings)
1481 {
1483 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1486 }
1487
1489 }
1490
1492 {
1493 return false;
1494 }
1495
1497 {
1498 return false;
1499 }
1500
1502 {
1503 return false;
1504 }
1505
1508
1510 {
1511 return false;
1512 }
1513
1515 {
1516 return true;
1517 }
1518
1520 {
1521 return true;
1522 }
1523
1525 {
1526 return true;
1527 }
1528
1530 {
1532 }
1533
1535 {
1539 }
1540}
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.