5700{
5702 {
5703 return true;
5704 }
5705};
5706
5708{
5709
5710};
5711
5712
5713
5715{
5719
5721
5724
5725
5726
5727
5728
5737
5743
5748
5753
5774 protected bool m_IsResultOfSplit
5775
5777
5782
5783
5784
5786
5790
5791
5792
5794
5797
5798
5799
5805
5806
5814
5817
5818
5820
5821
5823
5824
5829
5830
5835
5837
5838
5840
5841
5843 {
5848
5849 if (!
g_Game.IsDedicatedServer())
5850 {
5852 {
5854
5856 {
5858 }
5859 }
5860
5863 }
5864
5865 m_OldLocation = null;
5866
5868 {
5870 }
5871
5872 if (ConfigIsExisting("headSelectionsToHide"))
5873 {
5876 }
5877
5879 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5880 {
5882 }
5883
5885
5886 m_IsResultOfSplit = false;
5887
5889 }
5890
5892 {
5893 super.InitItemVariables();
5894
5900 m_Count = ConfigGetInt(
"count");
5901
5904
5909
5912
5917
5929
5933
5934
5937 if (ConfigIsExisting("canBeSplit"))
5938 {
5941 }
5942
5944 if (ConfigIsExisting("itemBehaviour"))
5946
5947
5950 RegisterNetSyncVariableInt("m_VarLiquidType");
5951 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5952
5953 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5954 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5955 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5956
5957 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5958 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5959 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5960 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5961
5962 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5963 RegisterNetSyncVariableBool("m_IsTakeable");
5964 RegisterNetSyncVariableBool("m_IsHologram");
5965
5968 {
5971 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5972 }
5973
5975
5977 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5979
5981 }
5982
5984 {
5986 }
5987
5989 {
5992 {
5997 }
5998 }
5999
6000 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
6001 {
6003 {
6006 }
6007
6009 }
6010
6012 {
6018 }
6019
6021
6023 {
6025
6026 if (!action)
6027 {
6028 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6029 return;
6030 }
6031
6033 if (!ai)
6034 {
6036 return;
6037 }
6038
6040 if (!action_array)
6041 {
6042 action_array = new array<ActionBase_Basic>;
6044 }
6045 if (LogManager.IsActionLogEnable())
6046 {
6047 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6048 }
6049
6050 if (action_array.Find(action) != -1)
6051 {
6052 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6053 }
6054 else
6055 {
6056 action_array.Insert(action);
6057 }
6058 }
6059
6061 {
6062 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6063 ActionBase action = player.GetActionManager().GetAction(actionName);
6066
6067 if (action_array)
6068 {
6069 action_array.RemoveItem(action);
6070 }
6071 }
6072
6073
6074
6076 {
6077 ActionOverrideData overrideData = new ActionOverrideData();
6081
6083 if (!actionMap)
6084 {
6087 }
6088
6089 actionMap.Insert(this.
Type(), overrideData);
6090
6091 }
6092
6094
6096
6097
6099 {
6102
6105
6106 string config_to_search = "CfgVehicles";
6107 string muzzle_owner_config;
6108
6110 {
6111 if (IsInherited(Weapon))
6112 config_to_search = "CfgWeapons";
6113
6114 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6115
6116 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6117
6118 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6119
6120 if (config_OnFire_subclass_count > 0)
6121 {
6122 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6123
6124 for (int i = 0; i < config_OnFire_subclass_count; i++)
6125 {
6126 string particle_class = "";
6127 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6128 string config_OnFire_entry = config_OnFire_class + particle_class;
6129 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6130 WPOF_array.Insert(WPOF);
6131 }
6132
6133
6135 }
6136 }
6137
6139 {
6140 config_to_search = "CfgWeapons";
6141 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6142
6143 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6144
6145 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6146
6147 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6148 {
6149 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6150
6151 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6152 {
6153 string particle_class2 = "";
6154 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6155 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6156 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6157 WPOBE_array.Insert(WPOBE);
6158 }
6159
6160
6162 }
6163 }
6164 }
6165
6166
6168 {
6171
6173 {
6174 string config_to_search = "CfgVehicles";
6175
6176 if (IsInherited(Weapon))
6177 config_to_search = "CfgWeapons";
6178
6179 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6180 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6181
6182 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6183 {
6184
6186
6188 {
6190 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6192 return;
6193 }
6194
6197
6198
6199
6200 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6201 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6202
6203 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6204 {
6205 string particle_class = "";
6206 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6207 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6208 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6209
6210 if (entry_type == CT_CLASS)
6211 {
6212 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6213 WPOOH_array.Insert(WPOF);
6214 }
6215 }
6216
6217
6219 }
6220 }
6221 }
6222
6224 {
6226 }
6227
6229 {
6231 {
6233
6236
6239
6240 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6241 }
6242 }
6243
6245 {
6247 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6248
6250 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6251
6253 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6254
6256 {
6258 }
6259 }
6260
6262 {
6264 }
6265
6267 {
6270 else
6272
6274 {
6277 }
6278 else
6279 {
6282
6285 }
6286
6288 }
6289
6291 {
6293 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6294 }
6295
6297 {
6299 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6301 }
6302
6304 {
6306 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6307 }
6308
6310 {
6313
6314 OverheatingParticle OP = new OverheatingParticle();
6319
6321 }
6322
6324 {
6327
6328 return -1;
6329 }
6330
6332 {
6334 {
6337
6338 for (int i = count; i > 0; --i)
6339 {
6340 int id = i - 1;
6343
6346
6347 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6348 {
6349 if (p)
6350 {
6353 }
6354 }
6355 }
6356 }
6357 }
6358
6360 {
6362 {
6364 {
6365 int id = i - 1;
6367
6368 if (OP)
6369 {
6371
6372 if (p)
6373 {
6375 }
6376
6377 delete OP;
6378 }
6379 }
6380
6383 }
6384 }
6385
6388 {
6389 return 0.0;
6390 }
6391
6392
6394 {
6395 return 250;
6396 }
6397
6399 {
6400 return 0;
6401 }
6402
6405 {
6407 return true;
6408
6409 return false;
6410 }
6411
6414 {
6417
6419 {
6421 }
6422 else
6423 {
6424
6426 }
6427
6429 }
6430
6437 {
6438 return -1;
6439 }
6440
6441
6442
6443
6445 {
6447 {
6448 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6449 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6450
6451 if (r_index >= 0)
6452 {
6453 InventoryLocation r_il = new InventoryLocation;
6454 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6455
6456 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6459 {
6460 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6461 }
6463 {
6464 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6465 }
6466
6467 }
6468
6469 player.GetHumanInventory().ClearUserReservedLocation(this);
6470 }
6471
6474 }
6475
6476
6477
6478
6480 {
6481 return ItemBase.m_DebugActionsMask;
6482 }
6483
6485 {
6486 return ItemBase.m_DebugActionsMask & mask;
6487 }
6488
6490 {
6491 ItemBase.m_DebugActionsMask = mask;
6492 }
6493
6495 {
6496 ItemBase.m_DebugActionsMask |= mask;
6497 }
6498
6500 {
6501 ItemBase.m_DebugActionsMask &= ~mask;
6502 }
6503
6505 {
6507 {
6509 }
6510 else
6511 {
6513 }
6514 }
6515
6516
6518 {
6519 if (GetEconomyProfile())
6520 {
6521 float q_max = GetEconomyProfile().GetQuantityMax();
6522 if (q_max > 0)
6523 {
6524 float q_min = GetEconomyProfile().GetQuantityMin();
6525 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6526
6528 {
6529 ComponentEnergyManager comp = GetCompEM();
6531 {
6533 }
6534 }
6536 {
6538
6539 }
6540
6541 }
6542 }
6543 }
6544
6547 {
6548 EntityAI parent = GetHierarchyParent();
6549
6550 if (parent)
6551 {
6552 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6553 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6554 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6555 }
6556 }
6557
6560 {
6561 EntityAI parent = GetHierarchyParent();
6562
6563 if (parent)
6564 {
6565 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6566 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6567 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6568 }
6569 }
6570
6572 {
6573
6574
6575
6576
6578
6580 {
6581 if (ScriptInputUserData.CanStoreInputUserData())
6582 {
6583 ScriptInputUserData ctx = new ScriptInputUserData;
6589 ctx.
Write(use_stack_max);
6592
6594 {
6595 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6596 }
6597 }
6598 }
6599 else if (!
g_Game.IsMultiplayer())
6600 {
6602 }
6603 }
6604
6606 {
6608 }
6609
6611 {
6613 }
6614
6616 {
6618 }
6619
6621 {
6622
6623 return false;
6624 }
6625
6627 {
6628 return false;
6629 }
6630
6634 {
6635 return false;
6636 }
6637
6639 {
6640 return "";
6641 }
6642
6644
6646 {
6647 return false;
6648 }
6649
6651 {
6652 return true;
6653 }
6654
6655
6656
6658 {
6659 return true;
6660 }
6661
6663 {
6664 return true;
6665 }
6666
6668 {
6669 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6671 }
6672
6674 {
6676 }
6677
6679 {
6681 if (!is_being_placed)
6683 SetSynchDirty();
6684 }
6685
6686
6688
6690 {
6692 }
6693
6695 {
6697 }
6698
6700 {
6701 return 1;
6702 }
6703
6705 {
6706 return false;
6707 }
6708
6710 {
6712 SetSynchDirty();
6713 }
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6750 {
6751 super.OnMovedInsideCargo(container);
6752
6753 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6754 }
6755
6756 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6757 {
6758 super.EEItemLocationChanged(oldLoc, newLoc);
6759
6760 PlayerBase newPlayer = null;
6761 PlayerBase oldPlayer = null;
6762
6763 if (newLoc.GetParent())
6764 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6765
6766 if (oldLoc.GetParent())
6767 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6768
6770 {
6771 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6772
6773 if (rIndex >= 0)
6774 {
6775 InventoryLocation rIl = new InventoryLocation;
6776 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6777
6778 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6781 {
6782 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6783 }
6785 {
6787 }
6788
6789 }
6790 }
6791
6793 {
6794 if (newPlayer)
6795 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6796
6797 if (newPlayer == oldPlayer)
6798 {
6799 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6800 {
6802 {
6803 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6804 {
6805 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6806 }
6807 }
6808 else
6809 {
6810 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6811 }
6812 }
6813
6814 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6815 {
6816 int type = oldLoc.GetType();
6818 {
6819 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6820 }
6822 {
6823 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6824 }
6825 }
6826 if (!m_OldLocation)
6827 {
6828 m_OldLocation = new InventoryLocation;
6829 }
6830 m_OldLocation.Copy(oldLoc);
6831 }
6832 else
6833 {
6834 if (m_OldLocation)
6835 {
6836 m_OldLocation.Reset();
6837 }
6838 }
6839
6840 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6841 }
6842 else
6843 {
6844 if (newPlayer)
6845 {
6846 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6847 if (resIndex >= 0)
6848 {
6849 InventoryLocation il = new InventoryLocation;
6850 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6852 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6855 {
6856 il.
GetParent().GetOnReleaseLock().Invoke(it);
6857 }
6859 {
6861 }
6862
6863 }
6864 }
6866 {
6867
6869 }
6870
6871 if (m_OldLocation)
6872 {
6873 m_OldLocation.Reset();
6874 }
6875 }
6876
6878 {
6879 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6880 }
6881
6883 {
6884 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6885 }
6886 }
6887
6888 override void EOnContact(IEntity other, Contact extra)
6889 {
6891 {
6892 int liquidType = -1;
6894 if (impactSpeed > 0.0)
6895 {
6897 #ifndef SERVER
6899 #else
6901 SetSynchDirty();
6902 #endif
6904 }
6905 }
6906
6907 #ifdef SERVER
6908 if (GetCompEM() && GetCompEM().IsPlugged())
6909 {
6910 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6911 GetCompEM().UnplugThis();
6912 }
6913 #endif
6914 }
6915
6917
6919 {
6921 }
6922
6924 {
6925
6926 }
6927
6929 {
6930 super.OnItemLocationChanged(old_owner, new_owner);
6931
6932 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6933 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6934
6935 if (!relatedPlayer && playerNew)
6936 relatedPlayer = playerNew;
6937
6938 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6939 {
6941 if (actionMgr)
6942 {
6943 ActionBase currentAction = actionMgr.GetRunningAction();
6944 if (currentAction)
6946 }
6947 }
6948
6949 Man ownerPlayerOld = null;
6950 Man ownerPlayerNew = null;
6951
6952 if (old_owner)
6953 {
6954 if (old_owner.
IsMan())
6955 {
6956 ownerPlayerOld = Man.Cast(old_owner);
6957 }
6958 else
6959 {
6960 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6961 }
6962 }
6963 else
6964 {
6966 {
6968
6969 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6970 {
6971 GetCompEM().UnplugThis();
6972 }
6973 }
6974 }
6975
6976 if (new_owner)
6977 {
6978 if (new_owner.
IsMan())
6979 {
6980 ownerPlayerNew = Man.Cast(new_owner);
6981 }
6982 else
6983 {
6984 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6985 }
6986 }
6987
6988 if (ownerPlayerOld != ownerPlayerNew)
6989 {
6990 if (ownerPlayerOld)
6991 {
6992 array<EntityAI> subItemsExit = new array<EntityAI>;
6994 for (int i = 0; i < subItemsExit.Count(); i++)
6995 {
6998 }
6999 }
7000
7001 if (ownerPlayerNew)
7002 {
7003 array<EntityAI> subItemsEnter = new array<EntityAI>;
7005 for (int j = 0; j < subItemsEnter.Count(); j++)
7006 {
7009 }
7010 }
7011 }
7012 else if (ownerPlayerNew != null)
7013 {
7014 PlayerBase nplayer;
7015 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7016 {
7017 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7019 for (int k = 0; k < subItemsUpdate.Count(); k++)
7020 {
7022 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7023 }
7024 }
7025 }
7026
7027 if (old_owner)
7028 old_owner.OnChildItemRemoved(this);
7029 if (new_owner)
7030 new_owner.OnChildItemReceived(this);
7031 }
7032
7033
7035 {
7036 super.EEDelete(parent);
7037 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7038 if (player)
7039 {
7041
7042 if (player.IsAlive())
7043 {
7044 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7045 if (r_index >= 0)
7046 {
7047 InventoryLocation r_il = new InventoryLocation;
7048 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7049
7050 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7053 {
7054 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7055 }
7057 {
7058 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7059 }
7060
7061 }
7062
7063 player.RemoveQuickBarEntityShortcut(this);
7064 }
7065 }
7066 }
7067
7069 {
7070 super.EEKilled(killer);
7071
7074 {
7075 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7076 {
7077 if (IsMagazine())
7078 {
7079 if (Magazine.Cast(this).GetAmmoCount() > 0)
7080 {
7082 }
7083 }
7084 else
7085 {
7087 }
7088 }
7089 }
7090 }
7091
7093 {
7094 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7095
7096 super.OnWasAttached(parent, slot_id);
7097
7100
7103 }
7104
7106 {
7107 super.OnWasDetached(parent, slot_id);
7108
7111
7114 }
7115
7117 {
7118 int idx;
7121
7122 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7123 if (inventory_slots.Count() < 1)
7124 {
7125 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7126 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7127 }
7128 else
7129 {
7130 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7131 }
7132
7133 idx = inventory_slots.Find(slot);
7134 if (idx < 0)
7135 return "";
7136
7137 return attach_types.Get(idx);
7138 }
7139
7141 {
7142 int idx = -1;
7143 string slot;
7144
7147
7148 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7149 if (inventory_slots.Count() < 1)
7150 {
7151 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7152 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7153 }
7154 else
7155 {
7156 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7157 if (detach_types.Count() < 1)
7158 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7159 }
7160
7161 for (int i = 0; i < inventory_slots.Count(); i++)
7162 {
7163 slot = inventory_slots.Get(i);
7164 }
7165
7166 if (slot != "")
7167 {
7168 if (detach_types.Count() == 1)
7169 idx = 0;
7170 else
7171 idx = inventory_slots.Find(slot);
7172 }
7173 if (idx < 0)
7174 return "";
7175
7176 return detach_types.Get(idx);
7177 }
7178
7180 {
7181
7183
7184
7185 float min_time = 1;
7186 float max_time = 3;
7187 float delay = Math.RandomFloat(min_time, max_time);
7188
7189 explode_timer.Run(delay, this, "DoAmmoExplosion");
7190 }
7191
7193 {
7194 Magazine magazine = Magazine.Cast(this);
7195 int pop_sounds_count = 6;
7196 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7197
7198
7199 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7200 string sound_name = pop_sounds[ sound_idx ];
7201 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7202
7203
7204 magazine.ServerAddAmmoCount(-1);
7205
7206
7207 float min_temp_to_explode = 100;
7208
7209 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7210 {
7212 }
7213 }
7214
7215
7216 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7217 {
7218 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7219
7220 const int CHANCE_DAMAGE_CARGO = 4;
7221 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7222 const int CHANCE_DAMAGE_NOTHING = 2;
7223
7225 {
7226 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7227 int chances;
7228 int rnd;
7229
7230 if (GetInventory().GetCargo())
7231 {
7232 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7233 rnd = Math.RandomInt(0,chances);
7234
7235 if (rnd < CHANCE_DAMAGE_CARGO)
7236 {
7238 }
7239 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7240 {
7242 }
7243 }
7244 else
7245 {
7246 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7247 rnd = Math.RandomInt(0,chances);
7248
7249 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7250 {
7252 }
7253 }
7254 }
7255 }
7256
7258 {
7259 CargoBase cargo = GetInventory().GetCargo();
7260 if (cargo)
7261 {
7263 if (item_count > 0)
7264 {
7265 int random_pick = Math.RandomInt(0, item_count);
7267 if (!item.IsExplosive())
7268 {
7269 item.AddHealth("","",damage);
7270 return true;
7271 }
7272 }
7273 }
7274 return false;
7275 }
7276
7278 {
7279 GameInventory inventory = GetInventory();
7281 if (attachment_count > 0)
7282 {
7283 int random_pick = Math.RandomInt(0, attachment_count);
7285 if (!attachment.IsExplosive())
7286 {
7287 attachment.AddHealth("","",damage);
7288 return true;
7289 }
7290 }
7291 return false;
7292 }
7293
7295 {
7297 }
7298
7300 {
7302 return GetInventory().CanRemoveEntity();
7303
7304 return false;
7305 }
7306
7308 {
7309
7311 return false;
7312
7313
7315 return false;
7316
7317
7318
7320 if (delta == 0)
7321 return false;
7322
7323
7324 return true;
7325 }
7326
7328 {
7330 {
7331 if (ScriptInputUserData.CanStoreInputUserData())
7332 {
7333 ScriptInputUserData ctx = new ScriptInputUserData;
7338 ctx.
Write(destination_entity);
7342 }
7343 }
7344 else if (!
g_Game.IsMultiplayer())
7345 {
7347 }
7348 }
7349
7351 {
7352 float split_quantity_new;
7356 InventoryLocation loc = new InventoryLocation;
7357
7358 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7359 {
7361 split_quantity_new = stack_max;
7362 else
7364
7366 {
7367 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7368 if (new_item)
7369 {
7370 new_item.SetResultOfSplit(true);
7371 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7373 new_item.
SetQuantity(split_quantity_new,
false,
true);
7374 }
7375 }
7376 }
7377 else if (destination_entity && slot_id == -1)
7378 {
7379 if (quantity > stack_max)
7380 split_quantity_new = stack_max;
7381 else
7382 split_quantity_new = quantity;
7383
7385 {
7386 GameInventory destinationInventory = destination_entity.GetInventory();
7388 {
7391 }
7392
7393 if (new_item)
7394 {
7395 new_item.SetResultOfSplit(true);
7396 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7398 new_item.
SetQuantity(split_quantity_new,
false,
true);
7399 }
7400 }
7401 }
7402 else
7403 {
7404 if (stack_max != 0)
7405 {
7407 {
7409 }
7410
7411 if (split_quantity_new == 0)
7412 {
7413 if (!
g_Game.IsMultiplayer())
7414 player.PhysicalPredictiveDropItem(this);
7415 else
7416 player.ServerDropEntity(this);
7417 return;
7418 }
7419
7421 {
7423
7424 if (new_item)
7425 {
7426 new_item.SetResultOfSplit(true);
7427 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7430 new_item.PlaceOnSurface();
7431 }
7432 }
7433 }
7434 }
7435 }
7436
7438 {
7439 float split_quantity_new;
7443 InventoryLocation loc = new InventoryLocation;
7444
7445 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7446 {
7448 split_quantity_new = stack_max;
7449 else
7451
7453 {
7454 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7455 if (new_item)
7456 {
7457 new_item.SetResultOfSplit(true);
7458 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7460 new_item.
SetQuantity(split_quantity_new,
false,
true);
7461 }
7462 }
7463 }
7464 else if (destination_entity && slot_id == -1)
7465 {
7466 if (quantity > stack_max)
7467 split_quantity_new = stack_max;
7468 else
7469 split_quantity_new = quantity;
7470
7472 {
7473 GameInventory destinationInventory = destination_entity.GetInventory();
7475 {
7478 }
7479
7480 if (new_item)
7481 {
7482 new_item.SetResultOfSplit(true);
7483 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7485 new_item.
SetQuantity(split_quantity_new,
false,
true);
7486 }
7487 }
7488 }
7489 else
7490 {
7491 if (stack_max != 0)
7492 {
7494 {
7496 }
7497
7499 {
7501
7502 if (new_item)
7503 {
7504 new_item.SetResultOfSplit(true);
7505 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7508 new_item.PlaceOnSurface();
7509 }
7510 }
7511 }
7512 }
7513 }
7514
7516 {
7518 {
7519 if (ScriptInputUserData.CanStoreInputUserData())
7520 {
7521 ScriptInputUserData ctx = new ScriptInputUserData;
7526 dst.WriteToContext(ctx);
7528 }
7529 }
7530 else if (!
g_Game.IsMultiplayer())
7531 {
7533 }
7534 }
7535
7537 {
7539 {
7540 if (ScriptInputUserData.CanStoreInputUserData())
7541 {
7542 ScriptInputUserData ctx = new ScriptInputUserData;
7547 ctx.
Write(destination_entity);
7553 }
7554 }
7555 else if (!
g_Game.IsMultiplayer())
7556 {
7558 }
7559 }
7560
7562 {
7564 }
7565
7567 {
7569 float split_quantity_new;
7571 if (dst.IsValid())
7572 {
7573 int slot_id = dst.GetSlot();
7575
7576 if (quantity > stack_max)
7577 split_quantity_new = stack_max;
7578 else
7579 split_quantity_new = quantity;
7580
7582 {
7584
7585 if (new_item)
7586 {
7587 new_item.SetResultOfSplit(true);
7588 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7590 new_item.
SetQuantity(split_quantity_new,
false,
true);
7591 }
7592
7593 return new_item;
7594 }
7595 }
7596
7597 return null;
7598 }
7599
7601 {
7603 float split_quantity_new;
7605 if (destination_entity)
7606 {
7608 if (quantity > stackable)
7609 split_quantity_new = stackable;
7610 else
7611 split_quantity_new = quantity;
7612
7614 {
7615 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7616 if (new_item)
7617 {
7618 new_item.SetResultOfSplit(true);
7619 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7621 new_item.
SetQuantity(split_quantity_new,
false,
true);
7622 }
7623 }
7624 }
7625 }
7626
7628 {
7630 {
7631 if (ScriptInputUserData.CanStoreInputUserData())
7632 {
7633 ScriptInputUserData ctx = new ScriptInputUserData;
7638 ItemBase destination_entity =
this;
7639 ctx.
Write(destination_entity);
7643 }
7644 }
7645 else if (!
g_Game.IsMultiplayer())
7646 {
7648 }
7649 }
7650
7652 {
7654 float split_quantity_new;
7656 if (player)
7657 {
7659 if (quantity > stackable)
7660 split_quantity_new = stackable;
7661 else
7662 split_quantity_new = quantity;
7663
7665 {
7666 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7667 new_item =
ItemBase.Cast(in_hands);
7668 if (new_item)
7669 {
7670 new_item.SetResultOfSplit(true);
7671 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7673 new_item.SetQuantity(split_quantity_new, false, true);
7674 }
7675 }
7676 }
7677 }
7678
7680 {
7682 float split_quantity_new = Math.Floor(quantity * 0.5);
7683
7685 return;
7686
7688
7689 if (new_item)
7690 {
7691 if (new_item.GetQuantityMax() < split_quantity_new)
7692 {
7693 split_quantity_new = new_item.GetQuantityMax();
7694 }
7695
7696 new_item.SetResultOfSplit(true);
7697 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7698
7700 {
7703 }
7704 else
7705 {
7707 new_item.
SetQuantity(split_quantity_new,
false,
true);
7708 }
7709 }
7710 }
7711
7713 {
7715 float split_quantity_new = Math.Floor(quantity / 2);
7716
7718 return;
7719
7720 InventoryLocation invloc = new InventoryLocation;
7722
7724 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7725
7726 if (new_item)
7727 {
7728 if (new_item.GetQuantityMax() < split_quantity_new)
7729 {
7730 split_quantity_new = new_item.GetQuantityMax();
7731 }
7733 {
7736 }
7737 else if (split_quantity_new > 1)
7738 {
7740 new_item.
SetQuantity(split_quantity_new,
false,
true);
7741 }
7742 }
7743 }
7744
7747 {
7748 SetWeightDirty();
7750
7751 if (parent)
7752 parent.OnAttachmentQuantityChangedEx(this, delta);
7753
7755 {
7757 {
7759 }
7761 {
7762 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7764 }
7765 }
7766 }
7767
7770 {
7771
7772 }
7773
7776 {
7778 }
7779
7781 {
7782 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7783
7785 {
7786 if (newLevel == GameConstants.STATE_RUINED)
7787 {
7789 EntityAI parent = GetHierarchyParent();
7790 if (parent && parent.IsFireplace())
7791 {
7792 CargoBase cargo = GetInventory().GetCargo();
7793 if (cargo)
7794 {
7796 {
7798 }
7799 }
7800 }
7801 }
7802
7804 {
7805
7807 return;
7808 }
7809
7810 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7811 {
7813 }
7814 }
7815 }
7816
7817
7819 {
7820 super.OnRightClick();
7821
7823 {
7825 {
7826 if (ScriptInputUserData.CanStoreInputUserData())
7827 {
7828 EntityAI root = GetHierarchyRoot();
7829 Man playerOwner = GetHierarchyRootPlayer();
7830 InventoryLocation dst = new InventoryLocation;
7831
7832
7833 if (!playerOwner && root && root == this)
7834 {
7836 }
7837 else
7838 {
7839
7840 GetInventory().GetCurrentInventoryLocation(dst);
7842 {
7843 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7845 {
7847 }
7848 else
7849 {
7851
7852
7853 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7854 {
7856 }
7857 else
7858 {
7859 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7860 }
7861 }
7862 }
7863 }
7864
7865 ScriptInputUserData ctx = new ScriptInputUserData;
7873 }
7874 }
7875 else if (!
g_Game.IsMultiplayer())
7876 {
7878 }
7879 }
7880 }
7881
7883 {
7884 if (root)
7885 {
7886 vector m4[4];
7887 root.GetTransform(m4);
7888 dst.SetGround(this, m4);
7889 }
7890 else
7891 {
7892 GetInventory().GetCurrentInventoryLocation(dst);
7893 }
7894 }
7895
7896 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7897 {
7898
7899 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7900 return false;
7901
7902 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7903 return false;
7904
7905
7907 return false;
7908
7909
7910 Magazine mag = Magazine.Cast(this);
7911 if (mag)
7912 {
7913 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7914 return false;
7915
7916 if (stack_max_limit)
7917 {
7918 Magazine other_mag = Magazine.Cast(other_item);
7919 if (other_item)
7920 {
7921 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7922 return false;
7923 }
7924
7925 }
7926 }
7927 else
7928 {
7929
7931 return false;
7932
7934 return false;
7935 }
7936
7937 PlayerBase player = null;
7938 if (CastTo(player, GetHierarchyRootPlayer()))
7939 {
7940 if (player.GetInventory().HasAttachment(this))
7941 return false;
7942
7943 if (player.IsItemsToDelete())
7944 return false;
7945 }
7946
7947 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7948 return false;
7949
7950 int slotID;
7952 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7953 return false;
7954
7955 return true;
7956 }
7957
7959 {
7961 }
7962
7964 {
7965 return m_IsResultOfSplit;
7966 }
7967
7969 {
7970 m_IsResultOfSplit = value;
7971 }
7972
7974 {
7976 }
7977
7979 {
7980 float other_item_quantity = other_item.GetQuantity();
7981 float this_free_space;
7982
7984
7986
7987 if (other_item_quantity > this_free_space)
7988 {
7989 return this_free_space;
7990 }
7991 else
7992 {
7993 return other_item_quantity;
7994 }
7995 }
7996
7998 {
8000 }
8001
8003 {
8005 return;
8006
8007 if (!IsMagazine() && other_item)
8008 {
8010 if (quantity_used != 0)
8011 {
8012 float hp1 = GetHealth01("","");
8013 float hp2 = other_item.GetHealth01("","");
8014 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
8015 hpResult = hpResult / (
GetQuantity() + quantity_used);
8016
8017 hpResult *= GetMaxHealth();
8018 Math.Round(hpResult);
8019 SetHealth("", "Health", hpResult);
8020
8022 other_item.AddQuantity(-quantity_used);
8023 }
8024 }
8026 }
8027
8029 {
8030 #ifdef SERVER
8031 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8032 GetHierarchyParent().IncreaseLifetimeUp();
8033 #endif
8034 };
8035
8037 {
8038 PlayerBase p = PlayerBase.Cast(player);
8039
8040 array<int> recipesIds = p.m_Recipes;
8041 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8042 if (moduleRecipesManager)
8043 {
8044 EntityAI itemInHands = player.GetEntityInHands();
8045 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8046 }
8047
8048 for (int i = 0;i < recipesIds.Count(); i++)
8049 {
8050 int key = recipesIds.Get(i);
8051 string recipeName = moduleRecipesManager.GetRecipeName(key);
8053 }
8054 }
8055
8056
8057 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8058 {
8059 super.GetDebugActions(outputList);
8060
8061
8067
8068
8073
8078
8079
8083
8084
8086 {
8090 }
8091
8094
8095
8099
8101
8102 InventoryLocation loc = new InventoryLocation();
8103 GetInventory().GetCurrentInventoryLocation(loc);
8105 {
8106 if (Gizmo_IsSupported())
8109 }
8110
8112 }
8113
8114
8115
8116
8118 {
8119 super.OnAction(action_id, player, ctx);
8120
8122 {
8123 switch (action_id)
8124 {
8128 return true;
8132 return true;
8133 }
8134 }
8135
8137 {
8138 switch (action_id)
8139 {
8141 Delete();
8142 return true;
8143 }
8144 }
8145
8146 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8147 {
8148 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8149 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8150 PlayerBase p = PlayerBase.Cast(player);
8151 if (
EActions.RECIPES_RANGE_START < 1000)
8152 {
8153 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8154 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8155 }
8156 }
8157 #ifndef SERVER
8158 else if (action_id ==
EActions.WATCH_PLAYER)
8159 {
8160 PluginDeveloper.SetDeveloperItemClientEx(player);
8161 }
8162 #endif
8164 {
8165 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8166 {
8167 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8168 OnDebugButtonPressServer(id + 1);
8169 }
8170
8171 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8172 {
8173 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8175 }
8176
8177 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8178 {
8179 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8181 }
8182
8183 else if (action_id ==
EActions.ADD_QUANTITY)
8184 {
8185 if (IsMagazine())
8186 {
8187 Magazine mag = Magazine.Cast(this);
8188 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8189 }
8190 else
8191 {
8193 }
8194
8195 if (m_EM)
8196 {
8197 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8198 }
8199
8200 }
8201
8202 else if (action_id ==
EActions.REMOVE_QUANTITY)
8203 {
8204 if (IsMagazine())
8205 {
8206 Magazine mag2 = Magazine.Cast(this);
8207 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8208 }
8209 else
8210 {
8212 }
8213 if (m_EM)
8214 {
8215 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8216 }
8217
8218 }
8219
8220 else if (action_id ==
EActions.SET_QUANTITY_0)
8221 {
8223
8224 if (m_EM)
8225 {
8226 m_EM.SetEnergy(0);
8227 }
8228 }
8229
8230 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8231 {
8233
8234 if (m_EM)
8235 {
8236 m_EM.SetEnergy(m_EM.GetEnergyMax());
8237 }
8238 }
8239
8240 else if (action_id ==
EActions.ADD_HEALTH)
8241 {
8242 AddHealth("","",GetMaxHealth("","Health")/5);
8243 }
8244 else if (action_id ==
EActions.REMOVE_HEALTH)
8245 {
8246 AddHealth("","",-GetMaxHealth("","Health")/5);
8247 }
8248 else if (action_id ==
EActions.DESTROY_HEALTH)
8249 {
8250 SetHealth01("","",0);
8251 }
8252 else if (action_id ==
EActions.WATCH_ITEM)
8253 {
8255 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8256 #ifdef DEVELOPER
8257 SetDebugDeveloper_item(this);
8258 #endif
8259 }
8260
8261 else if (action_id ==
EActions.ADD_TEMPERATURE)
8262 {
8263 AddTemperature(20);
8264
8265 }
8266
8267 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8268 {
8269 AddTemperature(-20);
8270
8271 }
8272
8273 else if (action_id ==
EActions.FLIP_FROZEN)
8274 {
8275 SetFrozen(!GetIsFrozen());
8276
8277 }
8278
8279 else if (action_id ==
EActions.ADD_WETNESS)
8280 {
8282
8283 }
8284
8285 else if (action_id ==
EActions.REMOVE_WETNESS)
8286 {
8288
8289 }
8290
8291 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8292 {
8295
8296
8297 }
8298
8299 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8300 {
8303 }
8304
8305 else if (action_id ==
EActions.MAKE_SPECIAL)
8306 {
8307 auto debugParams = DebugSpawnParams.WithPlayer(player);
8308 OnDebugSpawnEx(debugParams);
8309 }
8310
8311 }
8312
8313
8314 return false;
8315 }
8316
8317
8318
8319
8323
8326
8327
8328
8330 {
8331 return false;
8332 }
8333
8334
8336 {
8337 return true;
8338 }
8339
8340
8342 {
8343 return true;
8344 }
8345
8346
8347
8349 {
8350 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8351 return g_Game.ConfigIsExisting(config_path);
8352 }
8353
8356 {
8357 return null;
8358 }
8359
8361 {
8362 return false;
8363 }
8364
8366 {
8367 return false;
8368 }
8369
8373
8374
8376 {
8377 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8378 return module_repairing.CanRepair(this, item_repair_kit);
8379 }
8380
8381
8382 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8383 {
8384 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8385 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8386 }
8387
8388
8390 {
8391
8392
8393
8394
8395
8396
8397
8398
8399 return 1;
8400 }
8401
8402
8403
8405 {
8407 }
8408
8409
8410
8412 {
8414 }
8415
8416
8425 {
8426 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8427
8428 if (player)
8429 {
8430 player.MessageStatus(text);
8431 }
8432 }
8433
8434
8443 {
8444 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8445
8446 if (player)
8447 {
8448 player.MessageAction(text);
8449 }
8450 }
8451
8452
8461 {
8462 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8463
8464 if (player)
8465 {
8466 player.MessageFriendly(text);
8467 }
8468 }
8469
8470
8479 {
8480 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8481
8482 if (player)
8483 {
8484 player.MessageImportant(text);
8485 }
8486 }
8487
8489 {
8490 return true;
8491 }
8492
8493
8494 override bool KindOf(
string tag)
8495 {
8496 bool found = false;
8497 string item_name = this.
GetType();
8499 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8500
8501 int array_size = item_tag_array.Count();
8502 for (int i = 0; i < array_size; i++)
8503 {
8504 if (item_tag_array.Get(i) == tag)
8505 {
8506 found = true;
8507 break;
8508 }
8509 }
8510 return found;
8511 }
8512
8513
8515 {
8516
8517 super.OnRPC(sender, rpc_type,ctx);
8518
8519
8520 switch (rpc_type)
8521 {
8522 #ifndef SERVER
8523 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8524 Param2<bool, string> p = new Param2<bool, string>(false, "");
8525
8527 return;
8528
8529 bool play = p.param1;
8530 string soundSet = p.param2;
8531
8532 if (play)
8533 {
8535 {
8537 {
8539 }
8540 }
8541 else
8542 {
8544 }
8545 }
8546 else
8547 {
8549 }
8550
8551 break;
8552 #endif
8553
8554 }
8555
8557 {
8559 }
8560 }
8561
8562
8563
8564
8566 {
8567 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8568 return plugin.GetID(
name);
8569 }
8570
8572 {
8573 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8574 return plugin.GetName(id);
8575 }
8576
8579 {
8580
8581
8582 int varFlags;
8583 if (!ctx.
Read(varFlags))
8584 return;
8585
8586 if (varFlags & ItemVariableFlags.FLOAT)
8587 {
8589 }
8590 }
8591
8593 {
8594
8595 super.SerializeNumericalVars(floats_out);
8596
8597
8598
8600 {
8602 }
8603
8605 {
8607 }
8608
8610 {
8612 }
8613
8615 {
8620 }
8621
8623 {
8625 }
8626 }
8627
8629 {
8630
8631 super.DeSerializeNumericalVars(floats);
8632
8633
8634 int index = 0;
8635 int mask = Math.Round(floats.Get(index));
8636
8637 index++;
8638
8640 {
8642 {
8644 }
8645 else
8646 {
8647 float quantity = floats.Get(index);
8649 }
8650 index++;
8651 }
8652
8654 {
8655 float wet = floats.Get(index);
8657 index++;
8658 }
8659
8661 {
8662 int liquidtype = Math.Round(floats.Get(index));
8664 index++;
8665 }
8666
8668 {
8670 index++;
8672 index++;
8674 index++;
8676 index++;
8677 }
8678
8680 {
8681 int cleanness = Math.Round(floats.Get(index));
8683 index++;
8684 }
8685 }
8686
8688 {
8689 super.WriteVarsToCTX(ctx);
8690
8691
8693 {
8695 }
8696
8698 {
8700 }
8701
8703 {
8705 }
8706
8708 {
8709 int r,g,b,a;
8715 }
8716
8718 {
8720 }
8721 }
8722
8724 {
8725 if (!super.ReadVarsFromCTX(ctx,version))
8726 return false;
8727
8728 int intValue;
8729 float value;
8730
8731 if (version < 140)
8732 {
8733 if (!ctx.
Read(intValue))
8734 return false;
8735
8736 m_VariablesMask = intValue;
8737 }
8738
8740 {
8741 if (!ctx.
Read(value))
8742 return false;
8743
8745 {
8747 }
8748 else
8749 {
8751 }
8752 }
8753
8754 if (version < 140)
8755 {
8757 {
8758 if (!ctx.
Read(value))
8759 return false;
8760 SetTemperatureDirect(value);
8761 }
8762 }
8763
8765 {
8766 if (!ctx.
Read(value))
8767 return false;
8769 }
8770
8772 {
8773 if (!ctx.
Read(intValue))
8774 return false;
8776 }
8777
8779 {
8780 int r,g,b,a;
8782 return false;
8784 return false;
8786 return false;
8788 return false;
8789
8791 }
8792
8794 {
8795 if (!ctx.
Read(intValue))
8796 return false;
8798 }
8799
8800 if (version >= 138 && version < 140)
8801 {
8803 {
8804 if (!ctx.
Read(intValue))
8805 return false;
8806 SetFrozen(intValue);
8807 }
8808 }
8809
8810 return true;
8811 }
8812
8813
8815 {
8818 {
8820 }
8821
8822 if (!super.OnStoreLoad(ctx, version))
8823 {
8825 return false;
8826 }
8827
8828 if (version >= 114)
8829 {
8830 bool hasQuickBarIndexSaved;
8831
8832 if (!ctx.
Read(hasQuickBarIndexSaved))
8833 {
8835 return false;
8836 }
8837
8838 if (hasQuickBarIndexSaved)
8839 {
8840 int itmQBIndex;
8841
8842
8843 if (!ctx.
Read(itmQBIndex))
8844 {
8846 return false;
8847 }
8848
8849 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8850 if (itmQBIndex != -1 && parentPlayer)
8851 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8852 }
8853 }
8854 else
8855 {
8856
8857 PlayerBase player;
8858 int itemQBIndex;
8859 if (version ==
int.
MAX)
8860 {
8861 if (!ctx.
Read(itemQBIndex))
8862 {
8864 return false;
8865 }
8866 }
8867 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8868 {
8869
8870 if (!ctx.
Read(itemQBIndex))
8871 {
8873 return false;
8874 }
8875 if (itemQBIndex != -1 && player)
8876 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8877 }
8878 }
8879
8880 if (version < 140)
8881 {
8882
8883 if (!LoadVariables(ctx, version))
8884 {
8886 return false;
8887 }
8888 }
8889
8890
8892 {
8894 return false;
8895 }
8896 if (version >= 132)
8897 {
8899 if (raib)
8900 {
8902 {
8904 return false;
8905 }
8906 }
8907 }
8908
8910 return true;
8911 }
8912
8913
8914
8916 {
8917 super.OnStoreSave(ctx);
8918
8919 PlayerBase player;
8920 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8921 {
8923
8924 int itemQBIndex = -1;
8925 itemQBIndex = player.FindQuickBarEntityIndex(this);
8926 ctx.
Write(itemQBIndex);
8927 }
8928 else
8929 {
8931 }
8932
8934
8936 if (raib)
8937 {
8939 }
8940 }
8941
8942
8944 {
8945 super.AfterStoreLoad();
8946
8948 {
8950 }
8951
8953 {
8956 }
8957 }
8958
8960 {
8961 super.EEOnAfterLoad();
8962
8964 {
8966 }
8967
8970 }
8971
8973 {
8974 return false;
8975 }
8976
8977
8978
8980 {
8982 {
8983 #ifdef PLATFORM_CONSOLE
8984
8986 {
8988 if (menu)
8989 {
8991 }
8992 }
8993 #endif
8994 }
8995
8997 {
9000 }
9001
9003 {
9004 SetWeightDirty();
9006 }
9008 {
9011 }
9012
9014 {
9017
9020 }
9022 {
9026 }
9027
9028 super.OnVariablesSynchronized();
9029 }
9030
9031
9032
9034 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9035 {
9036 if (!IsServerCheck(allow_client))
9037 return false;
9038
9040 return false;
9041
9044
9045 if (value <= (min + 0.001))
9046 value = min;
9047
9048 if (value == min)
9049 {
9050 if (destroy_config)
9051 {
9052 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9053 if (dstr)
9054 {
9056 this.Delete();
9057 return true;
9058 }
9059 }
9060 else if (destroy_forced)
9061 {
9063 this.Delete();
9064 return true;
9065 }
9066
9068 }
9069
9072
9074 {
9075 EntityAI parent = GetHierarchyRoot();
9076 InventoryLocation iLoc = new InventoryLocation();
9077 GetInventory().GetCurrentInventoryLocation(iLoc);
9079 {
9080 int iLocSlot = iLoc.
GetSlot();
9082 {
9084 }
9086 {
9088 }
9089 }
9090 }
9091
9093 {
9095
9096 if (delta)
9098 }
9099
9101
9102 return false;
9103 }
9104
9105
9107 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9108 {
9110 }
9111
9113 {
9116 }
9117
9119 {
9122 }
9123
9125 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9126 {
9127 float value_clamped = Math.Clamp(value, 0, 1);
9129 SetQuantity(result, destroy_config, destroy_forced);
9130 }
9131
9132
9135 {
9137 }
9138
9140 {
9142 }
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9154 {
9155 int slot = -1;
9156 GameInventory inventory = GetInventory();
9157 if (inventory)
9158 {
9159 InventoryLocation il = new InventoryLocation;
9162 }
9163
9165 }
9166
9168 {
9169 float quantity_max = 0;
9170
9172 {
9173 if (attSlotID != -1)
9174 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9175
9176 if (quantity_max <= 0)
9178 }
9179
9180 if (quantity_max <= 0)
9182
9183 return quantity_max;
9184 }
9185
9187 {
9189 }
9190
9192 {
9194 }
9195
9196
9198 {
9200 }
9201
9203 {
9205 }
9206
9208 {
9210 }
9211
9212
9214 {
9215
9216 float weightEx = GetWeightEx();
9217 float special = GetInventoryAndCargoWeight();
9218 return weightEx - special;
9219 }
9220
9221
9223 {
9225 }
9226
9228 {
9230 {
9231 #ifdef DEVELOPER
9232 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9233 {
9234 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9236 }
9237 #endif
9238
9240 }
9241 else if (HasEnergyManager())
9242 {
9243 #ifdef DEVELOPER
9244 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9245 {
9246 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9247 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9248 }
9249 #endif
9250 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9251 }
9252 else
9253 {
9254 #ifdef DEVELOPER
9255 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9256 {
9257 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9258 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9259 }
9260 #endif
9261 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9262 }
9263 }
9264
9267 {
9268 int item_count = 0;
9270
9271 GameInventory inventory = GetInventory();
9272 CargoBase cargo = inventory.
GetCargo();
9273 if (cargo != NULL)
9274 {
9276 }
9277
9279 for (int i = 0; i < nAttachments; ++i)
9280 {
9282 if (item)
9283 item_count += item.GetNumberOfItems();
9284 }
9285 return item_count;
9286 }
9287
9290 {
9291 float weight = 0;
9292 float wetness = 1;
9293 if (include_wetness)
9296 {
9297 weight = wetness * m_ConfigWeight;
9298 }
9300 {
9301 weight = 1;
9302 }
9303 return weight;
9304 }
9305
9306
9307
9309 {
9310 GameInventory inventory = GetInventory();
9311 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9312 {
9313 array<EntityAI> items = new array<EntityAI>;
9315 for (int i = 0; i < items.Count(); ++i)
9316 {
9318 if (item)
9319 {
9320 g_Game.ObjectDelete(item);
9321 }
9322 }
9323 }
9324 }
9325
9326
9327
9328
9330 {
9331 float energy = 0;
9332 if (HasEnergyManager())
9333 {
9334 energy = GetCompEM().GetEnergy();
9335 }
9336 return energy;
9337 }
9338
9339
9341 {
9342 super.OnEnergyConsumed();
9343
9345 }
9346
9348 {
9349 super.OnEnergyAdded();
9350
9352 }
9353
9354
9356 {
9357 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9358 {
9360 {
9361 float energy_0to1 = GetCompEM().GetEnergy0To1();
9363 }
9364 }
9365 }
9366
9367
9369 {
9370 return ConfigGetFloat("heatIsolation");
9371 }
9372
9374 {
9376 }
9377
9379 {
9380 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9381 if (
g_Game.ConfigIsExisting(paramPath))
9382 return g_Game.ConfigGetFloat(paramPath);
9383
9384 return 0.0;
9385 }
9386
9388 {
9389 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9390 if (
g_Game.ConfigIsExisting(paramPath))
9391 return g_Game.ConfigGetFloat(paramPath);
9392
9393 return 0.0;
9394 }
9395
9396 override void SetWet(
float value,
bool allow_client =
false)
9397 {
9398 if (!IsServerCheck(allow_client))
9399 return;
9400
9403
9405
9406 m_VarWet = Math.Clamp(value, min, max);
9407
9409 {
9412 }
9413 }
9414
9415 override void AddWet(
float value)
9416 {
9418 }
9419
9421 {
9423 }
9424
9426 {
9428 }
9429
9431 {
9433 }
9434
9436 {
9438 }
9439
9441 {
9443 }
9444
9446 {
9449 if (newLevel != oldLevel)
9450 {
9452 }
9453 }
9454
9456 {
9457 SetWeightDirty();
9458 }
9459
9461 {
9462 return GetWetLevelInternal(
m_VarWet);
9463 }
9464
9465
9466
9468 {
9470 }
9471
9473 {
9475 }
9476
9478 {
9480 }
9481
9483 {
9485 }
9486
9487
9488
9490 {
9491 if (ConfigIsExisting("itemModelLength"))
9492 {
9493 return ConfigGetFloat("itemModelLength");
9494 }
9495 return 0;
9496 }
9497
9499 {
9500 if (ConfigIsExisting("itemAttachOffset"))
9501 {
9502 return ConfigGetFloat("itemAttachOffset");
9503 }
9504 return 0;
9505 }
9506
9507 override void SetCleanness(
int value,
bool allow_client =
false)
9508 {
9509 if (!IsServerCheck(allow_client))
9510 return;
9511
9513
9515
9518 }
9519
9521 {
9523 }
9524
9526 {
9527 return true;
9528 }
9529
9530
9531
9532
9534 {
9536 }
9537
9539 {
9541 }
9542
9543
9544
9545
9546 override void SetColor(
int r,
int g,
int b,
int a)
9547 {
9553 }
9555 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9556 {
9561 }
9562
9564 {
9566 }
9567
9570 {
9571 int r,g,b,a;
9573 r = r/255;
9574 g = g/255;
9575 b = b/255;
9576 a = a/255;
9577 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9578 }
9579
9580
9581
9582 override void SetLiquidType(
int value,
bool allow_client =
false)
9583 {
9584 if (!IsServerCheck(allow_client))
9585 return;
9586
9591 }
9592
9594 {
9595 return ConfigGetInt("varLiquidTypeInit");
9596 }
9597
9599 {
9601 }
9602
9604 {
9606 SetFrozen(false);
9607 }
9608
9611 {
9612 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9613 }
9614
9615
9618 {
9619 PlayerBase nplayer;
9620 if (PlayerBase.CastTo(nplayer, player))
9621 {
9623 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9624 }
9625 }
9626
9627
9630 {
9631 PlayerBase nplayer;
9632 if (PlayerBase.CastTo(nplayer,player))
9633 {
9634 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9635 }
9636
9637 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9638
9639 if (HasEnergyManager())
9640 {
9641 GetCompEM().UpdatePlugState();
9642 }
9643 }
9644
9645
9647 {
9648 super.OnPlacementStarted(player);
9649
9651 }
9652
9653 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9654 {
9656 {
9657 m_AdminLog.OnPlacementComplete(player,
this);
9658 }
9659
9660 super.OnPlacementComplete(player, position, orientation);
9661 }
9662
9663
9664
9665
9666
9668 {
9670 {
9671 return true;
9672 }
9673 else
9674 {
9675 return false;
9676 }
9677 }
9678
9679
9681 {
9683 {
9685 }
9686 }
9687
9688
9690 {
9692 }
9693
9695 {
9697 }
9698
9699 override void InsertAgent(
int agent,
float count = 1)
9700 {
9701 if (count < 1)
9702 return;
9703
9705 }
9706
9709 {
9711 }
9712
9713
9715 {
9717 }
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9761 {
9763 return false;
9764 return true;
9765 }
9766
9768 {
9769
9771 }
9772
9773
9776 {
9777 super.CheckForRoofLimited(timeTresholdMS);
9778
9779 float time =
g_Game.GetTime();
9780 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9781 {
9782 m_PreviousRoofTestTime = time;
9783 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9784 }
9785 }
9786
9787
9789 {
9791 {
9792 return 0;
9793 }
9794
9795 if (GetInventory().GetAttachmentSlotsCount() != 0)
9796 {
9797 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9798 if (filter)
9799 return filter.GetProtectionLevel(type, false, system);
9800 else
9801 return 0;
9802 }
9803
9804 string subclassPath, entryName;
9805
9806 switch (type)
9807 {
9809 entryName = "biological";
9810 break;
9812 entryName = "chemical";
9813 break;
9814 default:
9815 entryName = "biological";
9816 break;
9817 }
9818
9819 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9820
9821 return g_Game.ConfigGetFloat(subclassPath + entryName);
9822 }
9823
9824
9825
9828 {
9829 if (!IsMagazine())
9831
9833 }
9834
9835
9836
9837
9838
9843 {
9844 return true;
9845 }
9846
9848 {
9850 }
9851
9852
9853
9854
9855
9857 {
9858 if (parent)
9859 {
9860 if (parent.IsInherited(DayZInfected))
9861 return true;
9862
9863 if (!parent.IsRuined())
9864 return true;
9865 }
9866
9867 return true;
9868 }
9869
9871 {
9872 if (!super.CanPutAsAttachment(parent))
9873 {
9874 return false;
9875 }
9876
9877 if (!IsRuined() && !parent.IsRuined())
9878 {
9879 return true;
9880 }
9881
9882 return false;
9883 }
9884
9886 {
9887
9888
9889
9890
9891 return super.CanReceiveItemIntoCargo(item);
9892 }
9893
9895 {
9896
9897
9898
9899
9900 GameInventory attachmentInv = attachment.GetInventory();
9902 {
9903 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9904 return false;
9905 }
9906
9907 InventoryLocation loc = new InventoryLocation();
9908 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9909 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9910 return false;
9911
9912 return super.CanReceiveAttachment(attachment, slotId);
9913 }
9914
9916 {
9917 if (!super.CanReleaseAttachment(attachment))
9918 return false;
9919
9920 return GetInventory().AreChildrenAccessible();
9921 }
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9944 {
9945 int id = muzzle_owner.GetMuzzleID();
9946 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9947
9948 if (WPOF_array)
9949 {
9950 for (int i = 0; i < WPOF_array.Count(); i++)
9951 {
9952 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9953
9954 if (WPOF)
9955 {
9956 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9957 }
9958 }
9959 }
9960 }
9961
9962
9964 {
9965 int id = muzzle_owner.GetMuzzleID();
9967
9968 if (WPOBE_array)
9969 {
9970 for (int i = 0; i < WPOBE_array.Count(); i++)
9971 {
9972 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9973
9974 if (WPOBE)
9975 {
9976 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9977 }
9978 }
9979 }
9980 }
9981
9982
9984 {
9985 int id = muzzle_owner.GetMuzzleID();
9986 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9987
9988 if (WPOOH_array)
9989 {
9990 for (int i = 0; i < WPOOH_array.Count(); i++)
9991 {
9992 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9993
9994 if (WPOOH)
9995 {
9996 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9997 }
9998 }
9999 }
10000 }
10001
10002
10004 {
10005 int id = muzzle_owner.GetMuzzleID();
10006 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10007
10008 if (WPOOH_array)
10009 {
10010 for (int i = 0; i < WPOOH_array.Count(); i++)
10011 {
10012 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10013
10014 if (WPOOH)
10015 {
10016 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10017 }
10018 }
10019 }
10020 }
10021
10022
10024 {
10025 int id = muzzle_owner.GetMuzzleID();
10026 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10027
10028 if (WPOOH_array)
10029 {
10030 for (int i = 0; i < WPOOH_array.Count(); i++)
10031 {
10032 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10033
10034 if (WPOOH)
10035 {
10036 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10037 }
10038 }
10039 }
10040 }
10041
10042
10043
10045 {
10047 {
10048 return true;
10049 }
10050
10051 return false;
10052 }
10053
10055 {
10057 {
10058 return true;
10059 }
10060
10061 return false;
10062 }
10063
10065 {
10067 {
10068 return true;
10069 }
10070
10071 return false;
10072 }
10073
10075 {
10076 return false;
10077 }
10078
10081 {
10082 return UATimeSpent.DEFAULT_DEPLOY;
10083 }
10084
10085
10086
10087
10089 {
10091 SetSynchDirty();
10092 }
10093
10095 {
10097 }
10098
10099
10101 {
10102 return false;
10103 }
10104
10107 {
10108 string att_type = "None";
10109
10110 if (ConfigIsExisting("soundAttType"))
10111 {
10112 att_type = ConfigGetString("soundAttType");
10113 }
10114
10116 }
10117
10119 {
10121 }
10122
10123
10124
10125
10126
10132
10134 {
10137
10139 }
10140
10141
10143 {
10145 return;
10146
10148
10151
10154
10155 SoundParameters params = new SoundParameters();
10159 }
10160
10161
10163 {
10165 {
10168
10169 SetSynchDirty();
10170
10173 }
10174 }
10175
10177 {
10179 }
10180
10181
10183 {
10185 return;
10186
10188 SetSynchDirty();
10189
10192 }
10193
10195 {
10198 }
10199
10201 {
10203 }
10204
10205 void OnApply(PlayerBase player);
10206
10208 {
10209 return 1.0;
10210 };
10211
10213 {
10215 }
10216
10218 {
10220 }
10221
10223
10225 {
10226 SetDynamicPhysicsLifeTime(0.01);
10228 }
10229
10231 {
10232 array<string> zone_names = new array<string>;
10233 GetDamageZones(zone_names);
10234 for (int i = 0; i < zone_names.Count(); i++)
10235 {
10236 SetHealthMax(zone_names.Get(i),"Health");
10237 }
10238 SetHealthMax("","Health");
10239 }
10240
10243 {
10244 float global_health = GetHealth01("","Health");
10245 array<string> zones = new array<string>;
10246 GetDamageZones(zones);
10247
10248 for (int i = 0; i < zones.Count(); i++)
10249 {
10250 SetHealth01(zones.Get(i),"Health",global_health);
10251 }
10252 }
10253
10256 {
10257 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10258 }
10259
10261 {
10262 if (!hasRootAsPlayer)
10263 {
10264 if (refParentIB)
10265 {
10266
10267 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10268 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10269
10270 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10271 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10272
10275 }
10276 else
10277 {
10278
10281 }
10282 }
10283 }
10284
10286 {
10288 {
10289 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10290 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10291 {
10292 float heatPermCoef = 1.0;
10294 while (ent)
10295 {
10296 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10297 ent = ent.GetHierarchyParent();
10298 }
10299
10300 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10301 }
10302 }
10303 }
10304
10306 {
10307
10308 EntityAI parent = GetHierarchyParent();
10309 if (!parent)
10310 {
10311 hasParent = false;
10312 hasRootAsPlayer = false;
10313 }
10314 else
10315 {
10316 hasParent = true;
10317 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10318 refParentIB =
ItemBase.Cast(parent);
10319 }
10320 }
10321
10322 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10323 {
10324
10325 }
10326
10328 {
10329
10330 return false;
10331 }
10332
10334 {
10335
10336
10337 return false;
10338 }
10339
10341 {
10342
10343 return false;
10344 }
10345
10348 {
10349 return !GetIsFrozen() &&
IsOpen();
10350 }
10351
10353 {
10354 bool hasParent = false, hasRootAsPlayer = false;
10356
10357 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10358 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10359
10360 if (wwtu || foodDecay)
10361 {
10365
10366 if (processWetness || processTemperature || processDecay)
10367 {
10369
10370 if (processWetness)
10371 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10372
10373 if (processTemperature)
10375
10376 if (processDecay)
10377 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10378 }
10379 }
10380 }
10381
10384 {
10386 }
10387
10389 {
10392
10393 return super.GetTemperatureFreezeThreshold();
10394 }
10395
10397 {
10400
10401 return super.GetTemperatureThawThreshold();
10402 }
10403
10405 {
10408
10409 return super.GetItemOverheatThreshold();
10410 }
10411
10413 {
10415 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10416
10417 return super.GetTemperatureFreezeTime();
10418 }
10419
10421 {
10423 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10424
10425 return super.GetTemperatureThawTime();
10426 }
10427
10432
10434 {
10435 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10436 }
10437
10439 {
10440 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10441 }
10442
10445 {
10447 }
10448
10450 {
10452 }
10453
10455 {
10457 }
10458
10461 {
10462 return null;
10463 }
10464
10467 {
10468 return false;
10469 }
10470
10472 {
10474 {
10477 if (!trg)
10478 {
10480 explosive = this;
10481 }
10482
10483 explosive.PairRemote(trg);
10485
10486 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10487 trg.SetPersistentPairID(persistentID);
10488 explosive.SetPersistentPairID(persistentID);
10489
10490 return true;
10491 }
10492 return false;
10493 }
10494
10497 {
10498 float ret = 1.0;
10501 ret *= GetHealth01();
10502
10503 return ret;
10504 }
10505
10506 #ifdef DEVELOPER
10507 override void SetDebugItem()
10508 {
10509 super.SetDebugItem();
10510 _itemBase = this;
10511 }
10512
10514 {
10515 string text = super.GetDebugText();
10516
10518 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10519
10520 return text;
10521 }
10522 #endif
10523
10525 {
10526 return true;
10527 }
10528
10530
10532
10534 {
10537 }
10538
10539
10547
10563
10564 [
Obsolete(
"Use ItemSoundHandler instead")]
10567 {
10568 if (!
g_Game.IsDedicatedServer())
10569 {
10570 if (ConfigIsExisting("attachSoundSet"))
10571 {
10572 string cfg_path = "";
10573 string soundset = "";
10574 string type_name =
GetType();
10575
10578 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10579 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10580
10581 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10582 {
10583 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10584 {
10585 if (cfg_slot_array[i] == slot_type)
10586 {
10587 soundset = cfg_soundset_array[i];
10588 break;
10589 }
10590 }
10591 }
10592
10593 if (soundset != "")
10594 {
10595 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10597 }
10598 }
10599 }
10600 }
10601
10603}
10604
10606{
10608 if (entity)
10609 {
10610 bool is_item = entity.IsInherited(
ItemBase);
10611 if (is_item && full_quantity)
10612 {
10615 }
10616 }
10617 else
10618 {
10620 return NULL;
10621 }
10622 return entity;
10623}
10624
10626{
10627 if (item)
10628 {
10629 if (health > 0)
10630 item.SetHealth("", "", health);
10631
10632 if (item.CanHaveTemperature())
10633 {
10635 if (item.CanFreeze())
10636 item.SetFrozen(false);
10637 }
10638
10639 if (item.HasEnergyManager())
10640 {
10641 if (quantity >= 0)
10642 {
10643 item.GetCompEM().SetEnergy0To1(quantity);
10644 }
10645 else
10646 {
10648 }
10649 }
10650 else if (item.IsMagazine())
10651 {
10652 Magazine mag = Magazine.Cast(item);
10653 if (quantity >= 0)
10654 {
10655 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10656 }
10657 else
10658 {
10660 }
10661
10662 }
10663 else
10664 {
10665 if (quantity >= 0)
10666 {
10667 item.SetQuantityNormalized(quantity, false);
10668 }
10669 else
10670 {
10672 }
10673
10674 }
10675 }
10676}
10677
10678#ifdef DEVELOPER
10680#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.