5645{
5647 {
5648 return true;
5649 }
5650};
5651
5653{
5654
5655};
5656
5657
5658
5660{
5664
5666
5669
5670
5671
5672
5673
5682
5688
5693
5698
5719 protected bool m_IsResultOfSplit
5720
5722
5727
5728
5729
5731
5735
5736
5737
5739
5742
5743
5744
5750
5751
5759
5762
5763
5765
5766
5768
5769
5774
5775
5780
5782
5783
5785
5786
5788 {
5793
5794 if (!
g_Game.IsDedicatedServer())
5795 {
5797 {
5799
5801 {
5803 }
5804 }
5805
5808 }
5809
5810 m_OldLocation = null;
5811
5813 {
5815 }
5816
5817 if (ConfigIsExisting("headSelectionsToHide"))
5818 {
5821 }
5822
5824 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5825 {
5827 }
5828
5830
5831 m_IsResultOfSplit = false;
5832
5834 }
5835
5837 {
5838 super.InitItemVariables();
5839
5845 m_Count = ConfigGetInt(
"count");
5846
5849
5854
5857
5862
5874
5878
5879
5882 if (ConfigIsExisting("canBeSplit"))
5883 {
5886 }
5887
5889 if (ConfigIsExisting("itemBehaviour"))
5891
5892
5895 RegisterNetSyncVariableInt("m_VarLiquidType");
5896 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5897
5898 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5899 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5900 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5901
5902 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5903 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5904 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5905 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5906
5907 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5908 RegisterNetSyncVariableBool("m_IsTakeable");
5909 RegisterNetSyncVariableBool("m_IsHologram");
5910
5913 {
5916 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5917 }
5918
5920
5922 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5924
5926 }
5927
5929 {
5931 }
5932
5934 {
5937 {
5942 }
5943 }
5944
5945 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5946 {
5948 {
5951 }
5952
5954 }
5955
5957 {
5963 }
5964
5966
5968 {
5970
5971 if (!action)
5972 {
5973 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5974 return;
5975 }
5976
5978 if (!ai)
5979 {
5981 return;
5982 }
5983
5985 if (!action_array)
5986 {
5987 action_array = new array<ActionBase_Basic>;
5989 }
5990 if (LogManager.IsActionLogEnable())
5991 {
5992 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5993 }
5994
5995 if (action_array.Find(action) != -1)
5996 {
5997 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5998 }
5999 else
6000 {
6001 action_array.Insert(action);
6002 }
6003 }
6004
6006 {
6007 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6008 ActionBase action = player.GetActionManager().GetAction(actionName);
6011
6012 if (action_array)
6013 {
6014 action_array.RemoveItem(action);
6015 }
6016 }
6017
6018
6019
6021 {
6022 ActionOverrideData overrideData = new ActionOverrideData();
6026
6028 if (!actionMap)
6029 {
6032 }
6033
6034 actionMap.Insert(this.
Type(), overrideData);
6035
6036 }
6037
6039
6041
6042
6044 {
6047
6050
6051 string config_to_search = "CfgVehicles";
6052 string muzzle_owner_config;
6053
6055 {
6056 if (IsInherited(Weapon))
6057 config_to_search = "CfgWeapons";
6058
6059 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6060
6061 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6062
6063 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6064
6065 if (config_OnFire_subclass_count > 0)
6066 {
6067 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6068
6069 for (int i = 0; i < config_OnFire_subclass_count; i++)
6070 {
6071 string particle_class = "";
6072 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6073 string config_OnFire_entry = config_OnFire_class + particle_class;
6074 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6075 WPOF_array.Insert(WPOF);
6076 }
6077
6078
6080 }
6081 }
6082
6084 {
6085 config_to_search = "CfgWeapons";
6086 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6087
6088 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6089
6090 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6091
6092 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6093 {
6094 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6095
6096 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6097 {
6098 string particle_class2 = "";
6099 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6100 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6101 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6102 WPOBE_array.Insert(WPOBE);
6103 }
6104
6105
6107 }
6108 }
6109 }
6110
6111
6113 {
6116
6118 {
6119 string config_to_search = "CfgVehicles";
6120
6121 if (IsInherited(Weapon))
6122 config_to_search = "CfgWeapons";
6123
6124 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6125 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6126
6127 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6128 {
6129
6131
6133 {
6135 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6137 return;
6138 }
6139
6142
6143
6144
6145 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6146 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6147
6148 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6149 {
6150 string particle_class = "";
6151 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6152 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6153 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6154
6155 if (entry_type == CT_CLASS)
6156 {
6157 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6158 WPOOH_array.Insert(WPOF);
6159 }
6160 }
6161
6162
6164 }
6165 }
6166 }
6167
6169 {
6171 }
6172
6174 {
6176 {
6178
6181
6184
6185 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6186 }
6187 }
6188
6190 {
6192 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6193
6195 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6196
6198 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6199
6201 {
6203 }
6204 }
6205
6207 {
6209 }
6210
6212 {
6215 else
6217
6219 {
6222 }
6223 else
6224 {
6227
6230 }
6231
6233 }
6234
6236 {
6238 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6239 }
6240
6242 {
6244 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6246 }
6247
6249 {
6251 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6252 }
6253
6255 {
6258
6259 OverheatingParticle OP = new OverheatingParticle();
6264
6266 }
6267
6269 {
6272
6273 return -1;
6274 }
6275
6277 {
6279 {
6282
6283 for (int i = count; i > 0; --i)
6284 {
6285 int id = i - 1;
6288
6291
6292 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6293 {
6294 if (p)
6295 {
6298 }
6299 }
6300 }
6301 }
6302 }
6303
6305 {
6307 {
6309 {
6310 int id = i - 1;
6312
6313 if (OP)
6314 {
6316
6317 if (p)
6318 {
6320 }
6321
6322 delete OP;
6323 }
6324 }
6325
6328 }
6329 }
6330
6333 {
6334 return 0.0;
6335 }
6336
6337
6339 {
6340 return 250;
6341 }
6342
6344 {
6345 return 0;
6346 }
6347
6350 {
6352 return true;
6353
6354 return false;
6355 }
6356
6359 {
6362
6364 {
6366 }
6367 else
6368 {
6369
6371 }
6372
6374 }
6375
6382 {
6383 return -1;
6384 }
6385
6386
6387
6388
6390 {
6392 {
6393 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6394 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6395
6396 if (r_index >= 0)
6397 {
6398 InventoryLocation r_il = new InventoryLocation;
6399 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6400
6401 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6404 {
6405 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6406 }
6408 {
6409 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6410 }
6411
6412 }
6413
6414 player.GetHumanInventory().ClearUserReservedLocation(this);
6415 }
6416
6419 }
6420
6421
6422
6423
6425 {
6426 return ItemBase.m_DebugActionsMask;
6427 }
6428
6430 {
6431 return ItemBase.m_DebugActionsMask & mask;
6432 }
6433
6435 {
6436 ItemBase.m_DebugActionsMask = mask;
6437 }
6438
6440 {
6441 ItemBase.m_DebugActionsMask |= mask;
6442 }
6443
6445 {
6446 ItemBase.m_DebugActionsMask &= ~mask;
6447 }
6448
6450 {
6452 {
6454 }
6455 else
6456 {
6458 }
6459 }
6460
6461
6463 {
6464 if (GetEconomyProfile())
6465 {
6466 float q_max = GetEconomyProfile().GetQuantityMax();
6467 if (q_max > 0)
6468 {
6469 float q_min = GetEconomyProfile().GetQuantityMin();
6470 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6471
6473 {
6474 ComponentEnergyManager comp = GetCompEM();
6476 {
6478 }
6479 }
6481 {
6483
6484 }
6485
6486 }
6487 }
6488 }
6489
6492 {
6493 EntityAI parent = GetHierarchyParent();
6494
6495 if (parent)
6496 {
6497 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6498 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6499 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6500 }
6501 }
6502
6505 {
6506 EntityAI parent = GetHierarchyParent();
6507
6508 if (parent)
6509 {
6510 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6511 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6512 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6513 }
6514 }
6515
6517 {
6518
6519
6520
6521
6523
6525 {
6526 if (ScriptInputUserData.CanStoreInputUserData())
6527 {
6528 ScriptInputUserData ctx = new ScriptInputUserData;
6534 ctx.
Write(use_stack_max);
6537
6539 {
6540 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6541 }
6542 }
6543 }
6544 else if (!
g_Game.IsMultiplayer())
6545 {
6547 }
6548 }
6549
6551 {
6553 }
6554
6556 {
6558 }
6559
6561 {
6563 }
6564
6566 {
6567
6568 return false;
6569 }
6570
6572 {
6573 return false;
6574 }
6575
6579 {
6580 return false;
6581 }
6582
6584 {
6585 return "";
6586 }
6587
6589
6591 {
6592 return false;
6593 }
6594
6596 {
6597 return true;
6598 }
6599
6600
6601
6603 {
6604 return true;
6605 }
6606
6608 {
6609 return true;
6610 }
6611
6613 {
6614 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6616 }
6617
6619 {
6621 }
6622
6624 {
6626 if (!is_being_placed)
6628 SetSynchDirty();
6629 }
6630
6631
6633
6635 {
6637 }
6638
6640 {
6642 }
6643
6645 {
6646 return 1;
6647 }
6648
6650 {
6651 return false;
6652 }
6653
6655 {
6657 SetSynchDirty();
6658 }
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6695 {
6696 super.OnMovedInsideCargo(container);
6697
6698 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6699 }
6700
6701 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6702 {
6703 super.EEItemLocationChanged(oldLoc, newLoc);
6704
6705 PlayerBase newPlayer = null;
6706 PlayerBase oldPlayer = null;
6707
6708 if (newLoc.GetParent())
6709 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6710
6711 if (oldLoc.GetParent())
6712 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6713
6715 {
6716 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6717
6718 if (rIndex >= 0)
6719 {
6720 InventoryLocation rIl = new InventoryLocation;
6721 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6722
6723 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6726 {
6727 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6728 }
6730 {
6732 }
6733
6734 }
6735 }
6736
6738 {
6739 if (newPlayer)
6740 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6741
6742 if (newPlayer == oldPlayer)
6743 {
6744 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6745 {
6747 {
6748 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6749 {
6750 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6751 }
6752 }
6753 else
6754 {
6755 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6756 }
6757 }
6758
6759 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6760 {
6761 int type = oldLoc.GetType();
6763 {
6764 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6765 }
6767 {
6768 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6769 }
6770 }
6771 if (!m_OldLocation)
6772 {
6773 m_OldLocation = new InventoryLocation;
6774 }
6775 m_OldLocation.Copy(oldLoc);
6776 }
6777 else
6778 {
6779 if (m_OldLocation)
6780 {
6781 m_OldLocation.Reset();
6782 }
6783 }
6784
6785 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6786 }
6787 else
6788 {
6789 if (newPlayer)
6790 {
6791 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6792 if (resIndex >= 0)
6793 {
6794 InventoryLocation il = new InventoryLocation;
6795 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6797 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6800 {
6801 il.
GetParent().GetOnReleaseLock().Invoke(it);
6802 }
6804 {
6806 }
6807
6808 }
6809 }
6811 {
6812
6814 }
6815
6816 if (m_OldLocation)
6817 {
6818 m_OldLocation.Reset();
6819 }
6820 }
6821
6823 {
6824 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6825 }
6826
6828 {
6829 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6830 }
6831 }
6832
6833 override void EOnContact(IEntity other, Contact extra)
6834 {
6836 {
6837 int liquidType = -1;
6839 if (impactSpeed > 0.0)
6840 {
6842 #ifndef SERVER
6844 #else
6846 SetSynchDirty();
6847 #endif
6849 }
6850 }
6851
6852 #ifdef SERVER
6853 if (GetCompEM() && GetCompEM().IsPlugged())
6854 {
6855 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6856 GetCompEM().UnplugThis();
6857 }
6858 #endif
6859 }
6860
6862
6864 {
6866 }
6867
6869 {
6870
6871 }
6872
6874 {
6875 super.OnItemLocationChanged(old_owner, new_owner);
6876
6877 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6878 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6879
6880 if (!relatedPlayer && playerNew)
6881 relatedPlayer = playerNew;
6882
6883 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6884 {
6886 if (actionMgr)
6887 {
6888 ActionBase currentAction = actionMgr.GetRunningAction();
6889 if (currentAction)
6891 }
6892 }
6893
6894 Man ownerPlayerOld = null;
6895 Man ownerPlayerNew = null;
6896
6897 if (old_owner)
6898 {
6899 if (old_owner.
IsMan())
6900 {
6901 ownerPlayerOld = Man.Cast(old_owner);
6902 }
6903 else
6904 {
6905 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6906 }
6907 }
6908 else
6909 {
6911 {
6913
6914 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6915 {
6916 GetCompEM().UnplugThis();
6917 }
6918 }
6919 }
6920
6921 if (new_owner)
6922 {
6923 if (new_owner.
IsMan())
6924 {
6925 ownerPlayerNew = Man.Cast(new_owner);
6926 }
6927 else
6928 {
6929 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6930 }
6931 }
6932
6933 if (ownerPlayerOld != ownerPlayerNew)
6934 {
6935 if (ownerPlayerOld)
6936 {
6937 array<EntityAI> subItemsExit = new array<EntityAI>;
6939 for (int i = 0; i < subItemsExit.Count(); i++)
6940 {
6943 }
6944 }
6945
6946 if (ownerPlayerNew)
6947 {
6948 array<EntityAI> subItemsEnter = new array<EntityAI>;
6950 for (int j = 0; j < subItemsEnter.Count(); j++)
6951 {
6954 }
6955 }
6956 }
6957 else if (ownerPlayerNew != null)
6958 {
6959 PlayerBase nplayer;
6960 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6961 {
6962 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6964 for (int k = 0; k < subItemsUpdate.Count(); k++)
6965 {
6967 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6968 }
6969 }
6970 }
6971
6972 if (old_owner)
6973 old_owner.OnChildItemRemoved(this);
6974 if (new_owner)
6975 new_owner.OnChildItemReceived(this);
6976 }
6977
6978
6980 {
6981 super.EEDelete(parent);
6982 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6983 if (player)
6984 {
6986
6987 if (player.IsAlive())
6988 {
6989 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6990 if (r_index >= 0)
6991 {
6992 InventoryLocation r_il = new InventoryLocation;
6993 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6994
6995 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6998 {
6999 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7000 }
7002 {
7003 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7004 }
7005
7006 }
7007
7008 player.RemoveQuickBarEntityShortcut(this);
7009 }
7010 }
7011 }
7012
7014 {
7015 super.EEKilled(killer);
7016
7019 {
7020 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7021 {
7022 if (IsMagazine())
7023 {
7024 if (Magazine.Cast(this).GetAmmoCount() > 0)
7025 {
7027 }
7028 }
7029 else
7030 {
7032 }
7033 }
7034 }
7035 }
7036
7038 {
7039 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7040
7041 super.OnWasAttached(parent, slot_id);
7042
7045
7048 }
7049
7051 {
7052 super.OnWasDetached(parent, slot_id);
7053
7056
7059 }
7060
7062 {
7063 int idx;
7066
7067 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7068 if (inventory_slots.Count() < 1)
7069 {
7070 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7071 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7072 }
7073 else
7074 {
7075 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7076 }
7077
7078 idx = inventory_slots.Find(slot);
7079 if (idx < 0)
7080 return "";
7081
7082 return attach_types.Get(idx);
7083 }
7084
7086 {
7087 int idx = -1;
7088 string slot;
7089
7092
7093 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7094 if (inventory_slots.Count() < 1)
7095 {
7096 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7097 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7098 }
7099 else
7100 {
7101 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7102 if (detach_types.Count() < 1)
7103 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7104 }
7105
7106 for (int i = 0; i < inventory_slots.Count(); i++)
7107 {
7108 slot = inventory_slots.Get(i);
7109 }
7110
7111 if (slot != "")
7112 {
7113 if (detach_types.Count() == 1)
7114 idx = 0;
7115 else
7116 idx = inventory_slots.Find(slot);
7117 }
7118 if (idx < 0)
7119 return "";
7120
7121 return detach_types.Get(idx);
7122 }
7123
7125 {
7126
7128
7129
7130 float min_time = 1;
7131 float max_time = 3;
7132 float delay = Math.RandomFloat(min_time, max_time);
7133
7134 explode_timer.Run(delay, this, "DoAmmoExplosion");
7135 }
7136
7138 {
7139 Magazine magazine = Magazine.Cast(this);
7140 int pop_sounds_count = 6;
7141 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7142
7143
7144 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7145 string sound_name = pop_sounds[ sound_idx ];
7146 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7147
7148
7149 magazine.ServerAddAmmoCount(-1);
7150
7151
7152 float min_temp_to_explode = 100;
7153
7154 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7155 {
7157 }
7158 }
7159
7160
7161 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7162 {
7163 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7164
7165 const int CHANCE_DAMAGE_CARGO = 4;
7166 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7167 const int CHANCE_DAMAGE_NOTHING = 2;
7168
7170 {
7171 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7172 int chances;
7173 int rnd;
7174
7175 if (GetInventory().GetCargo())
7176 {
7177 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7178 rnd = Math.RandomInt(0,chances);
7179
7180 if (rnd < CHANCE_DAMAGE_CARGO)
7181 {
7183 }
7184 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7185 {
7187 }
7188 }
7189 else
7190 {
7191 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7192 rnd = Math.RandomInt(0,chances);
7193
7194 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7195 {
7197 }
7198 }
7199 }
7200 }
7201
7203 {
7204 CargoBase cargo = GetInventory().GetCargo();
7205 if (cargo)
7206 {
7208 if (item_count > 0)
7209 {
7210 int random_pick = Math.RandomInt(0, item_count);
7212 if (!item.IsExplosive())
7213 {
7214 item.AddHealth("","",damage);
7215 return true;
7216 }
7217 }
7218 }
7219 return false;
7220 }
7221
7223 {
7224 GameInventory inventory = GetInventory();
7226 if (attachment_count > 0)
7227 {
7228 int random_pick = Math.RandomInt(0, attachment_count);
7230 if (!attachment.IsExplosive())
7231 {
7232 attachment.AddHealth("","",damage);
7233 return true;
7234 }
7235 }
7236 return false;
7237 }
7238
7240 {
7242 }
7243
7245 {
7247 return GetInventory().CanRemoveEntity();
7248
7249 return false;
7250 }
7251
7253 {
7254
7256 return false;
7257
7258
7260 return false;
7261
7262
7263
7265 if (delta == 0)
7266 return false;
7267
7268
7269 return true;
7270 }
7271
7273 {
7275 {
7276 if (ScriptInputUserData.CanStoreInputUserData())
7277 {
7278 ScriptInputUserData ctx = new ScriptInputUserData;
7283 ctx.
Write(destination_entity);
7287 }
7288 }
7289 else if (!
g_Game.IsMultiplayer())
7290 {
7292 }
7293 }
7294
7296 {
7297 float split_quantity_new;
7301 InventoryLocation loc = new InventoryLocation;
7302
7303 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7304 {
7306 split_quantity_new = stack_max;
7307 else
7309
7311 {
7312 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7313 if (new_item)
7314 {
7315 new_item.SetResultOfSplit(true);
7316 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7318 new_item.
SetQuantity(split_quantity_new,
false,
true);
7319 }
7320 }
7321 }
7322 else if (destination_entity && slot_id == -1)
7323 {
7324 if (quantity > stack_max)
7325 split_quantity_new = stack_max;
7326 else
7327 split_quantity_new = quantity;
7328
7330 {
7331 GameInventory destinationInventory = destination_entity.GetInventory();
7333 {
7336 }
7337
7338 if (new_item)
7339 {
7340 new_item.SetResultOfSplit(true);
7341 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7343 new_item.
SetQuantity(split_quantity_new,
false,
true);
7344 }
7345 }
7346 }
7347 else
7348 {
7349 if (stack_max != 0)
7350 {
7352 {
7354 }
7355
7356 if (split_quantity_new == 0)
7357 {
7358 if (!
g_Game.IsMultiplayer())
7359 player.PhysicalPredictiveDropItem(this);
7360 else
7361 player.ServerDropEntity(this);
7362 return;
7363 }
7364
7366 {
7368
7369 if (new_item)
7370 {
7371 new_item.SetResultOfSplit(true);
7372 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7375 new_item.PlaceOnSurface();
7376 }
7377 }
7378 }
7379 }
7380 }
7381
7383 {
7384 float split_quantity_new;
7388 InventoryLocation loc = new InventoryLocation;
7389
7390 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7391 {
7393 split_quantity_new = stack_max;
7394 else
7396
7398 {
7399 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7400 if (new_item)
7401 {
7402 new_item.SetResultOfSplit(true);
7403 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7405 new_item.
SetQuantity(split_quantity_new,
false,
true);
7406 }
7407 }
7408 }
7409 else if (destination_entity && slot_id == -1)
7410 {
7411 if (quantity > stack_max)
7412 split_quantity_new = stack_max;
7413 else
7414 split_quantity_new = quantity;
7415
7417 {
7418 GameInventory destinationInventory = destination_entity.GetInventory();
7420 {
7423 }
7424
7425 if (new_item)
7426 {
7427 new_item.SetResultOfSplit(true);
7428 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7430 new_item.
SetQuantity(split_quantity_new,
false,
true);
7431 }
7432 }
7433 }
7434 else
7435 {
7436 if (stack_max != 0)
7437 {
7439 {
7441 }
7442
7444 {
7446
7447 if (new_item)
7448 {
7449 new_item.SetResultOfSplit(true);
7450 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7453 new_item.PlaceOnSurface();
7454 }
7455 }
7456 }
7457 }
7458 }
7459
7461 {
7463 {
7464 if (ScriptInputUserData.CanStoreInputUserData())
7465 {
7466 ScriptInputUserData ctx = new ScriptInputUserData;
7471 dst.WriteToContext(ctx);
7473 }
7474 }
7475 else if (!
g_Game.IsMultiplayer())
7476 {
7478 }
7479 }
7480
7482 {
7484 {
7485 if (ScriptInputUserData.CanStoreInputUserData())
7486 {
7487 ScriptInputUserData ctx = new ScriptInputUserData;
7492 ctx.
Write(destination_entity);
7498 }
7499 }
7500 else if (!
g_Game.IsMultiplayer())
7501 {
7503 }
7504 }
7505
7507 {
7509 }
7510
7512 {
7514 float split_quantity_new;
7516 if (dst.IsValid())
7517 {
7518 int slot_id = dst.GetSlot();
7520
7521 if (quantity > stack_max)
7522 split_quantity_new = stack_max;
7523 else
7524 split_quantity_new = quantity;
7525
7527 {
7529
7530 if (new_item)
7531 {
7532 new_item.SetResultOfSplit(true);
7533 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7535 new_item.
SetQuantity(split_quantity_new,
false,
true);
7536 }
7537
7538 return new_item;
7539 }
7540 }
7541
7542 return null;
7543 }
7544
7546 {
7548 float split_quantity_new;
7550 if (destination_entity)
7551 {
7553 if (quantity > stackable)
7554 split_quantity_new = stackable;
7555 else
7556 split_quantity_new = quantity;
7557
7559 {
7560 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7561 if (new_item)
7562 {
7563 new_item.SetResultOfSplit(true);
7564 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7566 new_item.
SetQuantity(split_quantity_new,
false,
true);
7567 }
7568 }
7569 }
7570 }
7571
7573 {
7575 {
7576 if (ScriptInputUserData.CanStoreInputUserData())
7577 {
7578 ScriptInputUserData ctx = new ScriptInputUserData;
7583 ItemBase destination_entity =
this;
7584 ctx.
Write(destination_entity);
7588 }
7589 }
7590 else if (!
g_Game.IsMultiplayer())
7591 {
7593 }
7594 }
7595
7597 {
7599 float split_quantity_new;
7601 if (player)
7602 {
7604 if (quantity > stackable)
7605 split_quantity_new = stackable;
7606 else
7607 split_quantity_new = quantity;
7608
7610 {
7611 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7612 new_item =
ItemBase.Cast(in_hands);
7613 if (new_item)
7614 {
7615 new_item.SetResultOfSplit(true);
7616 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7618 new_item.SetQuantity(split_quantity_new, false, true);
7619 }
7620 }
7621 }
7622 }
7623
7625 {
7627 float split_quantity_new = Math.Floor(quantity * 0.5);
7628
7630 return;
7631
7633
7634 if (new_item)
7635 {
7636 if (new_item.GetQuantityMax() < split_quantity_new)
7637 {
7638 split_quantity_new = new_item.GetQuantityMax();
7639 }
7640
7641 new_item.SetResultOfSplit(true);
7642 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7643
7645 {
7648 }
7649 else
7650 {
7652 new_item.
SetQuantity(split_quantity_new,
false,
true);
7653 }
7654 }
7655 }
7656
7658 {
7660 float split_quantity_new = Math.Floor(quantity / 2);
7661
7663 return;
7664
7665 InventoryLocation invloc = new InventoryLocation;
7667
7669 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7670
7671 if (new_item)
7672 {
7673 if (new_item.GetQuantityMax() < split_quantity_new)
7674 {
7675 split_quantity_new = new_item.GetQuantityMax();
7676 }
7678 {
7681 }
7682 else if (split_quantity_new > 1)
7683 {
7685 new_item.
SetQuantity(split_quantity_new,
false,
true);
7686 }
7687 }
7688 }
7689
7692 {
7693 SetWeightDirty();
7695
7696 if (parent)
7697 parent.OnAttachmentQuantityChangedEx(this, delta);
7698
7700 {
7702 {
7704 }
7706 {
7707 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7709 }
7710 }
7711 }
7712
7715 {
7716
7717 }
7718
7721 {
7723 }
7724
7726 {
7727 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7728
7730 {
7731 if (newLevel == GameConstants.STATE_RUINED)
7732 {
7734 EntityAI parent = GetHierarchyParent();
7735 if (parent && parent.IsFireplace())
7736 {
7737 CargoBase cargo = GetInventory().GetCargo();
7738 if (cargo)
7739 {
7741 {
7743 }
7744 }
7745 }
7746 }
7747
7749 {
7750
7752 return;
7753 }
7754
7755 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7756 {
7758 }
7759 }
7760 }
7761
7762
7764 {
7765 super.OnRightClick();
7766
7768 {
7770 {
7771 if (ScriptInputUserData.CanStoreInputUserData())
7772 {
7773 EntityAI root = GetHierarchyRoot();
7774 Man playerOwner = GetHierarchyRootPlayer();
7775 InventoryLocation dst = new InventoryLocation;
7776
7777
7778 if (!playerOwner && root && root == this)
7779 {
7781 }
7782 else
7783 {
7784
7785 GetInventory().GetCurrentInventoryLocation(dst);
7787 {
7788 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7790 {
7792 }
7793 else
7794 {
7796
7797
7798 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7799 {
7801 }
7802 else
7803 {
7804 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7805 }
7806 }
7807 }
7808 }
7809
7810 ScriptInputUserData ctx = new ScriptInputUserData;
7818 }
7819 }
7820 else if (!
g_Game.IsMultiplayer())
7821 {
7823 }
7824 }
7825 }
7826
7828 {
7829 if (root)
7830 {
7831 vector m4[4];
7832 root.GetTransform(m4);
7833 dst.SetGround(this, m4);
7834 }
7835 else
7836 {
7837 GetInventory().GetCurrentInventoryLocation(dst);
7838 }
7839 }
7840
7841 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7842 {
7843
7844 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7845 return false;
7846
7847 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7848 return false;
7849
7850
7852 return false;
7853
7854
7855 Magazine mag = Magazine.Cast(this);
7856 if (mag)
7857 {
7858 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7859 return false;
7860
7861 if (stack_max_limit)
7862 {
7863 Magazine other_mag = Magazine.Cast(other_item);
7864 if (other_item)
7865 {
7866 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7867 return false;
7868 }
7869
7870 }
7871 }
7872 else
7873 {
7874
7876 return false;
7877
7879 return false;
7880 }
7881
7882 PlayerBase player = null;
7883 if (CastTo(player, GetHierarchyRootPlayer()))
7884 {
7885 if (player.GetInventory().HasAttachment(this))
7886 return false;
7887
7888 if (player.IsItemsToDelete())
7889 return false;
7890 }
7891
7892 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7893 return false;
7894
7895 int slotID;
7897 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7898 return false;
7899
7900 return true;
7901 }
7902
7904 {
7906 }
7907
7909 {
7910 return m_IsResultOfSplit;
7911 }
7912
7914 {
7915 m_IsResultOfSplit = value;
7916 }
7917
7919 {
7921 }
7922
7924 {
7925 float other_item_quantity = other_item.GetQuantity();
7926 float this_free_space;
7927
7929
7931
7932 if (other_item_quantity > this_free_space)
7933 {
7934 return this_free_space;
7935 }
7936 else
7937 {
7938 return other_item_quantity;
7939 }
7940 }
7941
7943 {
7945 }
7946
7948 {
7950 return;
7951
7952 if (!IsMagazine() && other_item)
7953 {
7955 if (quantity_used != 0)
7956 {
7957 float hp1 = GetHealth01("","");
7958 float hp2 = other_item.GetHealth01("","");
7959 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7960 hpResult = hpResult / (
GetQuantity() + quantity_used);
7961
7962 hpResult *= GetMaxHealth();
7963 Math.Round(hpResult);
7964 SetHealth("", "Health", hpResult);
7965
7967 other_item.AddQuantity(-quantity_used);
7968 }
7969 }
7971 }
7972
7974 {
7975 #ifdef SERVER
7976 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7977 GetHierarchyParent().IncreaseLifetimeUp();
7978 #endif
7979 };
7980
7982 {
7983 PlayerBase p = PlayerBase.Cast(player);
7984
7985 array<int> recipesIds = p.m_Recipes;
7986 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7987 if (moduleRecipesManager)
7988 {
7989 EntityAI itemInHands = player.GetEntityInHands();
7990 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7991 }
7992
7993 for (int i = 0;i < recipesIds.Count(); i++)
7994 {
7995 int key = recipesIds.Get(i);
7996 string recipeName = moduleRecipesManager.GetRecipeName(key);
7998 }
7999 }
8000
8001
8002 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8003 {
8004 super.GetDebugActions(outputList);
8005
8006
8012
8013
8018
8023
8024
8028
8029
8031 {
8035 }
8036
8039
8040
8044
8046
8047 InventoryLocation loc = new InventoryLocation();
8048 GetInventory().GetCurrentInventoryLocation(loc);
8050 {
8051 if (Gizmo_IsSupported())
8054 }
8055
8057 }
8058
8059
8060
8061
8063 {
8064 super.OnAction(action_id, player, ctx);
8065
8067 {
8068 switch (action_id)
8069 {
8073 return true;
8077 return true;
8078 }
8079 }
8080
8082 {
8083 switch (action_id)
8084 {
8086 Delete();
8087 return true;
8088 }
8089 }
8090
8091 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8092 {
8093 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8094 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8095 PlayerBase p = PlayerBase.Cast(player);
8096 if (
EActions.RECIPES_RANGE_START < 1000)
8097 {
8098 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8099 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8100 }
8101 }
8102 #ifndef SERVER
8103 else if (action_id ==
EActions.WATCH_PLAYER)
8104 {
8105 PluginDeveloper.SetDeveloperItemClientEx(player);
8106 }
8107 #endif
8109 {
8110 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8111 {
8112 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8113 OnDebugButtonPressServer(id + 1);
8114 }
8115
8116 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8117 {
8118 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8120 }
8121
8122 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8123 {
8124 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8126 }
8127
8128 else if (action_id ==
EActions.ADD_QUANTITY)
8129 {
8130 if (IsMagazine())
8131 {
8132 Magazine mag = Magazine.Cast(this);
8133 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8134 }
8135 else
8136 {
8138 }
8139
8140 if (m_EM)
8141 {
8142 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8143 }
8144
8145 }
8146
8147 else if (action_id ==
EActions.REMOVE_QUANTITY)
8148 {
8149 if (IsMagazine())
8150 {
8151 Magazine mag2 = Magazine.Cast(this);
8152 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8153 }
8154 else
8155 {
8157 }
8158 if (m_EM)
8159 {
8160 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8161 }
8162
8163 }
8164
8165 else if (action_id ==
EActions.SET_QUANTITY_0)
8166 {
8168
8169 if (m_EM)
8170 {
8171 m_EM.SetEnergy(0);
8172 }
8173 }
8174
8175 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8176 {
8178
8179 if (m_EM)
8180 {
8181 m_EM.SetEnergy(m_EM.GetEnergyMax());
8182 }
8183 }
8184
8185 else if (action_id ==
EActions.ADD_HEALTH)
8186 {
8187 AddHealth("","",GetMaxHealth("","Health")/5);
8188 }
8189 else if (action_id ==
EActions.REMOVE_HEALTH)
8190 {
8191 AddHealth("","",-GetMaxHealth("","Health")/5);
8192 }
8193 else if (action_id ==
EActions.DESTROY_HEALTH)
8194 {
8195 SetHealth01("","",0);
8196 }
8197 else if (action_id ==
EActions.WATCH_ITEM)
8198 {
8200 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8201 #ifdef DEVELOPER
8202 SetDebugDeveloper_item(this);
8203 #endif
8204 }
8205
8206 else if (action_id ==
EActions.ADD_TEMPERATURE)
8207 {
8208 AddTemperature(20);
8209
8210 }
8211
8212 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8213 {
8214 AddTemperature(-20);
8215
8216 }
8217
8218 else if (action_id ==
EActions.FLIP_FROZEN)
8219 {
8220 SetFrozen(!GetIsFrozen());
8221
8222 }
8223
8224 else if (action_id ==
EActions.ADD_WETNESS)
8225 {
8227
8228 }
8229
8230 else if (action_id ==
EActions.REMOVE_WETNESS)
8231 {
8233
8234 }
8235
8236 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8237 {
8240
8241
8242 }
8243
8244 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8245 {
8248 }
8249
8250 else if (action_id ==
EActions.MAKE_SPECIAL)
8251 {
8252 auto debugParams = DebugSpawnParams.WithPlayer(player);
8253 OnDebugSpawnEx(debugParams);
8254 }
8255
8256 }
8257
8258
8259 return false;
8260 }
8261
8262
8263
8264
8268
8271
8272
8273
8275 {
8276 return false;
8277 }
8278
8279
8281 {
8282 return true;
8283 }
8284
8285
8287 {
8288 return true;
8289 }
8290
8291
8292
8294 {
8295 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8296 return g_Game.ConfigIsExisting(config_path);
8297 }
8298
8301 {
8302 return null;
8303 }
8304
8306 {
8307 return false;
8308 }
8309
8311 {
8312 return false;
8313 }
8314
8318
8319
8321 {
8322 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8323 return module_repairing.CanRepair(this, item_repair_kit);
8324 }
8325
8326
8327 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8328 {
8329 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8330 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8331 }
8332
8333
8335 {
8336
8337
8338
8339
8340
8341
8342
8343
8344 return 1;
8345 }
8346
8347
8348
8350 {
8352 }
8353
8354
8355
8357 {
8359 }
8360
8361
8370 {
8371 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8372
8373 if (player)
8374 {
8375 player.MessageStatus(text);
8376 }
8377 }
8378
8379
8388 {
8389 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8390
8391 if (player)
8392 {
8393 player.MessageAction(text);
8394 }
8395 }
8396
8397
8406 {
8407 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8408
8409 if (player)
8410 {
8411 player.MessageFriendly(text);
8412 }
8413 }
8414
8415
8424 {
8425 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8426
8427 if (player)
8428 {
8429 player.MessageImportant(text);
8430 }
8431 }
8432
8434 {
8435 return true;
8436 }
8437
8438
8439 override bool KindOf(
string tag)
8440 {
8441 bool found = false;
8442 string item_name = this.
GetType();
8444 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8445
8446 int array_size = item_tag_array.Count();
8447 for (int i = 0; i < array_size; i++)
8448 {
8449 if (item_tag_array.Get(i) == tag)
8450 {
8451 found = true;
8452 break;
8453 }
8454 }
8455 return found;
8456 }
8457
8458
8460 {
8461
8462 super.OnRPC(sender, rpc_type,ctx);
8463
8464
8465 switch (rpc_type)
8466 {
8467 #ifndef SERVER
8468 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8469 Param2<bool, string> p = new Param2<bool, string>(false, "");
8470
8472 return;
8473
8474 bool play = p.param1;
8475 string soundSet = p.param2;
8476
8477 if (play)
8478 {
8480 {
8482 {
8484 }
8485 }
8486 else
8487 {
8489 }
8490 }
8491 else
8492 {
8494 }
8495
8496 break;
8497 #endif
8498
8499 }
8500
8502 {
8504 }
8505 }
8506
8507
8508
8509
8511 {
8512 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8513 return plugin.GetID(
name);
8514 }
8515
8517 {
8518 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8519 return plugin.GetName(id);
8520 }
8521
8524 {
8525
8526
8527 int varFlags;
8528 if (!ctx.
Read(varFlags))
8529 return;
8530
8531 if (varFlags & ItemVariableFlags.FLOAT)
8532 {
8534 }
8535 }
8536
8538 {
8539
8540 super.SerializeNumericalVars(floats_out);
8541
8542
8543
8545 {
8547 }
8548
8550 {
8552 }
8553
8555 {
8557 }
8558
8560 {
8565 }
8566
8568 {
8570 }
8571 }
8572
8574 {
8575
8576 super.DeSerializeNumericalVars(floats);
8577
8578
8579 int index = 0;
8580 int mask = Math.Round(floats.Get(index));
8581
8582 index++;
8583
8585 {
8587 {
8589 }
8590 else
8591 {
8592 float quantity = floats.Get(index);
8594 }
8595 index++;
8596 }
8597
8599 {
8600 float wet = floats.Get(index);
8602 index++;
8603 }
8604
8606 {
8607 int liquidtype = Math.Round(floats.Get(index));
8609 index++;
8610 }
8611
8613 {
8615 index++;
8617 index++;
8619 index++;
8621 index++;
8622 }
8623
8625 {
8626 int cleanness = Math.Round(floats.Get(index));
8628 index++;
8629 }
8630 }
8631
8633 {
8634 super.WriteVarsToCTX(ctx);
8635
8636
8638 {
8640 }
8641
8643 {
8645 }
8646
8648 {
8650 }
8651
8653 {
8654 int r,g,b,a;
8660 }
8661
8663 {
8665 }
8666 }
8667
8669 {
8670 if (!super.ReadVarsFromCTX(ctx,version))
8671 return false;
8672
8673 int intValue;
8674 float value;
8675
8676 if (version < 140)
8677 {
8678 if (!ctx.
Read(intValue))
8679 return false;
8680
8681 m_VariablesMask = intValue;
8682 }
8683
8685 {
8686 if (!ctx.
Read(value))
8687 return false;
8688
8690 {
8692 }
8693 else
8694 {
8696 }
8697 }
8698
8699 if (version < 140)
8700 {
8702 {
8703 if (!ctx.
Read(value))
8704 return false;
8705 SetTemperatureDirect(value);
8706 }
8707 }
8708
8710 {
8711 if (!ctx.
Read(value))
8712 return false;
8714 }
8715
8717 {
8718 if (!ctx.
Read(intValue))
8719 return false;
8721 }
8722
8724 {
8725 int r,g,b,a;
8727 return false;
8729 return false;
8731 return false;
8733 return false;
8734
8736 }
8737
8739 {
8740 if (!ctx.
Read(intValue))
8741 return false;
8743 }
8744
8745 if (version >= 138 && version < 140)
8746 {
8748 {
8749 if (!ctx.
Read(intValue))
8750 return false;
8751 SetFrozen(intValue);
8752 }
8753 }
8754
8755 return true;
8756 }
8757
8758
8760 {
8763 {
8765 }
8766
8767 if (!super.OnStoreLoad(ctx, version))
8768 {
8770 return false;
8771 }
8772
8773 if (version >= 114)
8774 {
8775 bool hasQuickBarIndexSaved;
8776
8777 if (!ctx.
Read(hasQuickBarIndexSaved))
8778 {
8780 return false;
8781 }
8782
8783 if (hasQuickBarIndexSaved)
8784 {
8785 int itmQBIndex;
8786
8787
8788 if (!ctx.
Read(itmQBIndex))
8789 {
8791 return false;
8792 }
8793
8794 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8795 if (itmQBIndex != -1 && parentPlayer)
8796 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8797 }
8798 }
8799 else
8800 {
8801
8802 PlayerBase player;
8803 int itemQBIndex;
8804 if (version ==
int.
MAX)
8805 {
8806 if (!ctx.
Read(itemQBIndex))
8807 {
8809 return false;
8810 }
8811 }
8812 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8813 {
8814
8815 if (!ctx.
Read(itemQBIndex))
8816 {
8818 return false;
8819 }
8820 if (itemQBIndex != -1 && player)
8821 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8822 }
8823 }
8824
8825 if (version < 140)
8826 {
8827
8828 if (!LoadVariables(ctx, version))
8829 {
8831 return false;
8832 }
8833 }
8834
8835
8837 {
8839 return false;
8840 }
8841 if (version >= 132)
8842 {
8844 if (raib)
8845 {
8847 {
8849 return false;
8850 }
8851 }
8852 }
8853
8855 return true;
8856 }
8857
8858
8859
8861 {
8862 super.OnStoreSave(ctx);
8863
8864 PlayerBase player;
8865 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8866 {
8868
8869 int itemQBIndex = -1;
8870 itemQBIndex = player.FindQuickBarEntityIndex(this);
8871 ctx.
Write(itemQBIndex);
8872 }
8873 else
8874 {
8876 }
8877
8879
8881 if (raib)
8882 {
8884 }
8885 }
8886
8887
8889 {
8890 super.AfterStoreLoad();
8891
8893 {
8895 }
8896
8898 {
8901 }
8902 }
8903
8905 {
8906 super.EEOnAfterLoad();
8907
8909 {
8911 }
8912
8915 }
8916
8918 {
8919 return false;
8920 }
8921
8922
8923
8925 {
8927 {
8928 #ifdef PLATFORM_CONSOLE
8929
8931 {
8933 if (menu)
8934 {
8936 }
8937 }
8938 #endif
8939 }
8940
8942 {
8945 }
8946
8948 {
8949 SetWeightDirty();
8951 }
8953 {
8956 }
8957
8959 {
8962
8965 }
8967 {
8971 }
8972
8973 super.OnVariablesSynchronized();
8974 }
8975
8976
8977
8979 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8980 {
8981 if (!IsServerCheck(allow_client))
8982 return false;
8983
8985 return false;
8986
8989
8990 if (value <= (min + 0.001))
8991 value = min;
8992
8993 if (value == min)
8994 {
8995 if (destroy_config)
8996 {
8997 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8998 if (dstr)
8999 {
9001 this.Delete();
9002 return true;
9003 }
9004 }
9005 else if (destroy_forced)
9006 {
9008 this.Delete();
9009 return true;
9010 }
9011
9013 }
9014
9017
9019 {
9020 EntityAI parent = GetHierarchyRoot();
9021 InventoryLocation iLoc = new InventoryLocation();
9022 GetInventory().GetCurrentInventoryLocation(iLoc);
9024 {
9025 int iLocSlot = iLoc.
GetSlot();
9027 {
9029 }
9031 {
9033 }
9034 }
9035 }
9036
9038 {
9040
9041 if (delta)
9043 }
9044
9046
9047 return false;
9048 }
9049
9050
9052 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9053 {
9055 }
9056
9058 {
9061 }
9062
9064 {
9067 }
9068
9070 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9071 {
9072 float value_clamped = Math.Clamp(value, 0, 1);
9074 SetQuantity(result, destroy_config, destroy_forced);
9075 }
9076
9077
9080 {
9082 }
9083
9085 {
9087 }
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9099 {
9100 int slot = -1;
9101 GameInventory inventory = GetInventory();
9102 if (inventory)
9103 {
9104 InventoryLocation il = new InventoryLocation;
9107 }
9108
9110 }
9111
9113 {
9114 float quantity_max = 0;
9115
9117 {
9118 if (attSlotID != -1)
9119 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9120
9121 if (quantity_max <= 0)
9123 }
9124
9125 if (quantity_max <= 0)
9127
9128 return quantity_max;
9129 }
9130
9132 {
9134 }
9135
9137 {
9139 }
9140
9141
9143 {
9145 }
9146
9148 {
9150 }
9151
9153 {
9155 }
9156
9157
9159 {
9160
9161 float weightEx = GetWeightEx();
9162 float special = GetInventoryAndCargoWeight();
9163 return weightEx - special;
9164 }
9165
9166
9168 {
9170 }
9171
9173 {
9175 {
9176 #ifdef DEVELOPER
9177 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9178 {
9179 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9181 }
9182 #endif
9183
9185 }
9186 else if (HasEnergyManager())
9187 {
9188 #ifdef DEVELOPER
9189 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9190 {
9191 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9192 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9193 }
9194 #endif
9195 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9196 }
9197 else
9198 {
9199 #ifdef DEVELOPER
9200 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9201 {
9202 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9203 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9204 }
9205 #endif
9206 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9207 }
9208 }
9209
9212 {
9213 int item_count = 0;
9215
9216 GameInventory inventory = GetInventory();
9217 CargoBase cargo = inventory.
GetCargo();
9218 if (cargo != NULL)
9219 {
9221 }
9222
9224 for (int i = 0; i < nAttachments; ++i)
9225 {
9227 if (item)
9228 item_count += item.GetNumberOfItems();
9229 }
9230 return item_count;
9231 }
9232
9235 {
9236 float weight = 0;
9237 float wetness = 1;
9238 if (include_wetness)
9241 {
9242 weight = wetness * m_ConfigWeight;
9243 }
9245 {
9246 weight = 1;
9247 }
9248 return weight;
9249 }
9250
9251
9252
9254 {
9255 GameInventory inventory = GetInventory();
9256 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9257 {
9258 array<EntityAI> items = new array<EntityAI>;
9260 for (int i = 0; i < items.Count(); ++i)
9261 {
9263 if (item)
9264 {
9265 g_Game.ObjectDelete(item);
9266 }
9267 }
9268 }
9269 }
9270
9271
9272
9273
9275 {
9276 float energy = 0;
9277 if (HasEnergyManager())
9278 {
9279 energy = GetCompEM().GetEnergy();
9280 }
9281 return energy;
9282 }
9283
9284
9286 {
9287 super.OnEnergyConsumed();
9288
9290 }
9291
9293 {
9294 super.OnEnergyAdded();
9295
9297 }
9298
9299
9301 {
9302 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9303 {
9305 {
9306 float energy_0to1 = GetCompEM().GetEnergy0To1();
9308 }
9309 }
9310 }
9311
9312
9314 {
9315 return ConfigGetFloat("heatIsolation");
9316 }
9317
9319 {
9321 }
9322
9324 {
9325 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9326 if (
g_Game.ConfigIsExisting(paramPath))
9327 return g_Game.ConfigGetFloat(paramPath);
9328
9329 return 0.0;
9330 }
9331
9333 {
9334 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9335 if (
g_Game.ConfigIsExisting(paramPath))
9336 return g_Game.ConfigGetFloat(paramPath);
9337
9338 return 0.0;
9339 }
9340
9341 override void SetWet(
float value,
bool allow_client =
false)
9342 {
9343 if (!IsServerCheck(allow_client))
9344 return;
9345
9348
9350
9351 m_VarWet = Math.Clamp(value, min, max);
9352
9354 {
9357 }
9358 }
9359
9360 override void AddWet(
float value)
9361 {
9363 }
9364
9366 {
9368 }
9369
9371 {
9373 }
9374
9376 {
9378 }
9379
9381 {
9383 }
9384
9386 {
9388 }
9389
9391 {
9394 if (newLevel != oldLevel)
9395 {
9397 }
9398 }
9399
9401 {
9402 SetWeightDirty();
9403 }
9404
9406 {
9407 return GetWetLevelInternal(
m_VarWet);
9408 }
9409
9410
9411
9413 {
9415 }
9416
9418 {
9420 }
9421
9423 {
9425 }
9426
9428 {
9430 }
9431
9432
9433
9435 {
9436 if (ConfigIsExisting("itemModelLength"))
9437 {
9438 return ConfigGetFloat("itemModelLength");
9439 }
9440 return 0;
9441 }
9442
9444 {
9445 if (ConfigIsExisting("itemAttachOffset"))
9446 {
9447 return ConfigGetFloat("itemAttachOffset");
9448 }
9449 return 0;
9450 }
9451
9452 override void SetCleanness(
int value,
bool allow_client =
false)
9453 {
9454 if (!IsServerCheck(allow_client))
9455 return;
9456
9458
9460
9463 }
9464
9466 {
9468 }
9469
9471 {
9472 return true;
9473 }
9474
9475
9476
9477
9479 {
9481 }
9482
9484 {
9486 }
9487
9488
9489
9490
9491 override void SetColor(
int r,
int g,
int b,
int a)
9492 {
9498 }
9500 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9501 {
9506 }
9507
9509 {
9511 }
9512
9515 {
9516 int r,g,b,a;
9518 r = r/255;
9519 g = g/255;
9520 b = b/255;
9521 a = a/255;
9522 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9523 }
9524
9525
9526
9527 override void SetLiquidType(
int value,
bool allow_client =
false)
9528 {
9529 if (!IsServerCheck(allow_client))
9530 return;
9531
9536 }
9537
9539 {
9540 return ConfigGetInt("varLiquidTypeInit");
9541 }
9542
9544 {
9546 }
9547
9549 {
9551 SetFrozen(false);
9552 }
9553
9556 {
9557 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9558 }
9559
9560
9563 {
9564 PlayerBase nplayer;
9565 if (PlayerBase.CastTo(nplayer, player))
9566 {
9568 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9569 }
9570 }
9571
9572
9575 {
9576 PlayerBase nplayer;
9577 if (PlayerBase.CastTo(nplayer,player))
9578 {
9579 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9580 }
9581
9582 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9583
9584 if (HasEnergyManager())
9585 {
9586 GetCompEM().UpdatePlugState();
9587 }
9588 }
9589
9590
9592 {
9593 super.OnPlacementStarted(player);
9594
9596 }
9597
9598 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9599 {
9601 {
9602 m_AdminLog.OnPlacementComplete(player,
this);
9603 }
9604
9605 super.OnPlacementComplete(player, position, orientation);
9606 }
9607
9608
9609
9610
9611
9613 {
9615 {
9616 return true;
9617 }
9618 else
9619 {
9620 return false;
9621 }
9622 }
9623
9624
9626 {
9628 {
9630 }
9631 }
9632
9633
9635 {
9637 }
9638
9640 {
9642 }
9643
9644 override void InsertAgent(
int agent,
float count = 1)
9645 {
9646 if (count < 1)
9647 return;
9648
9650 }
9651
9654 {
9656 }
9657
9658
9660 {
9662 }
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9706 {
9708 return false;
9709 return true;
9710 }
9711
9713 {
9714
9716 }
9717
9718
9721 {
9722 super.CheckForRoofLimited(timeTresholdMS);
9723
9724 float time =
g_Game.GetTime();
9725 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9726 {
9727 m_PreviousRoofTestTime = time;
9728 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9729 }
9730 }
9731
9732
9734 {
9736 {
9737 return 0;
9738 }
9739
9740 if (GetInventory().GetAttachmentSlotsCount() != 0)
9741 {
9742 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9743 if (filter)
9744 return filter.GetProtectionLevel(type, false, system);
9745 else
9746 return 0;
9747 }
9748
9749 string subclassPath, entryName;
9750
9751 switch (type)
9752 {
9754 entryName = "biological";
9755 break;
9757 entryName = "chemical";
9758 break;
9759 default:
9760 entryName = "biological";
9761 break;
9762 }
9763
9764 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9765
9766 return g_Game.ConfigGetFloat(subclassPath + entryName);
9767 }
9768
9769
9770
9773 {
9774 if (!IsMagazine())
9776
9778 }
9779
9780
9781
9782
9783
9788 {
9789 return true;
9790 }
9791
9793 {
9795 }
9796
9797
9798
9799
9800
9802 {
9803 if (parent)
9804 {
9805 if (parent.IsInherited(DayZInfected))
9806 return true;
9807
9808 if (!parent.IsRuined())
9809 return true;
9810 }
9811
9812 return true;
9813 }
9814
9816 {
9817 if (!super.CanPutAsAttachment(parent))
9818 {
9819 return false;
9820 }
9821
9822 if (!IsRuined() && !parent.IsRuined())
9823 {
9824 return true;
9825 }
9826
9827 return false;
9828 }
9829
9831 {
9832
9833
9834
9835
9836 return super.CanReceiveItemIntoCargo(item);
9837 }
9838
9840 {
9841
9842
9843
9844
9845 GameInventory attachmentInv = attachment.GetInventory();
9847 {
9848 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9849 return false;
9850 }
9851
9852 InventoryLocation loc = new InventoryLocation();
9853 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9854 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9855 return false;
9856
9857 return super.CanReceiveAttachment(attachment, slotId);
9858 }
9859
9861 {
9862 if (!super.CanReleaseAttachment(attachment))
9863 return false;
9864
9865 return GetInventory().AreChildrenAccessible();
9866 }
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
9885
9886
9887
9889 {
9890 int id = muzzle_owner.GetMuzzleID();
9891 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9892
9893 if (WPOF_array)
9894 {
9895 for (int i = 0; i < WPOF_array.Count(); i++)
9896 {
9897 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9898
9899 if (WPOF)
9900 {
9901 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9902 }
9903 }
9904 }
9905 }
9906
9907
9909 {
9910 int id = muzzle_owner.GetMuzzleID();
9912
9913 if (WPOBE_array)
9914 {
9915 for (int i = 0; i < WPOBE_array.Count(); i++)
9916 {
9917 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9918
9919 if (WPOBE)
9920 {
9921 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9922 }
9923 }
9924 }
9925 }
9926
9927
9929 {
9930 int id = muzzle_owner.GetMuzzleID();
9931 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9932
9933 if (WPOOH_array)
9934 {
9935 for (int i = 0; i < WPOOH_array.Count(); i++)
9936 {
9937 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9938
9939 if (WPOOH)
9940 {
9941 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9942 }
9943 }
9944 }
9945 }
9946
9947
9949 {
9950 int id = muzzle_owner.GetMuzzleID();
9951 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9952
9953 if (WPOOH_array)
9954 {
9955 for (int i = 0; i < WPOOH_array.Count(); i++)
9956 {
9957 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9958
9959 if (WPOOH)
9960 {
9961 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9962 }
9963 }
9964 }
9965 }
9966
9967
9969 {
9970 int id = muzzle_owner.GetMuzzleID();
9971 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9972
9973 if (WPOOH_array)
9974 {
9975 for (int i = 0; i < WPOOH_array.Count(); i++)
9976 {
9977 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9978
9979 if (WPOOH)
9980 {
9981 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9982 }
9983 }
9984 }
9985 }
9986
9987
9988
9990 {
9992 {
9993 return true;
9994 }
9995
9996 return false;
9997 }
9998
10000 {
10002 {
10003 return true;
10004 }
10005
10006 return false;
10007 }
10008
10010 {
10012 {
10013 return true;
10014 }
10015
10016 return false;
10017 }
10018
10020 {
10021 return false;
10022 }
10023
10026 {
10027 return UATimeSpent.DEFAULT_DEPLOY;
10028 }
10029
10030
10031
10032
10034 {
10036 SetSynchDirty();
10037 }
10038
10040 {
10042 }
10043
10044
10046 {
10047 return false;
10048 }
10049
10052 {
10053 string att_type = "None";
10054
10055 if (ConfigIsExisting("soundAttType"))
10056 {
10057 att_type = ConfigGetString("soundAttType");
10058 }
10059
10061 }
10062
10064 {
10066 }
10067
10068
10069
10070
10071
10077
10079 {
10082
10084 }
10085
10086
10088 {
10090 return;
10091
10093
10096
10099
10100 SoundParameters params = new SoundParameters();
10104 }
10105
10106
10108 {
10110 {
10113
10114 SetSynchDirty();
10115
10118 }
10119 }
10120
10122 {
10124 }
10125
10126
10128 {
10130 return;
10131
10133 SetSynchDirty();
10134
10137 }
10138
10140 {
10143 }
10144
10146 {
10148 }
10149
10150 void OnApply(PlayerBase player);
10151
10153 {
10154 return 1.0;
10155 };
10156
10158 {
10160 }
10161
10163 {
10165 }
10166
10168
10170 {
10171 SetDynamicPhysicsLifeTime(0.01);
10173 }
10174
10176 {
10177 array<string> zone_names = new array<string>;
10178 GetDamageZones(zone_names);
10179 for (int i = 0; i < zone_names.Count(); i++)
10180 {
10181 SetHealthMax(zone_names.Get(i),"Health");
10182 }
10183 SetHealthMax("","Health");
10184 }
10185
10188 {
10189 float global_health = GetHealth01("","Health");
10190 array<string> zones = new array<string>;
10191 GetDamageZones(zones);
10192
10193 for (int i = 0; i < zones.Count(); i++)
10194 {
10195 SetHealth01(zones.Get(i),"Health",global_health);
10196 }
10197 }
10198
10201 {
10202 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10203 }
10204
10206 {
10207 if (!hasRootAsPlayer)
10208 {
10209 if (refParentIB)
10210 {
10211
10212 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10213 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10214
10215 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10216 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10217
10220 }
10221 else
10222 {
10223
10226 }
10227 }
10228 }
10229
10231 {
10233 {
10234 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10235 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10236 {
10237 float heatPermCoef = 1.0;
10239 while (ent)
10240 {
10241 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10242 ent = ent.GetHierarchyParent();
10243 }
10244
10245 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10246 }
10247 }
10248 }
10249
10251 {
10252
10253 EntityAI parent = GetHierarchyParent();
10254 if (!parent)
10255 {
10256 hasParent = false;
10257 hasRootAsPlayer = false;
10258 }
10259 else
10260 {
10261 hasParent = true;
10262 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10263 refParentIB =
ItemBase.Cast(parent);
10264 }
10265 }
10266
10267 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10268 {
10269
10270 }
10271
10273 {
10274
10275 return false;
10276 }
10277
10279 {
10280
10281
10282 return false;
10283 }
10284
10286 {
10287
10288 return false;
10289 }
10290
10293 {
10294 return !GetIsFrozen() &&
IsOpen();
10295 }
10296
10298 {
10299 bool hasParent = false, hasRootAsPlayer = false;
10301
10302 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10303 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10304
10305 if (wwtu || foodDecay)
10306 {
10310
10311 if (processWetness || processTemperature || processDecay)
10312 {
10314
10315 if (processWetness)
10316 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10317
10318 if (processTemperature)
10320
10321 if (processDecay)
10322 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10323 }
10324 }
10325 }
10326
10329 {
10331 }
10332
10334 {
10337
10338 return super.GetTemperatureFreezeThreshold();
10339 }
10340
10342 {
10345
10346 return super.GetTemperatureThawThreshold();
10347 }
10348
10350 {
10353
10354 return super.GetItemOverheatThreshold();
10355 }
10356
10358 {
10360 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10361
10362 return super.GetTemperatureFreezeTime();
10363 }
10364
10366 {
10368 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10369
10370 return super.GetTemperatureThawTime();
10371 }
10372
10377
10379 {
10380 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10381 }
10382
10384 {
10385 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10386 }
10387
10390 {
10392 }
10393
10395 {
10397 }
10398
10400 {
10402 }
10403
10406 {
10407 return null;
10408 }
10409
10412 {
10413 return false;
10414 }
10415
10417 {
10419 {
10422 if (!trg)
10423 {
10425 explosive = this;
10426 }
10427
10428 explosive.PairRemote(trg);
10430
10431 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10432 trg.SetPersistentPairID(persistentID);
10433 explosive.SetPersistentPairID(persistentID);
10434
10435 return true;
10436 }
10437 return false;
10438 }
10439
10442 {
10443 float ret = 1.0;
10446 ret *= GetHealth01();
10447
10448 return ret;
10449 }
10450
10451 #ifdef DEVELOPER
10452 override void SetDebugItem()
10453 {
10454 super.SetDebugItem();
10455 _itemBase = this;
10456 }
10457
10459 {
10460 string text = super.GetDebugText();
10461
10463 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10464
10465 return text;
10466 }
10467 #endif
10468
10470 {
10471 return true;
10472 }
10473
10475
10477
10479 {
10482 }
10483
10484
10492
10508
10509 [
Obsolete(
"Use ItemSoundHandler instead")]
10512 {
10513 if (!
g_Game.IsDedicatedServer())
10514 {
10515 if (ConfigIsExisting("attachSoundSet"))
10516 {
10517 string cfg_path = "";
10518 string soundset = "";
10519 string type_name =
GetType();
10520
10523 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10524 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10525
10526 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10527 {
10528 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10529 {
10530 if (cfg_slot_array[i] == slot_type)
10531 {
10532 soundset = cfg_soundset_array[i];
10533 break;
10534 }
10535 }
10536 }
10537
10538 if (soundset != "")
10539 {
10540 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10542 }
10543 }
10544 }
10545 }
10546
10548}
10549
10551{
10553 if (entity)
10554 {
10555 bool is_item = entity.IsInherited(
ItemBase);
10556 if (is_item && full_quantity)
10557 {
10560 }
10561 }
10562 else
10563 {
10565 return NULL;
10566 }
10567 return entity;
10568}
10569
10571{
10572 if (item)
10573 {
10574 if (health > 0)
10575 item.SetHealth("", "", health);
10576
10577 if (item.CanHaveTemperature())
10578 {
10580 if (item.CanFreeze())
10581 item.SetFrozen(false);
10582 }
10583
10584 if (item.HasEnergyManager())
10585 {
10586 if (quantity >= 0)
10587 {
10588 item.GetCompEM().SetEnergy0To1(quantity);
10589 }
10590 else
10591 {
10593 }
10594 }
10595 else if (item.IsMagazine())
10596 {
10597 Magazine mag = Magazine.Cast(item);
10598 if (quantity >= 0)
10599 {
10600 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10601 }
10602 else
10603 {
10605 }
10606
10607 }
10608 else
10609 {
10610 if (quantity >= 0)
10611 {
10612 item.SetQuantityNormalized(quantity, false);
10613 }
10614 else
10615 {
10617 }
10618
10619 }
10620 }
10621}
10622
10623#ifdef DEVELOPER
10625#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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 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)
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)
bool ShouldSplitQuantity(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)
override 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...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
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)
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 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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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
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 string GetFoldSoundset()
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 string GetLoopFoldSoundset()
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.