5811{
5813 {
5814 return true;
5815 }
5816};
5817
5819{
5820
5821};
5822
5823
5824
5826{
5830
5832
5835
5836
5837
5838
5839
5848
5854
5859
5864
5885 protected bool m_IsResultOfSplit
5886
5888
5893
5894
5895
5897
5901
5902
5903
5905
5908
5909
5910
5916
5917
5925
5928
5929
5931
5932
5934
5935
5940
5941
5946
5948
5949
5951
5952
5954 {
5959
5960 if (!
g_Game.IsDedicatedServer())
5961 {
5963 {
5965
5967 {
5969 }
5970 }
5971
5974 }
5975
5976 m_OldLocation = null;
5977
5979 {
5981 }
5982
5983 if (ConfigIsExisting("headSelectionsToHide"))
5984 {
5987 }
5988
5990 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5991 {
5993 }
5994
5996
5997 m_IsResultOfSplit = false;
5998
6000 }
6001
6003 {
6004 super.InitItemVariables();
6005
6011 m_Count = ConfigGetInt(
"count");
6012
6015
6020
6023
6028
6040
6044
6045
6048 if (ConfigIsExisting("canBeSplit"))
6049 {
6052 }
6053
6055 if (ConfigIsExisting("itemBehaviour"))
6057
6058
6061 RegisterNetSyncVariableInt("m_VarLiquidType");
6062 RegisterNetSyncVariableInt("m_Cleanness",0,1);
6063
6064 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
6065 RegisterNetSyncVariableFloat("m_ImpactSpeed");
6066 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
6067
6068 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
6069 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
6070 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
6071 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
6072
6073 RegisterNetSyncVariableBool("m_IsBeingPlaced");
6074 RegisterNetSyncVariableBool("m_IsTakeable");
6075 RegisterNetSyncVariableBool("m_IsHologram");
6076
6079 {
6082 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
6083 }
6084
6086
6088 if (ConfigIsExisting("temperaturePerQuantityWeight"))
6090
6092 }
6093
6095 {
6097 }
6098
6100 {
6103 {
6108 }
6109 }
6110
6111 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
6112 {
6114 {
6117 }
6118
6120 }
6121
6123 {
6129 }
6130
6132
6134 {
6136
6137 if (!action)
6138 {
6139 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6140 return;
6141 }
6142
6144 if (!ai)
6145 {
6147 return;
6148 }
6149
6151 if (!action_array)
6152 {
6153 action_array = new array<ActionBase_Basic>;
6155 }
6156 if (LogManager.IsActionLogEnable())
6157 {
6158 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6159 }
6160
6161 if (action_array.Find(action) != -1)
6162 {
6163 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6164 }
6165 else
6166 {
6167 action_array.Insert(action);
6168 }
6169 }
6170
6172 {
6173 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6174 ActionBase action = player.GetActionManager().GetAction(actionName);
6177
6178 if (action_array)
6179 {
6180 action_array.RemoveItem(action);
6181 }
6182 }
6183
6184
6185
6187 {
6188 ActionOverrideData overrideData = new ActionOverrideData();
6192
6194 if (!actionMap)
6195 {
6198 }
6199
6200 actionMap.Insert(this.
Type(), overrideData);
6201
6202 }
6203
6205
6207
6208
6210 {
6213
6216
6217 string config_to_search = "CfgVehicles";
6218 string muzzle_owner_config;
6219
6221 {
6222 if (IsInherited(Weapon))
6223 config_to_search = "CfgWeapons";
6224
6225 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6226
6227 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6228
6229 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6230
6231 if (config_OnFire_subclass_count > 0)
6232 {
6233 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6234
6235 for (int i = 0; i < config_OnFire_subclass_count; i++)
6236 {
6237 string particle_class = "";
6238 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6239 string config_OnFire_entry = config_OnFire_class + particle_class;
6240 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6241 WPOF_array.Insert(WPOF);
6242 }
6243
6244
6246 }
6247 }
6248
6250 {
6251 config_to_search = "CfgWeapons";
6252 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6253
6254 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6255
6256 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6257
6258 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6259 {
6260 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6261
6262 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6263 {
6264 string particle_class2 = "";
6265 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6266 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6267 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6268 WPOBE_array.Insert(WPOBE);
6269 }
6270
6271
6273 }
6274 }
6275 }
6276
6277
6279 {
6282
6284 {
6285 string config_to_search = "CfgVehicles";
6286
6287 if (IsInherited(Weapon))
6288 config_to_search = "CfgWeapons";
6289
6290 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6291 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6292
6293 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6294 {
6295
6297
6299 {
6301 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6303 return;
6304 }
6305
6308
6309
6310
6311 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6312 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6313
6314 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6315 {
6316 string particle_class = "";
6317 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6318 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6319 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6320
6321 if (entry_type == CT_CLASS)
6322 {
6323 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6324 WPOOH_array.Insert(WPOF);
6325 }
6326 }
6327
6328
6330 }
6331 }
6332 }
6333
6335 {
6337 }
6338
6340 {
6342 {
6344
6347
6350
6351 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6352 }
6353 }
6354
6356 {
6358 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6359
6361 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6362
6364 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6365
6367 {
6369 }
6370 }
6371
6373 {
6375 }
6376
6378 {
6381 else
6383
6385 {
6388 }
6389 else
6390 {
6393
6396 }
6397
6399 }
6400
6402 {
6404 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6405 }
6406
6408 {
6410 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6412 }
6413
6415 {
6417 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6418 }
6419
6421 {
6424
6425 OverheatingParticle OP = new OverheatingParticle();
6430
6432 }
6433
6435 {
6438
6439 return -1;
6440 }
6441
6443 {
6445 {
6448
6449 for (int i = count; i > 0; --i)
6450 {
6451 int id = i - 1;
6454
6457
6458 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6459 {
6460 if (p)
6461 {
6464 }
6465 }
6466 }
6467 }
6468 }
6469
6471 {
6473 {
6475 {
6476 int id = i - 1;
6478
6479 if (OP)
6480 {
6482
6483 if (p)
6484 {
6486 }
6487
6488 delete OP;
6489 }
6490 }
6491
6494 }
6495 }
6496
6499 {
6500 return 0.0;
6501 }
6502
6503
6505 {
6506 return 250;
6507 }
6508
6510 {
6511 return 0;
6512 }
6513
6516 {
6518 return true;
6519
6520 return false;
6521 }
6522
6525 {
6528
6530 {
6532 }
6533 else
6534 {
6535
6537 }
6538
6540 }
6541
6548 {
6549 return -1;
6550 }
6551
6552
6553
6554
6556 {
6558 {
6559 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6560 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6561
6562 if (r_index >= 0)
6563 {
6564 InventoryLocation r_il = new InventoryLocation;
6565 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6566
6567 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6570 {
6571 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6572 }
6574 {
6575 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6576 }
6577
6578 }
6579
6580 player.GetHumanInventory().ClearUserReservedLocation(this);
6581 }
6582
6585 }
6586
6587
6588
6589
6591 {
6592 return ItemBase.m_DebugActionsMask;
6593 }
6594
6596 {
6597 return ItemBase.m_DebugActionsMask & mask;
6598 }
6599
6601 {
6602 ItemBase.m_DebugActionsMask = mask;
6603 }
6604
6606 {
6607 ItemBase.m_DebugActionsMask |= mask;
6608 }
6609
6611 {
6612 ItemBase.m_DebugActionsMask &= ~mask;
6613 }
6614
6616 {
6618 {
6620 }
6621 else
6622 {
6624 }
6625 }
6626
6627
6629 {
6630 if (GetEconomyProfile())
6631 {
6632 float q_max = GetEconomyProfile().GetQuantityMax();
6633 if (q_max > 0)
6634 {
6635 float q_min = GetEconomyProfile().GetQuantityMin();
6636 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6637
6639 {
6640 ComponentEnergyManager comp = GetCompEM();
6642 {
6644 }
6645 }
6647 {
6649
6650 }
6651
6652 }
6653 }
6654 }
6655
6658 {
6659 EntityAI parent = GetHierarchyParent();
6660
6661 if (parent)
6662 {
6663 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6664 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6665 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6666 }
6667 }
6668
6671 {
6672 EntityAI parent = GetHierarchyParent();
6673
6674 if (parent)
6675 {
6676 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6677 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6678 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6679 }
6680 }
6681
6683 {
6684
6685
6686
6687
6689
6691 {
6692 if (ScriptInputUserData.CanStoreInputUserData())
6693 {
6694 ScriptInputUserData ctx = new ScriptInputUserData;
6700 ctx.
Write(use_stack_max);
6703
6705 {
6706 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6707 }
6708 }
6709 }
6710 else if (!
g_Game.IsMultiplayer())
6711 {
6713 }
6714 }
6715
6717 {
6719 }
6720
6722 {
6724 }
6725
6727 {
6729 }
6730
6732 {
6733
6734 return false;
6735 }
6736
6738 {
6739 return false;
6740 }
6741
6745 {
6746 return false;
6747 }
6748
6750 {
6751 return "";
6752 }
6753
6755
6757 {
6758 return false;
6759 }
6760
6762 {
6763 return true;
6764 }
6765
6766
6767
6769 {
6770 return true;
6771 }
6772
6774 {
6775 return true;
6776 }
6777
6779 {
6780 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6782 }
6783
6785 {
6787 }
6788
6790 {
6792 if (!is_being_placed)
6794 SetSynchDirty();
6795 }
6796
6797
6799
6801 {
6803 }
6804
6806 {
6808 }
6809
6811 {
6812 return 1;
6813 }
6814
6816 {
6817 return false;
6818 }
6819
6821 {
6823 SetSynchDirty();
6824 }
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6861 {
6862 super.OnMovedInsideCargo(container);
6863
6864 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6865 }
6866
6867 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6868 {
6869 super.EEItemLocationChanged(oldLoc, newLoc);
6870
6871 PlayerBase newPlayer = null;
6872 PlayerBase oldPlayer = null;
6873
6874 if (newLoc.GetParent())
6875 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6876
6877 if (oldLoc.GetParent())
6878 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6879
6881 {
6882 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6883
6884 if (rIndex >= 0)
6885 {
6886 InventoryLocation rIl = new InventoryLocation;
6887 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6888
6889 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6892 {
6893 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6894 }
6896 {
6898 }
6899
6900 }
6901 }
6902
6904 {
6905 if (newPlayer)
6906 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6907
6908 if (newPlayer == oldPlayer)
6909 {
6910 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6911 {
6913 {
6914 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6915 {
6916 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6917 }
6918 }
6919 else
6920 {
6921 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6922 }
6923 }
6924
6925 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6926 {
6927 int type = oldLoc.GetType();
6929 {
6930 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6931 }
6933 {
6934 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6935 }
6936 }
6937 if (!m_OldLocation)
6938 {
6939 m_OldLocation = new InventoryLocation;
6940 }
6941 m_OldLocation.Copy(oldLoc);
6942 }
6943 else
6944 {
6945 if (m_OldLocation)
6946 {
6947 m_OldLocation.Reset();
6948 }
6949 }
6950
6951 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6952 }
6953 else
6954 {
6955 if (newPlayer)
6956 {
6957 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6958 if (resIndex >= 0)
6959 {
6960 InventoryLocation il = new InventoryLocation;
6961 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6963 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6966 {
6967 il.
GetParent().GetOnReleaseLock().Invoke(it);
6968 }
6970 {
6972 }
6973
6974 }
6975 }
6977 {
6978
6980 }
6981
6982 if (m_OldLocation)
6983 {
6984 m_OldLocation.Reset();
6985 }
6986 }
6987
6989 {
6990 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6991 }
6992
6994 {
6995 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6996 }
6997 }
6998
6999 override void EOnContact(IEntity other, Contact extra)
7000 {
7002 {
7003 int liquidType = -1;
7005 if (impactSpeed > 0.0)
7006 {
7008 #ifndef SERVER
7010 #else
7012 SetSynchDirty();
7013 #endif
7015 }
7016 }
7017
7018 #ifdef SERVER
7019 if (GetCompEM() && GetCompEM().IsPlugged())
7020 {
7021 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
7022 GetCompEM().UnplugThis();
7023 }
7024 #endif
7025 }
7026
7028
7030 {
7032 }
7033
7035 {
7036
7037 }
7038
7040 {
7041 super.OnItemLocationChanged(old_owner, new_owner);
7042
7043 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7044 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7045
7046 if (!relatedPlayer && playerNew)
7047 relatedPlayer = playerNew;
7048
7049 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7050 {
7052 if (actionMgr)
7053 {
7054 ActionBase currentAction = actionMgr.GetRunningAction();
7055 if (currentAction)
7057 }
7058 }
7059
7060 Man ownerPlayerOld = null;
7061 Man ownerPlayerNew = null;
7062
7063 if (old_owner)
7064 {
7065 if (old_owner.
IsMan())
7066 {
7067 ownerPlayerOld = Man.Cast(old_owner);
7068 }
7069 else
7070 {
7071 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
7072 }
7073 }
7074 else
7075 {
7077 {
7079
7080 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
7081 {
7082 GetCompEM().UnplugThis();
7083 }
7084 }
7085 }
7086
7087 if (new_owner)
7088 {
7089 if (new_owner.
IsMan())
7090 {
7091 ownerPlayerNew = Man.Cast(new_owner);
7092 }
7093 else
7094 {
7095 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
7096 }
7097 }
7098
7099 if (ownerPlayerOld != ownerPlayerNew)
7100 {
7101 if (ownerPlayerOld)
7102 {
7103 array<EntityAI> subItemsExit = new array<EntityAI>;
7105 for (int i = 0; i < subItemsExit.Count(); i++)
7106 {
7109 }
7110 }
7111
7112 if (ownerPlayerNew)
7113 {
7114 array<EntityAI> subItemsEnter = new array<EntityAI>;
7116 for (int j = 0; j < subItemsEnter.Count(); j++)
7117 {
7120 }
7121 }
7122 }
7123 else if (ownerPlayerNew != null)
7124 {
7125 PlayerBase nplayer;
7126 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
7127 {
7128 array<EntityAI> subItemsUpdate = new array<EntityAI>;
7130 for (int k = 0; k < subItemsUpdate.Count(); k++)
7131 {
7133 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7134 }
7135 }
7136 }
7137
7138 if (old_owner)
7139 old_owner.OnChildItemRemoved(this);
7140 if (new_owner)
7141 new_owner.OnChildItemReceived(this);
7142 }
7143
7144
7146 {
7147 super.EEDelete(parent);
7148 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7149 if (player)
7150 {
7152
7153 if (player.IsAlive())
7154 {
7155 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7156 if (r_index >= 0)
7157 {
7158 InventoryLocation r_il = new InventoryLocation;
7159 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7160
7161 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7164 {
7165 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7166 }
7168 {
7169 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7170 }
7171
7172 }
7173
7174 player.RemoveQuickBarEntityShortcut(this);
7175 }
7176 }
7177 }
7178
7180 {
7181 super.EEKilled(killer);
7182
7185 {
7186 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7187 {
7188 if (IsMagazine())
7189 {
7190 if (Magazine.Cast(this).GetAmmoCount() > 0)
7191 {
7193 }
7194 }
7195 else
7196 {
7198 }
7199 }
7200 }
7201 }
7202
7204 {
7205 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7206
7207 super.OnWasAttached(parent, slot_id);
7208
7211
7214 }
7215
7217 {
7218 super.OnWasDetached(parent, slot_id);
7219
7222
7225 }
7226
7228 {
7229 int idx;
7232
7233 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7234 if (inventory_slots.Count() < 1)
7235 {
7236 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7237 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7238 }
7239 else
7240 {
7241 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7242 }
7243
7244 idx = inventory_slots.Find(slot);
7245 if (idx < 0)
7246 return "";
7247
7248 return attach_types.Get(idx);
7249 }
7250
7252 {
7253 int idx = -1;
7254 string slot;
7255
7258
7259 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7260 if (inventory_slots.Count() < 1)
7261 {
7262 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7263 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7264 }
7265 else
7266 {
7267 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7268 if (detach_types.Count() < 1)
7269 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7270 }
7271
7272 for (int i = 0; i < inventory_slots.Count(); i++)
7273 {
7274 slot = inventory_slots.Get(i);
7275 }
7276
7277 if (slot != "")
7278 {
7279 if (detach_types.Count() == 1)
7280 idx = 0;
7281 else
7282 idx = inventory_slots.Find(slot);
7283 }
7284 if (idx < 0)
7285 return "";
7286
7287 return detach_types.Get(idx);
7288 }
7289
7291 {
7292
7294
7295
7296 float min_time = 1;
7297 float max_time = 3;
7298 float delay = Math.RandomFloat(min_time, max_time);
7299
7300 explode_timer.Run(delay, this, "DoAmmoExplosion");
7301 }
7302
7304 {
7305 Magazine magazine = Magazine.Cast(this);
7306 int pop_sounds_count = 6;
7307 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7308
7309
7310 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7311 string sound_name = pop_sounds[ sound_idx ];
7312 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7313
7314
7315 magazine.ServerAddAmmoCount(-1);
7316
7317
7318 float min_temp_to_explode = 100;
7319
7320 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7321 {
7323 }
7324 }
7325
7326
7327 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7328 {
7329 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7330
7331 const int CHANCE_DAMAGE_CARGO = 4;
7332 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7333 const int CHANCE_DAMAGE_NOTHING = 2;
7334
7336 {
7337 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7338 int chances;
7339 int rnd;
7340
7341 if (GetInventory().GetCargo())
7342 {
7343 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7344 rnd = Math.RandomInt(0,chances);
7345
7346 if (rnd < CHANCE_DAMAGE_CARGO)
7347 {
7349 }
7350 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7351 {
7353 }
7354 }
7355 else
7356 {
7357 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7358 rnd = Math.RandomInt(0,chances);
7359
7360 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7361 {
7363 }
7364 }
7365 }
7366 }
7367
7369 {
7370 CargoBase cargo = GetInventory().GetCargo();
7371 if (cargo)
7372 {
7374 if (item_count > 0)
7375 {
7376 int random_pick = Math.RandomInt(0, item_count);
7378 if (!item.IsExplosive())
7379 {
7380 item.AddHealth("","",damage);
7381 return true;
7382 }
7383 }
7384 }
7385 return false;
7386 }
7387
7389 {
7390 GameInventory inventory = GetInventory();
7392 if (attachment_count > 0)
7393 {
7394 int random_pick = Math.RandomInt(0, attachment_count);
7396 if (!attachment.IsExplosive())
7397 {
7398 attachment.AddHealth("","",damage);
7399 return true;
7400 }
7401 }
7402 return false;
7403 }
7404
7406 {
7408 }
7409
7411 {
7413 return GetInventory().CanRemoveEntity();
7414
7415 return false;
7416 }
7417
7419 {
7420
7422 return false;
7423
7424
7426 return false;
7427
7428
7429
7431 if (delta == 0)
7432 return false;
7433
7434
7435 return true;
7436 }
7437
7439 {
7441 {
7442 if (ScriptInputUserData.CanStoreInputUserData())
7443 {
7444 ScriptInputUserData ctx = new ScriptInputUserData;
7449 ctx.
Write(destination_entity);
7453 }
7454 }
7455 else if (!
g_Game.IsMultiplayer())
7456 {
7458 }
7459 }
7460
7462 {
7463 float split_quantity_new;
7467 InventoryLocation loc = new InventoryLocation;
7468
7469 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7470 {
7472 split_quantity_new = stack_max;
7473 else
7475
7477 {
7478 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7479 if (new_item)
7480 {
7481 new_item.SetResultOfSplit(true);
7482 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7484 new_item.
SetQuantity(split_quantity_new,
false,
true);
7485 }
7486 }
7487 }
7488 else if (destination_entity && slot_id == -1)
7489 {
7490 if (quantity > stack_max)
7491 split_quantity_new = stack_max;
7492 else
7493 split_quantity_new = quantity;
7494
7496 {
7497 GameInventory destinationInventory = destination_entity.GetInventory();
7499 {
7502 }
7503
7504 if (new_item)
7505 {
7506 new_item.SetResultOfSplit(true);
7507 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7509 new_item.
SetQuantity(split_quantity_new,
false,
true);
7510 }
7511 }
7512 }
7513 else
7514 {
7515 if (stack_max != 0)
7516 {
7518 {
7520 }
7521
7522 if (split_quantity_new == 0)
7523 {
7524 if (!
g_Game.IsMultiplayer())
7525 player.PhysicalPredictiveDropItem(this);
7526 else
7527 player.ServerDropEntity(this);
7528 return;
7529 }
7530
7532 {
7534
7535 if (new_item)
7536 {
7537 new_item.SetResultOfSplit(true);
7538 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7541 new_item.PlaceOnSurface();
7542 }
7543 }
7544 }
7545 }
7546 }
7547
7549 {
7550 float split_quantity_new;
7554 InventoryLocation loc = new InventoryLocation;
7555
7556 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7557 {
7559 split_quantity_new = stack_max;
7560 else
7562
7564 {
7565 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7566 if (new_item)
7567 {
7568 new_item.SetResultOfSplit(true);
7569 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7571 new_item.
SetQuantity(split_quantity_new,
false,
true);
7572 }
7573 }
7574 }
7575 else if (destination_entity && slot_id == -1)
7576 {
7577 if (quantity > stack_max)
7578 split_quantity_new = stack_max;
7579 else
7580 split_quantity_new = quantity;
7581
7583 {
7584 GameInventory destinationInventory = destination_entity.GetInventory();
7586 {
7589 }
7590
7591 if (new_item)
7592 {
7593 new_item.SetResultOfSplit(true);
7594 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7596 new_item.
SetQuantity(split_quantity_new,
false,
true);
7597 }
7598 }
7599 }
7600 else
7601 {
7602 if (stack_max != 0)
7603 {
7605 {
7607 }
7608
7610 {
7612
7613 if (new_item)
7614 {
7615 new_item.SetResultOfSplit(true);
7616 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7619 new_item.PlaceOnSurface();
7620 }
7621 }
7622 }
7623 }
7624 }
7625
7627 {
7629 {
7630 if (ScriptInputUserData.CanStoreInputUserData())
7631 {
7632 ScriptInputUserData ctx = new ScriptInputUserData;
7637 dst.WriteToContext(ctx);
7639 }
7640 }
7641 else if (!
g_Game.IsMultiplayer())
7642 {
7644 }
7645 }
7646
7648 {
7650 {
7651 if (ScriptInputUserData.CanStoreInputUserData())
7652 {
7653 ScriptInputUserData ctx = new ScriptInputUserData;
7658 ctx.
Write(destination_entity);
7664 }
7665 }
7666 else if (!
g_Game.IsMultiplayer())
7667 {
7669 }
7670 }
7671
7673 {
7675 }
7676
7678 {
7680 float split_quantity_new;
7682 if (dst.IsValid())
7683 {
7684 int slot_id = dst.GetSlot();
7686
7687 if (quantity > stack_max)
7688 split_quantity_new = stack_max;
7689 else
7690 split_quantity_new = quantity;
7691
7693 {
7695
7696 if (new_item)
7697 {
7698 new_item.SetResultOfSplit(true);
7699 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7701 new_item.
SetQuantity(split_quantity_new,
false,
true);
7702 }
7703
7704 return new_item;
7705 }
7706 }
7707
7708 return null;
7709 }
7710
7712 {
7714 float split_quantity_new;
7716 if (destination_entity)
7717 {
7719 if (quantity > stackable)
7720 split_quantity_new = stackable;
7721 else
7722 split_quantity_new = quantity;
7723
7725 {
7726 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7727 if (new_item)
7728 {
7729 new_item.SetResultOfSplit(true);
7730 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7732 new_item.
SetQuantity(split_quantity_new,
false,
true);
7733 }
7734 }
7735 }
7736 }
7737
7739 {
7741 {
7742 if (ScriptInputUserData.CanStoreInputUserData())
7743 {
7744 ScriptInputUserData ctx = new ScriptInputUserData;
7749 ItemBase destination_entity =
this;
7750 ctx.
Write(destination_entity);
7754 }
7755 }
7756 else if (!
g_Game.IsMultiplayer())
7757 {
7759 }
7760 }
7761
7763 {
7765 float split_quantity_new;
7767 if (player)
7768 {
7770 if (quantity > stackable)
7771 split_quantity_new = stackable;
7772 else
7773 split_quantity_new = quantity;
7774
7776 {
7777 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7778 new_item =
ItemBase.Cast(in_hands);
7779 if (new_item)
7780 {
7781 new_item.SetResultOfSplit(true);
7782 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7784 new_item.SetQuantity(split_quantity_new, false, true);
7785 }
7786 }
7787 }
7788 }
7789
7791 {
7793 float split_quantity_new = Math.Floor(quantity * 0.5);
7794
7796 return;
7797
7799
7800 if (new_item)
7801 {
7802 if (new_item.GetQuantityMax() < split_quantity_new)
7803 {
7804 split_quantity_new = new_item.GetQuantityMax();
7805 }
7806
7807 new_item.SetResultOfSplit(true);
7808 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7809
7811 {
7814 }
7815 else
7816 {
7818 new_item.
SetQuantity(split_quantity_new,
false,
true);
7819 }
7820 }
7821 }
7822
7824 {
7826 float split_quantity_new = Math.Floor(quantity / 2);
7827
7829 return;
7830
7831 InventoryLocation invloc = new InventoryLocation;
7833
7835 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7836
7837 if (new_item)
7838 {
7839 if (new_item.GetQuantityMax() < split_quantity_new)
7840 {
7841 split_quantity_new = new_item.GetQuantityMax();
7842 }
7844 {
7847 }
7848 else if (split_quantity_new > 1)
7849 {
7851 new_item.
SetQuantity(split_quantity_new,
false,
true);
7852 }
7853 }
7854 }
7855
7858 {
7859 SetWeightDirty();
7861
7862 if (parent)
7863 parent.OnAttachmentQuantityChangedEx(this, delta);
7864
7866 {
7868 {
7870 }
7872 {
7873 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7875 }
7876 }
7877 }
7878
7881 {
7882
7883 }
7884
7887 {
7889 }
7890
7892 {
7893 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7894
7896 {
7897 if (newLevel == GameConstants.STATE_RUINED)
7898 {
7900 EntityAI parent = GetHierarchyParent();
7901 if (parent && parent.IsFireplace())
7902 {
7903 CargoBase cargo = GetInventory().GetCargo();
7904 if (cargo)
7905 {
7907 {
7909 }
7910 }
7911 }
7912 }
7913
7915 {
7916
7918 return;
7919 }
7920
7921 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7922 {
7924 }
7925 }
7926 }
7927
7928
7930 {
7931 super.OnRightClick();
7932
7934 {
7936 {
7937 if (ScriptInputUserData.CanStoreInputUserData())
7938 {
7939 EntityAI root = GetHierarchyRoot();
7940 Man playerOwner = GetHierarchyRootPlayer();
7941 InventoryLocation dst = new InventoryLocation;
7942
7943
7944 if (!playerOwner && root && root == this)
7945 {
7947 }
7948 else
7949 {
7950
7951 GetInventory().GetCurrentInventoryLocation(dst);
7953 {
7954 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7956 {
7958 }
7959 else
7960 {
7962
7963
7964 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7965 {
7967 }
7968 else
7969 {
7970 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7971 }
7972 }
7973 }
7974 }
7975
7976 ScriptInputUserData ctx = new ScriptInputUserData;
7984 }
7985 }
7986 else if (!
g_Game.IsMultiplayer())
7987 {
7989 }
7990 }
7991 }
7992
7994 {
7995 if (root)
7996 {
7997 vector m4[4];
7998 root.GetTransform(m4);
7999 dst.SetGround(this, m4);
8000 }
8001 else
8002 {
8003 GetInventory().GetCurrentInventoryLocation(dst);
8004 }
8005 }
8006
8007 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
8008 {
8009
8010 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
8011 return false;
8012
8013 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8014 return false;
8015
8016
8018 return false;
8019
8020
8021 Magazine mag = Magazine.Cast(this);
8022 if (mag)
8023 {
8024 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8025 return false;
8026
8027 if (stack_max_limit)
8028 {
8029 Magazine other_mag = Magazine.Cast(other_item);
8030 if (other_item)
8031 {
8032 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8033 return false;
8034 }
8035
8036 }
8037 }
8038 else
8039 {
8040
8042 return false;
8043
8045 return false;
8046 }
8047
8048 PlayerBase player = null;
8049 if (CastTo(player, GetHierarchyRootPlayer()))
8050 {
8051 if (player.GetInventory().HasAttachment(this))
8052 return false;
8053
8054 if (player.IsItemsToDelete())
8055 return false;
8056 }
8057
8058 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8059 return false;
8060
8061 int slotID;
8063 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8064 return false;
8065
8066 return true;
8067 }
8068
8070 {
8072 }
8073
8075 {
8076 return m_IsResultOfSplit;
8077 }
8078
8080 {
8081 m_IsResultOfSplit = value;
8082 }
8083
8085 {
8087 }
8088
8090 {
8091 float other_item_quantity = other_item.GetQuantity();
8092 float this_free_space;
8093
8095
8097
8098 if (other_item_quantity > this_free_space)
8099 {
8100 return this_free_space;
8101 }
8102 else
8103 {
8104 return other_item_quantity;
8105 }
8106 }
8107
8109 {
8111 }
8112
8114 {
8116 return;
8117
8118 if (!IsMagazine() && other_item)
8119 {
8121 if (quantity_used != 0)
8122 {
8123 float hp1 = GetHealth01("","");
8124 float hp2 = other_item.GetHealth01("","");
8125 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
8126 hpResult = hpResult / (
GetQuantity() + quantity_used);
8127
8128 hpResult *= GetMaxHealth();
8129 Math.Round(hpResult);
8130 SetHealth("", "Health", hpResult);
8131
8133 other_item.AddQuantity(-quantity_used);
8134 }
8135 }
8137 }
8138
8140 {
8141 #ifdef SERVER
8142 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8143 GetHierarchyParent().IncreaseLifetimeUp();
8144 #endif
8145 };
8146
8148 {
8149 PlayerBase p = PlayerBase.Cast(player);
8150
8151 array<int> recipesIds = p.m_Recipes;
8152 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8153 if (moduleRecipesManager)
8154 {
8155 EntityAI itemInHands = player.GetEntityInHands();
8156 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8157 }
8158
8159 for (int i = 0;i < recipesIds.Count(); i++)
8160 {
8161 int key = recipesIds.Get(i);
8162 string recipeName = moduleRecipesManager.GetRecipeName(key);
8164 }
8165 }
8166
8167
8168 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8169 {
8170 super.GetDebugActions(outputList);
8171
8172
8178
8179
8184
8189
8190
8194
8195
8197 {
8201 }
8202
8205
8206
8210
8212
8213 InventoryLocation loc = new InventoryLocation();
8214 GetInventory().GetCurrentInventoryLocation(loc);
8216 {
8217 if (Gizmo_IsSupported())
8220 }
8221
8223 }
8224
8225
8226
8227
8229 {
8230 super.OnAction(action_id, player, ctx);
8231
8233 {
8234 switch (action_id)
8235 {
8239 return true;
8243 return true;
8244 }
8245 }
8246
8248 {
8249 switch (action_id)
8250 {
8252 Delete();
8253 return true;
8254 }
8255 }
8256
8257 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8258 {
8259 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8260 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8261 PlayerBase p = PlayerBase.Cast(player);
8262 if (
EActions.RECIPES_RANGE_START < 1000)
8263 {
8264 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8265 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8266 }
8267 }
8268 #ifndef SERVER
8269 else if (action_id ==
EActions.WATCH_PLAYER)
8270 {
8271 PluginDeveloper.SetDeveloperItemClientEx(player);
8272 }
8273 #endif
8275 {
8276 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8277 {
8278 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8279 OnDebugButtonPressServer(id + 1);
8280 }
8281
8282 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8283 {
8284 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8286 }
8287
8288 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8289 {
8290 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8292 }
8293
8294 else if (action_id ==
EActions.ADD_QUANTITY)
8295 {
8296 if (IsMagazine())
8297 {
8298 Magazine mag = Magazine.Cast(this);
8299 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8300 }
8301 else
8302 {
8304 }
8305
8306 if (m_EM)
8307 {
8308 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8309 }
8310
8311 }
8312
8313 else if (action_id ==
EActions.REMOVE_QUANTITY)
8314 {
8315 if (IsMagazine())
8316 {
8317 Magazine mag2 = Magazine.Cast(this);
8318 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8319 }
8320 else
8321 {
8323 }
8324 if (m_EM)
8325 {
8326 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8327 }
8328
8329 }
8330
8331 else if (action_id ==
EActions.SET_QUANTITY_0)
8332 {
8334
8335 if (m_EM)
8336 {
8337 m_EM.SetEnergy(0);
8338 }
8339 }
8340
8341 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8342 {
8344
8345 if (m_EM)
8346 {
8347 m_EM.SetEnergy(m_EM.GetEnergyMax());
8348 }
8349 }
8350
8351 else if (action_id ==
EActions.ADD_HEALTH)
8352 {
8353 AddHealth("","",GetMaxHealth("","Health")/5);
8354 }
8355 else if (action_id ==
EActions.REMOVE_HEALTH)
8356 {
8357 AddHealth("","",-GetMaxHealth("","Health")/5);
8358 }
8359 else if (action_id ==
EActions.DESTROY_HEALTH)
8360 {
8361 SetHealth01("","",0);
8362 }
8363 else if (action_id ==
EActions.WATCH_ITEM)
8364 {
8366 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8367 #ifdef DEVELOPER
8368 SetDebugDeveloper_item(this);
8369 #endif
8370 }
8371
8372 else if (action_id ==
EActions.ADD_TEMPERATURE)
8373 {
8374 AddTemperature(20);
8375
8376 }
8377
8378 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8379 {
8380 AddTemperature(-20);
8381
8382 }
8383
8384 else if (action_id ==
EActions.FLIP_FROZEN)
8385 {
8386 SetFrozen(!GetIsFrozen());
8387
8388 }
8389
8390 else if (action_id ==
EActions.ADD_WETNESS)
8391 {
8393
8394 }
8395
8396 else if (action_id ==
EActions.REMOVE_WETNESS)
8397 {
8399
8400 }
8401
8402 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8403 {
8406
8407
8408 }
8409
8410 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8411 {
8414 }
8415
8416 else if (action_id ==
EActions.MAKE_SPECIAL)
8417 {
8418 auto debugParams = DebugSpawnParams.WithPlayer(player);
8419 OnDebugSpawnEx(debugParams);
8420 }
8421
8422 }
8423
8424
8425 return false;
8426 }
8427
8428
8429
8430
8434
8437
8438
8439
8441 {
8442 return false;
8443 }
8444
8445
8447 {
8448 return true;
8449 }
8450
8451
8453 {
8454 return true;
8455 }
8456
8457
8458
8460 {
8461 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8462 return g_Game.ConfigIsExisting(config_path);
8463 }
8464
8467 {
8468 return null;
8469 }
8470
8472 {
8473 return false;
8474 }
8475
8477 {
8478 return false;
8479 }
8480
8484
8485
8487 {
8488 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8489 return module_repairing.CanRepair(this, item_repair_kit);
8490 }
8491
8492
8493 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8494 {
8495 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8496 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8497 }
8498
8499
8501 {
8502
8503
8504
8505
8506
8507
8508
8509
8510 return 1;
8511 }
8512
8513
8514
8516 {
8518 }
8519
8520
8521
8523 {
8525 }
8526
8527
8536 {
8537 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8538
8539 if (player)
8540 {
8541 player.MessageStatus(text);
8542 }
8543 }
8544
8545
8554 {
8555 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8556
8557 if (player)
8558 {
8559 player.MessageAction(text);
8560 }
8561 }
8562
8563
8572 {
8573 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8574
8575 if (player)
8576 {
8577 player.MessageFriendly(text);
8578 }
8579 }
8580
8581
8590 {
8591 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8592
8593 if (player)
8594 {
8595 player.MessageImportant(text);
8596 }
8597 }
8598
8600 {
8601 return true;
8602 }
8603
8604
8605 override bool KindOf(
string tag)
8606 {
8607 bool found = false;
8608 string item_name = this.
GetType();
8610 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8611
8612 int array_size = item_tag_array.Count();
8613 for (int i = 0; i < array_size; i++)
8614 {
8615 if (item_tag_array.Get(i) == tag)
8616 {
8617 found = true;
8618 break;
8619 }
8620 }
8621 return found;
8622 }
8623
8624
8626 {
8627
8628 super.OnRPC(sender, rpc_type,ctx);
8629
8630
8631 switch (rpc_type)
8632 {
8633 #ifndef SERVER
8634 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8635 Param2<bool, string> p = new Param2<bool, string>(false, "");
8636
8638 return;
8639
8640 bool play = p.param1;
8641 string soundSet = p.param2;
8642
8643 if (play)
8644 {
8646 {
8648 {
8650 }
8651 }
8652 else
8653 {
8655 }
8656 }
8657 else
8658 {
8660 }
8661
8662 break;
8663 #endif
8664
8665 }
8666
8668 {
8670 }
8671 }
8672
8673
8674
8675
8677 {
8678 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8679 return plugin.GetID(
name);
8680 }
8681
8683 {
8684 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8685 return plugin.GetName(id);
8686 }
8687
8690 {
8691
8692
8693 int varFlags;
8694 if (!ctx.
Read(varFlags))
8695 return;
8696
8697 if (varFlags & ItemVariableFlags.FLOAT)
8698 {
8700 }
8701 }
8702
8704 {
8705
8706 super.SerializeNumericalVars(floats_out);
8707
8708
8709
8711 {
8713 }
8714
8716 {
8718 }
8719
8721 {
8723 }
8724
8726 {
8731 }
8732
8734 {
8736 }
8737 }
8738
8740 {
8741
8742 super.DeSerializeNumericalVars(floats);
8743
8744
8745 int index = 0;
8746 int mask = Math.Round(floats.Get(index));
8747
8748 index++;
8749
8751 {
8753 {
8755 }
8756 else
8757 {
8758 float quantity = floats.Get(index);
8760 }
8761 index++;
8762 }
8763
8765 {
8766 float wet = floats.Get(index);
8768 index++;
8769 }
8770
8772 {
8773 int liquidtype = Math.Round(floats.Get(index));
8775 index++;
8776 }
8777
8779 {
8781 index++;
8783 index++;
8785 index++;
8787 index++;
8788 }
8789
8791 {
8792 int cleanness = Math.Round(floats.Get(index));
8794 index++;
8795 }
8796 }
8797
8799 {
8800 super.WriteVarsToCTX(ctx);
8801
8802
8804 {
8806 }
8807
8809 {
8811 }
8812
8814 {
8816 }
8817
8819 {
8820 int r,g,b,a;
8826 }
8827
8829 {
8831 }
8832 }
8833
8835 {
8836 if (!super.ReadVarsFromCTX(ctx,version))
8837 return false;
8838
8839 int intValue;
8840 float value;
8841
8842 if (version < 140)
8843 {
8844 if (!ctx.
Read(intValue))
8845 return false;
8846
8847 m_VariablesMask = intValue;
8848 }
8849
8851 {
8852 if (!ctx.
Read(value))
8853 return false;
8854
8856 {
8858 }
8859 else
8860 {
8862 }
8863 }
8864
8865 if (version < 140)
8866 {
8868 {
8869 if (!ctx.
Read(value))
8870 return false;
8871 SetTemperatureDirect(value);
8872 }
8873 }
8874
8876 {
8877 if (!ctx.
Read(value))
8878 return false;
8880 }
8881
8883 {
8884 if (!ctx.
Read(intValue))
8885 return false;
8887 }
8888
8890 {
8891 int r,g,b,a;
8893 return false;
8895 return false;
8897 return false;
8899 return false;
8900
8902 }
8903
8905 {
8906 if (!ctx.
Read(intValue))
8907 return false;
8909 }
8910
8911 if (version >= 138 && version < 140)
8912 {
8914 {
8915 if (!ctx.
Read(intValue))
8916 return false;
8917 SetFrozen(intValue);
8918 }
8919 }
8920
8921 return true;
8922 }
8923
8924
8926 {
8929 {
8931 }
8932
8933 if (!super.OnStoreLoad(ctx, version))
8934 {
8936 return false;
8937 }
8938
8939 if (version >= 114)
8940 {
8941 bool hasQuickBarIndexSaved;
8942
8943 if (!ctx.
Read(hasQuickBarIndexSaved))
8944 {
8946 return false;
8947 }
8948
8949 if (hasQuickBarIndexSaved)
8950 {
8951 int itmQBIndex;
8952
8953
8954 if (!ctx.
Read(itmQBIndex))
8955 {
8957 return false;
8958 }
8959
8960 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8961 if (itmQBIndex != -1 && parentPlayer)
8962 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8963 }
8964 }
8965 else
8966 {
8967
8968 PlayerBase player;
8969 int itemQBIndex;
8970 if (version ==
int.
MAX)
8971 {
8972 if (!ctx.
Read(itemQBIndex))
8973 {
8975 return false;
8976 }
8977 }
8978 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8979 {
8980
8981 if (!ctx.
Read(itemQBIndex))
8982 {
8984 return false;
8985 }
8986 if (itemQBIndex != -1 && player)
8987 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8988 }
8989 }
8990
8991 if (version < 140)
8992 {
8993
8994 if (!LoadVariables(ctx, version))
8995 {
8997 return false;
8998 }
8999 }
9000
9001
9003 {
9005 return false;
9006 }
9007 if (version >= 132)
9008 {
9010 if (raib)
9011 {
9013 {
9015 return false;
9016 }
9017 }
9018 }
9019
9021 return true;
9022 }
9023
9024
9025
9027 {
9028 super.OnStoreSave(ctx);
9029
9030 PlayerBase player;
9031 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9032 {
9034
9035 int itemQBIndex = -1;
9036 itemQBIndex = player.FindQuickBarEntityIndex(this);
9037 ctx.
Write(itemQBIndex);
9038 }
9039 else
9040 {
9042 }
9043
9045
9047 if (raib)
9048 {
9050 }
9051 }
9052
9053
9055 {
9056 super.AfterStoreLoad();
9057
9059 {
9061 }
9062
9064 {
9067 }
9068 }
9069
9071 {
9072 super.EEOnAfterLoad();
9073
9075 {
9077 }
9078
9081 }
9082
9084 {
9085 return false;
9086 }
9087
9088
9089
9091 {
9093 {
9094 #ifdef PLATFORM_CONSOLE
9095
9097 {
9099 if (menu)
9100 {
9102 }
9103 }
9104 #endif
9105 }
9106
9108 {
9111 }
9112
9114 {
9115 SetWeightDirty();
9117 }
9119 {
9122 }
9123
9125 {
9128
9131 }
9133 {
9137 }
9138
9139 super.OnVariablesSynchronized();
9140 }
9141
9142
9143
9145 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9146 {
9147 if (!IsServerCheck(allow_client))
9148 return false;
9149
9151 return false;
9152
9155
9156 if (value <= (min + 0.001))
9157 value = min;
9158
9159 if (value == min)
9160 {
9161 if (destroy_config)
9162 {
9163 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9164 if (dstr)
9165 {
9167 this.Delete();
9168 return true;
9169 }
9170 }
9171 else if (destroy_forced)
9172 {
9174 this.Delete();
9175 return true;
9176 }
9177
9179 }
9180
9183
9185 {
9186 EntityAI parent = GetHierarchyRoot();
9187 InventoryLocation iLoc = new InventoryLocation();
9188 GetInventory().GetCurrentInventoryLocation(iLoc);
9190 {
9191 int iLocSlot = iLoc.
GetSlot();
9193 {
9195 }
9197 {
9199 }
9200 }
9201 }
9202
9204 {
9206
9207 if (delta)
9209 }
9210
9212
9213 return false;
9214 }
9215
9216
9218 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9219 {
9221 }
9222
9224 {
9227 }
9228
9230 {
9233 }
9234
9236 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9237 {
9238 float value_clamped = Math.Clamp(value, 0, 1);
9240 SetQuantity(result, destroy_config, destroy_forced);
9241 }
9242
9243
9246 {
9248 }
9249
9251 {
9253 }
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9265 {
9266 int slot = -1;
9267 GameInventory inventory = GetInventory();
9268 if (inventory)
9269 {
9270 InventoryLocation il = new InventoryLocation;
9273 }
9274
9276 }
9277
9279 {
9280 float quantity_max = 0;
9281
9283 {
9284 if (attSlotID != -1)
9285 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9286
9287 if (quantity_max <= 0)
9289 }
9290
9291 if (quantity_max <= 0)
9293
9294 return quantity_max;
9295 }
9296
9298 {
9300 }
9301
9303 {
9305 }
9306
9307
9309 {
9311 }
9312
9314 {
9316 }
9317
9319 {
9321 }
9322
9323
9325 {
9326
9327 float weightEx = GetWeightEx();
9328 float special = GetInventoryAndCargoWeight();
9329 return weightEx - special;
9330 }
9331
9332
9334 {
9336 }
9337
9339 {
9341 {
9342 #ifdef DEVELOPER
9343 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9344 {
9345 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9347 }
9348 #endif
9349
9351 }
9352 else if (HasEnergyManager())
9353 {
9354 #ifdef DEVELOPER
9355 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9356 {
9357 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9358 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9359 }
9360 #endif
9361 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9362 }
9363 else
9364 {
9365 #ifdef DEVELOPER
9366 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9367 {
9368 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9369 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9370 }
9371 #endif
9372 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9373 }
9374 }
9375
9378 {
9379 int item_count = 0;
9381
9382 GameInventory inventory = GetInventory();
9383 CargoBase cargo = inventory.
GetCargo();
9384 if (cargo != NULL)
9385 {
9387 }
9388
9390 for (int i = 0; i < nAttachments; ++i)
9391 {
9393 if (item)
9394 item_count += item.GetNumberOfItems();
9395 }
9396 return item_count;
9397 }
9398
9401 {
9402 float weight = 0;
9403 float wetness = 1;
9404 if (include_wetness)
9407 {
9408 weight = wetness * m_ConfigWeight;
9409 }
9411 {
9412 weight = 1;
9413 }
9414 return weight;
9415 }
9416
9417
9418
9420 {
9421 GameInventory inventory = GetInventory();
9422 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9423 {
9424 array<EntityAI> items = new array<EntityAI>;
9426 for (int i = 0; i < items.Count(); ++i)
9427 {
9429 if (item)
9430 {
9431 g_Game.ObjectDelete(item);
9432 }
9433 }
9434 }
9435 }
9436
9437
9438
9439
9441 {
9442 float energy = 0;
9443 if (HasEnergyManager())
9444 {
9445 energy = GetCompEM().GetEnergy();
9446 }
9447 return energy;
9448 }
9449
9450
9452 {
9453 super.OnEnergyConsumed();
9454
9456 }
9457
9459 {
9460 super.OnEnergyAdded();
9461
9463 }
9464
9465
9467 {
9468 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9469 {
9471 {
9472 float energy_0to1 = GetCompEM().GetEnergy0To1();
9474 }
9475 }
9476 }
9477
9478
9480 {
9481 return ConfigGetFloat("heatIsolation");
9482 }
9483
9485 {
9487 }
9488
9490 {
9491 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9492 if (
g_Game.ConfigIsExisting(paramPath))
9493 return g_Game.ConfigGetFloat(paramPath);
9494
9495 return 0.0;
9496 }
9497
9499 {
9500 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9501 if (
g_Game.ConfigIsExisting(paramPath))
9502 return g_Game.ConfigGetFloat(paramPath);
9503
9504 return 0.0;
9505 }
9506
9507 override void SetWet(
float value,
bool allow_client =
false)
9508 {
9509 if (!IsServerCheck(allow_client))
9510 return;
9511
9514
9516
9517 m_VarWet = Math.Clamp(value, min, max);
9518
9520 {
9523 }
9524 }
9525
9526 override void AddWet(
float value)
9527 {
9529 }
9530
9532 {
9534 }
9535
9537 {
9539 }
9540
9542 {
9544 }
9545
9547 {
9549 }
9550
9552 {
9554 }
9555
9557 {
9560 if (newLevel != oldLevel)
9561 {
9563 }
9564 }
9565
9567 {
9568 SetWeightDirty();
9569 }
9570
9572 {
9573 return GetWetLevelInternal(
m_VarWet);
9574 }
9575
9576
9577
9579 {
9581 }
9582
9584 {
9586 }
9587
9589 {
9591 }
9592
9594 {
9596 }
9597
9598
9599
9601 {
9602 if (ConfigIsExisting("itemModelLength"))
9603 {
9604 return ConfigGetFloat("itemModelLength");
9605 }
9606 return 0;
9607 }
9608
9610 {
9611 if (ConfigIsExisting("itemAttachOffset"))
9612 {
9613 return ConfigGetFloat("itemAttachOffset");
9614 }
9615 return 0;
9616 }
9617
9618 override void SetCleanness(
int value,
bool allow_client =
false)
9619 {
9620 if (!IsServerCheck(allow_client))
9621 return;
9622
9624
9626
9629 }
9630
9632 {
9634 }
9635
9637 {
9638 return true;
9639 }
9640
9641
9642
9643
9645 {
9647 }
9648
9650 {
9652 }
9653
9654
9655
9656
9657 override void SetColor(
int r,
int g,
int b,
int a)
9658 {
9664 }
9666 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9667 {
9672 }
9673
9675 {
9677 }
9678
9681 {
9682 int r,g,b,a;
9684 r = r/255;
9685 g = g/255;
9686 b = b/255;
9687 a = a/255;
9688 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9689 }
9690
9691
9692
9693 override void SetLiquidType(
int value,
bool allow_client =
false)
9694 {
9695 if (!IsServerCheck(allow_client))
9696 return;
9697
9702 }
9703
9705 {
9706 return ConfigGetInt("varLiquidTypeInit");
9707 }
9708
9710 {
9712 }
9713
9715 {
9717 SetFrozen(false);
9718 }
9719
9722 {
9723 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9724 }
9725
9726
9729 {
9730 PlayerBase nplayer;
9731 if (PlayerBase.CastTo(nplayer, player))
9732 {
9734 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9735 }
9736 }
9737
9738
9741 {
9742 PlayerBase nplayer;
9743 if (PlayerBase.CastTo(nplayer,player))
9744 {
9745 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9746 }
9747
9748 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9749
9750 if (HasEnergyManager())
9751 {
9752 GetCompEM().UpdatePlugState();
9753 }
9754 }
9755
9756
9758 {
9759 super.OnPlacementStarted(player);
9760
9762 }
9763
9764 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9765 {
9767 {
9768 m_AdminLog.OnPlacementComplete(player,
this);
9769 }
9770
9771 super.OnPlacementComplete(player, position, orientation);
9772 }
9773
9774
9775
9776
9777
9779 {
9781 {
9782 return true;
9783 }
9784 else
9785 {
9786 return false;
9787 }
9788 }
9789
9790
9792 {
9794 {
9796 }
9797 }
9798
9799
9801 {
9803 }
9804
9806 {
9808 }
9809
9810 override void InsertAgent(
int agent,
float count = 1)
9811 {
9812 if (count < 1)
9813 return;
9814
9816 }
9817
9820 {
9822 }
9823
9824
9826 {
9828 }
9829
9830
9831
9832
9833
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9872 {
9874 return false;
9875 return true;
9876 }
9877
9879 {
9880
9882 }
9883
9884
9887 {
9888 super.CheckForRoofLimited(timeTresholdMS);
9889
9890 float time =
g_Game.GetTime();
9891 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9892 {
9893 m_PreviousRoofTestTime = time;
9894 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9895 }
9896 }
9897
9898
9900 {
9902 {
9903 return 0;
9904 }
9905
9906 if (GetInventory().GetAttachmentSlotsCount() != 0)
9907 {
9908 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9909 if (filter)
9910 return filter.GetProtectionLevel(type, false, system);
9911 else
9912 return 0;
9913 }
9914
9915 string subclassPath, entryName;
9916
9917 switch (type)
9918 {
9920 entryName = "biological";
9921 break;
9923 entryName = "chemical";
9924 break;
9925 default:
9926 entryName = "biological";
9927 break;
9928 }
9929
9930 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9931
9932 return g_Game.ConfigGetFloat(subclassPath + entryName);
9933 }
9934
9935
9936
9939 {
9940 if (!IsMagazine())
9942
9944 }
9945
9946
9947
9948
9949
9954 {
9955 return true;
9956 }
9957
9959 {
9961 }
9962
9963
9964
9965
9966
9968 {
9969 if (parent)
9970 {
9971 if (parent.IsInherited(DayZInfected))
9972 return true;
9973
9974 if (!parent.IsRuined())
9975 return true;
9976 }
9977
9978 return true;
9979 }
9980
9982 {
9983 if (!super.CanPutAsAttachment(parent))
9984 {
9985 return false;
9986 }
9987
9988 if (!IsRuined() && !parent.IsRuined())
9989 {
9990 return true;
9991 }
9992
9993 return false;
9994 }
9995
9997 {
9998
9999
10000
10001
10002 return super.CanReceiveItemIntoCargo(item);
10003 }
10004
10006 {
10007
10008
10009
10010
10011 GameInventory attachmentInv = attachment.GetInventory();
10013 {
10014 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10015 return false;
10016 }
10017
10018 InventoryLocation loc = new InventoryLocation();
10019 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10020 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
10021 return false;
10022
10023 return super.CanReceiveAttachment(attachment, slotId);
10024 }
10025
10027 {
10028 if (!super.CanReleaseAttachment(attachment))
10029 return false;
10030
10031 return GetInventory().AreChildrenAccessible();
10032 }
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10055 {
10056 int id = muzzle_owner.GetMuzzleID();
10057 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
10058
10059 if (WPOF_array)
10060 {
10061 for (int i = 0; i < WPOF_array.Count(); i++)
10062 {
10063 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10064
10065 if (WPOF)
10066 {
10067 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10068 }
10069 }
10070 }
10071 }
10072
10073
10075 {
10076 int id = muzzle_owner.GetMuzzleID();
10078
10079 if (WPOBE_array)
10080 {
10081 for (int i = 0; i < WPOBE_array.Count(); i++)
10082 {
10083 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10084
10085 if (WPOBE)
10086 {
10087 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10088 }
10089 }
10090 }
10091 }
10092
10093
10095 {
10096 int id = muzzle_owner.GetMuzzleID();
10097 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10098
10099 if (WPOOH_array)
10100 {
10101 for (int i = 0; i < WPOOH_array.Count(); i++)
10102 {
10103 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10104
10105 if (WPOOH)
10106 {
10107 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10108 }
10109 }
10110 }
10111 }
10112
10113
10115 {
10116 int id = muzzle_owner.GetMuzzleID();
10117 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10118
10119 if (WPOOH_array)
10120 {
10121 for (int i = 0; i < WPOOH_array.Count(); i++)
10122 {
10123 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10124
10125 if (WPOOH)
10126 {
10127 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10128 }
10129 }
10130 }
10131 }
10132
10133
10135 {
10136 int id = muzzle_owner.GetMuzzleID();
10137 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10138
10139 if (WPOOH_array)
10140 {
10141 for (int i = 0; i < WPOOH_array.Count(); i++)
10142 {
10143 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10144
10145 if (WPOOH)
10146 {
10147 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10148 }
10149 }
10150 }
10151 }
10152
10153
10154
10156 {
10158 {
10159 return true;
10160 }
10161
10162 return false;
10163 }
10164
10166 {
10168 {
10169 return true;
10170 }
10171
10172 return false;
10173 }
10174
10176 {
10178 {
10179 return true;
10180 }
10181
10182 return false;
10183 }
10184
10186 {
10187 return false;
10188 }
10189
10192 {
10193 return UATimeSpent.DEFAULT_DEPLOY;
10194 }
10195
10196
10197
10198
10200 {
10202 SetSynchDirty();
10203 }
10204
10206 {
10208 }
10209
10210
10212 {
10213 return false;
10214 }
10215
10218 {
10219 string att_type = "None";
10220
10221 if (ConfigIsExisting("soundAttType"))
10222 {
10223 att_type = ConfigGetString("soundAttType");
10224 }
10225
10227 }
10228
10230 {
10232 }
10233
10234
10235
10236
10237
10243
10245 {
10248
10250 }
10251
10252
10254 {
10256 return;
10257
10259
10262
10265
10266 SoundParameters params = new SoundParameters();
10270 }
10271
10272
10274 {
10276 {
10279
10280 SetSynchDirty();
10281
10284 }
10285 }
10286
10288 {
10290 }
10291
10292
10294 {
10296 return;
10297
10299 SetSynchDirty();
10300
10303 }
10304
10306 {
10309 }
10310
10312 {
10314 }
10315
10316 void OnApply(PlayerBase player);
10317
10319 {
10320 return 1.0;
10321 };
10322
10324 {
10326 }
10327
10329 {
10331 }
10332
10334
10336 {
10337 SetDynamicPhysicsLifeTime(0.01);
10339 }
10340
10342 {
10343 array<string> zone_names = new array<string>;
10344 GetDamageZones(zone_names);
10345 for (int i = 0; i < zone_names.Count(); i++)
10346 {
10347 SetHealthMax(zone_names.Get(i),"Health");
10348 }
10349 SetHealthMax("","Health");
10350 }
10351
10354 {
10355 float global_health = GetHealth01("","Health");
10356 array<string> zones = new array<string>;
10357 GetDamageZones(zones);
10358
10359 for (int i = 0; i < zones.Count(); i++)
10360 {
10361 SetHealth01(zones.Get(i),"Health",global_health);
10362 }
10363 }
10364
10367 {
10368 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10369 }
10370
10372 {
10373 if (!hasRootAsPlayer)
10374 {
10375 if (refParentIB)
10376 {
10377
10378 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10379 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10380
10381 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10382 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10383
10386 }
10387 else
10388 {
10389
10392 }
10393 }
10394 }
10395
10397 {
10399 {
10400 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10401 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10402 {
10403 float heatPermCoef = 1.0;
10405 while (ent)
10406 {
10407 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10408 ent = ent.GetHierarchyParent();
10409 }
10410
10411 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10412 }
10413 }
10414 }
10415
10417 {
10418
10419 EntityAI parent = GetHierarchyParent();
10420 if (!parent)
10421 {
10422 hasParent = false;
10423 hasRootAsPlayer = false;
10424 }
10425 else
10426 {
10427 hasParent = true;
10428 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10429 refParentIB =
ItemBase.Cast(parent);
10430 }
10431 }
10432
10433 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10434 {
10435
10436 }
10437
10439 {
10440
10441 return false;
10442 }
10443
10445 {
10446
10447
10448 return false;
10449 }
10450
10452 {
10453
10454 return false;
10455 }
10456
10459 {
10460 return !GetIsFrozen() &&
IsOpen();
10461 }
10462
10464 {
10465 bool hasParent = false, hasRootAsPlayer = false;
10467
10468 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10469 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10470
10471 if (wwtu || foodDecay)
10472 {
10476
10477 if (processWetness || processTemperature || processDecay)
10478 {
10480
10481 if (processWetness)
10482 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10483
10484 if (processTemperature)
10486
10487 if (processDecay)
10488 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10489 }
10490 }
10491 }
10492
10495 {
10497 }
10498
10500 {
10503
10504 return super.GetTemperatureFreezeThreshold();
10505 }
10506
10508 {
10511
10512 return super.GetTemperatureThawThreshold();
10513 }
10514
10516 {
10519
10520 return super.GetItemOverheatThreshold();
10521 }
10522
10524 {
10526 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10527
10528 return super.GetTemperatureFreezeTime();
10529 }
10530
10532 {
10534 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10535
10536 return super.GetTemperatureThawTime();
10537 }
10538
10543
10545 {
10546 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10547 }
10548
10550 {
10551 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10552 }
10553
10556 {
10558 }
10559
10561 {
10563 }
10564
10566 {
10568 }
10569
10572 {
10573 return null;
10574 }
10575
10578 {
10579 return false;
10580 }
10581
10583 {
10585 {
10588 if (!trg)
10589 {
10591 explosive = this;
10592 }
10593
10594 explosive.PairRemote(trg);
10596
10597 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10598 trg.SetPersistentPairID(persistentID);
10599 explosive.SetPersistentPairID(persistentID);
10600
10601 return true;
10602 }
10603 return false;
10604 }
10605
10608 {
10609 float ret = 1.0;
10612 ret *= GetHealth01();
10613
10614 return ret;
10615 }
10616
10617 #ifdef DEVELOPER
10618 override void SetDebugItem()
10619 {
10620 super.SetDebugItem();
10621 _itemBase = this;
10622 }
10623
10625 {
10626 string text = super.GetDebugText();
10627
10629 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10630
10631 return text;
10632 }
10633 #endif
10634
10636 {
10637 return true;
10638 }
10639
10641
10643
10645 {
10648 }
10649
10650
10658
10674
10675 [
Obsolete(
"Use ItemSoundHandler instead")]
10678 {
10679 if (!
g_Game.IsDedicatedServer())
10680 {
10681 if (ConfigIsExisting("attachSoundSet"))
10682 {
10683 string cfg_path = "";
10684 string soundset = "";
10685 string type_name =
GetType();
10686
10689 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10690 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10691
10692 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10693 {
10694 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10695 {
10696 if (cfg_slot_array[i] == slot_type)
10697 {
10698 soundset = cfg_soundset_array[i];
10699 break;
10700 }
10701 }
10702 }
10703
10704 if (soundset != "")
10705 {
10706 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10708 }
10709 }
10710 }
10711 }
10712
10714}
10715
10717{
10719 if (entity)
10720 {
10721 bool is_item = entity.IsInherited(
ItemBase);
10722 if (is_item && full_quantity)
10723 {
10726 }
10727 }
10728 else
10729 {
10731 return NULL;
10732 }
10733 return entity;
10734}
10735
10737{
10738 if (item)
10739 {
10740 if (health > 0)
10741 item.SetHealth("", "", health);
10742
10743 if (item.CanHaveTemperature())
10744 {
10746 if (item.CanFreeze())
10747 item.SetFrozen(false);
10748 }
10749
10750 if (item.HasEnergyManager())
10751 {
10752 if (quantity >= 0)
10753 {
10754 item.GetCompEM().SetEnergy0To1(quantity);
10755 }
10756 else
10757 {
10759 }
10760 }
10761 else if (item.IsMagazine())
10762 {
10763 Magazine mag = Magazine.Cast(item);
10764 if (quantity >= 0)
10765 {
10766 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10767 }
10768 else
10769 {
10771 }
10772
10773 }
10774 else
10775 {
10776 if (quantity >= 0)
10777 {
10778 item.SetQuantityNormalized(quantity, false);
10779 }
10780 else
10781 {
10783 }
10784
10785 }
10786 }
10787}
10788
10789#ifdef DEVELOPER
10791#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.