Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible in inventory over this item.
5614{
5616 {
5617 return true;
5618 }
5619};
5620
5621
5622
5624{
5628
5630
5633
5634
5635
5636
5637
5646
5652
5657
5662
5683 protected bool m_IsResultOfSplit
5684
5686
5691
5692
5693
5695
5699
5700
5701
5703
5706
5707
5708
5714
5715
5723
5726
5727
5729
5730
5732
5733
5738
5739
5744
5745
5747
5748
5750 {
5755
5756 if (!
GetGame().IsDedicatedServer())
5757 {
5759 {
5761
5763 {
5765 }
5766 }
5767
5770 }
5771
5772 m_OldLocation = null;
5773
5775 {
5777 }
5778
5779 if (ConfigIsExisting("headSelectionsToHide"))
5780 {
5783 }
5784
5786 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5787 {
5789 }
5790
5792
5793 m_IsResultOfSplit = false;
5794
5796 }
5797
5799 {
5800 super.InitItemVariables();
5801
5807 m_Count = ConfigGetInt(
"count");
5808
5811
5816
5819
5824
5836
5840
5841
5844 if (ConfigIsExisting("canBeSplit"))
5845 {
5848 }
5849
5851 if (ConfigIsExisting("itemBehaviour"))
5853
5854
5857 RegisterNetSyncVariableInt("m_VarLiquidType");
5858 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5859
5860 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5861 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5862 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5863
5864 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5865 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5866 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5867 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5868
5869 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5870 RegisterNetSyncVariableBool("m_IsTakeable");
5871 RegisterNetSyncVariableBool("m_IsHologram");
5872
5875 {
5878 }
5879
5881
5883 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5885
5886 }
5887
5889 {
5891 }
5892
5894 {
5897 {
5902 }
5903 }
5904
5905 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5906 {
5908 {
5911 }
5912
5914 }
5915
5917 {
5923 }
5924
5926
5928 {
5930
5931 if (!action)
5932 {
5933 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5934 return;
5935 }
5936
5938 if (!ai)
5939 {
5941 return;
5942 }
5943
5945 if (!action_array)
5946 {
5947 action_array = new array<ActionBase_Basic>;
5949 }
5950 if (LogManager.IsActionLogEnable())
5951 {
5952 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5953 }
5954
5955 if (action_array.Find(action) != -1)
5956 {
5957 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5958 }
5959 else
5960 {
5961 action_array.Insert(action);
5962 }
5963 }
5964
5966 {
5968 ActionBase action = player.GetActionManager().GetAction(actionName);
5971
5972 if (action_array)
5973 {
5974 action_array.RemoveItem(action);
5975 }
5976 }
5977
5978
5979
5981 {
5982 ActionOverrideData overrideData = new ActionOverrideData();
5986
5988 if (!actionMap)
5989 {
5992 }
5993
5994 actionMap.Insert(this.
Type(), overrideData);
5995
5996 }
5997
5999
6001
6002
6004 {
6007
6010
6011 string config_to_search = "CfgVehicles";
6012 string muzzle_owner_config;
6013
6015 {
6016 if (IsInherited(Weapon))
6017 config_to_search = "CfgWeapons";
6018
6019 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6020
6021 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6022
6024
6025 if (config_OnFire_subclass_count > 0)
6026 {
6027 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6028
6029 for (int i = 0; i < config_OnFire_subclass_count; i++)
6030 {
6031 string particle_class = "";
6033 string config_OnFire_entry = config_OnFire_class + particle_class;
6034 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6035 WPOF_array.Insert(WPOF);
6036 }
6037
6038
6040 }
6041 }
6042
6044 {
6045 config_to_search = "CfgWeapons";
6046 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6047
6048 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6049
6051
6052 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6053 {
6054 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6055
6056 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6057 {
6058 string particle_class2 = "";
6060 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6061 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6062 WPOBE_array.Insert(WPOBE);
6063 }
6064
6065
6067 }
6068 }
6069 }
6070
6071
6073 {
6076
6078 {
6079 string config_to_search = "CfgVehicles";
6080
6081 if (IsInherited(Weapon))
6082 config_to_search = "CfgWeapons";
6083
6084 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6085 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6086
6087 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
6088 {
6089
6091
6093 {
6095 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6097 return;
6098 }
6099
6102
6103
6104
6106 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6107
6108 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6109 {
6110 string particle_class = "";
6112 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6114
6115 if (entry_type == CT_CLASS)
6116 {
6117 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6118 WPOOH_array.Insert(WPOF);
6119 }
6120 }
6121
6122
6124 }
6125 }
6126 }
6127
6129 {
6131 }
6132
6134 {
6136 {
6138
6141
6144
6145 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6146 }
6147 }
6148
6150 {
6152 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6153
6155 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6156
6158 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6159
6161 {
6163 }
6164 }
6165
6167 {
6169 }
6170
6172 {
6175 else
6177
6179 {
6182 }
6183 else
6184 {
6187
6190 }
6191
6193 }
6194
6196 {
6198 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6199 }
6200
6202 {
6204 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6206 }
6207
6209 {
6211 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6212 }
6213
6215 {
6218
6219 OverheatingParticle OP = new OverheatingParticle();
6224
6226 }
6227
6229 {
6232
6233 return -1;
6234 }
6235
6237 {
6239 {
6242
6243 for (int i = count; i > 0; --i)
6244 {
6245 int id = i - 1;
6248
6251
6252 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6253 {
6254 if (p)
6255 {
6258 }
6259 }
6260 }
6261 }
6262 }
6263
6265 {
6267 {
6269 {
6270 int id = i - 1;
6272
6273 if (OP)
6274 {
6276
6277 if (p)
6278 {
6280 }
6281
6282 delete OP;
6283 }
6284 }
6285
6288 }
6289 }
6290
6293 {
6294 return 0.0;
6295 }
6296
6297
6299 {
6300 return 250;
6301 }
6302
6304 {
6305 return 0;
6306 }
6307
6310 {
6312 return true;
6313
6314 return false;
6315 }
6316
6319 {
6322
6324 {
6326 }
6327 else
6328 {
6329
6331 }
6332
6334 }
6335
6342 {
6343 return -1;
6344 }
6345
6346
6347
6348
6350 {
6352 {
6354 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6355
6356 if (r_index >= 0)
6357 {
6358 InventoryLocation r_il = new InventoryLocation;
6359 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6360
6361 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6364 {
6365 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6366 }
6368 {
6369 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6370 }
6371
6372 }
6373
6374 player.GetHumanInventory().ClearUserReservedLocation(this);
6375 }
6376
6379 }
6380
6381
6382
6383
6385 {
6386 return ItemBase.m_DebugActionsMask;
6387 }
6388
6390 {
6391 return ItemBase.m_DebugActionsMask & mask;
6392 }
6393
6395 {
6396 ItemBase.m_DebugActionsMask = mask;
6397 }
6398
6400 {
6401 ItemBase.m_DebugActionsMask |= mask;
6402 }
6403
6405 {
6406 ItemBase.m_DebugActionsMask &= ~mask;
6407 }
6408
6410 {
6412 {
6414 }
6415 else
6416 {
6418 }
6419 }
6420
6421
6423 {
6424 if (GetEconomyProfile())
6425 {
6426 float q_max = GetEconomyProfile().GetQuantityMax();
6427 if (q_max > 0)
6428 {
6429 float q_min = GetEconomyProfile().GetQuantityMin();
6430 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6431
6433 {
6434 ComponentEnergyManager comp = GetCompEM();
6436 {
6438 }
6439 }
6441 {
6443
6444 }
6445
6446 }
6447 }
6448 }
6449
6452 {
6453 EntityAI parent = GetHierarchyParent();
6454
6455 if (parent)
6456 {
6457 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6458 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6459 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6460 }
6461 }
6462
6465 {
6466 EntityAI parent = GetHierarchyParent();
6467
6468 if (parent)
6469 {
6470 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6471 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6472 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6473 }
6474 }
6475
6477 {
6478
6479
6480
6481
6483
6485 {
6486 if (ScriptInputUserData.CanStoreInputUserData())
6487 {
6488 ScriptInputUserData ctx = new ScriptInputUserData;
6494 ctx.
Write(use_stack_max);
6497
6499 {
6500 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6501 }
6502 }
6503 }
6504 else if (!
GetGame().IsMultiplayer())
6505 {
6507 }
6508 }
6509
6511 {
6513 }
6514
6516 {
6518 }
6519
6521 {
6523 }
6524
6526 {
6527
6528 return false;
6529 }
6530
6532 {
6533 return false;
6534 }
6535
6539 {
6540 return false;
6541 }
6542
6544 {
6545 return "";
6546 }
6547
6549
6551 {
6552 return false;
6553 }
6554
6556 {
6557 return true;
6558 }
6559
6560
6561
6563 {
6564 return true;
6565 }
6566
6568 {
6569 return true;
6570 }
6571
6573 {
6574 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6576 }
6577
6579 {
6581 }
6582
6584 {
6586 if (!is_being_placed)
6588 SetSynchDirty();
6589 }
6590
6591
6593
6595 {
6597 }
6598
6600 {
6602 }
6603
6605 {
6606 return 1;
6607 }
6608
6610 {
6611 return false;
6612 }
6613
6615 {
6617 SetSynchDirty();
6618 }
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6655 {
6656 super.OnMovedInsideCargo(container);
6657
6658 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6659 }
6660
6661 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6662 {
6663 super.EEItemLocationChanged(oldLoc,newLoc);
6664
6665 PlayerBase new_player = null;
6666 PlayerBase old_player = null;
6667
6668 if (newLoc.GetParent())
6669 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6670
6671 if (oldLoc.GetParent())
6672 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6673
6675 {
6676 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6677
6678 if (r_index >= 0)
6679 {
6680 InventoryLocation r_il = new InventoryLocation;
6681 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6682
6683 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6686 {
6687 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6688 }
6690 {
6691 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6692 }
6693
6694 }
6695 }
6696
6698 {
6699 if (new_player)
6700 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6701
6702 if (new_player == old_player)
6703 {
6704
6705 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6706 {
6708 {
6709 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6710 {
6711 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6712 }
6713 }
6714 else
6715 {
6716 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6717 }
6718 }
6719
6720 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6721 {
6722 int type = oldLoc.GetType();
6724 {
6725 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6726 }
6728 {
6729 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6730 }
6731 }
6732 if (!m_OldLocation)
6733 {
6734 m_OldLocation = new InventoryLocation;
6735 }
6736 m_OldLocation.Copy(oldLoc);
6737 }
6738 else
6739 {
6740 if (m_OldLocation)
6741 {
6742 m_OldLocation.Reset();
6743 }
6744 }
6745
6747 }
6748 else
6749 {
6750 if (new_player)
6751 {
6752 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6753 if (res_index >= 0)
6754 {
6755 InventoryLocation il = new InventoryLocation;
6756 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6758 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6761 {
6762 il.
GetParent().GetOnReleaseLock().Invoke(it);
6763 }
6765 {
6767 }
6768
6769 }
6770 }
6772 {
6773
6775 }
6776
6777 if (m_OldLocation)
6778 {
6779 m_OldLocation.Reset();
6780 }
6781 }
6782 }
6783
6784 override void EOnContact(IEntity other, Contact extra)
6785 {
6787 {
6788 int liquidType = -1;
6790 if (impactSpeed > 0.0)
6791 {
6793 #ifndef SERVER
6795 #else
6797 SetSynchDirty();
6798 #endif
6800 }
6801 }
6802
6803 #ifdef SERVER
6804 if (GetCompEM() && GetCompEM().IsPlugged())
6805 {
6806 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6807 GetCompEM().UnplugThis();
6808 }
6809 #endif
6810 }
6811
6813
6815 {
6817 }
6818
6820 {
6821
6822 }
6823
6825 {
6826 super.OnItemLocationChanged(old_owner, new_owner);
6827
6828 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6829 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6830
6831 if (!relatedPlayer && playerNew)
6832 relatedPlayer = playerNew;
6833
6834 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6835 {
6837 if (actionMgr)
6838 {
6839 ActionBase currentAction = actionMgr.GetRunningAction();
6840 if (currentAction)
6842 }
6843 }
6844
6845 Man ownerPlayerOld = null;
6846 Man ownerPlayerNew = null;
6847
6848 if (old_owner)
6849 {
6850 if (old_owner.
IsMan())
6851 {
6852 ownerPlayerOld = Man.Cast(old_owner);
6853 }
6854 else
6855 {
6856 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6857 }
6858 }
6859 else
6860 {
6862 {
6864
6865 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6866 {
6867 GetCompEM().UnplugThis();
6868 }
6869 }
6870 }
6871
6872 if (new_owner)
6873 {
6874 if (new_owner.
IsMan())
6875 {
6876 ownerPlayerNew = Man.Cast(new_owner);
6877 }
6878 else
6879 {
6880 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6881 }
6882 }
6883
6884 if (ownerPlayerOld != ownerPlayerNew)
6885 {
6886 if (ownerPlayerOld)
6887 {
6888 array<EntityAI> subItemsExit = new array<EntityAI>;
6890 for (int i = 0; i < subItemsExit.Count(); i++)
6891 {
6894 }
6895 }
6896
6897 if (ownerPlayerNew)
6898 {
6899 array<EntityAI> subItemsEnter = new array<EntityAI>;
6901 for (int j = 0; j < subItemsEnter.Count(); j++)
6902 {
6905 }
6906 }
6907 }
6908 else if (ownerPlayerNew != null)
6909 {
6910 PlayerBase nplayer;
6911 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6912 {
6913 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6915 for (int k = 0; k < subItemsUpdate.Count(); k++)
6916 {
6918 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6919 }
6920 }
6921 }
6922
6923 if (old_owner)
6924 old_owner.OnChildItemRemoved(this);
6925 if (new_owner)
6926 new_owner.OnChildItemReceived(this);
6927 }
6928
6929
6931 {
6932 super.EEDelete(parent);
6933 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6934 if (player)
6935 {
6937
6938 if (player.IsAlive())
6939 {
6940 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6941 if (r_index >= 0)
6942 {
6943 InventoryLocation r_il = new InventoryLocation;
6944 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6945
6946 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6949 {
6950 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6951 }
6953 {
6954 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6955 }
6956
6957 }
6958
6959 player.RemoveQuickBarEntityShortcut(this);
6960 }
6961 }
6962 }
6963
6965 {
6966 super.EEKilled(killer);
6967
6970 {
6971 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6972 {
6973 if (IsMagazine())
6974 {
6975 if (Magazine.Cast(this).GetAmmoCount() > 0)
6976 {
6978 }
6979 }
6980 else
6981 {
6983 }
6984 }
6985 }
6986 }
6987
6989 {
6990 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6991
6992 super.OnWasAttached(parent, slot_id);
6993
6996
6998 }
6999
7001 {
7002 super.OnWasDetached(parent, slot_id);
7003
7006 }
7007
7009 {
7010 int idx;
7013
7014 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7015 if (inventory_slots.Count() < 1)
7016 {
7017 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7018 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7019 }
7020 else
7021 {
7022 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7023 }
7024
7025 idx = inventory_slots.Find(slot);
7026 if (idx < 0)
7027 return "";
7028
7029 return attach_types.Get(idx);
7030 }
7031
7033 {
7034 int idx = -1;
7035 string slot;
7036
7039
7040 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7041 if (inventory_slots.Count() < 1)
7042 {
7043 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7044 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7045 }
7046 else
7047 {
7048 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7049 if (detach_types.Count() < 1)
7050 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7051 }
7052
7053 for (int i = 0; i < inventory_slots.Count(); i++)
7054 {
7055 slot = inventory_slots.Get(i);
7056 }
7057
7058 if (slot != "")
7059 {
7060 if (detach_types.Count() == 1)
7061 idx = 0;
7062 else
7063 idx = inventory_slots.Find(slot);
7064 }
7065 if (idx < 0)
7066 return "";
7067
7068 return detach_types.Get(idx);
7069 }
7070
7072 {
7073
7075
7076
7077 float min_time = 1;
7078 float max_time = 3;
7079 float delay = Math.RandomFloat(min_time, max_time);
7080
7081 explode_timer.Run(delay, this, "DoAmmoExplosion");
7082 }
7083
7085 {
7086 Magazine magazine = Magazine.Cast(this);
7087 int pop_sounds_count = 6;
7088 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7089
7090
7091 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7092 string sound_name = pop_sounds[ sound_idx ];
7094
7095
7096 magazine.ServerAddAmmoCount(-1);
7097
7098
7099 float min_temp_to_explode = 100;
7100
7101 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
7102 {
7104 }
7105 }
7106
7107
7108 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7109 {
7110 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7111
7112 const int CHANCE_DAMAGE_CARGO = 4;
7113 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7114 const int CHANCE_DAMAGE_NOTHING = 2;
7115
7117 {
7118 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7119 int chances;
7120 int rnd;
7121
7122 if (GetInventory().GetCargo())
7123 {
7124 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7125 rnd = Math.RandomInt(0,chances);
7126
7127 if (rnd < CHANCE_DAMAGE_CARGO)
7128 {
7130 }
7131 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7132 {
7134 }
7135 }
7136 else
7137 {
7138 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7139 rnd = Math.RandomInt(0,chances);
7140
7141 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7142 {
7144 }
7145 }
7146 }
7147 }
7148
7150 {
7151 if (GetInventory().GetCargo())
7152 {
7153 int item_count = GetInventory().GetCargo().GetItemCount();
7154 if (item_count > 0)
7155 {
7156 int random_pick = Math.RandomInt(0, item_count);
7158 if (!item.IsExplosive())
7159 {
7160 item.AddHealth("","",damage);
7161 return true;
7162 }
7163 }
7164 }
7165 return false;
7166 }
7167
7169 {
7170 int attachment_count = GetInventory().AttachmentCount();
7171 if (attachment_count > 0)
7172 {
7173 int random_pick = Math.RandomInt(0, attachment_count);
7174 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7175 if (!attachment.IsExplosive())
7176 {
7177 attachment.AddHealth("","",damage);
7178 return true;
7179 }
7180 }
7181 return false;
7182 }
7183
7185 {
7187 }
7188
7190 {
7192 return GetInventory().CanRemoveEntity();
7193
7194 return false;
7195 }
7196
7198 {
7200 return;
7201
7203 {
7204 if (ScriptInputUserData.CanStoreInputUserData())
7205 {
7206 ScriptInputUserData ctx = new ScriptInputUserData;
7211 ctx.
Write(destination_entity);
7215 }
7216 }
7217 else if (!
GetGame().IsMultiplayer())
7218 {
7220 }
7221 }
7222
7224 {
7226 return;
7227
7228 float split_quantity_new;
7232 InventoryLocation loc = new InventoryLocation;
7233
7234 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7235 {
7237 split_quantity_new = stack_max;
7238 else
7240
7241 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7242 if (new_item)
7243 {
7244 new_item.SetResultOfSplit(true);
7245 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7247 new_item.SetQuantity(split_quantity_new);
7248 }
7249 }
7250 else if (destination_entity && slot_id == -1)
7251 {
7252 if (quantity > stack_max)
7253 split_quantity_new = stack_max;
7254 else
7255 split_quantity_new = quantity;
7256
7258 {
7261 }
7262
7263 if (new_item)
7264 {
7265 new_item.SetResultOfSplit(true);
7266 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7268 new_item.SetQuantity(split_quantity_new);
7269 }
7270 }
7271 else
7272 {
7273 if (stack_max != 0)
7274 {
7276 {
7278 }
7279
7280 if (split_quantity_new == 0)
7281 {
7282 if (!
GetGame().IsMultiplayer())
7283 player.PhysicalPredictiveDropItem(this);
7284 else
7285 player.ServerDropEntity(this);
7286 return;
7287 }
7288
7290
7291 if (new_item)
7292 {
7293 new_item.SetResultOfSplit(true);
7294 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7296 new_item.SetQuantity(stack_max);
7297 new_item.PlaceOnSurface();
7298 }
7299 }
7300 }
7301 }
7302
7304 {
7306 return;
7307
7308 float split_quantity_new;
7312 InventoryLocation loc = new InventoryLocation;
7313
7314 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7315 {
7317 split_quantity_new = stack_max;
7318 else
7320
7321 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7322 if (new_item)
7323 {
7324 new_item.SetResultOfSplit(true);
7325 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7327 new_item.SetQuantity(split_quantity_new);
7328 }
7329 }
7330 else if (destination_entity && slot_id == -1)
7331 {
7332 if (quantity > stack_max)
7333 split_quantity_new = stack_max;
7334 else
7335 split_quantity_new = quantity;
7336
7338 {
7341 }
7342
7343 if (new_item)
7344 {
7345 new_item.SetResultOfSplit(true);
7346 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7348 new_item.SetQuantity(split_quantity_new);
7349 }
7350 }
7351 else
7352 {
7353 if (stack_max != 0)
7354 {
7356 {
7358 }
7359
7361
7362 if (new_item)
7363 {
7364 new_item.SetResultOfSplit(true);
7365 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7367 new_item.SetQuantity(stack_max);
7368 new_item.PlaceOnSurface();
7369 }
7370 }
7371 }
7372 }
7373
7375 {
7377 return;
7378
7380 {
7381 if (ScriptInputUserData.CanStoreInputUserData())
7382 {
7383 ScriptInputUserData ctx = new ScriptInputUserData;
7388 dst.WriteToContext(ctx);
7390 }
7391 }
7392 else if (!
GetGame().IsMultiplayer())
7393 {
7395 }
7396 }
7397
7399 {
7401 return;
7402
7404 {
7405 if (ScriptInputUserData.CanStoreInputUserData())
7406 {
7407 ScriptInputUserData ctx = new ScriptInputUserData;
7412 ctx.
Write(destination_entity);
7418 }
7419 }
7420 else if (!
GetGame().IsMultiplayer())
7421 {
7423 }
7424 }
7425
7427 {
7429 }
7430
7432 {
7434 return this;
7435
7437 float split_quantity_new;
7439 if (dst.IsValid())
7440 {
7441 int slot_id = dst.GetSlot();
7443
7444 if (quantity > stack_max)
7445 split_quantity_new = stack_max;
7446 else
7447 split_quantity_new = quantity;
7448
7450
7451 if (new_item)
7452 {
7453 new_item.SetResultOfSplit(true);
7454 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7457 }
7458
7459 return new_item;
7460 }
7461
7462 return null;
7463 }
7464
7466 {
7468 return;
7469
7471 float split_quantity_new;
7473 if (destination_entity)
7474 {
7476 if (quantity > stackable)
7477 split_quantity_new = stackable;
7478 else
7479 split_quantity_new = quantity;
7480
7481 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7482 if (new_item)
7483 {
7484 new_item.SetResultOfSplit(true);
7485 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7487 new_item.SetQuantity(split_quantity_new);
7488 }
7489 }
7490 }
7491
7493 {
7495 return;
7496
7498 {
7499 if (ScriptInputUserData.CanStoreInputUserData())
7500 {
7501 ScriptInputUserData ctx = new ScriptInputUserData;
7506 ItemBase destination_entity =
this;
7507 ctx.
Write(destination_entity);
7511 }
7512 }
7513 else if (!
GetGame().IsMultiplayer())
7514 {
7516 }
7517 }
7518
7520 {
7522 return;
7523
7525 float split_quantity_new;
7527 if (player)
7528 {
7530 if (quantity > stackable)
7531 split_quantity_new = stackable;
7532 else
7533 split_quantity_new = quantity;
7534
7535 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7536 new_item =
ItemBase.Cast(in_hands);
7537 if (new_item)
7538 {
7539 new_item.SetResultOfSplit(true);
7540 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7542 new_item.SetQuantity(split_quantity_new);
7543 }
7544 }
7545 }
7546
7548 {
7550 return;
7551
7553 float split_quantity_new = Math.Floor(quantity * 0.5);
7554
7556
7557 if (new_item)
7558 {
7559 if (new_item.GetQuantityMax() < split_quantity_new)
7560 {
7561 split_quantity_new = new_item.GetQuantityMax();
7562 }
7563
7564 new_item.SetResultOfSplit(true);
7565 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7566
7568 {
7571 }
7572 else
7573 {
7576 }
7577 }
7578 }
7579
7581 {
7583 return;
7584
7586 float split_quantity_new = Math.Floor(quantity / 2);
7587
7588 InventoryLocation invloc = new InventoryLocation;
7590
7592 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7593
7594 if (new_item)
7595 {
7596 if (new_item.GetQuantityMax() < split_quantity_new)
7597 {
7598 split_quantity_new = new_item.GetQuantityMax();
7599 }
7601 {
7604 }
7605 else
7606 {
7609 }
7610 }
7611 }
7612
7615 {
7616 SetWeightDirty();
7618
7619 if (parent)
7620 parent.OnAttachmentQuantityChangedEx(this, delta);
7621
7623 {
7625 {
7627 }
7629 {
7630 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7632 }
7633 }
7634
7635 }
7636
7639 {
7640
7641 }
7642
7645 {
7647 }
7648
7650 {
7651 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7652
7654 {
7655 if (newLevel == GameConstants.STATE_RUINED)
7656 {
7658 EntityAI parent = GetHierarchyParent();
7659 if (parent && parent.IsFireplace())
7660 {
7661 CargoBase cargo = GetInventory().GetCargo();
7662 if (cargo)
7663 {
7665 {
7667 }
7668 }
7669 }
7670 }
7671
7673 {
7674
7676 return;
7677 }
7678
7679 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7680 {
7682 }
7683 }
7684 }
7685
7686
7688 {
7689 super.OnRightClick();
7690
7692 {
7694 {
7695 if (ScriptInputUserData.CanStoreInputUserData())
7696 {
7697 vector m4[4];
7699
7700 EntityAI root = GetHierarchyRoot();
7701
7702 InventoryLocation dst = new InventoryLocation;
7704 {
7705 if (root)
7706 {
7707 root.GetTransform(m4);
7709 }
7710 else
7711 GetInventory().GetCurrentInventoryLocation(dst);
7712 }
7713 else
7714 {
7716
7717
7718 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7719 {
7720 if (root)
7721 {
7722 root.GetTransform(m4);
7724 }
7725 else
7726 GetInventory().GetCurrentInventoryLocation(dst);
7727 }
7728 else
7729 {
7730 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7731 }
7732 }
7733
7734 ScriptInputUserData ctx = new ScriptInputUserData;
7742 }
7743 }
7744 else if (!
GetGame().IsMultiplayer())
7745 {
7747 }
7748 }
7749 }
7750
7751 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7752 {
7753
7754 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7755 return false;
7756
7757 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7758 return false;
7759
7760
7762 return false;
7763
7764
7765 Magazine mag = Magazine.Cast(this);
7766 if (mag)
7767 {
7768 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7769 return false;
7770
7771 if (stack_max_limit)
7772 {
7773 Magazine other_mag = Magazine.Cast(other_item);
7774 if (other_item)
7775 {
7776 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7777 return false;
7778 }
7779
7780 }
7781 }
7782 else
7783 {
7784
7786 return false;
7787
7789 return false;
7790 }
7791
7792 PlayerBase player = null;
7793 if (CastTo(player, GetHierarchyRootPlayer()))
7794 {
7795 if (player.GetInventory().HasAttachment(this))
7796 return false;
7797
7798 if (player.IsItemsToDelete())
7799 return false;
7800 }
7801
7802 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7803 return false;
7804
7805 int slotID;
7807 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7808 return false;
7809
7810 return true;
7811 }
7812
7814 {
7816 }
7817
7819 {
7820 return m_IsResultOfSplit;
7821 }
7822
7824 {
7825 m_IsResultOfSplit = value;
7826 }
7827
7829 {
7831 }
7832
7834 {
7835 float other_item_quantity = other_item.GetQuantity();
7836 float this_free_space;
7837
7839
7841
7842 if (other_item_quantity > this_free_space)
7843 {
7844 return this_free_space;
7845 }
7846 else
7847 {
7848 return other_item_quantity;
7849 }
7850 }
7851
7853 {
7855 }
7856
7858 {
7860 return;
7861
7862 if (!IsMagazine() && other_item)
7863 {
7865 if (quantity_used != 0)
7866 {
7867 float hp1 = GetHealth01("","");
7868 float hp2 = other_item.GetHealth01("","");
7869 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7870 hpResult = hpResult / (
GetQuantity() + quantity_used);
7871
7872 hpResult *= GetMaxHealth();
7873 Math.Round(hpResult);
7874 SetHealth("", "Health", hpResult);
7875
7877 other_item.AddQuantity(-quantity_used);
7878 }
7879 }
7881 }
7882
7884 {
7885 #ifdef SERVER
7886 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7887 GetHierarchyParent().IncreaseLifetimeUp();
7888 #endif
7889 };
7890
7892 {
7893 PlayerBase p = PlayerBase.Cast(player);
7894
7895 array<int> recipesIds = p.m_Recipes;
7896 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7897 if (moduleRecipesManager)
7898 {
7899 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7900 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7901 }
7902
7903 for (int i = 0;i < recipesIds.Count(); i++)
7904 {
7905 int key = recipesIds.Get(i);
7906 string recipeName = moduleRecipesManager.GetRecipeName(key);
7908 }
7909 }
7910
7911
7912 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7913 {
7914 super.GetDebugActions(outputList);
7915
7916
7921
7922
7926
7930
7931
7934
7935
7937 {
7940 }
7941
7943
7946
7950 }
7951
7952
7953
7954
7956 {
7957 super.OnAction(action_id, player, ctx);
7958 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7959 {
7960 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7961 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7962 PlayerBase p = PlayerBase.Cast(player);
7963 if (
EActions.RECIPES_RANGE_START < 1000)
7964 {
7965 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7966 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7967 }
7968 }
7969 #ifndef SERVER
7970 else if (action_id ==
EActions.WATCH_PLAYER)
7971 {
7972 PluginDeveloper.SetDeveloperItemClientEx(player);
7973 }
7974 #endif
7976 {
7977 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7978 {
7979 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7980 OnDebugButtonPressServer(id + 1);
7981 }
7982
7983 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7984 {
7985 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7987 }
7988
7989 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7990 {
7991 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7993 }
7994
7995 else if (action_id ==
EActions.ADD_QUANTITY)
7996 {
7997 if (IsMagazine())
7998 {
7999 Magazine mag = Magazine.Cast(this);
8000 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8001 }
8002 else
8003 {
8005 }
8006
8007 if (m_EM)
8008 {
8009 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8010 }
8011
8012 }
8013
8014 else if (action_id ==
EActions.REMOVE_QUANTITY)
8015 {
8016 if (IsMagazine())
8017 {
8018 Magazine mag2 = Magazine.Cast(this);
8019 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8020 }
8021 else
8022 {
8024 }
8025 if (m_EM)
8026 {
8027 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8028 }
8029
8030 }
8031
8032 else if (action_id ==
EActions.SET_QUANTITY_0)
8033 {
8035
8036 if (m_EM)
8037 {
8038 m_EM.SetEnergy(0);
8039 }
8040 }
8041
8042 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8043 {
8045
8046 if (m_EM)
8047 {
8048 m_EM.SetEnergy(m_EM.GetEnergyMax());
8049 }
8050 }
8051
8052 else if (action_id ==
EActions.ADD_HEALTH)
8053 {
8054 AddHealth("","",GetMaxHealth("","Health")/5);
8055 }
8056 else if (action_id ==
EActions.REMOVE_HEALTH)
8057 {
8058 AddHealth("","",-GetMaxHealth("","Health")/5);
8059 }
8060 else if (action_id ==
EActions.DESTROY_HEALTH)
8061 {
8062 SetHealth01("","",0);
8063 }
8064 else if (action_id ==
EActions.WATCH_ITEM)
8065 {
8067 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8068 #ifdef DEVELOPER
8069 SetDebugDeveloper_item(this);
8070 #endif
8071 }
8072
8073 else if (action_id ==
EActions.ADD_TEMPERATURE)
8074 {
8075 AddTemperature(20);
8076
8077 }
8078
8079 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8080 {
8081 AddTemperature(-20);
8082
8083 }
8084
8085 else if (action_id ==
EActions.FLIP_FROZEN)
8086 {
8087 SetFrozen(!GetIsFrozen());
8088
8089 }
8090
8091 else if (action_id ==
EActions.ADD_WETNESS)
8092 {
8094
8095 }
8096
8097 else if (action_id ==
EActions.REMOVE_WETNESS)
8098 {
8100
8101 }
8102
8103 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8104 {
8107
8108
8109 }
8110
8111 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8112 {
8115 }
8116
8117 else if (action_id ==
EActions.MAKE_SPECIAL)
8118 {
8119 auto debugParams = DebugSpawnParams.WithPlayer(player);
8120 OnDebugSpawnEx(debugParams);
8121 }
8122
8123 else if (action_id ==
EActions.DELETE)
8124 {
8125 Delete();
8126 }
8127
8128 }
8129
8130
8131 return false;
8132 }
8133
8134
8135
8136
8140
8143
8144
8145
8147 {
8148 return false;
8149 }
8150
8151
8153 {
8154 return true;
8155 }
8156
8157
8159 {
8160 return true;
8161 }
8162
8163
8164
8166 {
8167 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8169 }
8170
8173 {
8174 return null;
8175 }
8176
8178 {
8179 return false;
8180 }
8181
8183 {
8184 return false;
8185 }
8186
8190
8191
8193 {
8194 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8195 return module_repairing.CanRepair(this, item_repair_kit);
8196 }
8197
8198
8199 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8200 {
8201 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8202 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8203 }
8204
8205
8207 {
8208
8209
8210
8211
8212
8213
8214
8215
8216 return 1;
8217 }
8218
8219
8220
8222 {
8224 }
8225
8226
8227
8229 {
8231 }
8232
8233
8242 {
8243 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8244
8245 if (player)
8246 {
8247 player.MessageStatus(text);
8248 }
8249 }
8250
8251
8260 {
8261 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8262
8263 if (player)
8264 {
8265 player.MessageAction(text);
8266 }
8267 }
8268
8269
8278 {
8279 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8280
8281 if (player)
8282 {
8283 player.MessageFriendly(text);
8284 }
8285 }
8286
8287
8296 {
8297 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8298
8299 if (player)
8300 {
8301 player.MessageImportant(text);
8302 }
8303 }
8304
8306 {
8307 return true;
8308 }
8309
8310
8311 override bool KindOf(
string tag)
8312 {
8313 bool found = false;
8314 string item_name = this.
GetType();
8317
8318 int array_size = item_tag_array.Count();
8319 for (int i = 0; i < array_size; i++)
8320 {
8321 if (item_tag_array.Get(i) == tag)
8322 {
8323 found = true;
8324 break;
8325 }
8326 }
8327 return found;
8328 }
8329
8330
8332 {
8333
8334 super.OnRPC(sender, rpc_type,ctx);
8335
8336
8337 switch (rpc_type)
8338 {
8339 #ifndef SERVER
8340 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8341 Param2<bool, string> p = new Param2<bool, string>(false, "");
8342
8344 return;
8345
8346 bool play = p.param1;
8347 string soundSet = p.param2;
8348
8349 if (play)
8350 {
8352 {
8354 {
8356 }
8357 }
8358 else
8359 {
8361 }
8362 }
8363 else
8364 {
8366 }
8367
8368 break;
8369 #endif
8370
8371 }
8372
8374 {
8376 }
8377 }
8378
8379
8380
8381
8383 {
8384 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8385 return plugin.GetID(
name);
8386 }
8387
8389 {
8390 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8391 return plugin.GetName(id);
8392 }
8393
8396 {
8397
8398
8399 int varFlags;
8400 if (!ctx.
Read(varFlags))
8401 return;
8402
8403 if (varFlags & ItemVariableFlags.FLOAT)
8404 {
8406 }
8407 }
8408
8410 {
8411
8412 super.SerializeNumericalVars(floats_out);
8413
8414
8415
8417 {
8419 }
8420
8422 {
8424 }
8425
8427 {
8429 }
8430
8432 {
8437 }
8438
8440 {
8442 }
8443 }
8444
8446 {
8447
8448 super.DeSerializeNumericalVars(floats);
8449
8450
8451 int index = 0;
8452 int mask = Math.Round(floats.Get(index));
8453
8454 index++;
8455
8457 {
8459 {
8461 }
8462 else
8463 {
8464 float quantity = floats.Get(index);
8466 }
8467 index++;
8468 }
8469
8471 {
8472 float wet = floats.Get(index);
8474 index++;
8475 }
8476
8478 {
8479 int liquidtype = Math.Round(floats.Get(index));
8481 index++;
8482 }
8483
8485 {
8487 index++;
8489 index++;
8491 index++;
8493 index++;
8494 }
8495
8497 {
8498 int cleanness = Math.Round(floats.Get(index));
8500 index++;
8501 }
8502 }
8503
8505 {
8506 super.WriteVarsToCTX(ctx);
8507
8508
8510 {
8512 }
8513
8515 {
8517 }
8518
8520 {
8522 }
8523
8525 {
8526 int r,g,b,a;
8532 }
8533
8535 {
8537 }
8538 }
8539
8541 {
8542 if (!super.ReadVarsFromCTX(ctx,version))
8543 return false;
8544
8545 int intValue;
8546 float value;
8547
8548 if (version < 140)
8549 {
8550 if (!ctx.
Read(intValue))
8551 return false;
8552
8553 m_VariablesMask = intValue;
8554 }
8555
8557 {
8558 if (!ctx.
Read(value))
8559 return false;
8560
8562 {
8564 }
8565 else
8566 {
8568 }
8569 }
8570
8571 if (version < 140)
8572 {
8574 {
8575 if (!ctx.
Read(value))
8576 return false;
8577 SetTemperatureDirect(value);
8578 }
8579 }
8580
8582 {
8583 if (!ctx.
Read(value))
8584 return false;
8586 }
8587
8589 {
8590 if (!ctx.
Read(intValue))
8591 return false;
8593 }
8594
8596 {
8597 int r,g,b,a;
8599 return false;
8601 return false;
8603 return false;
8605 return false;
8606
8608 }
8609
8611 {
8612 if (!ctx.
Read(intValue))
8613 return false;
8615 }
8616
8617 if (version >= 138 && version < 140)
8618 {
8620 {
8621 if (!ctx.
Read(intValue))
8622 return false;
8623 SetFrozen(intValue);
8624 }
8625 }
8626
8627 return true;
8628 }
8629
8630
8632 {
8635 {
8637 }
8638
8639 if (!super.OnStoreLoad(ctx, version))
8640 {
8642 return false;
8643 }
8644
8645 if (version >= 114)
8646 {
8647 bool hasQuickBarIndexSaved;
8648
8649 if (!ctx.
Read(hasQuickBarIndexSaved))
8650 {
8652 return false;
8653 }
8654
8655 if (hasQuickBarIndexSaved)
8656 {
8657 int itmQBIndex;
8658
8659
8660 if (!ctx.
Read(itmQBIndex))
8661 {
8663 return false;
8664 }
8665
8666 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8667 if (itmQBIndex != -1 && parentPlayer)
8668 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8669 }
8670 }
8671 else
8672 {
8673
8674 PlayerBase player;
8675 int itemQBIndex;
8676 if (version ==
int.
MAX)
8677 {
8678 if (!ctx.
Read(itemQBIndex))
8679 {
8681 return false;
8682 }
8683 }
8684 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8685 {
8686
8687 if (!ctx.
Read(itemQBIndex))
8688 {
8690 return false;
8691 }
8692 if (itemQBIndex != -1 && player)
8693 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8694 }
8695 }
8696
8697 if (version < 140)
8698 {
8699
8700 if (!LoadVariables(ctx, version))
8701 {
8703 return false;
8704 }
8705 }
8706
8707
8709 {
8711 return false;
8712 }
8713 if (version >= 132)
8714 {
8716 if (raib)
8717 {
8719 {
8721 return false;
8722 }
8723 }
8724 }
8725
8727 return true;
8728 }
8729
8730
8731
8733 {
8734 super.OnStoreSave(ctx);
8735
8736 PlayerBase player;
8737 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8738 {
8740
8741 int itemQBIndex = -1;
8742 itemQBIndex = player.FindQuickBarEntityIndex(this);
8743 ctx.
Write(itemQBIndex);
8744 }
8745 else
8746 {
8748 }
8749
8751
8753 if (raib)
8754 {
8756 }
8757 }
8758
8759
8761 {
8762 super.AfterStoreLoad();
8763
8765 {
8767 }
8768
8770 {
8773 }
8774 }
8775
8777 {
8778 super.EEOnAfterLoad();
8779
8781 {
8783 }
8784
8787 }
8788
8790 {
8791 return false;
8792 }
8793
8794
8795
8797 {
8799 {
8800 #ifdef PLATFORM_CONSOLE
8801
8803 {
8805 if (menu)
8806 {
8808 }
8809 }
8810 #endif
8811 }
8812
8814 {
8817 }
8818
8820 {
8821 SetWeightDirty();
8823 }
8825 {
8828 }
8829
8831 {
8834 }
8836 {
8839 }
8840
8841 super.OnVariablesSynchronized();
8842 }
8843
8844
8845
8847 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8848 {
8849 if (!IsServerCheck(allow_client))
8850 return false;
8851
8853 return false;
8854
8857
8858 if (value <= (min + 0.001))
8859 value = min;
8860
8861 if (value == min)
8862 {
8863 if (destroy_config)
8864 {
8865 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8866 if (dstr)
8867 {
8869 this.Delete();
8870 return true;
8871 }
8872 }
8873 else if (destroy_forced)
8874 {
8876 this.Delete();
8877 return true;
8878 }
8879
8881 }
8882
8885
8887 {
8889
8890 if (delta)
8892 }
8893
8895
8896 return false;
8897 }
8898
8899
8901 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8902 {
8904 }
8905
8907 {
8910 }
8911
8913 {
8916 }
8917
8920 {
8921 float value_clamped = Math.Clamp(value, 0, 1);
8923 SetQuantity(result, destroy_config, destroy_forced);
8924 }
8925
8926
8929 {
8931 }
8932
8934 {
8936 }
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8948 {
8949 int slot = -1;
8950 if (GetInventory())
8951 {
8952 InventoryLocation il = new InventoryLocation;
8953 GetInventory().GetCurrentInventoryLocation(il);
8955 }
8956
8958 }
8959
8961 {
8962 float quantity_max = 0;
8963
8965 {
8966 if (attSlotID != -1)
8967 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8968
8969 if (quantity_max <= 0)
8971 }
8972
8973 if (quantity_max <= 0)
8975
8976 return quantity_max;
8977 }
8978
8980 {
8982 }
8983
8985 {
8987 }
8988
8989
8991 {
8993 }
8994
8996 {
8998 }
8999
9001 {
9003 }
9004
9005
9007 {
9008
9009 float weightEx = GetWeightEx();
9010 float special = GetInventoryAndCargoWeight();
9011 return weightEx - special;
9012 }
9013
9014
9016 {
9018 }
9019
9021 {
9023 {
9024 #ifdef DEVELOPER
9025 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9026 {
9027 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9029 }
9030 #endif
9031
9033 }
9034 else if (HasEnergyManager())
9035 {
9036 #ifdef DEVELOPER
9037 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9038 {
9039 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9040 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9041 }
9042 #endif
9043 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
9044 }
9045 else
9046 {
9047 #ifdef DEVELOPER
9048 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9049 {
9050 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9051 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9052 }
9053 #endif
9054 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
9055 }
9056 }
9057
9060 {
9061 int item_count = 0;
9063
9064 if (GetInventory().GetCargo() != NULL)
9065 {
9066 item_count = GetInventory().GetCargo().GetItemCount();
9067 }
9068
9069 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
9070 {
9071 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
9072 if (item)
9073 item_count += item.GetNumberOfItems();
9074 }
9075 return item_count;
9076 }
9077
9080 {
9081 float weight = 0;
9082 float wetness = 1;
9083 if (include_wetness)
9086 {
9087 weight = wetness * m_ConfigWeight;
9088 }
9090 {
9091 weight = 1;
9092 }
9093 return weight;
9094 }
9095
9096
9097
9099 {
9100 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
9101 {
9102 GameInventory inv = GetInventory();
9103 array<EntityAI> items = new array<EntityAI>;
9105 for (int i = 0; i < items.Count(); i++)
9106 {
9108 if (item)
9109 {
9111 }
9112 }
9113 }
9114 }
9115
9116
9117
9118
9120 {
9121 float energy = 0;
9122 if (HasEnergyManager())
9123 {
9124 energy = GetCompEM().GetEnergy();
9125 }
9126 return energy;
9127 }
9128
9129
9131 {
9132 super.OnEnergyConsumed();
9133
9135 }
9136
9138 {
9139 super.OnEnergyAdded();
9140
9142 }
9143
9144
9146 {
9147 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9148 {
9150 {
9151 float energy_0to1 = GetCompEM().GetEnergy0To1();
9153 }
9154 }
9155 }
9156
9157
9159 {
9160 return ConfigGetFloat("heatIsolation");
9161 }
9162
9164 {
9166 }
9167
9169 {
9170 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9171 if (
GetGame().ConfigIsExisting(paramPath))
9173
9174 return 0.0;
9175 }
9176
9178 {
9179 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9180 if (
GetGame().ConfigIsExisting(paramPath))
9182
9183 return 0.0;
9184 }
9185
9186 override void SetWet(
float value,
bool allow_client =
false)
9187 {
9188 if (!IsServerCheck(allow_client))
9189 return;
9190
9193
9195
9196 m_VarWet = Math.Clamp(value, min, max);
9197
9199 {
9202 }
9203 }
9204
9205 override void AddWet(
float value)
9206 {
9208 }
9209
9211 {
9213 }
9214
9216 {
9218 }
9219
9221 {
9223 }
9224
9226 {
9228 }
9229
9231 {
9233 }
9234
9236 {
9239 if (newLevel != oldLevel)
9240 {
9242 }
9243 }
9244
9246 {
9247 SetWeightDirty();
9248 }
9249
9251 {
9252 return GetWetLevelInternal(
m_VarWet);
9253 }
9254
9255
9256
9258 {
9260 }
9261
9263 {
9265 }
9266
9268 {
9270 }
9271
9273 {
9275 }
9276
9277
9278
9280 {
9281 if (ConfigIsExisting("itemModelLength"))
9282 {
9283 return ConfigGetFloat("itemModelLength");
9284 }
9285 return 0;
9286 }
9287
9289 {
9290 if (ConfigIsExisting("itemAttachOffset"))
9291 {
9292 return ConfigGetFloat("itemAttachOffset");
9293 }
9294 return 0;
9295 }
9296
9297 override void SetCleanness(
int value,
bool allow_client =
false)
9298 {
9299 if (!IsServerCheck(allow_client))
9300 return;
9301
9303
9305
9308 }
9309
9311 {
9313 }
9314
9316 {
9317 return true;
9318 }
9319
9320
9321
9322
9324 {
9326 }
9327
9329 {
9331 }
9332
9333
9334
9335
9336 override void SetColor(
int r,
int g,
int b,
int a)
9337 {
9343 }
9345 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9346 {
9351 }
9352
9354 {
9356 }
9357
9360 {
9361 int r,g,b,a;
9363 r = r/255;
9364 g = g/255;
9365 b = b/255;
9366 a = a/255;
9367 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9368 }
9369
9370
9371
9372 override void SetLiquidType(
int value,
bool allow_client =
false)
9373 {
9374 if (!IsServerCheck(allow_client))
9375 return;
9376
9381 }
9382
9384 {
9385 return ConfigGetInt("varLiquidTypeInit");
9386 }
9387
9389 {
9391 }
9392
9394 {
9396 SetFrozen(false);
9397 }
9398
9401 {
9402 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9403 }
9404
9405
9408 {
9409 PlayerBase nplayer;
9410 if (PlayerBase.CastTo(nplayer, player))
9411 {
9413
9414 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9415 }
9416 }
9417
9418
9421 {
9422 PlayerBase nplayer;
9423 if (PlayerBase.CastTo(nplayer,player))
9424 {
9425
9426 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9427
9428 }
9429
9430
9431 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9432
9433
9434 if (HasEnergyManager())
9435 {
9436 GetCompEM().UpdatePlugState();
9437 }
9438 }
9439
9440
9442 {
9443 super.OnPlacementStarted(player);
9444
9446 }
9447
9448 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9449 {
9451 {
9452 m_AdminLog.OnPlacementComplete(player,
this);
9453 }
9454
9455 super.OnPlacementComplete(player, position, orientation);
9456 }
9457
9458
9459
9460
9461
9463 {
9465 {
9466 return true;
9467 }
9468 else
9469 {
9470 return false;
9471 }
9472 }
9473
9474
9476 {
9478 {
9480 }
9481 }
9482
9483
9485 {
9487 }
9488
9490 {
9492 }
9493
9494 override void InsertAgent(
int agent,
float count = 1)
9495 {
9496 if (count < 1)
9497 return;
9498
9500 }
9501
9504 {
9506 }
9507
9508
9510 {
9512 }
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9556 {
9558 return false;
9559 return true;
9560 }
9561
9563 {
9564
9566 }
9567
9568
9571 {
9572 super.CheckForRoofLimited(timeTresholdMS);
9573
9575 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9576 {
9577 m_PreviousRoofTestTime = time;
9578 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9579 }
9580 }
9581
9582
9584 {
9586 {
9587 return 0;
9588 }
9589
9590 if (GetInventory().GetAttachmentSlotsCount() != 0)
9591 {
9592 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9593 if (filter)
9594 return filter.GetProtectionLevel(type, false, system);
9595 else
9596 return 0;
9597 }
9598
9599 string subclassPath, entryName;
9600
9601 switch (type)
9602 {
9604 entryName = "biological";
9605 break;
9607 entryName = "chemical";
9608 break;
9609 default:
9610 entryName = "biological";
9611 break;
9612 }
9613
9614 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9615
9617 }
9618
9619
9620
9623 {
9624 if (!IsMagazine())
9626
9628 }
9629
9630
9631
9632
9633
9638 {
9639 return true;
9640 }
9641
9643 {
9645 }
9646
9647
9648
9649
9650
9652 {
9653 if (parent)
9654 {
9655 if (parent.IsInherited(DayZInfected))
9656 return true;
9657
9658 if (!parent.IsRuined())
9659 return true;
9660 }
9661
9662 return true;
9663 }
9664
9666 {
9667 if (!super.CanPutAsAttachment(parent))
9668 {
9669 return false;
9670 }
9671
9672 if (!IsRuined() && !parent.IsRuined())
9673 {
9674 return true;
9675 }
9676
9677 return false;
9678 }
9679
9681 {
9682
9683
9684
9685
9686 return super.CanReceiveItemIntoCargo(item);
9687 }
9688
9690 {
9691
9692
9693
9694
9695 GameInventory attachmentInv = attachment.GetInventory();
9697 {
9698 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9699 return false;
9700 }
9701
9702 InventoryLocation loc = new InventoryLocation();
9703 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9704 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9705 return false;
9706
9707 return super.CanReceiveAttachment(attachment, slotId);
9708 }
9709
9711 {
9712 if (!super.CanReleaseAttachment(attachment))
9713 return false;
9714
9715 return GetInventory().AreChildrenAccessible();
9716 }
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9739 {
9740 int id = muzzle_owner.GetMuzzleID();
9741 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9742
9743 if (WPOF_array)
9744 {
9745 for (int i = 0; i < WPOF_array.Count(); i++)
9746 {
9747 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9748
9749 if (WPOF)
9750 {
9751 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9752 }
9753 }
9754 }
9755 }
9756
9757
9759 {
9760 int id = muzzle_owner.GetMuzzleID();
9762
9763 if (WPOBE_array)
9764 {
9765 for (int i = 0; i < WPOBE_array.Count(); i++)
9766 {
9767 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9768
9769 if (WPOBE)
9770 {
9771 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9772 }
9773 }
9774 }
9775 }
9776
9777
9779 {
9780 int id = muzzle_owner.GetMuzzleID();
9781 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9782
9783 if (WPOOH_array)
9784 {
9785 for (int i = 0; i < WPOOH_array.Count(); i++)
9786 {
9787 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9788
9789 if (WPOOH)
9790 {
9791 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9792 }
9793 }
9794 }
9795 }
9796
9797
9799 {
9800 int id = muzzle_owner.GetMuzzleID();
9801 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9802
9803 if (WPOOH_array)
9804 {
9805 for (int i = 0; i < WPOOH_array.Count(); i++)
9806 {
9807 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9808
9809 if (WPOOH)
9810 {
9811 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9812 }
9813 }
9814 }
9815 }
9816
9817
9819 {
9820 int id = muzzle_owner.GetMuzzleID();
9821 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9822
9823 if (WPOOH_array)
9824 {
9825 for (int i = 0; i < WPOOH_array.Count(); i++)
9826 {
9827 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9828
9829 if (WPOOH)
9830 {
9831 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9832 }
9833 }
9834 }
9835 }
9836
9837
9838
9840 {
9842 {
9843 return true;
9844 }
9845
9846 return false;
9847 }
9848
9850 {
9852 {
9853 return true;
9854 }
9855
9856 return false;
9857 }
9858
9860 {
9862 {
9863 return true;
9864 }
9865
9866 return false;
9867 }
9868
9870 {
9871 return false;
9872 }
9873
9876 {
9877 return UATimeSpent.DEFAULT_DEPLOY;
9878 }
9879
9880
9881
9882
9884 {
9886 SetSynchDirty();
9887 }
9888
9890 {
9892 }
9893
9894
9896 {
9897 return false;
9898 }
9899
9902 {
9903 string att_type = "None";
9904
9905 if (ConfigIsExisting("soundAttType"))
9906 {
9907 att_type = ConfigGetString("soundAttType");
9908 }
9909
9911 }
9912
9914 {
9916 }
9917
9918
9919
9920
9921
9925
9927 {
9930
9932 }
9933
9934
9936 {
9938 return;
9939
9941
9944
9947
9948 SoundParameters params = new SoundParameters();
9952 }
9953
9954
9956 {
9958 return;
9959
9961 SetSynchDirty();
9962
9965 }
9966
9967
9969 {
9971 return;
9972
9974 SetSynchDirty();
9975
9978 }
9979
9981 {
9983 }
9984
9986 {
9988 }
9989
9992 {
9993 if (!
GetGame().IsDedicatedServer())
9994 {
9995 if (ConfigIsExisting("attachSoundSet"))
9996 {
9997 string cfg_path = "";
9998 string soundset = "";
10000
10003 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10004 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10005
10006 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10007 {
10008 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10009 {
10010 if (cfg_slot_array[i] == slot_type)
10011 {
10012 soundset = cfg_soundset_array[i];
10013 break;
10014 }
10015 }
10016 }
10017
10018 if (soundset != "")
10019 {
10020 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10022 }
10023 }
10024 }
10025 }
10026
10028 {
10029
10030 }
10031
10032 void OnApply(PlayerBase player);
10033
10035 {
10036 return 1.0;
10037 };
10038
10040 {
10042 }
10043
10045 {
10047 }
10048
10050
10052 {
10053 SetDynamicPhysicsLifeTime(0.01);
10055 }
10056
10058 {
10059 array<string> zone_names = new array<string>;
10060 GetDamageZones(zone_names);
10061 for (int i = 0; i < zone_names.Count(); i++)
10062 {
10063 SetHealthMax(zone_names.Get(i),"Health");
10064 }
10065 SetHealthMax("","Health");
10066 }
10067
10070 {
10071 float global_health = GetHealth01("","Health");
10072 array<string> zones = new array<string>;
10073 GetDamageZones(zones);
10074
10075 for (int i = 0; i < zones.Count(); i++)
10076 {
10077 SetHealth01(zones.Get(i),"Health",global_health);
10078 }
10079 }
10080
10083 {
10084 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10085 }
10086
10088 {
10089 if (!hasRootAsPlayer)
10090 {
10091 if (refParentIB)
10092 {
10093
10094 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10095 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10096
10097 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10098 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10099
10102 }
10103 else
10104 {
10105
10108 }
10109 }
10110 }
10111
10113 {
10115 {
10116 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10117 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
10118 {
10119 float heatPermCoef = 1.0;
10121 while (ent)
10122 {
10123 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10124 ent = ent.GetHierarchyParent();
10125 }
10126
10127 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10128 }
10129 }
10130 }
10131
10133 {
10134
10135 EntityAI parent = GetHierarchyParent();
10136 if (!parent)
10137 {
10138 hasParent = false;
10139 hasRootAsPlayer = false;
10140 }
10141 else
10142 {
10143 hasParent = true;
10144 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10145 refParentIB =
ItemBase.Cast(parent);
10146 }
10147 }
10148
10149 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10150 {
10151
10152 }
10153
10155 {
10156
10157 return false;
10158 }
10159
10161 {
10162
10163
10164 return false;
10165 }
10166
10168 {
10169
10170 return false;
10171 }
10172
10175 {
10176 return !GetIsFrozen() &&
IsOpen();
10177 }
10178
10180 {
10181 bool hasParent = false, hasRootAsPlayer = false;
10183
10184 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10185 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10186
10187 if (wwtu || foodDecay)
10188 {
10192
10193 if (processWetness || processTemperature || processDecay)
10194 {
10196
10197 if (processWetness)
10198 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10199
10200 if (processTemperature)
10202
10203 if (processDecay)
10204 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10205 }
10206 }
10207 }
10208
10211 {
10213 }
10214
10216 {
10219
10220 return super.GetTemperatureFreezeThreshold();
10221 }
10222
10224 {
10227
10228 return super.GetTemperatureThawThreshold();
10229 }
10230
10232 {
10235
10236 return super.GetItemOverheatThreshold();
10237 }
10238
10240 {
10242 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10243
10244 return super.GetTemperatureFreezeTime();
10245 }
10246
10248 {
10250 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10251
10252 return super.GetTemperatureThawTime();
10253 }
10254
10259
10261 {
10262 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10263 }
10264
10266 {
10267 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10268 }
10269
10272 {
10274 }
10275
10277 {
10279 }
10280
10282 {
10284 }
10285
10288 {
10289 return null;
10290 }
10291
10294 {
10295 return false;
10296 }
10297
10299 {
10301 {
10304 if (!trg)
10305 {
10307 explosive = this;
10308 }
10309
10310 explosive.PairRemote(trg);
10312
10313 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10314 trg.SetPersistentPairID(persistentID);
10315 explosive.SetPersistentPairID(persistentID);
10316
10317 return true;
10318 }
10319 return false;
10320 }
10321
10324 {
10325 float ret = 1.0;
10328 ret *= GetHealth01();
10329
10330 return ret;
10331 }
10332
10333 #ifdef DEVELOPER
10334 override void SetDebugItem()
10335 {
10336 super.SetDebugItem();
10337 _itemBase = this;
10338 }
10339
10341 {
10342 string text = super.GetDebugText();
10343
10345 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10346
10347 return text;
10348 }
10349 #endif
10350
10352 {
10353 return true;
10354 }
10355
10357
10359
10361 {
10364 }
10365
10366
10374
10390}
10391
10393{
10395 if (entity)
10396 {
10397 bool is_item = entity.IsInherited(
ItemBase);
10398 if (is_item && full_quantity)
10399 {
10402 }
10403 }
10404 else
10405 {
10407 return NULL;
10408 }
10409 return entity;
10410}
10411
10413{
10414 if (item)
10415 {
10416 if (health > 0)
10417 item.SetHealth("", "", health);
10418
10419 if (item.CanHaveTemperature())
10420 {
10422 if (item.CanFreeze())
10423 item.SetFrozen(false);
10424 }
10425
10426 if (item.HasEnergyManager())
10427 {
10428 if (quantity >= 0)
10429 {
10430 item.GetCompEM().SetEnergy0To1(quantity);
10431 }
10432 else
10433 {
10435 }
10436 }
10437 else if (item.IsMagazine())
10438 {
10439 Magazine mag = Magazine.Cast(item);
10440 if (quantity >= 0)
10441 {
10442 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10443 }
10444 else
10445 {
10447 }
10448
10449 }
10450 else
10451 {
10452 if (quantity >= 0)
10453 {
10454 item.SetQuantityNormalized(quantity, false);
10455 }
10456 else
10457 {
10459 }
10460
10461 }
10462 }
10463}
10464
10465#ifdef DEVELOPER
10467#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.