Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first when overriding this event.
6777{
6779 {
6780 return true;
6781 }
6782};
6783
6784
6785
6787{
6791
6793
6796
6797
6798
6799
6800
6809
6815
6820
6825
6846 protected bool m_IsResultOfSplit
6847
6849
6854
6855
6856
6858
6862
6863
6864
6866
6869
6870
6871
6877
6878
6886
6889
6890
6892
6893
6895
6896
6901
6902
6907
6908
6910
6911
6913 {
6918
6919 if (!
GetGame().IsDedicatedServer())
6920 {
6922 {
6924
6926 {
6928 }
6929 }
6930
6933 }
6934
6935 m_OldLocation = null;
6936
6938 {
6940 }
6941
6942 if (ConfigIsExisting("headSelectionsToHide"))
6943 {
6946 }
6947
6949 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
6950 {
6952 }
6953
6955
6956 m_IsResultOfSplit = false;
6957
6959 }
6960
6962 {
6963 super.InitItemVariables();
6964
6970 m_Count = ConfigGetInt(
"count");
6971
6974
6979
6982
6987
6999
7003
7004
7007 if (ConfigIsExisting("canBeSplit"))
7008 {
7011 }
7012
7014 if (ConfigIsExisting("itemBehaviour"))
7016
7017
7020 RegisterNetSyncVariableInt("m_VarLiquidType");
7021 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7022
7023 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7024 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7025 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7026
7027 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7028 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7029 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7030 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7031
7032 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7033 RegisterNetSyncVariableBool("m_IsTakeable");
7034 RegisterNetSyncVariableBool("m_IsHologram");
7035
7038 {
7041 }
7042
7044
7046 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7048
7049 }
7050
7052 {
7054 }
7055
7057 {
7060 {
7065 }
7066 }
7067
7068 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7069 {
7071 {
7074 }
7075
7077 }
7078
7080 {
7086 }
7087
7089
7091 {
7093
7094 if (!action)
7095 {
7096 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7097 return;
7098 }
7099
7101 if (!ai)
7102 {
7104 return;
7105 }
7106
7108 if (!action_array)
7109 {
7110 action_array = new array<ActionBase_Basic>;
7112 }
7113 if (LogManager.IsActionLogEnable())
7114 {
7115 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7116 }
7117
7118 if (action_array.Find(action) != -1)
7119 {
7120 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7121 }
7122 else
7123 {
7124 action_array.Insert(action);
7125 }
7126 }
7127
7129 {
7131 ActionBase action = player.GetActionManager().GetAction(actionName);
7134
7135 if (action_array)
7136 {
7137 action_array.RemoveItem(action);
7138 }
7139 }
7140
7141
7142
7144 {
7145 ActionOverrideData overrideData = new ActionOverrideData();
7149
7151 if (!actionMap)
7152 {
7155 }
7156
7157 actionMap.Insert(this.
Type(), overrideData);
7158
7159 }
7160
7162
7164
7165
7167 {
7170
7173
7174 string config_to_search = "CfgVehicles";
7175 string muzzle_owner_config;
7176
7178 {
7179 if (IsInherited(Weapon))
7180 config_to_search = "CfgWeapons";
7181
7182 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7183
7184 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7185
7187
7188 if (config_OnFire_subclass_count > 0)
7189 {
7190 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7191
7192 for (int i = 0; i < config_OnFire_subclass_count; i++)
7193 {
7194 string particle_class = "";
7196 string config_OnFire_entry = config_OnFire_class + particle_class;
7197 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7198 WPOF_array.Insert(WPOF);
7199 }
7200
7201
7203 }
7204 }
7205
7207 {
7208 config_to_search = "CfgWeapons";
7209 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7210
7211 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7212
7214
7215 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7216 {
7217 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7218
7219 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7220 {
7221 string particle_class2 = "";
7223 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7224 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7225 WPOBE_array.Insert(WPOBE);
7226 }
7227
7228
7230 }
7231 }
7232 }
7233
7234
7236 {
7239
7241 {
7242 string config_to_search = "CfgVehicles";
7243
7244 if (IsInherited(Weapon))
7245 config_to_search = "CfgWeapons";
7246
7247 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7248 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7249
7250 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7251 {
7252
7254
7256 {
7258 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7260 return;
7261 }
7262
7265
7266
7267
7269 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7270
7271 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7272 {
7273 string particle_class = "";
7275 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7277
7278 if (entry_type == CT_CLASS)
7279 {
7280 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7281 WPOOH_array.Insert(WPOF);
7282 }
7283 }
7284
7285
7287 }
7288 }
7289 }
7290
7292 {
7294 }
7295
7297 {
7299 {
7301
7304
7307
7308 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7309 }
7310 }
7311
7313 {
7315 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7316
7318 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7319
7321 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7322
7324 {
7326 }
7327 }
7328
7330 {
7332 }
7333
7335 {
7338 else
7340
7342 {
7345 }
7346 else
7347 {
7350
7353 }
7354
7356 }
7357
7359 {
7361 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7362 }
7363
7365 {
7367 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
7369 }
7370
7372 {
7374 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7375 }
7376
7378 {
7381
7382 OverheatingParticle OP = new OverheatingParticle();
7387
7389 }
7390
7392 {
7395
7396 return -1;
7397 }
7398
7400 {
7402 {
7405
7406 for (int i = count; i > 0; --i)
7407 {
7408 int id = i - 1;
7411
7414
7415 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7416 {
7417 if (p)
7418 {
7421 }
7422 }
7423 }
7424 }
7425 }
7426
7428 {
7430 {
7432 {
7433 int id = i - 1;
7435
7436 if (OP)
7437 {
7439
7440 if (p)
7441 {
7443 }
7444
7445 delete OP;
7446 }
7447 }
7448
7451 }
7452 }
7453
7456 {
7457 return 0.0;
7458 }
7459
7460
7462 {
7463 return 250;
7464 }
7465
7467 {
7468 return 0;
7469 }
7470
7473 {
7475 return true;
7476
7477 return false;
7478 }
7479
7482 {
7485
7487 {
7489 }
7490 else
7491 {
7492
7494 }
7495
7497 }
7498
7505 {
7506 return -1;
7507 }
7508
7509
7510
7511
7513 {
7515 {
7517 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7518
7519 if (r_index >= 0)
7520 {
7521 InventoryLocation r_il = new InventoryLocation;
7522 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7523
7524 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7527 {
7528 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7529 }
7531 {
7532 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7533 }
7534
7535 }
7536
7537 player.GetHumanInventory().ClearUserReservedLocation(this);
7538 }
7539
7542 }
7543
7544
7545
7546
7548 {
7549 return ItemBase.m_DebugActionsMask;
7550 }
7551
7553 {
7554 return ItemBase.m_DebugActionsMask & mask;
7555 }
7556
7558 {
7559 ItemBase.m_DebugActionsMask = mask;
7560 }
7561
7563 {
7564 ItemBase.m_DebugActionsMask |= mask;
7565 }
7566
7568 {
7569 ItemBase.m_DebugActionsMask &= ~mask;
7570 }
7571
7573 {
7575 {
7577 }
7578 else
7579 {
7581 }
7582 }
7583
7584
7586 {
7587 if (GetEconomyProfile())
7588 {
7589 float q_max = GetEconomyProfile().GetQuantityMax();
7590 if (q_max > 0)
7591 {
7592 float q_min = GetEconomyProfile().GetQuantityMin();
7593 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
7594
7596 {
7597 ComponentEnergyManager comp = GetCompEM();
7599 {
7601 }
7602 }
7604 {
7606
7607 }
7608
7609 }
7610 }
7611 }
7612
7615 {
7616 EntityAI parent = GetHierarchyParent();
7617
7618 if (parent)
7619 {
7620 InventoryLocation inventory_location_to_lock = new InventoryLocation;
7621 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
7622 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
7623 }
7624 }
7625
7628 {
7629 EntityAI parent = GetHierarchyParent();
7630
7631 if (parent)
7632 {
7633 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
7634 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
7635 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
7636 }
7637 }
7638
7640 {
7641
7642
7643
7644
7646
7648 {
7649 if (ScriptInputUserData.CanStoreInputUserData())
7650 {
7651 ScriptInputUserData ctx = new ScriptInputUserData;
7657 ctx.
Write(use_stack_max);
7660
7662 {
7663 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
7664 }
7665 }
7666 }
7667 else if (!
GetGame().IsMultiplayer())
7668 {
7670 }
7671 }
7672
7674 {
7676 }
7677
7679 {
7681 }
7682
7684 {
7686 }
7687
7689 {
7690
7691 return false;
7692 }
7693
7695 {
7696 return false;
7697 }
7698
7702 {
7703 return false;
7704 }
7705
7707 {
7708 return "";
7709 }
7710
7712
7714 {
7715 return false;
7716 }
7717
7719 {
7720 return true;
7721 }
7722
7723
7724
7726 {
7727 return true;
7728 }
7729
7731 {
7732 return true;
7733 }
7734
7736 {
7737 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7739 }
7740
7742 {
7744 }
7745
7747 {
7749 if (!is_being_placed)
7751 SetSynchDirty();
7752 }
7753
7754
7756
7758 {
7760 }
7761
7763 {
7765 }
7766
7768 {
7769 return 1;
7770 }
7771
7773 {
7774 return false;
7775 }
7776
7778 {
7780 SetSynchDirty();
7781 }
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7818 {
7819 super.OnMovedInsideCargo(container);
7820
7821 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7822 }
7823
7824 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
7825 {
7826 super.EEItemLocationChanged(oldLoc,newLoc);
7827
7828 PlayerBase new_player = null;
7829 PlayerBase old_player = null;
7830
7831 if (newLoc.GetParent())
7832 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
7833
7834 if (oldLoc.GetParent())
7835 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
7836
7838 {
7839 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
7840
7841 if (r_index >= 0)
7842 {
7843 InventoryLocation r_il = new InventoryLocation;
7844 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7845
7846 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7849 {
7850 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7851 }
7853 {
7854 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7855 }
7856
7857 }
7858 }
7859
7861 {
7862 if (new_player)
7863 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
7864
7865 if (new_player == old_player)
7866 {
7867
7868 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
7869 {
7871 {
7872 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
7873 {
7874 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7875 }
7876 }
7877 else
7878 {
7879 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
7880 }
7881 }
7882
7883 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
7884 {
7885 int type = oldLoc.GetType();
7887 {
7888 oldLoc.GetParent().GetOnSetLock().Invoke(this);
7889 }
7891 {
7892 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
7893 }
7894 }
7895 if (!m_OldLocation)
7896 {
7897 m_OldLocation = new InventoryLocation;
7898 }
7899 m_OldLocation.Copy(oldLoc);
7900 }
7901 else
7902 {
7903 if (m_OldLocation)
7904 {
7905 m_OldLocation.Reset();
7906 }
7907 }
7908
7910 }
7911 else
7912 {
7913 if (new_player)
7914 {
7915 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
7916 if (res_index >= 0)
7917 {
7918 InventoryLocation il = new InventoryLocation;
7919 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
7921 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
7924 {
7925 il.
GetParent().GetOnReleaseLock().Invoke(it);
7926 }
7928 {
7930 }
7931
7932 }
7933 }
7935 {
7936
7938 }
7939
7940 if (m_OldLocation)
7941 {
7942 m_OldLocation.Reset();
7943 }
7944 }
7945 }
7946
7947 override void EOnContact(IEntity other, Contact extra)
7948 {
7950 {
7951 int liquidType = -1;
7953 if (impactSpeed > 0.0)
7954 {
7956 #ifndef SERVER
7958 #else
7960 SetSynchDirty();
7961 #endif
7963 }
7964 }
7965
7966 #ifdef SERVER
7967 if (GetCompEM() && GetCompEM().IsPlugged())
7968 {
7969 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
7970 GetCompEM().UnplugThis();
7971 }
7972 #endif
7973 }
7974
7976
7978 {
7980 }
7981
7983 {
7984
7985 }
7986
7988 {
7989 super.OnItemLocationChanged(old_owner, new_owner);
7990
7991 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
7992 PlayerBase playerNew = PlayerBase.Cast(new_owner);
7993
7994 if (!relatedPlayer && playerNew)
7995 relatedPlayer = playerNew;
7996
7997 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
7998 {
8000 if (actionMgr)
8001 {
8002 ActionBase currentAction = actionMgr.GetRunningAction();
8003 if (currentAction)
8005 }
8006 }
8007
8008 Man ownerPlayerOld = null;
8009 Man ownerPlayerNew = null;
8010
8011 if (old_owner)
8012 {
8013 if (old_owner.
IsMan())
8014 {
8015 ownerPlayerOld = Man.Cast(old_owner);
8016 }
8017 else
8018 {
8019 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8020 }
8021 }
8022 else
8023 {
8025 {
8027
8028 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8029 {
8030 GetCompEM().UnplugThis();
8031 }
8032 }
8033 }
8034
8035 if (new_owner)
8036 {
8037 if (new_owner.
IsMan())
8038 {
8039 ownerPlayerNew = Man.Cast(new_owner);
8040 }
8041 else
8042 {
8043 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8044 }
8045 }
8046
8047 if (ownerPlayerOld != ownerPlayerNew)
8048 {
8049 if (ownerPlayerOld)
8050 {
8051 array<EntityAI> subItemsExit = new array<EntityAI>;
8053 for (int i = 0; i < subItemsExit.Count(); i++)
8054 {
8057 }
8058 }
8059
8060 if (ownerPlayerNew)
8061 {
8062 array<EntityAI> subItemsEnter = new array<EntityAI>;
8064 for (int j = 0; j < subItemsEnter.Count(); j++)
8065 {
8068 }
8069 }
8070 }
8071 else if (ownerPlayerNew != null)
8072 {
8073 PlayerBase nplayer;
8074 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8075 {
8076 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8078 for (int k = 0; k < subItemsUpdate.Count(); k++)
8079 {
8081 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8082 }
8083 }
8084 }
8085
8086 if (old_owner)
8087 old_owner.OnChildItemRemoved(this);
8088 if (new_owner)
8089 new_owner.OnChildItemReceived(this);
8090 }
8091
8092
8094 {
8095 super.EEDelete(parent);
8096 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8097 if (player)
8098 {
8100
8101 if (player.IsAlive())
8102 {
8103 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8104 if (r_index >= 0)
8105 {
8106 InventoryLocation r_il = new InventoryLocation;
8107 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8108
8109 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8112 {
8113 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8114 }
8116 {
8117 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8118 }
8119
8120 }
8121
8122 player.RemoveQuickBarEntityShortcut(this);
8123 }
8124 }
8125 }
8126
8128 {
8129 super.EEKilled(killer);
8130
8133 {
8134 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8135 {
8136 if (IsMagazine())
8137 {
8138 if (Magazine.Cast(this).GetAmmoCount() > 0)
8139 {
8141 }
8142 }
8143 else
8144 {
8146 }
8147 }
8148 }
8149 }
8150
8152 {
8153 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8154
8155 super.OnWasAttached(parent, slot_id);
8156
8159
8161 }
8162
8164 {
8165 super.OnWasDetached(parent, slot_id);
8166
8169 }
8170
8172 {
8173 int idx;
8176
8177 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8178 if (inventory_slots.Count() < 1)
8179 {
8180 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8181 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8182 }
8183 else
8184 {
8185 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8186 }
8187
8188 idx = inventory_slots.Find(slot);
8189 if (idx < 0)
8190 return "";
8191
8192 return attach_types.Get(idx);
8193 }
8194
8196 {
8197 int idx = -1;
8198 string slot;
8199
8202
8203 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8204 if (inventory_slots.Count() < 1)
8205 {
8206 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8207 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8208 }
8209 else
8210 {
8211 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8212 if (detach_types.Count() < 1)
8213 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8214 }
8215
8216 for (int i = 0; i < inventory_slots.Count(); i++)
8217 {
8218 slot = inventory_slots.Get(i);
8219 }
8220
8221 if (slot != "")
8222 {
8223 if (detach_types.Count() == 1)
8224 idx = 0;
8225 else
8226 idx = inventory_slots.Find(slot);
8227 }
8228 if (idx < 0)
8229 return "";
8230
8231 return detach_types.Get(idx);
8232 }
8233
8235 {
8236
8238
8239
8240 float min_time = 1;
8241 float max_time = 3;
8242 float delay = Math.RandomFloat(min_time, max_time);
8243
8244 explode_timer.Run(delay, this, "DoAmmoExplosion");
8245 }
8246
8248 {
8249 Magazine magazine = Magazine.Cast(this);
8250 int pop_sounds_count = 6;
8251 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8252
8253
8254 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8255 string sound_name = pop_sounds[ sound_idx ];
8257
8258
8259 magazine.ServerAddAmmoCount(-1);
8260
8261
8262 float min_temp_to_explode = 100;
8263
8264 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8265 {
8267 }
8268 }
8269
8270
8271 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8272 {
8273 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8274
8275 const int CHANCE_DAMAGE_CARGO = 4;
8276 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8277 const int CHANCE_DAMAGE_NOTHING = 2;
8278
8280 {
8281 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8282 int chances;
8283 int rnd;
8284
8285 if (GetInventory().GetCargo())
8286 {
8287 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8288 rnd = Math.RandomInt(0,chances);
8289
8290 if (rnd < CHANCE_DAMAGE_CARGO)
8291 {
8293 }
8294 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8295 {
8297 }
8298 }
8299 else
8300 {
8301 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8302 rnd = Math.RandomInt(0,chances);
8303
8304 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8305 {
8307 }
8308 }
8309 }
8310 }
8311
8313 {
8314 if (GetInventory().GetCargo())
8315 {
8316 int item_count = GetInventory().GetCargo().GetItemCount();
8317 if (item_count > 0)
8318 {
8319 int random_pick = Math.RandomInt(0, item_count);
8321 if (!item.IsExplosive())
8322 {
8323 item.AddHealth("","",damage);
8324 return true;
8325 }
8326 }
8327 }
8328 return false;
8329 }
8330
8332 {
8333 int attachment_count = GetInventory().AttachmentCount();
8334 if (attachment_count > 0)
8335 {
8336 int random_pick = Math.RandomInt(0, attachment_count);
8337 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
8338 if (!attachment.IsExplosive())
8339 {
8340 attachment.AddHealth("","",damage);
8341 return true;
8342 }
8343 }
8344 return false;
8345 }
8346
8348 {
8350 }
8351
8353 {
8355 return GetInventory().CanRemoveEntity();
8356
8357 return false;
8358 }
8359
8361 {
8363 return;
8364
8366 {
8367 if (ScriptInputUserData.CanStoreInputUserData())
8368 {
8369 ScriptInputUserData ctx = new ScriptInputUserData;
8374 ctx.
Write(destination_entity);
8378 }
8379 }
8380 else if (!
GetGame().IsMultiplayer())
8381 {
8383 }
8384 }
8385
8387 {
8389 return;
8390
8391 float split_quantity_new;
8395 InventoryLocation loc = new InventoryLocation;
8396
8397 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8398 {
8400 split_quantity_new = stack_max;
8401 else
8403
8404 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8405 if (new_item)
8406 {
8407 new_item.SetResultOfSplit(true);
8408 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8410 new_item.SetQuantity(split_quantity_new);
8411 }
8412 }
8413 else if (destination_entity && slot_id == -1)
8414 {
8415 if (quantity > stack_max)
8416 split_quantity_new = stack_max;
8417 else
8418 split_quantity_new = quantity;
8419
8421 {
8424 }
8425
8426 if (new_item)
8427 {
8428 new_item.SetResultOfSplit(true);
8429 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8431 new_item.SetQuantity(split_quantity_new);
8432 }
8433 }
8434 else
8435 {
8436 if (stack_max != 0)
8437 {
8439 {
8441 }
8442
8443 if (split_quantity_new == 0)
8444 {
8445 if (!
GetGame().IsMultiplayer())
8446 player.PhysicalPredictiveDropItem(this);
8447 else
8448 player.ServerDropEntity(this);
8449 return;
8450 }
8451
8453
8454 if (new_item)
8455 {
8456 new_item.SetResultOfSplit(true);
8457 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8459 new_item.SetQuantity(stack_max);
8460 new_item.PlaceOnSurface();
8461 }
8462 }
8463 }
8464 }
8465
8467 {
8469 return;
8470
8471 float split_quantity_new;
8475 InventoryLocation loc = new InventoryLocation;
8476
8477 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8478 {
8480 split_quantity_new = stack_max;
8481 else
8483
8484 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
8485 if (new_item)
8486 {
8487 new_item.SetResultOfSplit(true);
8488 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8490 new_item.SetQuantity(split_quantity_new);
8491 }
8492 }
8493 else if (destination_entity && slot_id == -1)
8494 {
8495 if (quantity > stack_max)
8496 split_quantity_new = stack_max;
8497 else
8498 split_quantity_new = quantity;
8499
8501 {
8504 }
8505
8506 if (new_item)
8507 {
8508 new_item.SetResultOfSplit(true);
8509 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8511 new_item.SetQuantity(split_quantity_new);
8512 }
8513 }
8514 else
8515 {
8516 if (stack_max != 0)
8517 {
8519 {
8521 }
8522
8524
8525 if (new_item)
8526 {
8527 new_item.SetResultOfSplit(true);
8528 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8530 new_item.SetQuantity(stack_max);
8531 new_item.PlaceOnSurface();
8532 }
8533 }
8534 }
8535 }
8536
8538 {
8540 return;
8541
8543 {
8544 if (ScriptInputUserData.CanStoreInputUserData())
8545 {
8546 ScriptInputUserData ctx = new ScriptInputUserData;
8551 dst.WriteToContext(ctx);
8553 }
8554 }
8555 else if (!
GetGame().IsMultiplayer())
8556 {
8558 }
8559 }
8560
8562 {
8564 return;
8565
8567 {
8568 if (ScriptInputUserData.CanStoreInputUserData())
8569 {
8570 ScriptInputUserData ctx = new ScriptInputUserData;
8575 ctx.
Write(destination_entity);
8581 }
8582 }
8583 else if (!
GetGame().IsMultiplayer())
8584 {
8586 }
8587 }
8588
8590 {
8592 }
8593
8595 {
8597 return this;
8598
8600 float split_quantity_new;
8602 if (dst.IsValid())
8603 {
8604 int slot_id = dst.GetSlot();
8606
8607 if (quantity > stack_max)
8608 split_quantity_new = stack_max;
8609 else
8610 split_quantity_new = quantity;
8611
8613
8614 if (new_item)
8615 {
8616 new_item.SetResultOfSplit(true);
8617 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8620 }
8621
8622 return new_item;
8623 }
8624
8625 return null;
8626 }
8627
8629 {
8631 return;
8632
8634 float split_quantity_new;
8636 if (destination_entity)
8637 {
8639 if (quantity > stackable)
8640 split_quantity_new = stackable;
8641 else
8642 split_quantity_new = quantity;
8643
8644 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
8645 if (new_item)
8646 {
8647 new_item.SetResultOfSplit(true);
8648 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8650 new_item.SetQuantity(split_quantity_new);
8651 }
8652 }
8653 }
8654
8656 {
8658 return;
8659
8661 {
8662 if (ScriptInputUserData.CanStoreInputUserData())
8663 {
8664 ScriptInputUserData ctx = new ScriptInputUserData;
8669 ItemBase destination_entity =
this;
8670 ctx.
Write(destination_entity);
8674 }
8675 }
8676 else if (!
GetGame().IsMultiplayer())
8677 {
8679 }
8680 }
8681
8683 {
8685 return;
8686
8688 float split_quantity_new;
8690 if (player)
8691 {
8693 if (quantity > stackable)
8694 split_quantity_new = stackable;
8695 else
8696 split_quantity_new = quantity;
8697
8698 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
8699 new_item =
ItemBase.Cast(in_hands);
8700 if (new_item)
8701 {
8702 new_item.SetResultOfSplit(true);
8703 MiscGameplayFunctions.TransferItemProperties(this,new_item);
8705 new_item.SetQuantity(split_quantity_new);
8706 }
8707 }
8708 }
8709
8711 {
8713 return;
8714
8716 float split_quantity_new = Math.Floor(quantity * 0.5);
8717
8719
8720 if (new_item)
8721 {
8722 if (new_item.GetQuantityMax() < split_quantity_new)
8723 {
8724 split_quantity_new = new_item.GetQuantityMax();
8725 }
8726
8727 new_item.SetResultOfSplit(true);
8728 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8729
8731 {
8734 }
8735 else
8736 {
8739 }
8740 }
8741 }
8742
8744 {
8746 return;
8747
8749 float split_quantity_new = Math.Floor(quantity / 2);
8750
8751 InventoryLocation invloc = new InventoryLocation;
8753
8755 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
8756
8757 if (new_item)
8758 {
8759 if (new_item.GetQuantityMax() < split_quantity_new)
8760 {
8761 split_quantity_new = new_item.GetQuantityMax();
8762 }
8764 {
8767 }
8768 else
8769 {
8772 }
8773 }
8774 }
8775
8778 {
8779 SetWeightDirty();
8781
8782 if (parent)
8783 parent.OnAttachmentQuantityChangedEx(this, delta);
8784
8786 {
8788 {
8790 }
8792 {
8793 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
8795 }
8796 }
8797
8798 }
8799
8802 {
8803
8804 }
8805
8808 {
8810 }
8811
8813 {
8814 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
8815
8817 {
8818 if (newLevel == GameConstants.STATE_RUINED)
8819 {
8821 EntityAI parent = GetHierarchyParent();
8822 if (parent && parent.IsFireplace())
8823 {
8824 CargoBase cargo = GetInventory().GetCargo();
8825 if (cargo)
8826 {
8828 {
8830 }
8831 }
8832 }
8833 }
8834
8836 {
8837
8839 return;
8840 }
8841
8842 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
8843 {
8845 }
8846 }
8847 }
8848
8849
8851 {
8852 super.OnRightClick();
8853
8855 {
8857 {
8858 if (ScriptInputUserData.CanStoreInputUserData())
8859 {
8860 vector m4[4];
8862
8863 EntityAI root = GetHierarchyRoot();
8864
8865 InventoryLocation dst = new InventoryLocation;
8867 {
8868 if (root)
8869 {
8870 root.GetTransform(m4);
8872 }
8873 else
8874 GetInventory().GetCurrentInventoryLocation(dst);
8875 }
8876 else
8877 {
8879
8880
8881 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
8882 {
8883 if (root)
8884 {
8885 root.GetTransform(m4);
8887 }
8888 else
8889 GetInventory().GetCurrentInventoryLocation(dst);
8890 }
8891 else
8892 {
8893 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
8894 }
8895 }
8896
8897 ScriptInputUserData ctx = new ScriptInputUserData;
8905 }
8906 }
8907 else if (!
GetGame().IsMultiplayer())
8908 {
8910 }
8911 }
8912 }
8913
8914 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
8915 {
8916
8917 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
8918 return false;
8919
8920 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
8921 return false;
8922
8923
8925 return false;
8926
8927
8928 Magazine mag = Magazine.Cast(this);
8929 if (mag)
8930 {
8931 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
8932 return false;
8933
8934 if (stack_max_limit)
8935 {
8936 Magazine other_mag = Magazine.Cast(other_item);
8937 if (other_item)
8938 {
8939 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
8940 return false;
8941 }
8942
8943 }
8944 }
8945 else
8946 {
8947
8949 return false;
8950
8952 return false;
8953 }
8954
8955 PlayerBase player = null;
8956 if (CastTo(player, GetHierarchyRootPlayer()))
8957 {
8958 if (player.GetInventory().HasAttachment(this))
8959 return false;
8960
8961 if (player.IsItemsToDelete())
8962 return false;
8963 }
8964
8965 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
8966 return false;
8967
8968 int slotID;
8970 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
8971 return false;
8972
8973 return true;
8974 }
8975
8977 {
8979 }
8980
8982 {
8983 return m_IsResultOfSplit;
8984 }
8985
8987 {
8988 m_IsResultOfSplit = value;
8989 }
8990
8992 {
8994 }
8995
8997 {
8998 float other_item_quantity = other_item.GetQuantity();
8999 float this_free_space;
9000
9002
9004
9005 if (other_item_quantity > this_free_space)
9006 {
9007 return this_free_space;
9008 }
9009 else
9010 {
9011 return other_item_quantity;
9012 }
9013 }
9014
9016 {
9018 }
9019
9021 {
9023 return;
9024
9025 if (!IsMagazine() && other_item)
9026 {
9028 if (quantity_used != 0)
9029 {
9030 float hp1 = GetHealth01("","");
9031 float hp2 = other_item.GetHealth01("","");
9032 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9033 hpResult = hpResult / (
GetQuantity() + quantity_used);
9034
9035 hpResult *= GetMaxHealth();
9036 Math.Round(hpResult);
9037 SetHealth("", "Health", hpResult);
9038
9040 other_item.AddQuantity(-quantity_used);
9041 }
9042 }
9044 }
9045
9047 {
9048 #ifdef SERVER
9049 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9050 GetHierarchyParent().IncreaseLifetimeUp();
9051 #endif
9052 };
9053
9055 {
9056 PlayerBase p = PlayerBase.Cast(player);
9057
9058 array<int> recipesIds = p.m_Recipes;
9059 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9060 if (moduleRecipesManager)
9061 {
9062 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9063 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9064 }
9065
9066 for (int i = 0;i < recipesIds.Count(); i++)
9067 {
9068 int key = recipesIds.Get(i);
9069 string recipeName = moduleRecipesManager.GetRecipeName(key);
9071 }
9072 }
9073
9074
9075 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9076 {
9077 super.GetDebugActions(outputList);
9078
9079
9084
9085
9089
9093
9094
9097
9098
9100 {
9103 }
9104
9106
9109
9113 }
9114
9115
9116
9117
9119 {
9120 super.OnAction(action_id, player, ctx);
9121 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9122 {
9123 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9124 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9125 PlayerBase p = PlayerBase.Cast(player);
9126 if (
EActions.RECIPES_RANGE_START < 1000)
9127 {
9128 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9129 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9130 }
9131 }
9132 #ifndef SERVER
9133 else if (action_id ==
EActions.WATCH_PLAYER)
9134 {
9135 PluginDeveloper.SetDeveloperItemClientEx(player);
9136 }
9137 #endif
9139 {
9140 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9141 {
9142 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9143 OnDebugButtonPressServer(id + 1);
9144 }
9145
9146 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9147 {
9148 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9150 }
9151
9152 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9153 {
9154 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9156 }
9157
9158 else if (action_id ==
EActions.ADD_QUANTITY)
9159 {
9160 if (IsMagazine())
9161 {
9162 Magazine mag = Magazine.Cast(this);
9163 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9164 }
9165 else
9166 {
9168 }
9169
9170 if (m_EM)
9171 {
9172 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9173 }
9174
9175 }
9176
9177 else if (action_id ==
EActions.REMOVE_QUANTITY)
9178 {
9179 if (IsMagazine())
9180 {
9181 Magazine mag2 = Magazine.Cast(this);
9182 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9183 }
9184 else
9185 {
9187 }
9188 if (m_EM)
9189 {
9190 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9191 }
9192
9193 }
9194
9195 else if (action_id ==
EActions.SET_QUANTITY_0)
9196 {
9198
9199 if (m_EM)
9200 {
9201 m_EM.SetEnergy(0);
9202 }
9203 }
9204
9205 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9206 {
9208
9209 if (m_EM)
9210 {
9211 m_EM.SetEnergy(m_EM.GetEnergyMax());
9212 }
9213 }
9214
9215 else if (action_id ==
EActions.ADD_HEALTH)
9216 {
9217 AddHealth("","",GetMaxHealth("","Health")/5);
9218 }
9219 else if (action_id ==
EActions.REMOVE_HEALTH)
9220 {
9221 AddHealth("","",-GetMaxHealth("","Health")/5);
9222 }
9223 else if (action_id ==
EActions.DESTROY_HEALTH)
9224 {
9225 SetHealth01("","",0);
9226 }
9227 else if (action_id ==
EActions.WATCH_ITEM)
9228 {
9230 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9231 #ifdef DEVELOPER
9232 SetDebugDeveloper_item(this);
9233 #endif
9234 }
9235
9236 else if (action_id ==
EActions.ADD_TEMPERATURE)
9237 {
9238 AddTemperature(20);
9239
9240 }
9241
9242 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9243 {
9244 AddTemperature(-20);
9245
9246 }
9247
9248 else if (action_id ==
EActions.FLIP_FROZEN)
9249 {
9250 SetFrozen(!GetIsFrozen());
9251
9252 }
9253
9254 else if (action_id ==
EActions.ADD_WETNESS)
9255 {
9257
9258 }
9259
9260 else if (action_id ==
EActions.REMOVE_WETNESS)
9261 {
9263
9264 }
9265
9266 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9267 {
9270
9271
9272 }
9273
9274 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9275 {
9278 }
9279
9280 else if (action_id ==
EActions.MAKE_SPECIAL)
9281 {
9282 auto debugParams = DebugSpawnParams.WithPlayer(player);
9283 OnDebugSpawnEx(debugParams);
9284 }
9285
9286 else if (action_id ==
EActions.DELETE)
9287 {
9288 Delete();
9289 }
9290
9291 }
9292
9293
9294 return false;
9295 }
9296
9297
9298
9299
9303
9306
9307
9308
9310 {
9311 return false;
9312 }
9313
9314
9316 {
9317 return true;
9318 }
9319
9320
9322 {
9323 return true;
9324 }
9325
9326
9327
9329 {
9330 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9332 }
9333
9336 {
9337 return null;
9338 }
9339
9341 {
9342 return false;
9343 }
9344
9346 {
9347 return false;
9348 }
9349
9353
9354
9356 {
9357 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9358 return module_repairing.CanRepair(this, item_repair_kit);
9359 }
9360
9361
9362 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
9363 {
9364 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
9365 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9366 }
9367
9368
9370 {
9371
9372
9373
9374
9375
9376
9377
9378
9379 return 1;
9380 }
9381
9382
9383
9385 {
9387 }
9388
9389
9390
9392 {
9394 }
9395
9396
9405 {
9406 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9407
9408 if (player)
9409 {
9410 player.MessageStatus(text);
9411 }
9412 }
9413
9414
9423 {
9424 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9425
9426 if (player)
9427 {
9428 player.MessageAction(text);
9429 }
9430 }
9431
9432
9441 {
9442 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9443
9444 if (player)
9445 {
9446 player.MessageFriendly(text);
9447 }
9448 }
9449
9450
9459 {
9460 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9461
9462 if (player)
9463 {
9464 player.MessageImportant(text);
9465 }
9466 }
9467
9469 {
9470 return true;
9471 }
9472
9473
9474 override bool KindOf(
string tag)
9475 {
9476 bool found = false;
9477 string item_name = this.
GetType();
9480
9481 int array_size = item_tag_array.Count();
9482 for (int i = 0; i < array_size; i++)
9483 {
9484 if (item_tag_array.Get(i) == tag)
9485 {
9486 found = true;
9487 break;
9488 }
9489 }
9490 return found;
9491 }
9492
9493
9495 {
9496
9497 super.OnRPC(sender, rpc_type,ctx);
9498
9499
9500 switch (rpc_type)
9501 {
9502 #ifndef SERVER
9503 case ERPCs.RPC_SOUND_LOCK_ATTACH:
9504 Param2<bool, string> p = new Param2<bool, string>(false, "");
9505
9507 return;
9508
9509 bool play = p.param1;
9510 string soundSet = p.param2;
9511
9512 if (play)
9513 {
9515 {
9517 {
9519 }
9520 }
9521 else
9522 {
9524 }
9525 }
9526 else
9527 {
9529 }
9530
9531 break;
9532 #endif
9533
9534 }
9535
9537 {
9539 }
9540 }
9541
9542
9543
9544
9546 {
9547 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9548 return plugin.GetID(
name);
9549 }
9550
9552 {
9553 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
9554 return plugin.GetName(id);
9555 }
9556
9559 {
9560
9561
9562 int varFlags;
9563 if (!ctx.
Read(varFlags))
9564 return;
9565
9566 if (varFlags & ItemVariableFlags.FLOAT)
9567 {
9569 }
9570 }
9571
9573 {
9574
9575 super.SerializeNumericalVars(floats_out);
9576
9577
9578
9580 {
9582 }
9583
9585 {
9587 }
9588
9590 {
9592 }
9593
9595 {
9600 }
9601
9603 {
9605 }
9606 }
9607
9609 {
9610
9611 super.DeSerializeNumericalVars(floats);
9612
9613
9614 int index = 0;
9615 int mask = Math.Round(floats.Get(index));
9616
9617 index++;
9618
9620 {
9622 {
9624 }
9625 else
9626 {
9627 float quantity = floats.Get(index);
9629 }
9630 index++;
9631 }
9632
9634 {
9635 float wet = floats.Get(index);
9637 index++;
9638 }
9639
9641 {
9642 int liquidtype = Math.Round(floats.Get(index));
9644 index++;
9645 }
9646
9648 {
9650 index++;
9652 index++;
9654 index++;
9656 index++;
9657 }
9658
9660 {
9661 int cleanness = Math.Round(floats.Get(index));
9663 index++;
9664 }
9665 }
9666
9668 {
9669 super.WriteVarsToCTX(ctx);
9670
9671
9673 {
9675 }
9676
9678 {
9680 }
9681
9683 {
9685 }
9686
9688 {
9689 int r,g,b,a;
9695 }
9696
9698 {
9700 }
9701 }
9702
9704 {
9705 if (!super.ReadVarsFromCTX(ctx,version))
9706 return false;
9707
9708 int intValue;
9709 float value;
9710
9711 if (version < 140)
9712 {
9713 if (!ctx.
Read(intValue))
9714 return false;
9715
9716 m_VariablesMask = intValue;
9717 }
9718
9720 {
9721 if (!ctx.
Read(value))
9722 return false;
9723
9725 {
9727 }
9728 else
9729 {
9731 }
9732 }
9733
9734 if (version < 140)
9735 {
9737 {
9738 if (!ctx.
Read(value))
9739 return false;
9740 SetTemperatureDirect(value);
9741 }
9742 }
9743
9745 {
9746 if (!ctx.
Read(value))
9747 return false;
9749 }
9750
9752 {
9753 if (!ctx.
Read(intValue))
9754 return false;
9756 }
9757
9759 {
9760 int r,g,b,a;
9762 return false;
9764 return false;
9766 return false;
9768 return false;
9769
9771 }
9772
9774 {
9775 if (!ctx.
Read(intValue))
9776 return false;
9778 }
9779
9780 if (version >= 138 && version < 140)
9781 {
9783 {
9784 if (!ctx.
Read(intValue))
9785 return false;
9786 SetFrozen(intValue);
9787 }
9788 }
9789
9790 return true;
9791 }
9792
9793
9795 {
9798 {
9800 }
9801
9802 if (!super.OnStoreLoad(ctx, version))
9803 {
9805 return false;
9806 }
9807
9808 if (version >= 114)
9809 {
9810 bool hasQuickBarIndexSaved;
9811
9812 if (!ctx.
Read(hasQuickBarIndexSaved))
9813 {
9815 return false;
9816 }
9817
9818 if (hasQuickBarIndexSaved)
9819 {
9820 int itmQBIndex;
9821
9822
9823 if (!ctx.
Read(itmQBIndex))
9824 {
9826 return false;
9827 }
9828
9829 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
9830 if (itmQBIndex != -1 && parentPlayer)
9831 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
9832 }
9833 }
9834 else
9835 {
9836
9837 PlayerBase player;
9838 int itemQBIndex;
9839 if (version ==
int.
MAX)
9840 {
9841 if (!ctx.
Read(itemQBIndex))
9842 {
9844 return false;
9845 }
9846 }
9847 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
9848 {
9849
9850 if (!ctx.
Read(itemQBIndex))
9851 {
9853 return false;
9854 }
9855 if (itemQBIndex != -1 && player)
9856 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
9857 }
9858 }
9859
9860 if (version < 140)
9861 {
9862
9863 if (!LoadVariables(ctx, version))
9864 {
9866 return false;
9867 }
9868 }
9869
9870
9872 {
9874 return false;
9875 }
9876 if (version >= 132)
9877 {
9879 if (raib)
9880 {
9882 {
9884 return false;
9885 }
9886 }
9887 }
9888
9890 return true;
9891 }
9892
9893
9894
9896 {
9897 super.OnStoreSave(ctx);
9898
9899 PlayerBase player;
9900 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
9901 {
9903
9904 int itemQBIndex = -1;
9905 itemQBIndex = player.FindQuickBarEntityIndex(this);
9906 ctx.
Write(itemQBIndex);
9907 }
9908 else
9909 {
9911 }
9912
9914
9916 if (raib)
9917 {
9919 }
9920 }
9921
9922
9924 {
9925 super.AfterStoreLoad();
9926
9928 {
9930 }
9931
9933 {
9936 }
9937 }
9938
9940 {
9941 super.EEOnAfterLoad();
9942
9944 {
9946 }
9947
9950 }
9951
9953 {
9954 return false;
9955 }
9956
9957
9958
9960 {
9962 {
9963 #ifdef PLATFORM_CONSOLE
9964
9966 {
9968 if (menu)
9969 {
9971 }
9972 }
9973 #endif
9974 }
9975
9977 {
9980 }
9981
9983 {
9984 SetWeightDirty();
9986 }
9988 {
9991 }
9992
9994 {
9997 }
9999 {
10002 }
10003
10004 super.OnVariablesSynchronized();
10005 }
10006
10007
10008
10010 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10011 {
10012 if (!IsServerCheck(allow_client))
10013 return false;
10014
10016 return false;
10017
10020
10021 if (value <= (min + 0.001))
10022 value = min;
10023
10024 if (value == min)
10025 {
10026 if (destroy_config)
10027 {
10028 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10029 if (dstr)
10030 {
10032 this.Delete();
10033 return true;
10034 }
10035 }
10036 else if (destroy_forced)
10037 {
10039 this.Delete();
10040 return true;
10041 }
10042
10044 }
10045
10048
10050 {
10052
10053 if (delta)
10055 }
10056
10058
10059 return false;
10060 }
10061
10062
10064 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10065 {
10067 }
10068
10070 {
10073 }
10074
10076 {
10079 }
10080
10083 {
10084 float value_clamped = Math.Clamp(value, 0, 1);
10086 SetQuantity(result, destroy_config, destroy_forced);
10087 }
10088
10089
10092 {
10094 }
10095
10097 {
10099 }
10100
10101
10102
10103
10104
10105
10106
10107
10108
10109
10111 {
10112 int slot = -1;
10113 if (GetInventory())
10114 {
10115 InventoryLocation il = new InventoryLocation;
10116 GetInventory().GetCurrentInventoryLocation(il);
10118 }
10119
10121 }
10122
10124 {
10125 float quantity_max = 0;
10126
10128 {
10129 if (attSlotID != -1)
10130 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10131
10132 if (quantity_max <= 0)
10134 }
10135
10136 if (quantity_max <= 0)
10138
10139 return quantity_max;
10140 }
10141
10143 {
10145 }
10146
10148 {
10150 }
10151
10152
10154 {
10156 }
10157
10159 {
10161 }
10162
10164 {
10166 }
10167
10168
10170 {
10171
10172 float weightEx = GetWeightEx();
10173 float special = GetInventoryAndCargoWeight();
10174 return weightEx - special;
10175 }
10176
10177
10179 {
10181 }
10182
10184 {
10186 {
10187 #ifdef DEVELOPER
10188 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10189 {
10190 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10192 }
10193 #endif
10194
10195 return GetQuantity() * GetConfigWeightModified();
10196 }
10197 else if (HasEnergyManager())
10198 {
10199 #ifdef DEVELOPER
10200 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10201 {
10202 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10203 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10204 }
10205 #endif
10206 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10207 }
10208 else
10209 {
10210 #ifdef DEVELOPER
10211 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10212 {
10213 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10214 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10215 }
10216 #endif
10217 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10218 }
10219 }
10220
10223 {
10224 int item_count = 0;
10226
10227 if (GetInventory().GetCargo() != NULL)
10228 {
10229 item_count = GetInventory().GetCargo().GetItemCount();
10230 }
10231
10232 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10233 {
10234 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10235 if (item)
10236 item_count += item.GetNumberOfItems();
10237 }
10238 return item_count;
10239 }
10240
10243 {
10244 float weight = 0;
10245 float wetness = 1;
10246 if (include_wetness)
10249 {
10250 weight = wetness * m_ConfigWeight;
10251 }
10253 {
10254 weight = 1;
10255 }
10256 return weight;
10257 }
10258
10259
10260
10262 {
10263 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10264 {
10265 GameInventory inv = GetInventory();
10266 array<EntityAI> items = new array<EntityAI>;
10268 for (int i = 0; i < items.Count(); i++)
10269 {
10271 if (item)
10272 {
10274 }
10275 }
10276 }
10277 }
10278
10279
10280
10281
10283 {
10284 float energy = 0;
10285 if (HasEnergyManager())
10286 {
10287 energy = GetCompEM().GetEnergy();
10288 }
10289 return energy;
10290 }
10291
10292
10294 {
10295 super.OnEnergyConsumed();
10296
10298 }
10299
10301 {
10302 super.OnEnergyAdded();
10303
10305 }
10306
10307
10309 {
10310 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10311 {
10313 {
10314 float energy_0to1 = GetCompEM().GetEnergy0To1();
10316 }
10317 }
10318 }
10319
10320
10322 {
10323 return ConfigGetFloat("heatIsolation");
10324 }
10325
10327 {
10329 }
10330
10332 {
10333 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10334 if (
GetGame().ConfigIsExisting(paramPath))
10336
10337 return 0.0;
10338 }
10339
10341 {
10342 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
10343 if (
GetGame().ConfigIsExisting(paramPath))
10345
10346 return 0.0;
10347 }
10348
10349 override void SetWet(
float value,
bool allow_client =
false)
10350 {
10351 if (!IsServerCheck(allow_client))
10352 return;
10353
10356
10358
10359 m_VarWet = Math.Clamp(value, min, max);
10360
10362 {
10365 }
10366 }
10367
10368 override void AddWet(
float value)
10369 {
10371 }
10372
10374 {
10376 }
10377
10379 {
10381 }
10382
10384 {
10386 }
10387
10389 {
10391 }
10392
10394 {
10396 }
10397
10398 override void OnWetChanged(
float newVal,
float oldVal)
10399 {
10402 if (newLevel != oldLevel)
10403 {
10405 }
10406 }
10407
10409 {
10410 SetWeightDirty();
10411 }
10412
10414 {
10415 return GetWetLevelInternal(
m_VarWet);
10416 }
10417
10418
10419
10421 {
10423 }
10424
10426 {
10428 }
10429
10431 {
10433 }
10434
10436 {
10438 }
10439
10440
10441
10443 {
10444 if (ConfigIsExisting("itemModelLength"))
10445 {
10446 return ConfigGetFloat("itemModelLength");
10447 }
10448 return 0;
10449 }
10450
10452 {
10453 if (ConfigIsExisting("itemAttachOffset"))
10454 {
10455 return ConfigGetFloat("itemAttachOffset");
10456 }
10457 return 0;
10458 }
10459
10460 override void SetCleanness(
int value,
bool allow_client =
false)
10461 {
10462 if (!IsServerCheck(allow_client))
10463 return;
10464
10466
10468
10471 }
10472
10474 {
10476 }
10477
10479 {
10480 return true;
10481 }
10482
10483
10484
10485
10487 {
10489 }
10490
10492 {
10494 }
10495
10496
10497
10498
10499 override void SetColor(
int r,
int g,
int b,
int a)
10500 {
10506 }
10508 override void GetColor(out
int r,out
int g,out
int b,out
int a)
10509 {
10514 }
10515
10517 {
10519 }
10520
10523 {
10524 int r,g,b,a;
10526 r = r/255;
10527 g = g/255;
10528 b = b/255;
10529 a = a/255;
10530 return MiscGameplayFunctions.GetColorString(r, g, b, a);
10531 }
10532
10533
10534
10535 override void SetLiquidType(
int value,
bool allow_client =
false)
10536 {
10537 if (!IsServerCheck(allow_client))
10538 return;
10539
10544 }
10545
10547 {
10548 return ConfigGetInt("varLiquidTypeInit");
10549 }
10550
10552 {
10554 }
10555
10557 {
10559 SetFrozen(false);
10560 }
10561
10564 {
10565 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10566 }
10567
10568
10571 {
10572 PlayerBase nplayer;
10573 if (PlayerBase.CastTo(nplayer, player))
10574 {
10576
10577 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
10578 }
10579 }
10580
10581
10584 {
10585 PlayerBase nplayer;
10586 if (PlayerBase.CastTo(nplayer,player))
10587 {
10588
10589 nplayer.SetEnableQuickBarEntityShortcut(this,false);
10590
10591 }
10592
10593
10594 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
10595
10596
10597 if (HasEnergyManager())
10598 {
10599 GetCompEM().UpdatePlugState();
10600 }
10601 }
10602
10603
10605 {
10606 super.OnPlacementStarted(player);
10607
10609 }
10610
10611 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
10612 {
10614 {
10615 m_AdminLog.OnPlacementComplete(player,
this);
10616 }
10617
10618 super.OnPlacementComplete(player, position, orientation);
10619 }
10620
10621
10622
10623
10624
10626 {
10628 {
10629 return true;
10630 }
10631 else
10632 {
10633 return false;
10634 }
10635 }
10636
10637
10639 {
10641 {
10643 }
10644 }
10645
10646
10648 {
10650 }
10651
10653 {
10655 }
10656
10657 override void InsertAgent(
int agent,
float count = 1)
10658 {
10659 if (count < 1)
10660 return;
10661
10663 }
10664
10667 {
10669 }
10670
10671
10673 {
10675 }
10676
10677
10678
10679
10680
10681
10682
10683
10684
10685
10686
10687
10688
10689
10690
10691
10692
10693
10694
10695
10696
10697
10698
10699
10700
10701
10702
10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10719 {
10721 return false;
10722 return true;
10723 }
10724
10726 {
10727
10729 }
10730
10731
10734 {
10735 super.CheckForRoofLimited(timeTresholdMS);
10736
10738 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
10739 {
10740 m_PreviousRoofTestTime = time;
10741 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
10742 }
10743 }
10744
10745
10747 {
10749 {
10750 return 0;
10751 }
10752
10753 if (GetInventory().GetAttachmentSlotsCount() != 0)
10754 {
10755 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
10756 if (filter)
10757 return filter.GetProtectionLevel(type, false, system);
10758 else
10759 return 0;
10760 }
10761
10762 string subclassPath, entryName;
10763
10764 switch (type)
10765 {
10767 entryName = "biological";
10768 break;
10770 entryName = "chemical";
10771 break;
10772 default:
10773 entryName = "biological";
10774 break;
10775 }
10776
10777 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
10778
10780 }
10781
10782
10783
10786 {
10787 if (!IsMagazine())
10789
10791 }
10792
10793
10794
10795
10796
10801 {
10802 return true;
10803 }
10804
10806 {
10808 }
10809
10810
10811
10812
10813
10815 {
10816 if (parent)
10817 {
10818 if (parent.IsInherited(DayZInfected))
10819 return true;
10820
10821 if (!parent.IsRuined())
10822 return true;
10823 }
10824
10825 return true;
10826 }
10827
10829 {
10830 if (!super.CanPutAsAttachment(parent))
10831 {
10832 return false;
10833 }
10834
10835 if (!IsRuined() && !parent.IsRuined())
10836 {
10837 return true;
10838 }
10839
10840 return false;
10841 }
10842
10844 {
10845
10846
10847
10848
10849 return super.CanReceiveItemIntoCargo(item);
10850 }
10851
10853 {
10854
10855
10856
10857
10858 GameInventory attachmentInv = attachment.GetInventory();
10860 {
10861 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
10862 return false;
10863 }
10864
10865 InventoryLocation loc = new InventoryLocation();
10866 attachment.GetInventory().GetCurrentInventoryLocation(loc);
10867 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
10868 return false;
10869
10870 return super.CanReceiveAttachment(attachment, slotId);
10871 }
10872
10874 {
10875 if (!super.CanReleaseAttachment(attachment))
10876 return false;
10877
10878 return GetInventory().AreChildrenAccessible();
10879 }
10880
10881
10882
10883
10884
10885
10886
10887
10888
10889
10890
10891
10892
10893
10894
10895
10896
10897
10898
10899
10900
10902 {
10903 int id = muzzle_owner.GetMuzzleID();
10904 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
10905
10906 if (WPOF_array)
10907 {
10908 for (int i = 0; i < WPOF_array.Count(); i++)
10909 {
10910 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
10911
10912 if (WPOF)
10913 {
10914 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
10915 }
10916 }
10917 }
10918 }
10919
10920
10922 {
10923 int id = muzzle_owner.GetMuzzleID();
10925
10926 if (WPOBE_array)
10927 {
10928 for (int i = 0; i < WPOBE_array.Count(); i++)
10929 {
10930 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
10931
10932 if (WPOBE)
10933 {
10934 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10935 }
10936 }
10937 }
10938 }
10939
10940
10942 {
10943 int id = muzzle_owner.GetMuzzleID();
10944 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10945
10946 if (WPOOH_array)
10947 {
10948 for (int i = 0; i < WPOOH_array.Count(); i++)
10949 {
10950 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10951
10952 if (WPOOH)
10953 {
10954 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
10955 }
10956 }
10957 }
10958 }
10959
10960
10962 {
10963 int id = muzzle_owner.GetMuzzleID();
10964 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10965
10966 if (WPOOH_array)
10967 {
10968 for (int i = 0; i < WPOOH_array.Count(); i++)
10969 {
10970 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10971
10972 if (WPOOH)
10973 {
10974 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10975 }
10976 }
10977 }
10978 }
10979
10980
10982 {
10983 int id = muzzle_owner.GetMuzzleID();
10984 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10985
10986 if (WPOOH_array)
10987 {
10988 for (int i = 0; i < WPOOH_array.Count(); i++)
10989 {
10990 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10991
10992 if (WPOOH)
10993 {
10994 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10995 }
10996 }
10997 }
10998 }
10999
11000
11001
11003 {
11005 {
11006 return true;
11007 }
11008
11009 return false;
11010 }
11011
11013 {
11015 {
11016 return true;
11017 }
11018
11019 return false;
11020 }
11021
11023 {
11025 {
11026 return true;
11027 }
11028
11029 return false;
11030 }
11031
11033 {
11034 return false;
11035 }
11036
11039 {
11040 return UATimeSpent.DEFAULT_DEPLOY;
11041 }
11042
11043
11044
11045
11047 {
11049 SetSynchDirty();
11050 }
11051
11053 {
11055 }
11056
11057
11059 {
11060 return false;
11061 }
11062
11065 {
11066 string att_type = "None";
11067
11068 if (ConfigIsExisting("soundAttType"))
11069 {
11070 att_type = ConfigGetString("soundAttType");
11071 }
11072
11074 }
11075
11077 {
11079 }
11080
11081
11082
11083
11084
11088
11090 {
11093
11095 }
11096
11097
11099 {
11101 return;
11102
11104
11107
11110
11111 SoundParameters params = new SoundParameters();
11115 }
11116
11117
11119 {
11121 return;
11122
11124 SetSynchDirty();
11125
11128 }
11129
11130
11132 {
11134 return;
11135
11137 SetSynchDirty();
11138
11141 }
11142
11144 {
11146 }
11147
11149 {
11151 }
11152
11155 {
11156 if (!
GetGame().IsDedicatedServer())
11157 {
11158 if (ConfigIsExisting("attachSoundSet"))
11159 {
11160 string cfg_path = "";
11161 string soundset = "";
11162 string type_name =
GetType();
11163
11166 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11167 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11168
11169 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11170 {
11171 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11172 {
11173 if (cfg_slot_array[i] == slot_type)
11174 {
11175 soundset = cfg_soundset_array[i];
11176 break;
11177 }
11178 }
11179 }
11180
11181 if (soundset != "")
11182 {
11183 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11185 }
11186 }
11187 }
11188 }
11189
11191 {
11192
11193 }
11194
11195 void OnApply(PlayerBase player);
11196
11198 {
11199 return 1.0;
11200 };
11201
11203 {
11205 }
11206
11208 {
11210 }
11211
11213
11215 {
11216 SetDynamicPhysicsLifeTime(0.01);
11218 }
11219
11221 {
11222 array<string> zone_names = new array<string>;
11223 GetDamageZones(zone_names);
11224 for (int i = 0; i < zone_names.Count(); i++)
11225 {
11226 SetHealthMax(zone_names.Get(i),"Health");
11227 }
11228 SetHealthMax("","Health");
11229 }
11230
11233 {
11234 float global_health = GetHealth01("","Health");
11235 array<string> zones = new array<string>;
11236 GetDamageZones(zones);
11237
11238 for (int i = 0; i < zones.Count(); i++)
11239 {
11240 SetHealth01(zones.Get(i),"Health",global_health);
11241 }
11242 }
11243
11246 {
11247 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11248 }
11249
11251 {
11252 if (!hasRootAsPlayer)
11253 {
11254 if (refParentIB)
11255 {
11256
11257 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11258 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11259
11260 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11261 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11262
11265 }
11266 else
11267 {
11268
11271 }
11272 }
11273 }
11274
11276 {
11278 {
11279 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11280 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11281 {
11282 float heatPermCoef = 1.0;
11284 while (ent)
11285 {
11286 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11287 ent = ent.GetHierarchyParent();
11288 }
11289
11290 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11291 }
11292 }
11293 }
11294
11296 {
11297
11298 EntityAI parent = GetHierarchyParent();
11299 if (!parent)
11300 {
11301 hasParent = false;
11302 hasRootAsPlayer = false;
11303 }
11304 else
11305 {
11306 hasParent = true;
11307 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11308 refParentIB =
ItemBase.Cast(parent);
11309 }
11310 }
11311
11312 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11313 {
11314
11315 }
11316
11318 {
11319
11320 return false;
11321 }
11322
11324 {
11325
11326
11327 return false;
11328 }
11329
11331 {
11332
11333 return false;
11334 }
11335
11338 {
11339 return !GetIsFrozen() &&
IsOpen();
11340 }
11341
11343 {
11344 bool hasParent = false, hasRootAsPlayer = false;
11346
11347 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
11348 bool foodDecay =
g_Game.IsFoodDecayEnabled();
11349
11350 if (wwtu || foodDecay)
11351 {
11355
11356 if (processWetness || processTemperature || processDecay)
11357 {
11359
11360 if (processWetness)
11361 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11362
11363 if (processTemperature)
11365
11366 if (processDecay)
11367 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11368 }
11369 }
11370 }
11371
11374 {
11376 }
11377
11379 {
11382
11383 return super.GetTemperatureFreezeThreshold();
11384 }
11385
11387 {
11390
11391 return super.GetTemperatureThawThreshold();
11392 }
11393
11395 {
11398
11399 return super.GetItemOverheatThreshold();
11400 }
11401
11403 {
11405 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
11406
11407 return super.GetTemperatureFreezeTime();
11408 }
11409
11411 {
11413 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
11414
11415 return super.GetTemperatureThawTime();
11416 }
11417
11422
11424 {
11425 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11426 }
11427
11429 {
11430 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11431 }
11432
11435 {
11437 }
11438
11440 {
11442 }
11443
11445 {
11447 }
11448
11451 {
11452 return null;
11453 }
11454
11457 {
11458 return false;
11459 }
11460
11462 {
11464 {
11467 if (!trg)
11468 {
11470 explosive = this;
11471 }
11472
11473 explosive.PairRemote(trg);
11475
11476 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
11477 trg.SetPersistentPairID(persistentID);
11478 explosive.SetPersistentPairID(persistentID);
11479
11480 return true;
11481 }
11482 return false;
11483 }
11484
11487 {
11488 float ret = 1.0;
11491 ret *= GetHealth01();
11492
11493 return ret;
11494 }
11495
11496 #ifdef DEVELOPER
11497 override void SetDebugItem()
11498 {
11499 super.SetDebugItem();
11500 _itemBase = this;
11501 }
11502
11504 {
11505 string text = super.GetDebugText();
11506
11508 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
11509
11510 return text;
11511 }
11512 #endif
11513
11515 {
11516 return true;
11517 }
11518
11520
11522
11524 {
11527 }
11528
11529
11537
11553}
11554
11556{
11558 if (entity)
11559 {
11560 bool is_item = entity.IsInherited(
ItemBase);
11561 if (is_item && full_quantity)
11562 {
11565 }
11566 }
11567 else
11568 {
11570 return NULL;
11571 }
11572 return entity;
11573}
11574
11576{
11577 if (item)
11578 {
11579 if (health > 0)
11580 item.SetHealth("", "", health);
11581
11582 if (item.CanHaveTemperature())
11583 {
11585 if (item.CanFreeze())
11586 item.SetFrozen(false);
11587 }
11588
11589 if (item.HasEnergyManager())
11590 {
11591 if (quantity >= 0)
11592 {
11593 item.GetCompEM().SetEnergy0To1(quantity);
11594 }
11595 else
11596 {
11598 }
11599 }
11600 else if (item.IsMagazine())
11601 {
11602 Magazine mag = Magazine.Cast(item);
11603 if (quantity >= 0)
11604 {
11605 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
11606 }
11607 else
11608 {
11610 }
11611
11612 }
11613 else
11614 {
11615 if (quantity >= 0)
11616 {
11617 item.SetQuantityNormalized(quantity, false);
11618 }
11619 else
11620 {
11622 }
11623
11624 }
11625 }
11626}
11627
11628#ifdef DEVELOPER
11630#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.