891{
894
897
900
902
903
911
913 {
915 }
916
917 protected void Init()
918 {
921
922 RegisterNetSyncVariableInt("m_CodeLockComponent.m_DoorIndex");
923 RegisterNetSyncVariableInt("m_CodeLockComponent.m_Stage");
924 RegisterNetSyncVariableInt("m_CodeLockComponent.m_WrongCodeCount");
925 RegisterNetSyncVariableInt("m_CodeLockComponent.m_UIAction");
926 RegisterNetSyncVariableBool("m_CodeLockComponent.m_IsLocked");
927 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasPIN");
928 RegisterNetSyncVariableBool("m_CodeLockComponent.m_HasBruteForceProtection");
929 RegisterNetSyncVariableBoolSignal("m_CodeLockComponent.m_HandleBruteForceProtection");
930 RegisterNetSyncVariableBool("m_Reversed");
931 }
932
934 {
935 super.EEInit();
936
937
939 }
940
942 {
943 super.EEItemLocationChanged(oldLoc, newLoc);
944
946 {
948 {
949 if (
g_Game.IsDedicatedServer())
950 SetSynchDirty();
951
952
954 }
955 }
956 }
957
959 {
960 super.EEItemAttached(item, slot_name);
961
963 {
966 {
968 if (battery)
969 {
970 float batteryEnergy = battery.GetCompEM().GetEnergy();
972 {
974 GetCompEM().SwitchOn();
975 }
976
978 }
979 }
980 }
981 }
982
984 {
985 super.EEItemDetached(item, slot_name);
986
988 {
991 {
993 GetCompEM().SwitchOff();
994
996 }
997 }
998 }
999
1001 {
1002 super.OnWasAttached(parent, slot_id);
1003
1005 {
1008 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1009 {
1011 if (battery && battery.GetCompEM().GetEnergy() > 0 && !GetCompEM().IsWorking())
1012 {
1014 GetCompEM().SwitchOn();
1015 }
1016
1017 if (parent && parent.CanUseConstruction())
1018 {
1020 if (buildingBase)
1021 {
1023 }
1024 }
1025 }
1026
1028 }
1029 }
1030
1032 {
1033 super.OnWasDetached(parent, slot_id);
1034
1036 {
1038 if (GetCompEM().IsWorking())
1039 GetCompEM().SwitchOff();
1040
1042 if (
slotName.IndexOf(
"Att_CodeLock") > -1)
1043 {
1047 }
1048
1050 }
1051 }
1052
1054 {
1056 return false;
1057
1058 return true;
1059 }
1060
1062 {
1065 if (doorsInfoMap && doorsInfoMap.Count() > 0)
1066 {
1067 int doorIndex = -1;
1070 {
1071 foreach(string relatedSlotName: doorInfoData.m_RelatedInventorySlotNames)
1072 {
1074 {
1075 doorIndex = doorInfoIndex;
1076 doorInfo = doorInfoData;
1077 break;
1078 }
1079 }
1080
1081 if (doorIndex != -1)
1082 break;
1083 }
1084
1085 if (doorIndex > -1)
1086 {
1088 }
1089
1092 if (rebuilding && doorInfo)
1093 {
1095 ConstructionPartRebuildReversibleDoor reversibleDoorPart;
1096 if (constructionPart &&
Class.
CastTo(reversibleDoorPart, constructionPart))
1097 {
1098 m_Reversed = reversibleDoorPart.IsReversedLocal();
1099 }
1100 }
1101 }
1102 }
1103
1106 {
1108 {
1111 return false;
1112 }
1113
1114 return true;
1115 }
1116
1118 {
1119 super.OnWorkStop();
1120
1122 {
1125
1127 }
1128 }
1129
1131 {
1132 super.OnWorkStart();
1133
1135 {
1137 }
1138 }
1139
1140 override void OnWork(
float consumed_energy)
1141 {
1142 super.OnWork(consumed_energy);
1143
1145 {
1147 if (battery)
1148 {
1149 if (GetCompEM().IsWorking() && battery.GetCompEM().GetEnergy() <= 0)
1150 {
1151 GetCompEM().SwitchOff();
1153 }
1154
1157 {
1159 SetSynchDirty();
1160 }
1161 }
1162 }
1163 }
1164
1167 {
1169 GetInventory().GetCurrentInventoryLocation(inventoryLocation);
1170
1171
1172 if (
g_Game.IsMultiplayer())
1173 {
1174 parent.GetInventory().DropEntity(
InventoryMode.SERVER, parent,
this);
1175 }
1176 else
1177 {
1178 parent.GetInventory().DropEntity(
InventoryMode.LOCAL, parent,
this);
1179 }
1180
1183 if (parent.MemoryPointExists(
slotName))
1184 {
1185 groundPos = parent.ModelToWorld(parent.GetMemoryPointPos(
slotName));
1186 }
1187 else
1188 {
1190 }
1191
1193 PlaceOnSurface();
1194 }
1195
1197 {
1199 return battery;
1200 }
1201
1203 {
1204 return true;
1205 }
1206
1208 {
1209 return true;
1210 }
1211
1213 {
1214 return true;
1215 }
1216
1218 {
1220 }
1221
1223 {
1224 return true;
1225 }
1226
1228 {
1229 return GetCompEM().IsWorking();
1230 }
1231
1233 {
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
1300 {
1301 if (!player)
1302 return false;
1303
1305 return false;
1306
1308
1310 }
1311
1313 {
1314 EntityAI hierarchyParent = GetHierarchyRoot();
1315 if (hierarchyParent.CanUseConstruction())
1316 return true;
1317
1318 if (BroadcastedBunker.Cast(hierarchyParent))
1319 return true;
1320
1321 return false;
1322 }
1323
1325 {
1327 }
1328
1330 {
1332 if (!battery)
1333 return 0.0;
1334
1335 float energy = battery.GetCompEM().GetEnergy();
1336 float energyMax = battery.GetCompEM().GetEnergyMax();
1337
1338 if (energyMax <= 0)
1339 return 0.0;
1340
1341 return (energy / energyMax) * 100.0;
1342 }
1343
1345 {
1348 }
1349
1351 {
1353 {
1356 }
1357 }
1358
1360 {
1361 super.SetActions();
1362
1364 }
1365
1367 {
1368 super.OnRPC(sender, rpc_type, ctx);
1369
1371 }
1372
1374 {
1375 super.OnStoreSave(ctx);
1376
1378 }
1379
1381 {
1382 if (!super.OnStoreLoad(ctx, version))
1383 return false;
1384
1386 return false;
1387
1388 return true;
1389 }
1390
1392 {
1393 super.AfterStoreLoad();
1394
1396 {
1398 {
1400 }
1401 else
1402 {
1404 }
1405 }
1406
1408 }
1409
1411 {
1412 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
1413
1415 }
1416
1418 {
1419 super.OnVariablesSynchronized();
1420
1422 {
1424 if (uiAction != CodeLockUIAction.NONE)
1425 {
1427 }
1428 }
1429 }
1430
1432 {
1433 return true;
1434 }
1435
1437 {
1438 super.InitItemSounds();
1439
1447 }
1448
1449
1451 {
1452 GetInventory().CreateInInventory("Battery9V");
1453 }
1454}
1455
1457{
1458 override void Init()
1459 {
1461
1462 BunkerBroadcastConfigInstance bunkerConfig = CfgBunkerBroadcastHandler.GetData();
1464
1465 if (bunkerConfig && bunkerConfig.bunkerSettings)
1466 {
1468 pinCodeLength = bunkerConfig.bunkerSettings.lockCodeLength;
1471 }
1472
1474 }
1475
1477 {
1478 return false;
1479 }
1480
1482 {
1483 return false;
1484 }
1485
1487 {
1488 return false;
1489 }
1490
1493
1495 {
1496 return false;
1497 }
1498
1500 {
1501 return true;
1502 }
1503
1505 {
1506 return true;
1507 }
1508
1510 {
1511 return true;
1512 }
1513
1515 {
1517 }
1518
1520 {
1524 }
1525}
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.