DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ OnCombine()

void SpawnItemOnLocation::OnCombine ( ItemBase other_item)
protected

См. определение в файле ItemBase.c строка 7224

7229{
7230 override bool CanPutAsAttachment(EntityAI parent)
7231 {
7232 return true;
7233 }
7234};
7235
7237{
7238
7239};
7240
7241//const bool QUANTITY_DEBUG_REMOVE_ME = false;
7242
7243class ItemBase extends InventoryItem
7244{
7248
7250
7251 static int m_DebugActionsMask;
7253 // ============================================
7254 // Variable Manipulation System
7255 // ============================================
7256 // Quantity
7257
7258 float m_VarQuantity;
7259 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
7261 int m_VarQuantityMin;
7262 int m_VarQuantityMax;
7263 int m_Count;
7264 float m_VarStackMax;
7265 float m_StoreLoadedQuantity = float.LOWEST;
7266 // Wet
7267 float m_VarWet;
7268 float m_VarWetPrev;//for client to know wetness changed during synchronization
7269 float m_VarWetInit;
7270 float m_VarWetMin;
7271 float m_VarWetMax;
7272 // Cleanness
7273 int m_Cleanness;
7274 int m_CleannessInit;
7275 int m_CleannessMin;
7276 int m_CleannessMax;
7277 // impact sounds
7279 bool m_CanPlayImpactSound = true;
7280 float m_ImpactSpeed;
7282 //
7283 float m_HeatIsolation;
7284 float m_ItemModelLength;
7285 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
7287 int m_VarLiquidType;
7288 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
7289 int m_QuickBarBonus;
7290 bool m_IsBeingPlaced;
7291 bool m_IsHologram;
7292 bool m_IsTakeable;
7293 bool m_ThrowItemOnDrop;
7296 bool m_FixDamageSystemInit = false; //can be changed on storage version check
7297 bool can_this_be_combined; //Check if item can be combined
7298 bool m_CanThisBeSplit; //Check if item can be split
7299 bool m_IsStoreLoad = false;
7300 bool m_CanShowQuantity;
7301 bool m_HasQuantityBar;
7302 protected bool m_CanBeDigged;
7303 protected bool m_IsResultOfSplit
7304
7305 string m_SoundAttType;
7306 // items color variables
7311 //-------------------------------------------------------
7312
7313 // light source managing
7315
7319
7320 //==============================================
7321 // agent system
7322 private int m_AttachedAgents;
7323
7325 void TransferModifiers(PlayerBase reciever);
7326
7327
7328 // Weapons & suppressors particle effects
7332 ref static map<string, int> m_WeaponTypeToID;
7333 static int m_LastRegisteredWeaponID = 0;
7334
7335 // Overheating effects
7337 float m_OverheatingShots;
7338 ref Timer m_CheckOverheating;
7339 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
7340 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
7341 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
7342 ref array <ref OverheatingParticle> m_OverheatingParticles;
7343
7345 protected bool m_HideSelectionsBySlot;
7346
7347 // Admin Log
7348 PluginAdminLog m_AdminLog;
7349
7350 // misc
7351 ref Timer m_PhysDropTimer;
7352
7353 // Attachment Locking variables
7354 ref array<int> m_CompatibleLocks;
7355 protected int m_LockType;
7356 protected ref EffectSound m_LockingSound;
7357 protected string m_LockSoundSet;
7358
7359 // ItemSoundHandler variables
7360 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
7361 protected int m_SoundSyncPlay; // id for sound to play
7362 protected int m_SoundSyncStop; // id for sound to stop
7363 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
7364
7366
7367 //temperature
7368 private float m_TemperaturePerQuantityWeight;
7369
7370 // -------------------------------------------------------------------------
7371 void ItemBase()
7372 {
7373 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
7377
7378 if (!g_Game.IsDedicatedServer())
7379 {
7380 if (HasMuzzle())
7381 {
7383
7385 {
7387 }
7388 }
7389
7391 m_ActionsInitialize = false;
7392 }
7393
7394 m_OldLocation = null;
7395
7396 if (g_Game.IsServer())
7397 {
7398 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
7399 }
7400
7401 if (ConfigIsExisting("headSelectionsToHide"))
7402 {
7404 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
7405 }
7406
7407 m_HideSelectionsBySlot = false;
7408 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7409 {
7410 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
7411 }
7412
7413 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
7414
7415 m_IsResultOfSplit = false;
7416
7418 }
7419
7420 override void InitItemVariables()
7421 {
7422 super.InitItemVariables();
7423
7424 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
7425 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
7426 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
7427 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
7428 m_VarStackMax = ConfigGetFloat("varStackMax");
7429 m_Count = ConfigGetInt("count");
7430
7431 m_CanShowQuantity = ConfigGetBool("quantityShow");
7432 m_HasQuantityBar = ConfigGetBool("quantityBar");
7433
7434 m_CleannessInit = ConfigGetInt("varCleannessInit");
7436 m_CleannessMin = ConfigGetInt("varCleannessMin");
7437 m_CleannessMax = ConfigGetInt("varCleannessMax");
7438
7439 m_WantPlayImpactSound = false;
7440 m_ImpactSpeed = 0.0;
7441
7442 m_VarWetInit = ConfigGetFloat("varWetInit");
7444 m_VarWetMin = ConfigGetFloat("varWetMin");
7445 m_VarWetMax = ConfigGetFloat("varWetMax");
7446
7447 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
7448 if (IsLiquidContainer() && GetQuantity() != 0)
7450 m_IsBeingPlaced = false;
7451 m_IsHologram = false;
7452 m_IsTakeable = true;
7453 m_CanBeMovedOverride = false;
7457 m_CanBeDigged = ConfigGetBool("canBeDigged");
7458
7459 m_CompatibleLocks = new array<int>();
7460 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
7461 m_LockType = ConfigGetInt("lockType");
7462
7463 //Define if item can be split and set ability to be combined accordingly
7464 m_CanThisBeSplit = false;
7465 can_this_be_combined = false;
7466 if (ConfigIsExisting("canBeSplit"))
7467 {
7468 can_this_be_combined = ConfigGetBool("canBeSplit");
7470 }
7471
7472 m_ItemBehaviour = -1;
7473 if (ConfigIsExisting("itemBehaviour"))
7474 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
7475
7476 //RegisterNetSyncVariableInt("m_VariablesMask");
7477 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
7478 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
7479 RegisterNetSyncVariableInt("m_VarLiquidType");
7480 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7481
7482 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7483 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7484 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7485
7486 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7487 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7488 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7489 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7490
7491 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7492 RegisterNetSyncVariableBool("m_IsTakeable");
7493 RegisterNetSyncVariableBool("m_IsHologram");
7494
7497 {
7498 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
7499 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
7500 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
7501 }
7502
7503 m_LockSoundSet = ConfigGetString("lockSoundSet");
7504
7506 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7507 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
7508
7509 m_SoundSyncSlotID = -1;
7510 }
7511
7512 override int GetQuickBarBonus()
7513 {
7514 return m_QuickBarBonus;
7515 }
7516
7517 void InitializeActions()
7518 {
7520 if (!m_InputActionMap)
7521 {
7523 m_InputActionMap = iam;
7524 SetActions();
7526 }
7527 }
7528
7529 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
7530 {
7532 {
7533 m_ActionsInitialize = true;
7535 }
7536
7537 actions = m_InputActionMap.Get(action_input_type);
7538 }
7539
7540 void SetActions()
7541 {
7542 AddAction(ActionTakeItem);
7543 AddAction(ActionTakeItemToHands);
7544 AddAction(ActionWorldCraft);
7546 AddAction(ActionAttachWithSwitch);
7547 }
7548
7549 void SetActionAnimOverrides(); // Override action animation for specific item
7550
7551 void AddAction(typename actionName)
7552 {
7553 ActionBase action = ActionManagerBase.GetAction(actionName);
7554
7555 if (!action)
7556 {
7557 Debug.LogError("Action " + actionName + " dosn't exist!");
7558 return;
7559 }
7560
7561 typename ai = action.GetInputType();
7562 if (!ai)
7563 {
7564 m_ActionsInitialize = false;
7565 return;
7566 }
7567
7568 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
7569 if (!action_array)
7570 {
7571 action_array = new array<ActionBase_Basic>;
7572 m_InputActionMap.Insert(ai, action_array);
7573 }
7574 if (LogManager.IsActionLogEnable())
7575 {
7576 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
7577 }
7578
7579 if (action_array.Find(action) != -1)
7580 {
7581 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
7582 }
7583 else
7584 {
7585 action_array.Insert(action);
7586 }
7587 }
7588
7589 void RemoveAction(typename actionName)
7590 {
7591 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
7592 ActionBase action = player.GetActionManager().GetAction(actionName);
7593 typename ai = action.GetInputType();
7594 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
7595
7596 if (action_array)
7597 {
7598 action_array.RemoveItem(action);
7599 }
7600 }
7601
7602 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
7603 // Set -1 for params which should stay in default state
7604 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
7605 {
7606 ActionOverrideData overrideData = new ActionOverrideData();
7607 overrideData.m_CommandUID = commandUID;
7608 overrideData.m_CommandUIDProne = commandUIDProne;
7609 overrideData.m_StanceMask = stanceMask;
7610
7611 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
7612 if (!actionMap) // create new map of action > overidables map
7613 {
7614 actionMap = new TActionAnimOverrideMap();
7615 m_ItemActionOverrides.Insert(action, actionMap);
7616 }
7617
7618 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
7619
7620 }
7621
7622 void OnItemInHandsPlayerSwimStart(PlayerBase player);
7623
7624 ScriptedLightBase GetLight();
7625
7626 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
7627 void LoadParticleConfigOnFire(int id)
7628 {
7629 if (!m_OnFireEffect)
7631
7634
7635 string config_to_search = "CfgVehicles";
7636 string muzzle_owner_config;
7637
7638 if (!m_OnFireEffect.Contains(id))
7639 {
7640 if (IsInherited(Weapon))
7641 config_to_search = "CfgWeapons";
7642
7643 muzzle_owner_config = config_to_search + " " + GetType() + " ";
7644
7645 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7646
7647 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
7648
7649 if (config_OnFire_subclass_count > 0)
7650 {
7651 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7652
7653 for (int i = 0; i < config_OnFire_subclass_count; i++)
7654 {
7655 string particle_class = "";
7656 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
7657 string config_OnFire_entry = config_OnFire_class + particle_class;
7658 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7659 WPOF_array.Insert(WPOF);
7660 }
7661
7662
7663 m_OnFireEffect.Insert(id, WPOF_array);
7664 }
7665 }
7666
7667 if (!m_OnBulletCasingEjectEffect.Contains(id))
7668 {
7669 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
7670 muzzle_owner_config = config_to_search + " " + GetType() + " ";
7671
7672 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7673
7674 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
7675
7676 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7677 {
7678 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7679
7680 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7681 {
7682 string particle_class2 = "";
7683 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
7684 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7685 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7686 WPOBE_array.Insert(WPOBE);
7687 }
7688
7689
7690 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
7691 }
7692 }
7693 }
7694
7695 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
7697 {
7700
7701 if (!m_OnOverheatingEffect.Contains(id))
7702 {
7703 string config_to_search = "CfgVehicles";
7704
7705 if (IsInherited(Weapon))
7706 config_to_search = "CfgWeapons";
7707
7708 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
7709 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7710
7711 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
7712 {
7713
7714 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
7715
7717 {
7718 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
7719 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7720 Error(error);
7721 return;
7722 }
7723
7724 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
7725 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
7726
7727
7728
7729 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
7730 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7731
7732 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7733 {
7734 string particle_class = "";
7735 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
7736 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7737 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
7738
7739 if (entry_type == CT_CLASS)
7740 {
7741 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7742 WPOOH_array.Insert(WPOF);
7743 }
7744 }
7745
7746
7747 m_OnOverheatingEffect.Insert(id, WPOOH_array);
7748 }
7749 }
7750 }
7751
7752 float GetOverheatingValue()
7753 {
7754 return m_OverheatingShots;
7755 }
7756
7757 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
7758 {
7759 if (m_MaxOverheatingValue > 0)
7760 {
7762
7763 if (!m_CheckOverheating)
7765
7767 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
7768
7769 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7770 }
7771 }
7772
7773 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7774 {
7776 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7777
7779 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7780
7782 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7783
7785 {
7787 }
7788 }
7789
7791 {
7793 }
7794
7795 void OnOverheatingDecay()
7796 {
7797 if (m_MaxOverheatingValue > 0)
7798 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
7799 else
7801
7802 if (m_OverheatingShots <= 0)
7803 {
7806 }
7807 else
7808 {
7809 if (!m_CheckOverheating)
7811
7813 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
7814 }
7815
7816 CheckOverheating(this, "", this);
7817 }
7818
7819 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7820 {
7822 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
7823 }
7824
7825 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7826 {
7828 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
7830 }
7831
7832 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
7833 {
7835 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7836 }
7837
7838 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
7839 {
7841 m_OverheatingParticles = new array<ref OverheatingParticle>;
7842
7843 OverheatingParticle OP = new OverheatingParticle();
7844 OP.RegisterParticle(p);
7845 OP.SetOverheatingLimitMin(min_heat_coef);
7846 OP.SetOverheatingLimitMax(max_heat_coef);
7847 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
7848
7849 m_OverheatingParticles.Insert(OP);
7850 }
7851
7852 float GetOverheatingCoef()
7853 {
7854 if (m_MaxOverheatingValue > 0)
7856
7857 return -1;
7858 }
7859
7861 {
7863 {
7864 float overheat_coef = GetOverheatingCoef();
7865 int count = m_OverheatingParticles.Count();
7866
7867 for (int i = count; i > 0; --i)
7868 {
7869 int id = i - 1;
7870 OverheatingParticle OP = m_OverheatingParticles.Get(id);
7871 Particle p = OP.GetParticle();
7872
7873 float overheat_min = OP.GetOverheatingLimitMin();
7874 float overheat_max = OP.GetOverheatingLimitMax();
7875
7876 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
7877 {
7878 if (p)
7879 {
7880 p.Stop();
7881 OP.RegisterParticle(null);
7882 }
7883 }
7884 }
7885 }
7886 }
7887
7889 {
7891 {
7892 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
7893 {
7894 int id = i - 1;
7895 OverheatingParticle OP = m_OverheatingParticles.Get(id);
7896
7897 if (OP)
7898 {
7899 Particle p = OP.GetParticle();
7900
7901 if (p)
7902 {
7903 p.Stop();
7904 }
7905
7906 delete OP;
7907 }
7908 }
7909
7910 m_OverheatingParticles.Clear();
7912 }
7913 }
7914
7916 float GetInfectionChance(int system = 0, Param param = null)
7917 {
7918 return 0.0;
7919 }
7920
7921
7922 float GetDisinfectQuantity(int system = 0, Param param1 = null)
7923 {
7924 return 250;//default value
7925 }
7926
7927 float GetFilterDamageRatio()
7928 {
7929 return 0;
7930 }
7931
7933 bool HasMuzzle()
7934 {
7935 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
7936 return true;
7937
7938 return false;
7939 }
7940
7942 int GetMuzzleID()
7943 {
7944 if (!m_WeaponTypeToID)
7945 m_WeaponTypeToID = new map<string, int>;
7946
7947 if (m_WeaponTypeToID.Contains(GetType()))
7948 {
7949 return m_WeaponTypeToID.Get(GetType());
7950 }
7951 else
7952 {
7953 // Register new weapon ID
7955 }
7956
7958 }
7959
7966 {
7967 return -1;
7968 }
7969
7970
7971
7972 // -------------------------------------------------------------------------
7973 void ~ItemBase()
7974 {
7975 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
7976 {
7977 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
7978 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7979
7980 if (r_index >= 0)
7981 {
7982 InventoryLocation r_il = new InventoryLocation;
7983 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7984
7985 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7986 int r_type = r_il.GetType();
7987 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
7988 {
7989 r_il.GetParent().GetOnReleaseLock().Invoke(this);
7990 }
7991 else if (r_type == InventoryLocationType.ATTACHMENT)
7992 {
7993 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
7994 }
7995
7996 }
7997
7998 player.GetHumanInventory().ClearUserReservedLocation(this);
7999 }
8000
8001 if (m_LockingSound)
8002 SEffectManager.DestroyEffect(m_LockingSound);
8003 }
8004
8005
8006
8007 // -------------------------------------------------------------------------
8008 static int GetDebugActionsMask()
8009 {
8010 return ItemBase.m_DebugActionsMask;
8011 }
8012
8013 static bool HasDebugActionsMask(int mask)
8014 {
8015 return ItemBase.m_DebugActionsMask & mask;
8016 }
8017
8018 static void SetDebugActionsMask(int mask)
8019 {
8020 ItemBase.m_DebugActionsMask = mask;
8021 }
8022
8023 static void AddDebugActionsMask(int mask)
8024 {
8025 ItemBase.m_DebugActionsMask |= mask;
8026 }
8027
8028 static void RemoveDebugActionsMask(int mask)
8029 {
8030 ItemBase.m_DebugActionsMask &= ~mask;
8031 }
8032
8033 static void ToggleDebugActionsMask(int mask)
8034 {
8035 if (HasDebugActionsMask(mask))
8036 {
8038 }
8039 else
8040 {
8041 AddDebugActionsMask(mask);
8042 }
8043 }
8044
8045 // -------------------------------------------------------------------------
8046 void SetCEBasedQuantity()
8047 {
8048 if (GetEconomyProfile())
8049 {
8050 float q_max = GetEconomyProfile().GetQuantityMax();
8051 if (q_max > 0)
8052 {
8053 float q_min = GetEconomyProfile().GetQuantityMin();
8054 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8055
8056 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
8057 {
8058 ComponentEnergyManager comp = GetCompEM();
8059 if (comp && (comp.GetEnergyMaxPristine() || comp.GetEnergyAtSpawn()))//checking for a potential for energy, we need to check both values, as both are optional, only when both are set to 0, we know the item can't have energy
8060 {
8061 comp.SetEnergy0To1(quantity_randomized);
8062 }
8063 }
8064 else if (HasQuantity())
8065 {
8066 SetQuantityNormalized(quantity_randomized, false);
8067 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
8068 }
8069
8070 }
8071 }
8072 }
8073
8075 void LockToParent()
8076 {
8077 EntityAI parent = GetHierarchyParent();
8078
8079 if (parent)
8080 {
8081 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8082 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8083 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
8084 }
8085 }
8086
8088 void UnlockFromParent()
8089 {
8090 EntityAI parent = GetHierarchyParent();
8091
8092 if (parent)
8093 {
8094 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8095 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8096 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
8097 }
8098 }
8099
8100 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
8101 {
8102 /*
8103 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
8104 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
8105 */
8106 ItemBase item2 = ItemBase.Cast(entity2);
8107
8108 if (g_Game.IsClient())
8109 {
8110 if (ScriptInputUserData.CanStoreInputUserData())
8111 {
8112 ScriptInputUserData ctx = new ScriptInputUserData;
8114 ctx.Write(-1);
8115 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8116 ctx.Write(i1);
8117 ctx.Write(item2);
8118 ctx.Write(use_stack_max);
8119 ctx.Write(-1);
8120 ctx.Send();
8121
8122 if (IsCombineAll(item2, use_stack_max))
8123 {
8124 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8125 }
8126 }
8127 }
8128 else if (!g_Game.IsMultiplayer())
8129 {
8130 CombineItems(item2, use_stack_max);
8131 }
8132 }
8133
8134 bool IsLiquidPresent()
8135 {
8136 return (GetLiquidType() != 0 && HasQuantity());
8137 }
8138
8139 bool IsLiquidContainer()
8140 {
8141 return m_LiquidContainerMask != 0;
8142 }
8143
8145 {
8146 return m_LiquidContainerMask;
8147 }
8148
8149 bool IsBloodContainer()
8150 {
8151 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
8152 return false;
8153 }
8154
8155 bool IsNVG()
8156 {
8157 return false;
8158 }
8159
8162 bool IsExplosive()
8163 {
8164 return false;
8165 }
8166
8168 {
8169 return "";
8170 }
8171
8173
8174 bool IsLightSource()
8175 {
8176 return false;
8177 }
8178
8180 {
8181 return true;
8182 }
8183
8184 //--- ACTION CONDITIONS
8185 //direction
8186 bool IsFacingPlayer(PlayerBase player, string selection)
8187 {
8188 return true;
8189 }
8190
8191 bool IsPlayerInside(PlayerBase player, string selection)
8192 {
8193 return true;
8194 }
8195
8196 override bool CanObstruct()
8197 {
8198 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8199 return !player || !IsPlayerInside(player, "");
8200 }
8201
8202 override bool IsBeingPlaced()
8203 {
8204 return m_IsBeingPlaced;
8205 }
8206
8207 void SetIsBeingPlaced(bool is_being_placed)
8208 {
8209 m_IsBeingPlaced = is_being_placed;
8210 if (!is_being_placed)
8212 SetSynchDirty();
8213 }
8214
8215 //server-side
8216 void OnEndPlacement() {}
8217
8218 override bool IsHologram()
8219 {
8220 return m_IsHologram;
8221 }
8222
8223 bool CanBeDigged()
8224 {
8225 return m_CanBeDigged;
8226 }
8227
8229 {
8230 return 1;
8231 }
8232
8233 bool CanMakeGardenplot()
8234 {
8235 return false;
8236 }
8237
8238 void SetIsHologram(bool is_hologram)
8239 {
8240 m_IsHologram = is_hologram;
8241 SetSynchDirty();
8242 }
8243 /*
8244 protected float GetNutritionalEnergy()
8245 {
8246 Edible_Base edible = Edible_Base.Cast(this);
8247 return edible.GetFoodEnergy();
8248 }
8249
8250 protected float GetNutritionalWaterContent()
8251 {
8252 Edible_Base edible = Edible_Base.Cast(this);
8253 return edible.GetFoodWater();
8254 }
8255
8256 protected float GetNutritionalIndex()
8257 {
8258 Edible_Base edible = Edible_Base.Cast(this);
8259 return edible.GetFoodNutritionalIndex();
8260 }
8261
8262 protected float GetNutritionalFullnessIndex()
8263 {
8264 Edible_Base edible = Edible_Base.Cast(this);
8265 return edible.GetFoodTotalVolume();
8266 }
8267
8268 protected float GetNutritionalToxicity()
8269 {
8270 Edible_Base edible = Edible_Base.Cast(this);
8271 return edible.GetFoodToxicity();
8272
8273 }
8274 */
8275
8276
8277 // -------------------------------------------------------------------------
8278 override void OnMovedInsideCargo(EntityAI container)
8279 {
8280 super.OnMovedInsideCargo(container);
8281
8282 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8283 }
8284
8285 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8286 {
8287 super.EEItemLocationChanged(oldLoc, newLoc);
8288
8289 PlayerBase newPlayer = null;
8290 PlayerBase oldPlayer = null;
8291
8292 if (newLoc.GetParent())
8293 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8294
8295 if (oldLoc.GetParent())
8296 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8297
8298 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
8299 {
8300 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
8301
8302 if (rIndex >= 0)
8303 {
8304 InventoryLocation rIl = new InventoryLocation;
8305 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
8306
8307 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
8308 int rType = rIl.GetType();
8309 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
8310 {
8311 rIl.GetParent().GetOnReleaseLock().Invoke(this);
8312 }
8313 else if (rType == InventoryLocationType.ATTACHMENT)
8314 {
8315 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
8316 }
8317
8318 }
8319 }
8320
8321 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
8322 {
8323 if (newPlayer)
8324 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
8325
8326 if (newPlayer == oldPlayer)
8327 {
8328 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8329 {
8330 if (oldLoc.GetType() == InventoryLocationType.CARGO)
8331 {
8332 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8333 {
8334 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8335 }
8336 }
8337 else
8338 {
8339 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8340 }
8341 }
8342
8343 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8344 {
8345 int type = oldLoc.GetType();
8346 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
8347 {
8348 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8349 }
8350 else if (type == InventoryLocationType.ATTACHMENT)
8351 {
8352 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8353 }
8354 }
8355 if (!m_OldLocation)
8356 {
8357 m_OldLocation = new InventoryLocation;
8358 }
8359 m_OldLocation.Copy(oldLoc);
8360 }
8361 else
8362 {
8363 if (m_OldLocation)
8364 {
8365 m_OldLocation.Reset();
8366 }
8367 }
8368
8369 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
8370 }
8371 else
8372 {
8373 if (newPlayer)
8374 {
8375 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8376 if (resIndex >= 0)
8377 {
8378 InventoryLocation il = new InventoryLocation;
8379 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
8380 ItemBase it = ItemBase.Cast(il.GetItem());
8381 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
8382 int rel_type = il.GetType();
8383 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
8384 {
8385 il.GetParent().GetOnReleaseLock().Invoke(it);
8386 }
8387 else if (rel_type == InventoryLocationType.ATTACHMENT)
8388 {
8389 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
8390 }
8391 //it.GetOnReleaseLock().Invoke(it);
8392 }
8393 }
8394 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
8395 {
8396 //ThrowPhysically(oldPlayer, vector.Zero);
8397 m_ThrowItemOnDrop = false;
8398 }
8399
8400 if (m_OldLocation)
8401 {
8402 m_OldLocation.Reset();
8403 }
8404 }
8405
8406 if (oldLoc.GetType() == InventoryLocationType.TEMP)
8407 {
8408 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
8409 }
8410
8411 if (newLoc.GetType() == InventoryLocationType.TEMP)
8412 {
8413 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
8414 }
8415 }
8416
8417 override void EOnContact(IEntity other, Contact extra)
8418 {
8420 {
8421 int liquidType = -1;
8422 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
8423 if (impactSpeed > 0.0)
8424 {
8425 m_ImpactSpeed = impactSpeed;
8426 #ifndef SERVER
8427 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
8428 #else
8429 m_WantPlayImpactSound = true;
8430 SetSynchDirty();
8431 #endif
8432 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
8433 }
8434 }
8435
8436 #ifdef SERVER
8437 if (GetCompEM() && GetCompEM().IsPlugged())
8438 {
8439 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
8440 GetCompEM().UnplugThis();
8441 }
8442 #endif
8443 }
8444
8445 void RefreshPhysics();
8446
8447 override void OnCreatePhysics()
8448 {
8450 }
8451
8452 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8453 {
8454
8455 }
8456 // -------------------------------------------------------------------------
8457 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
8458 {
8459 super.OnItemLocationChanged(old_owner, new_owner);
8460
8461 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8462 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8463
8464 if (!relatedPlayer && playerNew)
8465 relatedPlayer = playerNew;
8466
8467 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8468 {
8469 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
8470 if (actionMgr)
8471 {
8472 ActionBase currentAction = actionMgr.GetRunningAction();
8473 if (currentAction)
8474 currentAction.OnItemLocationChanged(this);
8475 }
8476 }
8477
8478 Man ownerPlayerOld = null;
8479 Man ownerPlayerNew = null;
8480
8481 if (old_owner)
8482 {
8483 if (old_owner.IsMan())
8484 {
8485 ownerPlayerOld = Man.Cast(old_owner);
8486 }
8487 else
8488 {
8489 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8490 }
8491 }
8492 else
8493 {
8494 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
8495 {
8496 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
8497
8498 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
8499 {
8500 GetCompEM().UnplugThis();
8501 }
8502 }
8503 }
8504
8505 if (new_owner)
8506 {
8507 if (new_owner.IsMan())
8508 {
8509 ownerPlayerNew = Man.Cast(new_owner);
8510 }
8511 else
8512 {
8513 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8514 }
8515 }
8516
8517 if (ownerPlayerOld != ownerPlayerNew)
8518 {
8519 if (ownerPlayerOld)
8520 {
8521 array<EntityAI> subItemsExit = new array<EntityAI>;
8522 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
8523 for (int i = 0; i < subItemsExit.Count(); i++)
8524 {
8525 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
8526 itemExit.OnInventoryExit(ownerPlayerOld);
8527 }
8528 }
8529
8530 if (ownerPlayerNew)
8531 {
8532 array<EntityAI> subItemsEnter = new array<EntityAI>;
8533 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
8534 for (int j = 0; j < subItemsEnter.Count(); j++)
8535 {
8536 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
8537 itemEnter.OnInventoryEnter(ownerPlayerNew);
8538 }
8539 }
8540 }
8541 else if (ownerPlayerNew != null)
8542 {
8543 PlayerBase nplayer;
8544 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8545 {
8546 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8547 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
8548 for (int k = 0; k < subItemsUpdate.Count(); k++)
8549 {
8550 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
8551 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8552 }
8553 }
8554 }
8555
8556 if (old_owner)
8557 old_owner.OnChildItemRemoved(this);
8558 if (new_owner)
8559 new_owner.OnChildItemReceived(this);
8560 }
8561
8562 // -------------------------------------------------------------------------------
8563 override void EEDelete(EntityAI parent)
8564 {
8565 super.EEDelete(parent);
8566 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8567 if (player)
8568 {
8569 OnInventoryExit(player);
8570
8571 if (player.IsAlive())
8572 {
8573 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8574 if (r_index >= 0)
8575 {
8576 InventoryLocation r_il = new InventoryLocation;
8577 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8578
8579 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8580 int r_type = r_il.GetType();
8581 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8582 {
8583 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8584 }
8585 else if (r_type == InventoryLocationType.ATTACHMENT)
8586 {
8587 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8588 }
8589
8590 }
8591
8592 player.RemoveQuickBarEntityShortcut(this);
8593 }
8594 }
8595 }
8596 // -------------------------------------------------------------------------------
8597 override void EEKilled(Object killer)
8598 {
8599 super.EEKilled(killer);
8600
8602 if (killer && killer.IsFireplace() && CanExplodeInFire())
8603 {
8604 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8605 {
8606 if (IsMagazine())
8607 {
8608 if (Magazine.Cast(this).GetAmmoCount() > 0)
8609 {
8610 ExplodeAmmo();
8611 }
8612 }
8613 else
8614 {
8615 Explode(DamageType.EXPLOSION);
8616 }
8617 }
8618 }
8619 }
8620
8621 override void OnWasAttached(EntityAI parent, int slot_id)
8622 {
8623 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8624
8625 super.OnWasAttached(parent, slot_id);
8626
8627 if (HasQuantity())
8628 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8629
8630 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
8631 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
8632 }
8633
8634 override void OnWasDetached(EntityAI parent, int slot_id)
8635 {
8636 super.OnWasDetached(parent, slot_id);
8637
8638 if (HasQuantity())
8639 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8640
8641 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
8642 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
8643 }
8644
8645 override string ChangeIntoOnAttach(string slot)
8646 {
8647 int idx;
8648 TStringArray inventory_slots = new TStringArray;
8649 TStringArray attach_types = new TStringArray;
8650
8651 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8652 if (inventory_slots.Count() < 1) //is string
8653 {
8654 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8655 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8656 }
8657 else //is array
8658 {
8659 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8660 }
8661
8662 idx = inventory_slots.Find(slot);
8663 if (idx < 0)
8664 return "";
8665
8666 return attach_types.Get(idx);
8667 }
8668
8669 override string ChangeIntoOnDetach()
8670 {
8671 int idx = -1;
8672 string slot;
8673
8674 TStringArray inventory_slots = new TStringArray;
8675 TStringArray detach_types = new TStringArray;
8676
8677 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8678 if (inventory_slots.Count() < 1) //is string
8679 {
8680 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8681 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8682 }
8683 else //is array
8684 {
8685 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8686 if (detach_types.Count() < 1)
8687 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8688 }
8689
8690 for (int i = 0; i < inventory_slots.Count(); i++)
8691 {
8692 slot = inventory_slots.Get(i);
8693 }
8694
8695 if (slot != "")
8696 {
8697 if (detach_types.Count() == 1)
8698 idx = 0;
8699 else
8700 idx = inventory_slots.Find(slot);
8701 }
8702 if (idx < 0)
8703 return "";
8704
8705 return detach_types.Get(idx);
8706 }
8707
8708 void ExplodeAmmo()
8709 {
8710 //timer
8711 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
8712
8713 //min/max time
8714 float min_time = 1;
8715 float max_time = 3;
8716 float delay = Math.RandomFloat(min_time, max_time);
8717
8718 explode_timer.Run(delay, this, "DoAmmoExplosion");
8719 }
8720
8721 void DoAmmoExplosion()
8722 {
8723 Magazine magazine = Magazine.Cast(this);
8724 int pop_sounds_count = 6;
8725 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8726
8727 //play sound
8728 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8729 string sound_name = pop_sounds[ sound_idx ];
8730 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
8731
8732 //remove ammo count
8733 magazine.ServerAddAmmoCount(-1);
8734
8735 //if condition then repeat -> ExplodeAmmo
8736 float min_temp_to_explode = 100; //min temperature for item to explode
8737
8738 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
8739 {
8740 ExplodeAmmo();
8741 }
8742 }
8743
8744 // -------------------------------------------------------------------------------
8745 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
8746 {
8747 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
8748
8749 const int CHANCE_DAMAGE_CARGO = 4;
8750 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8751 const int CHANCE_DAMAGE_NOTHING = 2;
8752
8753 if (IsClothing() || IsContainer() || IsItemTent())
8754 {
8755 float dmg = damageResult.GetDamage("","Health") * -0.5;
8756 int chances;
8757 int rnd;
8758
8759 if (GetInventory().GetCargo())
8760 {
8761 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8762 rnd = Math.RandomInt(0,chances);
8763
8764 if (rnd < CHANCE_DAMAGE_CARGO)
8765 {
8766 DamageItemInCargo(dmg);
8767 }
8768 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8769 {
8771 }
8772 }
8773 else
8774 {
8775 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8776 rnd = Math.RandomInt(0,chances);
8777
8778 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8779 {
8781 }
8782 }
8783 }
8784 }
8785
8786 bool DamageItemInCargo(float damage)
8787 {
8788 CargoBase cargo = GetInventory().GetCargo();
8789 if (cargo)
8790 {
8791 int item_count = cargo.GetItemCount();
8792 if (item_count > 0)
8793 {
8794 int random_pick = Math.RandomInt(0, item_count);
8795 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
8796 if (!item.IsExplosive())
8797 {
8798 item.AddHealth("","",damage);
8799 return true;
8800 }
8801 }
8802 }
8803 return false;
8804 }
8805
8806 bool DamageItemAttachments(float damage)
8807 {
8808 GameInventory inventory = GetInventory();
8809 int attachment_count = inventory.AttachmentCount();
8810 if (attachment_count > 0)
8811 {
8812 int random_pick = Math.RandomInt(0, attachment_count);
8813 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
8814 if (!attachment.IsExplosive())
8815 {
8816 attachment.AddHealth("","",damage);
8817 return true;
8818 }
8819 }
8820 return false;
8821 }
8822
8823 override bool IsSplitable()
8824 {
8825 return m_CanThisBeSplit;
8826 }
8827 //----------------
8828 override bool CanBeSplit()
8829 {
8830 if (IsSplitable() && (GetQuantity() > 1))
8831 return GetInventory().CanRemoveEntity();
8832
8833 return false;
8834 }
8835
8836 protected bool ShouldSplitQuantity(float quantity)
8837 {
8838 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
8839 if (!IsSplitable())
8840 return false;
8841
8842 // nothing to split?
8843 if (GetQuantity() <= 1)
8844 return false;
8845
8846 // check if we should re-use the item instead of creating a new copy?
8847 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
8848 int delta = GetQuantity() - quantity;
8849 if (delta == 0)
8850 return false;
8851
8852 // valid to split
8853 return true;
8854 }
8855
8856 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
8857 {
8858 if (g_Game.IsClient())
8859 {
8860 if (ScriptInputUserData.CanStoreInputUserData())
8861 {
8862 ScriptInputUserData ctx = new ScriptInputUserData;
8864 ctx.Write(1);
8865 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8866 ctx.Write(i1);
8867 ctx.Write(destination_entity);
8868 ctx.Write(true);
8869 ctx.Write(slot_id);
8870 ctx.Send();
8871 }
8872 }
8873 else if (!g_Game.IsMultiplayer())
8874 {
8875 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
8876 }
8877 }
8878
8879 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
8880 {
8881 float split_quantity_new;
8882 ItemBase new_item;
8883 float quantity = GetQuantity();
8884 float stack_max = GetTargetQuantityMax(slot_id);
8885 InventoryLocation loc = new InventoryLocation;
8886
8887 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8888 {
8889 if (stack_max <= GetQuantity())
8890 split_quantity_new = stack_max;
8891 else
8892 split_quantity_new = GetQuantity();
8893
8894 if (ShouldSplitQuantity(split_quantity_new))
8895 {
8896 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
8897 if (new_item)
8898 {
8899 new_item.SetResultOfSplit(true);
8900 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8901 AddQuantity(-split_quantity_new, false, true);
8902 new_item.SetQuantity(split_quantity_new, false, true);
8903 }
8904 }
8905 }
8906 else if (destination_entity && slot_id == -1)
8907 {
8908 if (quantity > stack_max)
8909 split_quantity_new = stack_max;
8910 else
8911 split_quantity_new = quantity;
8912
8913 if (ShouldSplitQuantity(split_quantity_new))
8914 {
8915 GameInventory destinationInventory = destination_entity.GetInventory();
8916 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
8917 {
8918 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
8919 new_item = ItemBase.Cast(o);
8920 }
8921
8922 if (new_item)
8923 {
8924 new_item.SetResultOfSplit(true);
8925 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8926 AddQuantity(-split_quantity_new, false, true);
8927 new_item.SetQuantity(split_quantity_new, false, true);
8928 }
8929 }
8930 }
8931 else
8932 {
8933 if (stack_max != 0)
8934 {
8935 if (stack_max < GetQuantity())
8936 {
8937 split_quantity_new = GetQuantity() - stack_max;
8938 }
8939
8940 if (split_quantity_new == 0)
8941 {
8942 if (!g_Game.IsMultiplayer())
8943 player.PhysicalPredictiveDropItem(this);
8944 else
8945 player.ServerDropEntity(this);
8946 return;
8947 }
8948
8949 if (ShouldSplitQuantity(split_quantity_new))
8950 {
8951 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
8952
8953 if (new_item)
8954 {
8955 new_item.SetResultOfSplit(true);
8956 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8957 SetQuantity(split_quantity_new, false, true);
8958 new_item.SetQuantity(stack_max, false, true);
8959 new_item.PlaceOnSurface();
8960 }
8961 }
8962 }
8963 }
8964 }
8965
8966 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
8967 {
8968 float split_quantity_new;
8969 ItemBase new_item;
8970 float quantity = GetQuantity();
8971 float stack_max = GetTargetQuantityMax(slot_id);
8972 InventoryLocation loc = new InventoryLocation;
8973
8974 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
8975 {
8976 if (stack_max <= GetQuantity())
8977 split_quantity_new = stack_max;
8978 else
8979 split_quantity_new = GetQuantity();
8980
8981 if (ShouldSplitQuantity(split_quantity_new))
8982 {
8983 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
8984 if (new_item)
8985 {
8986 new_item.SetResultOfSplit(true);
8987 MiscGameplayFunctions.TransferItemProperties(this, new_item);
8988 AddQuantity(-split_quantity_new, false, true);
8989 new_item.SetQuantity(split_quantity_new, false, true);
8990 }
8991 }
8992 }
8993 else if (destination_entity && slot_id == -1)
8994 {
8995 if (quantity > stack_max)
8996 split_quantity_new = stack_max;
8997 else
8998 split_quantity_new = quantity;
8999
9000 if (ShouldSplitQuantity(split_quantity_new))
9001 {
9002 GameInventory destinationInventory = destination_entity.GetInventory();
9003 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9004 {
9005 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9006 new_item = ItemBase.Cast(o);
9007 }
9008
9009 if (new_item)
9010 {
9011 new_item.SetResultOfSplit(true);
9012 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9013 AddQuantity(-split_quantity_new, false, true);
9014 new_item.SetQuantity(split_quantity_new, false, true);
9015 }
9016 }
9017 }
9018 else
9019 {
9020 if (stack_max != 0)
9021 {
9022 if (stack_max < GetQuantity())
9023 {
9024 split_quantity_new = GetQuantity() - stack_max;
9025 }
9026
9027 if (ShouldSplitQuantity(split_quantity_new))
9028 {
9029 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9030
9031 if (new_item)
9032 {
9033 new_item.SetResultOfSplit(true);
9034 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9035 SetQuantity(split_quantity_new, false, true);
9036 new_item.SetQuantity(stack_max, false, true);
9037 new_item.PlaceOnSurface();
9038 }
9039 }
9040 }
9041 }
9042 }
9043
9044 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
9045 {
9046 if (g_Game.IsClient())
9047 {
9048 if (ScriptInputUserData.CanStoreInputUserData())
9049 {
9050 ScriptInputUserData ctx = new ScriptInputUserData;
9052 ctx.Write(4);
9053 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9054 ctx.Write(thiz);
9055 dst.WriteToContext(ctx);
9056 ctx.Send();
9057 }
9058 }
9059 else if (!g_Game.IsMultiplayer())
9060 {
9062 }
9063 }
9064
9065 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
9066 {
9067 if (g_Game.IsClient())
9068 {
9069 if (ScriptInputUserData.CanStoreInputUserData())
9070 {
9071 ScriptInputUserData ctx = new ScriptInputUserData;
9073 ctx.Write(2);
9074 ItemBase dummy = this; // @NOTE: workaround for correct serialization
9075 ctx.Write(dummy);
9076 ctx.Write(destination_entity);
9077 ctx.Write(true);
9078 ctx.Write(idx);
9079 ctx.Write(row);
9080 ctx.Write(col);
9081 ctx.Send();
9082 }
9083 }
9084 else if (!g_Game.IsMultiplayer())
9085 {
9086 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
9087 }
9088 }
9089
9090 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
9091 {
9093 }
9094
9095 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
9096 {
9097 float quantity = GetQuantity();
9098 float split_quantity_new;
9099 ItemBase new_item;
9100 if (dst.IsValid())
9101 {
9102 int slot_id = dst.GetSlot();
9103 float stack_max = GetTargetQuantityMax(slot_id);
9104
9105 if (quantity > stack_max)
9106 split_quantity_new = stack_max;
9107 else
9108 split_quantity_new = quantity;
9109
9110 if (ShouldSplitQuantity(split_quantity_new))
9111 {
9112 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9113
9114 if (new_item)
9115 {
9116 new_item.SetResultOfSplit(true);
9117 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9118 AddQuantity(-split_quantity_new, false, true);
9119 new_item.SetQuantity(split_quantity_new, false, true);
9120 }
9121
9122 return new_item;
9123 }
9124 }
9125
9126 return null;
9127 }
9128
9129 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
9130 {
9131 float quantity = GetQuantity();
9132 float split_quantity_new;
9133 ItemBase new_item;
9134 if (destination_entity)
9135 {
9136 float stackable = GetTargetQuantityMax();
9137 if (quantity > stackable)
9138 split_quantity_new = stackable;
9139 else
9140 split_quantity_new = quantity;
9141
9142 if (ShouldSplitQuantity(split_quantity_new))
9143 {
9144 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
9145 if (new_item)
9146 {
9147 new_item.SetResultOfSplit(true);
9148 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9149 AddQuantity(-split_quantity_new, false, true);
9150 new_item.SetQuantity(split_quantity_new, false, true);
9151 }
9152 }
9153 }
9154 }
9155
9156 void SplitIntoStackMaxHandsClient(PlayerBase player)
9157 {
9158 if (g_Game.IsClient())
9159 {
9160 if (ScriptInputUserData.CanStoreInputUserData())
9161 {
9162 ScriptInputUserData ctx = new ScriptInputUserData;
9164 ctx.Write(3);
9165 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9166 ctx.Write(i1);
9167 ItemBase destination_entity = this;
9168 ctx.Write(destination_entity);
9169 ctx.Write(true);
9170 ctx.Write(0);
9171 ctx.Send();
9172 }
9173 }
9174 else if (!g_Game.IsMultiplayer())
9175 {
9176 SplitIntoStackMaxHands(player);
9177 }
9178 }
9179
9180 void SplitIntoStackMaxHands(PlayerBase player)
9181 {
9182 float quantity = GetQuantity();
9183 float split_quantity_new;
9184 ref ItemBase new_item;
9185 if (player)
9186 {
9187 float stackable = GetTargetQuantityMax();
9188 if (quantity > stackable)
9189 split_quantity_new = stackable;
9190 else
9191 split_quantity_new = quantity;
9192
9193 if (ShouldSplitQuantity(split_quantity_new))
9194 {
9195 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
9196 new_item = ItemBase.Cast(in_hands);
9197 if (new_item)
9198 {
9199 new_item.SetResultOfSplit(true);
9200 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9201 AddQuantity(-split_quantity_new, false, true);
9202 new_item.SetQuantity(split_quantity_new, false, true);
9203 }
9204 }
9205 }
9206 }
9207
9208 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
9209 {
9210 float quantity = GetQuantity();
9211 float split_quantity_new = Math.Floor(quantity * 0.5);
9212
9213 if (!ShouldSplitQuantity(split_quantity_new))
9214 return;
9215
9216 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9217
9218 if (new_item)
9219 {
9220 if (new_item.GetQuantityMax() < split_quantity_new)
9221 {
9222 split_quantity_new = new_item.GetQuantityMax();
9223 }
9224
9225 new_item.SetResultOfSplit(true);
9226 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9227
9228 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9229 {
9230 AddQuantity(-1, false, true);
9231 new_item.SetQuantity(1, false, true);
9232 }
9233 else
9234 {
9235 AddQuantity(-split_quantity_new, false, true);
9236 new_item.SetQuantity(split_quantity_new, false, true);
9237 }
9238 }
9239 }
9240
9241 void SplitItem(PlayerBase player)
9242 {
9243 float quantity = GetQuantity();
9244 float split_quantity_new = Math.Floor(quantity / 2);
9245
9246 if (!ShouldSplitQuantity(split_quantity_new))
9247 return;
9248
9249 InventoryLocation invloc = new InventoryLocation;
9250 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
9251
9252 ItemBase new_item;
9253 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9254
9255 if (new_item)
9256 {
9257 if (new_item.GetQuantityMax() < split_quantity_new)
9258 {
9259 split_quantity_new = new_item.GetQuantityMax();
9260 }
9261 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9262 {
9263 AddQuantity(-1, false, true);
9264 new_item.SetQuantity(1, false, true);
9265 }
9266 else if (split_quantity_new > 1)
9267 {
9268 AddQuantity(-split_quantity_new, false, true);
9269 new_item.SetQuantity(split_quantity_new, false, true);
9270 }
9271 }
9272 }
9273
9275 void OnQuantityChanged(float delta)
9276 {
9277 SetWeightDirty();
9278 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
9279
9280 if (parent)
9281 parent.OnAttachmentQuantityChangedEx(this, delta);
9282
9283 if (IsLiquidContainer())
9284 {
9285 if (GetQuantityNormalized() <= 0.0)
9286 {
9288 }
9289 else if (GetLiquidType() == LIQUID_NONE)
9290 {
9291 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
9293 }
9294 }
9295 }
9296
9299 {
9300 // insert code here
9301 }
9302
9304 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
9305 {
9307 }
9308
9309 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
9310 {
9311 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9312
9313 if (g_Game.IsServer())
9314 {
9315 if (newLevel == GameConstants.STATE_RUINED)
9316 {
9318 EntityAI parent = GetHierarchyParent();
9319 if (parent && parent.IsFireplace())
9320 {
9321 CargoBase cargo = GetInventory().GetCargo();
9322 if (cargo)
9323 {
9324 for (int i = 0; i < cargo.GetItemCount(); ++i)
9325 {
9326 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
9327 }
9328 }
9329 }
9330 }
9331
9332 if (IsResultOfSplit())
9333 {
9334 // reset the splitting result flag, return to normal item behavior
9335 SetResultOfSplit(false);
9336 return;
9337 }
9338
9339 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9340 {
9341 SetCleanness(0);//unclean the item upon damage dealt
9342 }
9343 }
9344 }
9345
9346 // just the split? TODO: verify
9347 override void OnRightClick()
9348 {
9349 super.OnRightClick();
9350
9351 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
9352 {
9353 if (g_Game.IsClient())
9354 {
9355 if (ScriptInputUserData.CanStoreInputUserData())
9356 {
9357 EntityAI root = GetHierarchyRoot();
9358 Man playerOwner = GetHierarchyRootPlayer();
9359 InventoryLocation dst = new InventoryLocation;
9360
9361 // If we have no hierarchy root player and the root is the same as this item the source item is in the vicinity so we want to create the new split item there also
9362 if (!playerOwner && root && root == this)
9363 {
9365 }
9366 else
9367 {
9368 // Check if we can place the new split item in the same parent where the source item is placed in or otherwise drop it in vicinity
9369 GetInventory().GetCurrentInventoryLocation(dst);
9370 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
9371 {
9372 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9373 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
9374 {
9376 }
9377 else
9378 {
9379 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
9380 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
9381 this shouldnt cause issues within this scope*/
9382 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
9383 {
9385 }
9386 else
9387 {
9388 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9389 }
9390 }
9391 }
9392 }
9393
9394 ScriptInputUserData ctx = new ScriptInputUserData;
9396 ctx.Write(4);
9397 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9398 ctx.Write(thiz);
9399 dst.WriteToContext(ctx);
9400 ctx.Write(true); // dummy
9401 ctx.Send();
9402 }
9403 }
9404 else if (!g_Game.IsMultiplayer())
9405 {
9406 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
9407 }
9408 }
9409 }
9410
9411 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
9412 {
9413 if (root)
9414 {
9415 vector m4[4];
9416 root.GetTransform(m4);
9417 dst.SetGround(this, m4);
9418 }
9419 else
9420 {
9421 GetInventory().GetCurrentInventoryLocation(dst);
9422 }
9423 }
9424
9425 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
9426 {
9427 //TODO: delete check zero quantity check after fix double posts hands fsm events
9428 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
9429 return false;
9430
9431 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9432 return false;
9433
9434 //can_this_be_combined = ConfigGetBool("canBeSplit");
9436 return false;
9437
9438
9439 Magazine mag = Magazine.Cast(this);
9440 if (mag)
9441 {
9442 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9443 return false;
9444
9445 if (stack_max_limit)
9446 {
9447 Magazine other_mag = Magazine.Cast(other_item);
9448 if (other_item)
9449 {
9450 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9451 return false;
9452 }
9453
9454 }
9455 }
9456 else
9457 {
9458 //TODO: delete check zero quantity check after fix double posts hands fsm events
9459 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
9460 return false;
9461
9462 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
9463 return false;
9464 }
9465
9466 PlayerBase player = null;
9467 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
9468 {
9469 if (player.GetInventory().HasAttachment(this))
9470 return false;
9471
9472 if (player.IsItemsToDelete())
9473 return false;
9474 }
9475
9476 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9477 return false;
9478
9479 int slotID;
9480 string slotName;
9481 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9482 return false;
9483
9484 return true;
9485 }
9486
9487 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
9488 {
9489 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
9490 }
9491
9492 bool IsResultOfSplit()
9493 {
9494 return m_IsResultOfSplit;
9495 }
9496
9497 void SetResultOfSplit(bool value)
9498 {
9499 m_IsResultOfSplit = value;
9500 }
9501
9502 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
9503 {
9504 return ComputeQuantityUsedEx(other_item, use_stack_max);
9505 }
9506
9507 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
9508 {
9509 float other_item_quantity = other_item.GetQuantity();
9510 float this_free_space;
9511
9512 float stack_max = GetQuantityMax();
9513
9514 this_free_space = stack_max - GetQuantity();
9515
9516 if (other_item_quantity > this_free_space)
9517 {
9518 return this_free_space;
9519 }
9520 else
9521 {
9522 return other_item_quantity;
9523 }
9524 }
9525
9526 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
9527 {
9528 CombineItems(ItemBase.Cast(entity2),use_stack_max);
9529 }
9530
9531 void CombineItems(ItemBase other_item, bool use_stack_max = true)
9532 {
9533 if (!CanBeCombined(other_item, false))
9534 return;
9535
9536 if (!IsMagazine() && other_item)
9537 {
9538 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
9539 if (quantity_used != 0)
9540 {
9541 float hp1 = GetHealth01("","");
9542 float hp2 = other_item.GetHealth01("","");
9543 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
9544 hpResult = hpResult / (GetQuantity() + quantity_used);
9545
9546 hpResult *= GetMaxHealth();
9547 Math.Round(hpResult);
9548 SetHealth("", "Health", hpResult);
9549
9550 AddQuantity(quantity_used);
9551 other_item.AddQuantity(-quantity_used);
9552 }
9553 }
9554 OnCombine(other_item);
9555 }
9556
9557 void OnCombine(ItemBase other_item)
9558 {
9559 #ifdef SERVER
9560 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9561 GetHierarchyParent().IncreaseLifetimeUp();
9562 #endif
9563 };
9564
9565 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
9566 {
9567 PlayerBase p = PlayerBase.Cast(player);
9568
9569 array<int> recipesIds = p.m_Recipes;
9570 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
9571 if (moduleRecipesManager)
9572 {
9573 EntityAI itemInHands = player.GetEntityInHands();
9574 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
9575 }
9576
9577 for (int i = 0;i < recipesIds.Count(); i++)
9578 {
9579 int key = recipesIds.Get(i);
9580 string recipeName = moduleRecipesManager.GetRecipeName(key);
9581 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
9582 }
9583 }
9584
9585 // -------------------------------------------------------------------------
9586 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9587 {
9588 super.GetDebugActions(outputList);
9589
9590 //quantity
9591 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
9592 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
9593 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
9594 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
9595 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9596
9597 //health
9598 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
9599 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
9600 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
9601 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9602 //temperature
9603 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
9604 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
9605 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
9606 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9607
9608 //wet
9609 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
9610 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
9611 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9612
9613 //liquidtype
9614 if (IsLiquidContainer())
9615 {
9616 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
9617 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
9618 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9619 }
9620
9621 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
9622 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9623
9624 // watch
9625 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
9626 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
9627 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9628
9629 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
9630
9631 InventoryLocation loc = new InventoryLocation();
9632 GetInventory().GetCurrentInventoryLocation(loc);
9633 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
9634 {
9635 if (Gizmo_IsSupported())
9636 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
9637 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
9638 }
9639
9640 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
9641 }
9642
9643 // -------------------------------------------------------------------------
9644 // -------------------------------------------------------------------------
9645 // -------------------------------------------------------------------------
9646 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
9647 {
9648 super.OnAction(action_id, player, ctx);
9649
9650 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
9651 {
9652 switch (action_id)
9653 {
9654 case EActions.GIZMO_OBJECT:
9655 if (GetGizmoApi())
9656 GetGizmoApi().SelectObject(this);
9657 return true;
9658 case EActions.GIZMO_PHYSICS:
9659 if (GetGizmoApi())
9660 GetGizmoApi().SelectPhysics(GetPhysics());
9661 return true;
9662 }
9663 }
9664
9665 if (g_Game.IsServer())
9666 {
9667 switch (action_id)
9668 {
9669 case EActions.DELETE:
9670 Delete();
9671 return true;
9672 }
9673 }
9674
9675 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
9676 {
9677 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
9678 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
9679 PlayerBase p = PlayerBase.Cast(player);
9680 if (EActions.RECIPES_RANGE_START < 1000)
9681 {
9682 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9683 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9684 }
9685 }
9686 #ifndef SERVER
9687 else if (action_id == EActions.WATCH_PLAYER)
9688 {
9689 PluginDeveloper.SetDeveloperItemClientEx(player);
9690 }
9691 #endif
9692 if (g_Game.IsServer())
9693 {
9694 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9695 {
9696 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9697 OnDebugButtonPressServer(id + 1);
9698 }
9699
9700 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9701 {
9702 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9703 InsertAgent(agent_id,100);
9704 }
9705
9706 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9707 {
9708 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9709 RemoveAgent(agent_id2);
9710 }
9711
9712 else if (action_id == EActions.ADD_QUANTITY)
9713 {
9714 if (IsMagazine())
9715 {
9716 Magazine mag = Magazine.Cast(this);
9717 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9718 }
9719 else
9720 {
9721 AddQuantity(GetQuantityMax() * 0.2);
9722 }
9723
9724 if (m_EM)
9725 {
9726 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9727 }
9728 //PrintVariables();
9729 }
9730
9731 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
9732 {
9733 if (IsMagazine())
9734 {
9735 Magazine mag2 = Magazine.Cast(this);
9736 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9737 }
9738 else
9739 {
9740 AddQuantity(- GetQuantityMax() * 0.2);
9741 }
9742 if (m_EM)
9743 {
9744 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9745 }
9746 //PrintVariables();
9747 }
9748
9749 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
9750 {
9751 SetQuantity(0);
9752
9753 if (m_EM)
9754 {
9755 m_EM.SetEnergy(0);
9756 }
9757 }
9758
9759 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
9760 {
9762
9763 if (m_EM)
9764 {
9765 m_EM.SetEnergy(m_EM.GetEnergyMax());
9766 }
9767 }
9768
9769 else if (action_id == EActions.ADD_HEALTH)
9770 {
9771 AddHealth("","",GetMaxHealth("","Health")/5);
9772 }
9773 else if (action_id == EActions.REMOVE_HEALTH)
9774 {
9775 AddHealth("","",-GetMaxHealth("","Health")/5);
9776 }
9777 else if (action_id == EActions.DESTROY_HEALTH)
9778 {
9779 SetHealth01("","",0);
9780 }
9781 else if (action_id == EActions.WATCH_ITEM)
9782 {
9784 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
9785 #ifdef DEVELOPER
9786 SetDebugDeveloper_item(this);
9787 #endif
9788 }
9789
9790 else if (action_id == EActions.ADD_TEMPERATURE)
9791 {
9792 AddTemperature(20);
9793 //PrintVariables();
9794 }
9795
9796 else if (action_id == EActions.REMOVE_TEMPERATURE)
9797 {
9798 AddTemperature(-20);
9799 //PrintVariables();
9800 }
9801
9802 else if (action_id == EActions.FLIP_FROZEN)
9803 {
9804 SetFrozen(!GetIsFrozen());
9805 //PrintVariables();
9806 }
9807
9808 else if (action_id == EActions.ADD_WETNESS)
9809 {
9810 AddWet(GetWetMax()/5);
9811 //PrintVariables();
9812 }
9813
9814 else if (action_id == EActions.REMOVE_WETNESS)
9815 {
9816 AddWet(-GetWetMax()/5);
9817 //PrintVariables();
9818 }
9819
9820 else if (action_id == EActions.LIQUIDTYPE_UP)
9821 {
9822 int curr_type = GetLiquidType();
9823 SetLiquidType(curr_type * 2);
9824 //AddWet(1);
9825 //PrintVariables();
9826 }
9827
9828 else if (action_id == EActions.LIQUIDTYPE_DOWN)
9829 {
9830 int curr_type2 = GetLiquidType();
9831 SetLiquidType(curr_type2 / 2);
9832 }
9833
9834 else if (action_id == EActions.MAKE_SPECIAL)
9835 {
9836 auto debugParams = DebugSpawnParams.WithPlayer(player);
9837 OnDebugSpawnEx(debugParams);
9838 }
9839
9840 }
9841
9842
9843 return false;
9844 }
9845
9846 // -------------------------------------------------------------------------
9847
9848
9851 void OnActivatedByTripWire();
9852
9854 void OnActivatedByItem(notnull ItemBase item);
9855
9856 //----------------------------------------------------------------
9857 //returns true if item is able to explode when put in fire
9858 bool CanExplodeInFire()
9859 {
9860 return false;
9861 }
9862
9863 //----------------------------------------------------------------
9864 bool CanEat()
9865 {
9866 return true;
9867 }
9868
9869 //----------------------------------------------------------------
9870 override bool IsIgnoredByConstruction()
9871 {
9872 return true;
9873 }
9874
9875 //----------------------------------------------------------------
9876 //has FoodStages in config?
9877 bool HasFoodStage()
9878 {
9879 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
9880 return g_Game.ConfigIsExisting(config_path);
9881 }
9882
9884 FoodStage GetFoodStage()
9885 {
9886 return null;
9887 }
9888
9889 bool CanBeCooked()
9890 {
9891 return false;
9892 }
9893
9894 bool CanBeCookedOnStick()
9895 {
9896 return false;
9897 }
9898
9900 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
9902
9903 //----------------------------------------------------------------
9904 bool CanRepair(ItemBase item_repair_kit)
9905 {
9906 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
9907 return module_repairing.CanRepair(this, item_repair_kit);
9908 }
9909
9910 //----------------------------------------------------------------
9911 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
9912 {
9913 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
9914 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
9915 }
9916
9917 //----------------------------------------------------------------
9918 int GetItemSize()
9919 {
9920 /*
9921 vector v_size = this.ConfigGetVector("itemSize");
9922 int v_size_x = v_size[0];
9923 int v_size_y = v_size[1];
9924 int size = v_size_x * v_size_y;
9925 return size;
9926 */
9927
9928 return 1;
9929 }
9930
9931 //----------------------------------------------------------------
9932 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
9933 bool CanBeMovedOverride()
9934 {
9935 return m_CanBeMovedOverride;
9936 }
9937
9938 //----------------------------------------------------------------
9939 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
9940 void SetCanBeMovedOverride(bool setting)
9941 {
9942 m_CanBeMovedOverride = setting;
9943 }
9944
9945 //----------------------------------------------------------------
9953 void MessageToOwnerStatus(string text)
9954 {
9955 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9956
9957 if (player)
9958 {
9959 player.MessageStatus(text);
9960 }
9961 }
9962
9963 //----------------------------------------------------------------
9971 void MessageToOwnerAction(string text)
9972 {
9973 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9974
9975 if (player)
9976 {
9977 player.MessageAction(text);
9978 }
9979 }
9980
9981 //----------------------------------------------------------------
9989 void MessageToOwnerFriendly(string text)
9990 {
9991 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
9992
9993 if (player)
9994 {
9995 player.MessageFriendly(text);
9996 }
9997 }
9998
9999 //----------------------------------------------------------------
10007 void MessageToOwnerImportant(string text)
10008 {
10009 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10010
10011 if (player)
10012 {
10013 player.MessageImportant(text);
10014 }
10015 }
10016
10017 override bool IsItemBase()
10018 {
10019 return true;
10020 }
10021
10022 // Checks if item is of questioned kind
10023 override bool KindOf(string tag)
10024 {
10025 bool found = false;
10026 string item_name = this.GetType();
10027 ref TStringArray item_tag_array = new TStringArray;
10028 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
10029
10030 int array_size = item_tag_array.Count();
10031 for (int i = 0; i < array_size; i++)
10032 {
10033 if (item_tag_array.Get(i) == tag)
10034 {
10035 found = true;
10036 break;
10037 }
10038 }
10039 return found;
10040 }
10041
10042
10043 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
10044 {
10045 //Debug.Log("OnRPC called");
10046 super.OnRPC(sender, rpc_type,ctx);
10047
10048 //Play soundset for attachment locking (ActionLockAttachment.c)
10049 switch (rpc_type)
10050 {
10051 #ifndef SERVER
10052 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10053 Param2<bool, string> p = new Param2<bool, string>(false, "");
10054
10055 if (!ctx.Read(p))
10056 return;
10057
10058 bool play = p.param1;
10059 string soundSet = p.param2;
10060
10061 if (play)
10062 {
10063 if (m_LockingSound)
10064 {
10066 {
10067 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10068 }
10069 }
10070 else
10071 {
10072 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10073 }
10074 }
10075 else
10076 {
10077 SEffectManager.DestroyEffect(m_LockingSound);
10078 }
10079
10080 break;
10081 #endif
10082
10083 }
10084
10085 if (GetWrittenNoteData())
10086 {
10087 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
10088 }
10089 }
10090
10091 //-----------------------------
10092 // VARIABLE MANIPULATION SYSTEM
10093 //-----------------------------
10094 int NameToID(string name)
10095 {
10096 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10097 return plugin.GetID(name);
10098 }
10099
10100 string IDToName(int id)
10101 {
10102 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10103 return plugin.GetName(id);
10104 }
10105
10107 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
10108 {
10109 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
10110 //read the flags
10111 int varFlags;
10112 if (!ctx.Read(varFlags))
10113 return;
10114
10115 if (varFlags & ItemVariableFlags.FLOAT)
10116 {
10117 ReadVarsFromCTX(ctx);
10118 }
10119 }
10120
10121 override void SerializeNumericalVars(array<float> floats_out)
10122 {
10123 //some variables handled on EntityAI level already!
10124 super.SerializeNumericalVars(floats_out);
10125
10126 // the order of serialization must be the same as the order of de-serialization
10127 //--------------------------------------------
10128 if (IsVariableSet(VARIABLE_QUANTITY))
10129 {
10130 floats_out.Insert(m_VarQuantity);
10131 }
10132 //--------------------------------------------
10133 if (IsVariableSet(VARIABLE_WET))
10134 {
10135 floats_out.Insert(m_VarWet);
10136 }
10137 //--------------------------------------------
10138 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10139 {
10140 floats_out.Insert(m_VarLiquidType);
10141 }
10142 //--------------------------------------------
10143 if (IsVariableSet(VARIABLE_COLOR))
10144 {
10145 floats_out.Insert(m_ColorComponentR);
10146 floats_out.Insert(m_ColorComponentG);
10147 floats_out.Insert(m_ColorComponentB);
10148 floats_out.Insert(m_ColorComponentA);
10149 }
10150 //--------------------------------------------
10151 if (IsVariableSet(VARIABLE_CLEANNESS))
10152 {
10153 floats_out.Insert(m_Cleanness);
10154 }
10155 }
10156
10157 override void DeSerializeNumericalVars(array<float> floats)
10158 {
10159 //some variables handled on EntityAI level already!
10160 super.DeSerializeNumericalVars(floats);
10161
10162 // the order of serialization must be the same as the order of de-serialization
10163 int index = 0;
10164 int mask = Math.Round(floats.Get(index));
10165
10166 index++;
10167 //--------------------------------------------
10168 if (mask & VARIABLE_QUANTITY)
10169 {
10170 if (m_IsStoreLoad)
10171 {
10172 SetStoreLoadedQuantity(floats.Get(index));
10173 }
10174 else
10175 {
10176 float quantity = floats.Get(index);
10177 SetQuantity(quantity, true, false, false, false);
10178 }
10179 index++;
10180 }
10181 //--------------------------------------------
10182 if (mask & VARIABLE_WET)
10183 {
10184 float wet = floats.Get(index);
10185 SetWet(wet);
10186 index++;
10187 }
10188 //--------------------------------------------
10189 if (mask & VARIABLE_LIQUIDTYPE)
10190 {
10191 int liquidtype = Math.Round(floats.Get(index));
10192 SetLiquidType(liquidtype);
10193 index++;
10194 }
10195 //--------------------------------------------
10196 if (mask & VARIABLE_COLOR)
10197 {
10198 m_ColorComponentR = Math.Round(floats.Get(index));
10199 index++;
10200 m_ColorComponentG = Math.Round(floats.Get(index));
10201 index++;
10202 m_ColorComponentB = Math.Round(floats.Get(index));
10203 index++;
10204 m_ColorComponentA = Math.Round(floats.Get(index));
10205 index++;
10206 }
10207 //--------------------------------------------
10208 if (mask & VARIABLE_CLEANNESS)
10209 {
10210 int cleanness = Math.Round(floats.Get(index));
10211 SetCleanness(cleanness);
10212 index++;
10213 }
10214 }
10215
10216 override void WriteVarsToCTX(ParamsWriteContext ctx)
10217 {
10218 super.WriteVarsToCTX(ctx);
10219
10220 //--------------------------------------------
10221 if (IsVariableSet(VARIABLE_QUANTITY))
10222 {
10223 ctx.Write(GetQuantity());
10224 }
10225 //--------------------------------------------
10226 if (IsVariableSet(VARIABLE_WET))
10227 {
10228 ctx.Write(GetWet());
10229 }
10230 //--------------------------------------------
10231 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10232 {
10233 ctx.Write(GetLiquidType());
10234 }
10235 //--------------------------------------------
10236 if (IsVariableSet(VARIABLE_COLOR))
10237 {
10238 int r,g,b,a;
10239 GetColor(r,g,b,a);
10240 ctx.Write(r);
10241 ctx.Write(g);
10242 ctx.Write(b);
10243 ctx.Write(a);
10244 }
10245 //--------------------------------------------
10246 if (IsVariableSet(VARIABLE_CLEANNESS))
10247 {
10248 ctx.Write(GetCleanness());
10249 }
10250 }
10251
10252 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
10253 {
10254 if (!super.ReadVarsFromCTX(ctx,version))
10255 return false;
10256
10257 int intValue;
10258 float value;
10259
10260 if (version < 140)
10261 {
10262 if (!ctx.Read(intValue))
10263 return false;
10264
10265 m_VariablesMask = intValue;
10266 }
10267
10268 if (m_VariablesMask & VARIABLE_QUANTITY)
10269 {
10270 if (!ctx.Read(value))
10271 return false;
10272
10273 if (IsStoreLoad())
10274 {
10276 }
10277 else
10278 {
10279 SetQuantity(value, true, false, false, false);
10280 }
10281 }
10282 //--------------------------------------------
10283 if (version < 140)
10284 {
10285 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10286 {
10287 if (!ctx.Read(value))
10288 return false;
10289 SetTemperatureDirect(value);
10290 }
10291 }
10292 //--------------------------------------------
10293 if (m_VariablesMask & VARIABLE_WET)
10294 {
10295 if (!ctx.Read(value))
10296 return false;
10297 SetWet(value);
10298 }
10299 //--------------------------------------------
10300 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
10301 {
10302 if (!ctx.Read(intValue))
10303 return false;
10304 SetLiquidType(intValue);
10305 }
10306 //--------------------------------------------
10307 if (m_VariablesMask & VARIABLE_COLOR)
10308 {
10309 int r,g,b,a;
10310 if (!ctx.Read(r))
10311 return false;
10312 if (!ctx.Read(g))
10313 return false;
10314 if (!ctx.Read(b))
10315 return false;
10316 if (!ctx.Read(a))
10317 return false;
10318
10319 SetColor(r,g,b,a);
10320 }
10321 //--------------------------------------------
10322 if (m_VariablesMask & VARIABLE_CLEANNESS)
10323 {
10324 if (!ctx.Read(intValue))
10325 return false;
10326 SetCleanness(intValue);
10327 }
10328 //--------------------------------------------
10329 if (version >= 138 && version < 140)
10330 {
10331 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10332 {
10333 if (!ctx.Read(intValue))
10334 return false;
10335 SetFrozen(intValue);
10336 }
10337 }
10338
10339 return true;
10340 }
10341
10342 //----------------------------------------------------------------
10343 override bool OnStoreLoad(ParamsReadContext ctx, int version)
10344 {
10345 m_IsStoreLoad = true;
10347 {
10348 m_FixDamageSystemInit = true;
10349 }
10350
10351 if (!super.OnStoreLoad(ctx, version))
10352 {
10353 m_IsStoreLoad = false;
10354 return false;
10355 }
10356
10357 if (version >= 114)
10358 {
10359 bool hasQuickBarIndexSaved;
10360
10361 if (!ctx.Read(hasQuickBarIndexSaved))
10362 {
10363 m_IsStoreLoad = false;
10364 return false;
10365 }
10366
10367 if (hasQuickBarIndexSaved)
10368 {
10369 int itmQBIndex;
10370
10371 //Load quickbar item bind
10372 if (!ctx.Read(itmQBIndex))
10373 {
10374 m_IsStoreLoad = false;
10375 return false;
10376 }
10377
10378 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10379 if (itmQBIndex != -1 && parentPlayer)
10380 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10381 }
10382 }
10383 else
10384 {
10385 // Backup of how it used to be
10386 PlayerBase player;
10387 int itemQBIndex;
10388 if (version == int.MAX)
10389 {
10390 if (!ctx.Read(itemQBIndex))
10391 {
10392 m_IsStoreLoad = false;
10393 return false;
10394 }
10395 }
10396 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10397 {
10398 //Load quickbar item bind
10399 if (!ctx.Read(itemQBIndex))
10400 {
10401 m_IsStoreLoad = false;
10402 return false;
10403 }
10404 if (itemQBIndex != -1 && player)
10405 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10406 }
10407 }
10408
10409 if (version < 140)
10410 {
10411 // variable management system
10412 if (!LoadVariables(ctx, version))
10413 {
10414 m_IsStoreLoad = false;
10415 return false;
10416 }
10417 }
10418
10419 //agent trasmission system
10420 if (!LoadAgents(ctx, version))
10421 {
10422 m_IsStoreLoad = false;
10423 return false;
10424 }
10425 if (version >= 132)
10426 {
10427 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
10428 if (raib)
10429 {
10430 if (!raib.OnStoreLoad(ctx,version))
10431 {
10432 m_IsStoreLoad = false;
10433 return false;
10434 }
10435 }
10436 }
10437
10438 m_IsStoreLoad = false;
10439 return true;
10440 }
10441
10442 //----------------------------------------------------------------
10443
10444 override void OnStoreSave(ParamsWriteContext ctx)
10445 {
10446 super.OnStoreSave(ctx);
10447
10448 PlayerBase player;
10449 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10450 {
10451 ctx.Write(true); // Keep track of if we should actually read this in or not
10452 //Save quickbar item bind
10453 int itemQBIndex = -1;
10454 itemQBIndex = player.FindQuickBarEntityIndex(this);
10455 ctx.Write(itemQBIndex);
10456 }
10457 else
10458 {
10459 ctx.Write(false); // Keep track of if we should actually read this in or not
10460 }
10461
10462 SaveAgents(ctx);//agent trasmission system
10463
10464 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
10465 if (raib)
10466 {
10467 raib.OnStoreSave(ctx);
10468 }
10469 }
10470 //----------------------------------------------------------------
10471
10472 override void AfterStoreLoad()
10473 {
10474 super.AfterStoreLoad();
10475
10477 {
10479 }
10480
10481 if (GetStoreLoadedQuantity() != float.LOWEST)
10482 {
10484 SetStoreLoadedQuantity(float.LOWEST);//IMPORTANT to do this !! we use 'm_StoreLoadedQuantity' inside SetQuantity to distinguish between initial quantity setting and the consequent(normal gameplay) calls
10485 }
10486 }
10487
10488 override void EEOnAfterLoad()
10489 {
10490 super.EEOnAfterLoad();
10491
10493 {
10494 m_FixDamageSystemInit = false;
10495 }
10496
10499 }
10500
10501 bool CanBeDisinfected()
10502 {
10503 return false;
10504 }
10505
10506
10507 //----------------------------------------------------------------
10508 override void OnVariablesSynchronized()
10509 {
10510 if (m_Initialized)
10511 {
10512 #ifdef PLATFORM_CONSOLE
10513 //bruteforce it is
10514 if (IsSplitable())
10515 {
10516 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
10517 if (menu)
10518 {
10519 menu.Refresh();
10520 }
10521 }
10522 #endif
10523 }
10524
10526 {
10527 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10528 m_WantPlayImpactSound = false;
10529 }
10530
10532 {
10533 SetWeightDirty();
10535 }
10536 if (m_VarWet != m_VarWetPrev)
10537 {
10540 }
10541
10542 if (m_SoundSyncPlay != 0)
10543 {
10546
10547 m_SoundSyncPlay = 0;
10548 m_SoundSyncSlotID = -1;
10549 }
10550 if (m_SoundSyncStop != 0)
10551 {
10553 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
10554 m_SoundSyncStop = 0;
10555 }
10556
10557 super.OnVariablesSynchronized();
10558 }
10559
10560 //------------------------- Quantity
10561 //----------------------------------------------------------------
10563 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
10564 {
10565 if (!IsServerCheck(allow_client))
10566 return false;
10567
10568 if (!HasQuantity())
10569 return false;
10570
10571 float min = GetQuantityMin();
10572 float max = GetQuantityMax();
10573
10574 if (value <= (min + 0.001))
10575 value = min;
10576
10577 if (value == min)
10578 {
10579 if (destroy_config)
10580 {
10581 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10582 if (dstr)
10583 {
10584 m_VarQuantity = Math.Clamp(value, min, max);
10585 this.Delete();
10586 return true;
10587 }
10588 }
10589 else if (destroy_forced)
10590 {
10591 m_VarQuantity = Math.Clamp(value, min, max);
10592 this.Delete();
10593 return true;
10594 }
10595 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
10596 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
10597 }
10598
10599 float delta = m_VarQuantity;
10600 m_VarQuantity = Math.Clamp(value, min, max);
10601
10602 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10603 {
10604 EntityAI parent = GetHierarchyRoot();
10605 InventoryLocation iLoc = new InventoryLocation();
10606 GetInventory().GetCurrentInventoryLocation(iLoc);
10607 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
10608 {
10609 int iLocSlot = iLoc.GetSlot();
10610 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
10611 {
10612 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
10613 }
10614 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
10615 {
10616 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
10617 }
10618 }
10619 }
10620
10621 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
10622 {
10623 delta = m_VarQuantity - delta;
10624
10625 if (delta)
10626 OnQuantityChanged(delta);
10627 }
10628
10629 SetVariableMask(VARIABLE_QUANTITY);
10630
10631 return false;
10632 }
10633
10634 //----------------------------------------------------------------
10636 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
10637 {
10638 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
10639 }
10640 //----------------------------------------------------------------
10641 void SetQuantityMax()
10642 {
10643 float max = GetQuantityMax();
10644 SetQuantity(max);
10645 }
10646
10647 override void SetQuantityToMinimum()
10648 {
10649 float min = GetQuantityMin();
10650 SetQuantity(min);
10651 }
10652 //----------------------------------------------------------------
10654 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
10655 {
10656 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
10657 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
10658 SetQuantity(result, destroy_config, destroy_forced);
10659 }
10660
10661 //----------------------------------------------------------------
10663 override float GetQuantityNormalized()
10664 {
10665 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
10666 }
10667
10669 {
10670 return GetQuantityNormalized();
10671 }
10672
10673 /*void SetAmmoNormalized(float value)
10674 {
10675 float value_clamped = Math.Clamp(value, 0, 1);
10676 Magazine this_mag = Magazine.Cast(this);
10677 int max_rounds = this_mag.GetAmmoMax();
10678 int result = value * max_rounds;//can the rounded if higher precision is required
10679 this_mag.SetAmmoCount(result);
10680 }*/
10681 //----------------------------------------------------------------
10682 override int GetQuantityMax()
10683 {
10684 int slot = -1;
10685 GameInventory inventory = GetInventory();
10686 if (inventory)
10687 {
10688 InventoryLocation il = new InventoryLocation;
10689 inventory.GetCurrentInventoryLocation(il);
10690 slot = il.GetSlot();
10691 }
10692
10693 return GetTargetQuantityMax(slot);
10694 }
10695
10696 override int GetTargetQuantityMax(int attSlotID = -1)
10697 {
10698 float quantity_max = 0;
10699
10700 if (IsSplitable()) //only stackable/splitable items can check for stack size
10701 {
10702 if (attSlotID != -1)
10703 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10704
10705 if (quantity_max <= 0)
10706 quantity_max = m_VarStackMax;
10707 }
10708
10709 if (quantity_max <= 0)
10710 quantity_max = m_VarQuantityMax;
10711
10712 return quantity_max;
10713 }
10714 //----------------------------------------------------------------
10715 override int GetQuantityMin()
10716 {
10717 return m_VarQuantityMin;
10718 }
10719 //----------------------------------------------------------------
10720 int GetQuantityInit()
10721 {
10722 return m_VarQuantityInit;
10723 }
10724
10725 //----------------------------------------------------------------
10726 override bool HasQuantity()
10727 {
10728 return !(GetQuantityMax() - GetQuantityMin() == 0);
10729 }
10730
10731 override float GetQuantity()
10732 {
10733 return m_VarQuantity;
10734 }
10735
10736 bool IsFullQuantity()
10737 {
10738 return GetQuantity() >= GetQuantityMax();
10739 }
10740
10741 //Calculates weight of single item without attachments and cargo
10742 override float GetSingleInventoryItemWeightEx()
10743 {
10744 //this needs to be first stored inside local variables, when returned directly during inside return call, the result is completely different due to enforce script bug
10745 float weightEx = GetWeightEx();//overall weight of the item
10746 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
10747 return weightEx - special;
10748 }
10749
10750 // Obsolete, use GetSingleInventoryItemWeightEx() instead
10752 {
10754 }
10755
10756 override protected float GetWeightSpecialized(bool forceRecalc = false)
10757 {
10758 if (IsSplitable()) //quantity determines size of the stack
10759 {
10760 #ifdef DEVELOPER
10761 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10762 {
10763 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10764 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
10765 }
10766 #endif
10767
10768 return GetQuantity() * GetConfigWeightModified();
10769 }
10770 else if (HasEnergyManager())// items with energy manager
10771 {
10772 #ifdef DEVELOPER
10773 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10774 {
10775 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10776 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
10777 }
10778 #endif
10779 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
10780 }
10781 else//everything else
10782 {
10783 #ifdef DEVELOPER
10784 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10785 {
10786 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10787 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
10788 }
10789 #endif
10790 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
10791 }
10792 }
10793
10795 int GetNumberOfItems()
10796 {
10797 int item_count = 0;
10798 ItemBase item;
10799
10800 GameInventory inventory = GetInventory();
10801 CargoBase cargo = inventory.GetCargo();
10802 if (cargo != NULL)
10803 {
10804 item_count = cargo.GetItemCount();
10805 }
10806
10807 int nAttachments = inventory.AttachmentCount();
10808 for (int i = 0; i < nAttachments; ++i)
10809 {
10810 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
10811 if (item)
10812 item_count += item.GetNumberOfItems();
10813 }
10814 return item_count;
10815 }
10816
10818 float GetUnitWeight(bool include_wetness = true)
10819 {
10820 float weight = 0;
10821 float wetness = 1;
10822 if (include_wetness)
10823 wetness += GetWet();
10824 if (IsSplitable()) //quantity determines size of the stack
10825 {
10826 weight = wetness * m_ConfigWeight;
10827 }
10828 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
10829 {
10830 weight = 1;
10831 }
10832 return weight;
10833 }
10834
10835 //-----------------------------------------------------------------
10836
10837 override void ClearInventory()
10838 {
10839 GameInventory inventory = GetInventory();
10840 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
10841 {
10842 array<EntityAI> items = new array<EntityAI>;
10843 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
10844 for (int i = 0; i < items.Count(); ++i)
10845 {
10846 ItemBase item = ItemBase.Cast(items.Get(i));
10847 if (item)
10848 {
10849 g_Game.ObjectDelete(item);
10850 }
10851 }
10852 }
10853 }
10854
10855 //------------------------- Energy
10856
10857 //----------------------------------------------------------------
10858 float GetEnergy()
10859 {
10860 float energy = 0;
10861 if (HasEnergyManager())
10862 {
10863 energy = GetCompEM().GetEnergy();
10864 }
10865 return energy;
10866 }
10867
10868
10869 override void OnEnergyConsumed()
10870 {
10871 super.OnEnergyConsumed();
10872
10874 }
10875
10876 override void OnEnergyAdded()
10877 {
10878 super.OnEnergyAdded();
10879
10881 }
10882
10883 // Converts energy (from Energy Manager) to quantity, if enabled.
10885 {
10886 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10887 {
10888 if (HasQuantity())
10889 {
10890 float energy_0to1 = GetCompEM().GetEnergy0To1();
10891 SetQuantityNormalized(energy_0to1);
10892 }
10893 }
10894 }
10895
10896 //----------------------------------------------------------------
10897 float GetHeatIsolationInit()
10898 {
10899 return ConfigGetFloat("heatIsolation");
10900 }
10901
10902 float GetHeatIsolation()
10903 {
10904 return m_HeatIsolation;
10905 }
10906
10907 float GetDryingIncrement(string pIncrementName)
10908 {
10909 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
10910 if (g_Game.ConfigIsExisting(paramPath))
10911 return g_Game.ConfigGetFloat(paramPath);
10912
10913 return 0.0;
10914 }
10915
10916 float GetSoakingIncrement(string pIncrementName)
10917 {
10918 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
10919 if (g_Game.ConfigIsExisting(paramPath))
10920 return g_Game.ConfigGetFloat(paramPath);
10921
10922 return 0.0;
10923 }
10924 //----------------------------------------------------------------
10925 override void SetWet(float value, bool allow_client = false)
10926 {
10927 if (!IsServerCheck(allow_client))
10928 return;
10929
10930 float min = GetWetMin();
10931 float max = GetWetMax();
10932
10933 float previousValue = m_VarWet;
10934
10935 m_VarWet = Math.Clamp(value, min, max);
10936
10937 if (previousValue != m_VarWet)
10938 {
10939 SetVariableMask(VARIABLE_WET);
10940 OnWetChanged(m_VarWet, previousValue);
10941 }
10942 }
10943 //----------------------------------------------------------------
10944 override void AddWet(float value)
10945 {
10946 SetWet(GetWet() + value);
10947 }
10948 //----------------------------------------------------------------
10949 override void SetWetMax()
10950 {
10952 }
10953 //----------------------------------------------------------------
10954 override float GetWet()
10955 {
10956 return m_VarWet;
10957 }
10958 //----------------------------------------------------------------
10959 override float GetWetMax()
10960 {
10961 return m_VarWetMax;
10962 }
10963 //----------------------------------------------------------------
10964 override float GetWetMin()
10965 {
10966 return m_VarWetMin;
10967 }
10968 //----------------------------------------------------------------
10969 override float GetWetInit()
10970 {
10971 return m_VarWetInit;
10972 }
10973 //----------------------------------------------------------------
10974 override void OnWetChanged(float newVal, float oldVal)
10975 {
10976 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
10977 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
10978 if (newLevel != oldLevel)
10979 {
10980 OnWetLevelChanged(newLevel,oldLevel);
10981 }
10982 }
10983
10984 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
10985 {
10986 SetWeightDirty();
10987 }
10988
10989 override EWetnessLevel GetWetLevel()
10990 {
10991 return GetWetLevelInternal(m_VarWet);
10992 }
10993
10994 //----------------------------------------------------------------
10995
10996 override void SetStoreLoad(bool value)
10997 {
10998 m_IsStoreLoad = value;
10999 }
11000
11001 override bool IsStoreLoad()
11002 {
11003 return m_IsStoreLoad;
11004 }
11005
11006 override void SetStoreLoadedQuantity(float value)
11007 {
11008 m_StoreLoadedQuantity = value;
11009 }
11010
11011 override float GetStoreLoadedQuantity()
11012 {
11013 return m_StoreLoadedQuantity;
11014 }
11015
11016 //----------------------------------------------------------------
11017
11018 float GetItemModelLength()
11019 {
11020 if (ConfigIsExisting("itemModelLength"))
11021 {
11022 return ConfigGetFloat("itemModelLength");
11023 }
11024 return 0;
11025 }
11026
11027 float GetItemAttachOffset()
11028 {
11029 if (ConfigIsExisting("itemAttachOffset"))
11030 {
11031 return ConfigGetFloat("itemAttachOffset");
11032 }
11033 return 0;
11034 }
11035
11036 override void SetCleanness(int value, bool allow_client = false)
11037 {
11038 if (!IsServerCheck(allow_client))
11039 return;
11040
11041 int previousValue = m_Cleanness;
11042
11043 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
11044
11045 if (previousValue != m_Cleanness)
11046 SetVariableMask(VARIABLE_CLEANNESS);
11047 }
11048
11049 override int GetCleanness()
11050 {
11051 return m_Cleanness;
11052 }
11053
11055 {
11056 return true;
11057 }
11058
11059 //----------------------------------------------------------------
11060 // ATTACHMENT LOCKING
11061 // Getters relevant to generic ActionLockAttachment
11062 int GetLockType()
11063 {
11064 return m_LockType;
11065 }
11066
11067 string GetLockSoundSet()
11068 {
11069 return m_LockSoundSet;
11070 }
11071
11072 //----------------------------------------------------------------
11073 //------------------------- Color
11074 // sets items color variable given color components
11075 override void SetColor(int r, int g, int b, int a)
11076 {
11081 SetVariableMask(VARIABLE_COLOR);
11082 }
11084 override void GetColor(out int r,out int g,out int b,out int a)
11085 {
11090 }
11091
11092 bool IsColorSet()
11093 {
11094 return IsVariableSet(VARIABLE_COLOR);
11095 }
11096
11098 string GetColorString()
11099 {
11100 int r,g,b,a;
11101 GetColor(r,g,b,a);
11102 r = r/255;
11103 g = g/255;
11104 b = b/255;
11105 a = a/255;
11106 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11107 }
11108 //----------------------------------------------------------------
11109 //------------------------- LiquidType
11110
11111 override void SetLiquidType(int value, bool allow_client = false)
11112 {
11113 if (!IsServerCheck(allow_client))
11114 return;
11115
11116 int old = m_VarLiquidType;
11117 m_VarLiquidType = value;
11118 OnLiquidTypeChanged(old,value);
11119 SetVariableMask(VARIABLE_LIQUIDTYPE);
11120 }
11121
11122 int GetLiquidTypeInit()
11123 {
11124 return ConfigGetInt("varLiquidTypeInit");
11125 }
11126
11127 override int GetLiquidType()
11128 {
11129 return m_VarLiquidType;
11130 }
11131
11132 protected void OnLiquidTypeChanged(int oldType, int newType)
11133 {
11134 if (newType == LIQUID_NONE && GetIsFrozen())
11135 SetFrozen(false);
11136 }
11137
11139 void UpdateQuickbarShortcutVisibility(PlayerBase player)
11140 {
11141 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11142 }
11143
11144 // -------------------------------------------------------------------------
11146 void OnInventoryEnter(Man player)
11147 {
11148 PlayerBase nplayer;
11149 if (PlayerBase.CastTo(nplayer, player))
11150 {
11151 m_CanPlayImpactSound = true;
11152 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11153 }
11154 }
11155
11156 // -------------------------------------------------------------------------
11158 void OnInventoryExit(Man player)
11159 {
11160 PlayerBase nplayer;
11161 if (PlayerBase.CastTo(nplayer,player))
11162 {
11163 nplayer.SetEnableQuickBarEntityShortcut(this, false);
11164 }
11165
11166 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11167
11168 if (HasEnergyManager())
11169 {
11170 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
11171 }
11172 }
11173
11174 // ADVANCED PLACEMENT EVENTS
11175 override void OnPlacementStarted(Man player)
11176 {
11177 super.OnPlacementStarted(player);
11178
11179 SetTakeable(false);
11180 }
11181
11182 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
11183 {
11184 if (m_AdminLog)
11185 {
11186 m_AdminLog.OnPlacementComplete(player, this);
11187 }
11188
11189 super.OnPlacementComplete(player, position, orientation);
11190 }
11191
11192 //-----------------------------
11193 // AGENT SYSTEM
11194 //-----------------------------
11195 //--------------------------------------------------------------------------
11196 bool ContainsAgent(int agent_id)
11197 {
11198 if (agent_id & m_AttachedAgents)
11199 {
11200 return true;
11201 }
11202 else
11203 {
11204 return false;
11205 }
11206 }
11207
11208 //--------------------------------------------------------------------------
11209 override void RemoveAgent(int agent_id)
11210 {
11211 if (ContainsAgent(agent_id))
11212 {
11213 m_AttachedAgents = ~agent_id & m_AttachedAgents;
11214 }
11215 }
11216
11217 //--------------------------------------------------------------------------
11218 override void RemoveAllAgents()
11219 {
11220 m_AttachedAgents = 0;
11221 }
11222 //--------------------------------------------------------------------------
11223 override void RemoveAllAgentsExcept(int agent_to_keep)
11224 {
11225 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
11226 }
11227 // -------------------------------------------------------------------------
11228 override void InsertAgent(int agent, float count = 1)
11229 {
11230 if (count < 1)
11231 return;
11232 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
11234 }
11235
11237 void TransferAgents(int agents)
11238 {
11240 }
11241
11242 // -------------------------------------------------------------------------
11243 override int GetAgents()
11244 {
11245 return m_AttachedAgents;
11246 }
11247 //----------------------------------------------------------------------
11248
11249 /*int GetContaminationType()
11250 {
11251 int contamination_type;
11252
11253 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
11254 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
11255 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
11256 const int DIRTY_MASK = eAgents.WOUND_AGENT;
11257
11258 Edible_Base edible = Edible_Base.Cast(this);
11259 int agents = GetAgents();
11260 if (edible)
11261 {
11262 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
11263 if (profile)
11264 {
11265 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
11266 }
11267 }
11268 if (agents & CONTAMINATED_MASK)
11269 {
11270 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
11271 }
11272 if (agents & POISONED_MASK)
11273 {
11274 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
11275 }
11276 if (agents & NERVE_GAS_MASK)
11277 {
11278 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
11279 }
11280 if (agents & DIRTY_MASK)
11281 {
11282 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
11283 }
11284
11285 return agents;
11286 }*/
11287
11288 // -------------------------------------------------------------------------
11289 bool LoadAgents(ParamsReadContext ctx, int version)
11290 {
11291 if (!ctx.Read(m_AttachedAgents))
11292 return false;
11293 return true;
11294 }
11295 // -------------------------------------------------------------------------
11297 {
11298
11300 }
11301 // -------------------------------------------------------------------------
11302
11304 override void CheckForRoofLimited(float timeTresholdMS = 3000)
11305 {
11306 super.CheckForRoofLimited(timeTresholdMS);
11307
11308 float time = g_Game.GetTime();
11309 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11310 {
11311 m_PreviousRoofTestTime = time;
11312 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11313 }
11314 }
11315
11316 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
11317 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
11318 {
11319 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
11320 {
11321 return 0;
11322 }
11323
11324 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
11325 {
11326 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
11327 if (filter)
11328 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
11329 else
11330 return 0;//otherwise return 0 when no filter attached
11331 }
11332
11333 string subclassPath, entryName;
11334
11335 switch (type)
11336 {
11337 case DEF_BIOLOGICAL:
11338 entryName = "biological";
11339 break;
11340 case DEF_CHEMICAL:
11341 entryName = "chemical";
11342 break;
11343 default:
11344 entryName = "biological";
11345 break;
11346 }
11347
11348 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
11349
11350 return g_Game.ConfigGetFloat(subclassPath + entryName);
11351 }
11352
11353
11354
11356 override void EEOnCECreate()
11357 {
11358 if (!IsMagazine())
11360
11362 }
11363
11364
11365 //-------------------------
11366 // OPEN/CLOSE USER ACTIONS
11367 //-------------------------
11369 void Open();
11370 void Close();
11371 bool IsOpen()
11372 {
11373 return true;
11374 }
11375
11376 override bool CanDisplayCargo()
11377 {
11378 return IsOpen();
11379 }
11380
11381
11382 // ------------------------------------------------------------
11383 // CONDITIONS
11384 // ------------------------------------------------------------
11385 override bool CanPutInCargo(EntityAI parent)
11386 {
11387 if (parent)
11388 {
11389 if (parent.IsInherited(DayZInfected))
11390 return true;
11391
11392 if (!parent.IsRuined())
11393 return true;
11394 }
11395
11396 return true;
11397 }
11398
11399 override bool CanPutAsAttachment(EntityAI parent)
11400 {
11401 if (!super.CanPutAsAttachment(parent))
11402 {
11403 return false;
11404 }
11405
11406 if (!IsRuined() && !parent.IsRuined())
11407 {
11408 return true;
11409 }
11410
11411 return false;
11412 }
11413
11414 override bool CanReceiveItemIntoCargo(EntityAI item)
11415 {
11416 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11417 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11418 // return false;
11419
11420 return super.CanReceiveItemIntoCargo(item);
11421 }
11422
11423 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
11424 {
11425 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11426 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11427 // return false;
11428
11429 GameInventory attachmentInv = attachment.GetInventory();
11430 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
11431 {
11432 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11433 return false;
11434 }
11435
11436 InventoryLocation loc = new InventoryLocation();
11437 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11438 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
11439 return false;
11440
11441 return super.CanReceiveAttachment(attachment, slotId);
11442 }
11443
11444 override bool CanReleaseAttachment(EntityAI attachment)
11445 {
11446 if (!super.CanReleaseAttachment(attachment))
11447 return false;
11448
11449 return GetInventory().AreChildrenAccessible();
11450 }
11451
11452 /*override bool CanLoadAttachment(EntityAI attachment)
11453 {
11454 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
11455 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
11456 // return false;
11457
11458 GameInventory attachmentInv = attachment.GetInventory();
11459 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
11460 {
11461 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
11462 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
11463
11464 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11465 return false;
11466 }
11467
11468 return super.CanLoadAttachment(attachment);
11469 }*/
11470
11471 // Plays muzzle flash particle effects
11472 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11473 {
11474 int id = muzzle_owner.GetMuzzleID();
11475 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
11476
11477 if (WPOF_array)
11478 {
11479 for (int i = 0; i < WPOF_array.Count(); i++)
11480 {
11481 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11482
11483 if (WPOF)
11484 {
11485 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11486 }
11487 }
11488 }
11489 }
11490
11491 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
11492 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11493 {
11494 int id = muzzle_owner.GetMuzzleID();
11495 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
11496
11497 if (WPOBE_array)
11498 {
11499 for (int i = 0; i < WPOBE_array.Count(); i++)
11500 {
11501 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11502
11503 if (WPOBE)
11504 {
11505 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11506 }
11507 }
11508 }
11509 }
11510
11511 // Plays all weapon overheating particles
11512 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11513 {
11514 int id = muzzle_owner.GetMuzzleID();
11515 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11516
11517 if (WPOOH_array)
11518 {
11519 for (int i = 0; i < WPOOH_array.Count(); i++)
11520 {
11521 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11522
11523 if (WPOOH)
11524 {
11525 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11526 }
11527 }
11528 }
11529 }
11530
11531 // Updates all weapon overheating particles
11532 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11533 {
11534 int id = muzzle_owner.GetMuzzleID();
11535 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11536
11537 if (WPOOH_array)
11538 {
11539 for (int i = 0; i < WPOOH_array.Count(); i++)
11540 {
11541 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11542
11543 if (WPOOH)
11544 {
11545 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11546 }
11547 }
11548 }
11549 }
11550
11551 // Stops overheating particles
11552 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
11553 {
11554 int id = muzzle_owner.GetMuzzleID();
11555 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11556
11557 if (WPOOH_array)
11558 {
11559 for (int i = 0; i < WPOOH_array.Count(); i++)
11560 {
11561 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11562
11563 if (WPOOH)
11564 {
11565 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11566 }
11567 }
11568 }
11569 }
11570
11571 //----------------------------------------------------------------
11572 //Item Behaviour - unified approach
11573 override bool IsHeavyBehaviour()
11574 {
11575 if (m_ItemBehaviour == 0)
11576 {
11577 return true;
11578 }
11579
11580 return false;
11581 }
11582
11583 override bool IsOneHandedBehaviour()
11584 {
11585 if (m_ItemBehaviour == 1)
11586 {
11587 return true;
11588 }
11589
11590 return false;
11591 }
11592
11593 override bool IsTwoHandedBehaviour()
11594 {
11595 if (m_ItemBehaviour == 2)
11596 {
11597 return true;
11598 }
11599
11600 return false;
11601 }
11602
11603 bool IsDeployable()
11604 {
11605 return false;
11606 }
11607
11609 float GetDeployTime()
11610 {
11611 return UATimeSpent.DEFAULT_DEPLOY;
11612 }
11613
11614
11615 //----------------------------------------------------------------
11616 // Item Targeting (User Actions)
11617 override void SetTakeable(bool pState)
11618 {
11619 m_IsTakeable = pState;
11620 SetSynchDirty();
11621 }
11622
11623 override bool IsTakeable()
11624 {
11625 return m_IsTakeable;
11626 }
11627
11628 // For cases where we want to show object widget which cant be taken to hands
11630 {
11631 return false;
11632 }
11633
11635 protected void PreLoadSoundAttachmentType()
11636 {
11637 string att_type = "None";
11638
11639 if (ConfigIsExisting("soundAttType"))
11640 {
11641 att_type = ConfigGetString("soundAttType");
11642 }
11643
11644 m_SoundAttType = att_type;
11645 }
11646
11647 override string GetAttachmentSoundType()
11648 {
11649 return m_SoundAttType;
11650 }
11651
11652 //----------------------------------------------------------------
11653 //SOUNDS - ItemSoundHandler
11654 //----------------------------------------------------------------
11655
11656 string GetPlaceSoundset(); // played when deploy starts
11657 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
11658 string GetDeploySoundset(); // played when deploy sucessfully finishes
11659 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
11660 string GetFoldSoundset(); // played when fold sucessfully finishes
11661
11663 {
11664 if (!m_ItemSoundHandler)
11666
11667 return m_ItemSoundHandler;
11668 }
11669
11670 // override to initialize sounds
11671 protected void InitItemSounds()
11672 {
11673 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
11674 return;
11675
11677
11678 if (GetPlaceSoundset() != string.Empty)
11679 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
11680
11681 if (GetDeploySoundset() != string.Empty)
11682 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
11683
11684 SoundParameters params = new SoundParameters();
11685 params.m_Loop = true;
11686 if (GetLoopDeploySoundset() != string.Empty)
11687 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
11688 }
11689
11690 // Start sound using ItemSoundHandler
11691 void StartItemSoundServer(int id, int slotId)
11692 {
11693 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
11694 {
11695 m_SoundSyncSlotID = slotId;
11696 m_SoundSyncPlay = id;
11697
11698 SetSynchDirty();
11699
11700 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
11701 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
11702 }
11703 }
11704
11705 void StartItemSoundServer(int id)
11706 {
11707 StartItemSoundServer(id, InventorySlots.INVALID);
11708 }
11709
11710 // Stop sound using ItemSoundHandler
11711 void StopItemSoundServer(int id)
11712 {
11713 if (!g_Game.IsServer())
11714 return;
11715
11716 m_SoundSyncStop = id;
11717 SetSynchDirty();
11718
11719 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
11720 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
11721 }
11722
11723 protected void ClearStartItemSoundServer()
11724 {
11725 m_SoundSyncPlay = 0;
11726 m_SoundSyncSlotID = InventorySlots.INVALID;
11727 }
11728
11729 protected void ClearStopItemSoundServer()
11730 {
11731 m_SoundSyncStop = 0;
11732 }
11733
11734 void OnApply(PlayerBase player);
11735
11737 {
11738 return 1.0;
11739 };
11740 //returns applicable selection
11741 array<string> GetHeadHidingSelection()
11742 {
11744 }
11745
11747 {
11749 }
11750
11751 WrittenNoteData GetWrittenNoteData() {};
11752
11754 {
11755 SetDynamicPhysicsLifeTime(0.01);
11756 m_ItemBeingDroppedPhys = false;
11757 }
11758
11760 {
11761 array<string> zone_names = new array<string>;
11762 GetDamageZones(zone_names);
11763 for (int i = 0; i < zone_names.Count(); i++)
11764 {
11765 SetHealthMax(zone_names.Get(i),"Health");
11766 }
11767 SetHealthMax("","Health");
11768 }
11769
11771 void SetZoneDamageCEInit()
11772 {
11773 float global_health = GetHealth01("","Health");
11774 array<string> zones = new array<string>;
11775 GetDamageZones(zones);
11776 //set damage of all zones to match global health level
11777 for (int i = 0; i < zones.Count(); i++)
11778 {
11779 SetHealth01(zones.Get(i),"Health",global_health);
11780 }
11781 }
11782
11784 bool IsCoverFaceForShave(string slot_name)
11785 {
11786 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11787 }
11788
11789 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
11790 {
11791 if (!hasRootAsPlayer)
11792 {
11793 if (refParentIB)
11794 {
11795 // parent is wet
11796 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
11797 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11798 // parent has liquid inside
11799 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
11800 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11801 // drying
11802 else if (m_VarWet > m_VarWetMin)
11803 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
11804 }
11805 else
11806 {
11807 // drying on ground or inside non-itembase (car, ...)
11808 if (m_VarWet > m_VarWetMin)
11809 AddWet(-1 * delta * GetDryingIncrement("ground"));
11810 }
11811 }
11812 }
11813
11814 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
11815 {
11817 {
11818 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
11819 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11820 {
11821 float heatPermCoef = 1.0;
11822 EntityAI ent = this;
11823 while (ent)
11824 {
11825 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11826 ent = ent.GetHierarchyParent();
11827 }
11828
11829 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11830 }
11831 }
11832 }
11833
11834 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
11835 {
11836 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
11837 EntityAI parent = GetHierarchyParent();
11838 if (!parent)
11839 {
11840 hasParent = false;
11841 hasRootAsPlayer = false;
11842 }
11843 else
11844 {
11845 hasParent = true;
11846 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11847 refParentIB = ItemBase.Cast(parent);
11848 }
11849 }
11850
11851 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
11852 {
11853 // this is stub, implemented on Edible_Base
11854 }
11855
11856 bool CanDecay()
11857 {
11858 // return true used on selected food clases so they can decay
11859 return false;
11860 }
11861
11862 protected bool CanProcessDecay()
11863 {
11864 // this is stub, implemented on Edible_Base class
11865 // used to determine whether it is still necessary for the food to decay
11866 return false;
11867 }
11868
11869 protected bool CanHaveWetness()
11870 {
11871 // return true used on selected items that have a wetness effect
11872 return false;
11873 }
11874
11876 bool CanBeConsumed(ConsumeConditionData data = null)
11877 {
11878 return !GetIsFrozen() && IsOpen();
11879 }
11880
11881 override void ProcessVariables()
11882 {
11883 bool hasParent = false, hasRootAsPlayer = false;
11884 ItemBase refParentIB;
11885
11886 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
11887 bool foodDecay = g_Game.IsFoodDecayEnabled();
11888
11889 if (wwtu || foodDecay)
11890 {
11891 bool processWetness = wwtu && CanHaveWetness();
11892 bool processTemperature = wwtu && CanHaveTemperature();
11893 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
11894
11895 if (processWetness || processTemperature || processDecay)
11896 {
11897 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
11898
11899 if (processWetness)
11900 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11901
11902 if (processTemperature)
11903 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
11904
11905 if (processDecay)
11906 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
11907 }
11908 }
11909 }
11910
11913 {
11914 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
11915 }
11916
11917 override float GetTemperatureFreezeThreshold()
11918 {
11920 return Liquid.GetFreezeThreshold(GetLiquidType());
11921
11922 return super.GetTemperatureFreezeThreshold();
11923 }
11924
11925 override float GetTemperatureThawThreshold()
11926 {
11928 return Liquid.GetThawThreshold(GetLiquidType());
11929
11930 return super.GetTemperatureThawThreshold();
11931 }
11932
11933 override float GetItemOverheatThreshold()
11934 {
11936 return Liquid.GetBoilThreshold(GetLiquidType());
11937
11938 return super.GetItemOverheatThreshold();
11939 }
11940
11941 override float GetTemperatureFreezeTime()
11942 {
11943 if (HasQuantity())
11944 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
11945
11946 return super.GetTemperatureFreezeTime();
11947 }
11948
11949 override float GetTemperatureThawTime()
11950 {
11951 if (HasQuantity())
11952 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
11953
11954 return super.GetTemperatureThawTime();
11955 }
11956
11958 void AffectLiquidContainerOnFill(int liquid_type, float amount);
11960 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
11961
11962 bool IsCargoException4x3(EntityAI item)
11963 {
11964 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
11965 }
11966
11968 {
11969 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
11970 }
11971
11973 void AddLightSourceItem(ItemBase lightsource)
11974 {
11975 m_LightSourceItem = lightsource;
11976 }
11977
11979 {
11980 m_LightSourceItem = null;
11981 }
11982
11984 {
11985 return m_LightSourceItem;
11986 }
11987
11989 array<int> GetValidFinishers()
11990 {
11991 return null;
11992 }
11993
11995 bool GetActionWidgetOverride(out typename name)
11996 {
11997 return false;
11998 }
11999
12000 bool PairWithDevice(notnull ItemBase otherDevice)
12001 {
12002 if (g_Game.IsServer())
12003 {
12004 ItemBase explosive = otherDevice;
12006 if (!trg)
12007 {
12008 trg = RemoteDetonatorTrigger.Cast(otherDevice);
12009 explosive = this;
12010 }
12011
12012 explosive.PairRemote(trg);
12013 trg.SetControlledDevice(explosive);
12014
12015 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12016 trg.SetPersistentPairID(persistentID);
12017 explosive.SetPersistentPairID(persistentID);
12018
12019 return true;
12020 }
12021 return false;
12022 }
12023
12025 float GetBaitEffectivity()
12026 {
12027 float ret = 1.0;
12028 if (HasQuantity())
12029 ret *= GetQuantityNormalized();
12030 ret *= GetHealth01();
12031
12032 return ret;
12033 }
12034
12035 #ifdef DEVELOPER
12036 override void SetDebugItem()
12037 {
12038 super.SetDebugItem();
12039 _itemBase = this;
12040 }
12041
12042 override string GetDebugText()
12043 {
12044 string text = super.GetDebugText();
12045
12046 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
12047 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
12048
12049 return text;
12050 }
12051 #endif
12052
12053 bool CanBeUsedForSuicide()
12054 {
12055 return true;
12056 }
12057
12059 //DEPRECATED BELOW
12061 // Backwards compatibility
12062 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12063 {
12064 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
12065 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
12066 }
12067
12068 // replaced by ItemSoundHandler
12069 protected EffectSound m_SoundDeployFinish;
12070 protected EffectSound m_SoundPlace;
12071 protected EffectSound m_DeployLoopSoundEx;
12072 protected EffectSound m_SoundDeploy;
12073 bool m_IsPlaceSound;
12074 bool m_IsDeploySound;
12076
12077 string GetDeployFinishSoundset();
12078 void PlayDeploySound();
12079 void PlayDeployFinishSound();
12080 void PlayPlaceSound();
12081 void PlayDeployLoopSoundEx();
12082 void StopDeployLoopSoundEx();
12083 void SoundSynchRemoteReset();
12084 void SoundSynchRemote();
12085 bool UsesGlobalDeploy(){return false;}
12086 bool CanPlayDeployLoopSound(){return false;}
12088 bool IsPlaceSound(){return m_IsPlaceSound;}
12089 bool IsDeploySound(){return m_IsDeploySound;}
12090 void SetIsPlaceSound(bool is_place_sound);
12091 void SetIsDeploySound(bool is_deploy_sound);
12092
12093 [Obsolete("Use ItemSoundHandler instead")]
12095 void PlayAttachSound(string slot_type)
12096 {
12097 if (!g_Game.IsDedicatedServer())
12098 {
12099 if (ConfigIsExisting("attachSoundSet"))
12100 {
12101 string cfg_path = "";
12102 string soundset = "";
12103 string type_name = GetType();
12104
12105 TStringArray cfg_soundset_array = new TStringArray;
12106 TStringArray cfg_slot_array = new TStringArray;
12107 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12108 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12109
12110 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12111 {
12112 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12113 {
12114 if (cfg_slot_array[i] == slot_type)
12115 {
12116 soundset = cfg_soundset_array[i];
12117 break;
12118 }
12119 }
12120 }
12121
12122 if (soundset != "")
12123 {
12124 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
12125 sound.SetAutodestroy(true);
12126 }
12127 }
12128 }
12129 }
12130
12131 void PlayDetachSound(string slot_type) {}
12132}
12133
12134EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
12135{
12136 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
12137 if (entity)
12138 {
12139 bool is_item = entity.IsInherited(ItemBase);
12140 if (is_item && full_quantity)
12141 {
12142 ItemBase item = ItemBase.Cast(entity);
12143 item.SetQuantity(item.GetQuantityInit());
12144 }
12145 }
12146 else
12147 {
12148 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
12149 return NULL;
12150 }
12151 return entity;
12152}
12153
12154void SetupSpawnedItem(ItemBase item, float health, float quantity)
12155{
12156 if (item)
12157 {
12158 if (health > 0)
12159 item.SetHealth("", "", health);
12160
12161 if (item.CanHaveTemperature())
12162 {
12163 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
12164 if (item.CanFreeze())
12165 item.SetFrozen(false);
12166 }
12167
12168 if (item.HasEnergyManager())
12169 {
12170 if (quantity >= 0)
12171 {
12172 item.GetCompEM().SetEnergy0To1(quantity);
12173 }
12174 else
12175 {
12176 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
12177 }
12178 }
12179 else if (item.IsMagazine())
12180 {
12181 Magazine mag = Magazine.Cast(item);
12182 if (quantity >= 0)
12183 {
12184 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12185 }
12186 else
12187 {
12188 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
12189 }
12190
12191 }
12192 else
12193 {
12194 if (quantity >= 0)
12195 {
12196 item.SetQuantityNormalized(quantity, false);
12197 }
12198 else
12199 {
12200 item.SetQuantity(Math.AbsFloat(quantity));
12201 }
12202
12203 }
12204 }
12205}
12206
12207#ifdef DEVELOPER
12208ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
12209#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
EWetnessLevel
Определения 3_Game/DayZ/Entities/EntityAI.c:2
bool SetAttachSoundEvent()
void InventoryItemType()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_ITEM_MANIPULATION
class LogManager EntityAI
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionDropItem()
Определения ActionDropItem.c:34
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
string Debug()
Определения CachedEquipmentStorageBase.c:29
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
Определения ContaminatedArea_Dynamic.c:42
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
DayZGame GetDayZGame()
Определения DayZGame.c:3944
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:159
const int MIN
Определения EnConvert.c:28
const int MAX
Определения EnConvert.c:27
float GetTemperature()
Определения Environment.c:500
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool IsPrepareToDelete()
Определения FireplaceBase.c:643
override bool CanHaveTemperature()
Определения FireplaceBase.c:561
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6453
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5680
bool HidesSelectionBySlot()
Определения ItemBase.c:9413
float m_VarWetMin
Определения ItemBase.c:4937
void SplitItem(PlayerBase player)
Определения ItemBase.c:6908
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9634
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8895
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8330
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5685
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:9038
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6875
override bool IsHeavyBehaviour()
Определения ItemBase.c:9240
override void SetWetMax()
Определения ItemBase.c:8616
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9451
void ClearStartItemSoundServer()
Определения ItemBase.c:9390
float m_VarWet
Определения ItemBase.c:4934
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9481
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:3
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8890
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4997
bool CanBeMovedOverride()
Определения ItemBase.c:7600
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8592
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4983
void StartItemSoundServer(int id, int slotId)
Определения ItemBase.c:9358
override void ProcessVariables()
Определения ItemBase.c:9548
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:5011
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8423
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8956
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8806
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5271
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:5009
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9584
bool m_IsSoundSynchRemote
Определения ItemBase.c:9742
float m_OverheatingShots
Определения ItemBase.c:5004
void StopItemSoundServer(int id)
Определения ItemBase.c:9378
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5700
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5424
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9608
ref array< int > m_CompatibleLocks
Определения ItemBase.c:5021
bool CanBeCooked()
Определения ItemBase.c:7556
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5767
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:5035
bool m_RecipesInitialized
Определения ItemBase.c:4919
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6546
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9592
override void OnEnergyConsumed()
Определения ItemBase.c:8536
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8462
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8656
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8418
ref TIntArray m_InteractActions
Определения ItemBase.c:4985
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7620
float m_VarQuantity
Определения ItemBase.c:4925
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9753
override float GetWetMax()
Определения ItemBase.c:8626
bool CanBeUsedForSuicide()
Определения ItemBase.c:9720
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7193
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5905
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7774
void DoAmmoExplosion()
Определения ItemBase.c:6388
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4996
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6732
int GetItemSize()
Определения ItemBase.c:7585
bool m_CanBeMovedOverride
Определения ItemBase.c:4962
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6312
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5492
bool CanDecay()
Определения ItemBase.c:9523
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...
Определения ItemBase.c:8303
void SetQuantityMax()
Определения ItemBase.c:8308
override float GetQuantity()
Определения ItemBase.c:8398
int m_ColorComponentR
Определения ItemBase.c:4974
int m_ShotsToStartOverheating
Определения ItemBase.c:5006
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8641
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5499
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9139
void OnOverheatingDecay()
Определения ItemBase.c:5462
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8574
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4940
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5600
bool UsesGlobalDeploy()
Определения ItemBase.c:9752
int m_ItemBehaviour
Определения ItemBase.c:4955
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:9111
float m_HeatIsolation
Определения ItemBase.c:4950
float m_VarWetInit
Определения ItemBase.c:4936
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5945
void SetCEBasedQuantity()
Определения ItemBase.c:5713
bool m_CanPlayImpactSound
Определения ItemBase.c:4946
override string GetAttachmentSoundType()
Определения ItemBase.c:9314
float GetOverheatingCoef()
Определения ItemBase.c:5519
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9408
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9762
override bool IsStoreLoad()
Определения ItemBase.c:8668
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7169
bool IsLightSource()
Определения ItemBase.c:5841
bool m_HasQuantityBar
Определения ItemBase.c:4968
void SetResultOfSplit(bool value)
Определения ItemBase.c:7164
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6796
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6965
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5527
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8583
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9219
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8678
int m_LockType
Определения ItemBase.c:5022
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:5027
bool m_CanBeDigged
Определения ItemBase.c:4969
float m_ItemAttachOffset
Определения ItemBase.c:4952
float GetItemModelLength()
Определения ItemBase.c:8685
bool m_ThrowItemOnDrop
Определения ItemBase.c:4960
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7919
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8971
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8569
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7198
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9579
bool CanHaveWetness()
Определения ItemBase.c:9536
int m_CleannessMin
Определения ItemBase.c:4942
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8904
string IDToName(int id)
Определения ItemBase.c:7767
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9543
float GetHeatIsolationInit()
Определения ItemBase.c:8564
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7607
override bool HasQuantity()
Определения ItemBase.c:8393
float m_VarWetPrev
Определения ItemBase.c:4935
int m_SoundSyncStop
Определения ItemBase.c:5029
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9629
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4984
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5609
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5294
int m_VarLiquidType
Определения ItemBase.c:4954
int m_QuickBarBonus
Определения ItemBase.c:4956
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9302
override float GetWetInit()
Определения ItemBase.c:8636
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4948
int m_SoundSyncPlay
Определения ItemBase.c:5028
int m_MaxOverheatingValue
Определения ItemBase.c:5007
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4931
bool m_IsTakeable
Определения ItemBase.c:4959
bool ShouldSplitQuantity(float quantity)
Определения ItemBase.c:6503
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4999
string GetLockSoundSet()
Определения ItemBase.c:8734
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8765
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9656
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6971
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4911
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9329
override int GetQuantityMin()
Определения ItemBase.c:8382
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6711
override int GetQuickBarBonus()
Определения ItemBase.c:5179
override void SetTakeable(bool pState)
Определения ItemBase.c:9284
float m_OverheatingDecayInterval
Определения ItemBase.c:5008
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6523
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9501
bool CanProcessDecay()
Определения ItemBase.c:9529
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5690
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9645
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7571
bool can_this_be_combined
Определения ItemBase.c:4964
EffectSound m_SoundDeploy
Определения ItemBase.c:9739
int m_SoundSyncSlotID
Определения ItemBase.c:5030
int m_Count
Определения ItemBase.c:4930
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9692
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9276
override bool IsSplitable()
Определения ItemBase.c:6490
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6473
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7883
void ConvertEnergyToQuantity()
Определения ItemBase.c:8551
override void RemoveAllAgents()
Определения ItemBase.c:8885
override void SetQuantityToMinimum()
Определения ItemBase.c:8314
bool m_WantPlayImpactSound
Определения ItemBase.c:4945
override float GetTemperatureThawTime()
Определения ItemBase.c:9616
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4998
int m_ColorComponentG
Определения ItemBase.c:4975
float m_StoreLoadedQuantity
Определения ItemBase.c:4932
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7638
int m_ColorComponentA
Определения ItemBase.c:4977
int m_VarQuantityInit
Определения ItemBase.c:4927
float GetFilterDamageRatio()
Определения ItemBase.c:5594
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8778
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6942
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...
Определения ItemBase.c:8321
bool m_HideSelectionsBySlot
Определения ItemBase.c:5012
bool IsOverheatingEffectActive()
Определения ItemBase.c:5457
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5874
int GetLiquidContainerMask()
Определения ItemBase.c:5811
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
Определения ItemBase.c:7078
ref Timer m_CheckOverheating
Определения ItemBase.c:5005
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5505
float GetEnergy()
Определения ItemBase.c:8525
bool CanBeDigged()
Определения ItemBase.c:5890
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9662
bool IsNVG()
Определения ItemBase.c:5822
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8485
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9438
bool m_IsDeploySound
Определения ItemBase.c:9741
bool CanEat()
Определения ItemBase.c:7531
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9179
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9250
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9640
bool IsLiquidContainer()
Определения ItemBase.c:5806
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7551
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8409
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8963
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8363
int m_CleannessInit
Определения ItemBase.c:4941
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5589
override int GetAgents()
Определения ItemBase.c:8910
int m_VarQuantityMax
Определения ItemBase.c:4929
override bool IsHologram()
Определения ItemBase.c:5885
float GetItemAttachOffset()
Определения ItemBase.c:8694
bool IsPlaceSound()
Определения ItemBase.c:9755
static int GetDebugActionsMask()
Определения ItemBase.c:5675
override int GetLiquidType()
Определения ItemBase.c:8794
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9518
override bool IsItemBase()
Определения ItemBase.c:7684
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9260
void ExplodeAmmo()
Определения ItemBase.c:6375
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:7154
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8984
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9159
override void OnEnergyAdded()
Определения ItemBase.c:8543
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()
Определения ItemBase.c:5834
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9738
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7824
void StopItemDynamicPhysics()
Определения ItemBase.c:9420
bool HasFoodStage()
Определения ItemBase.c:7544
override void SetStoreLoad(bool value)
Определения ItemBase.c:8663
float GetOverheatingValue()
Определения ItemBase.c:5419
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8863
override void AddWet(float value)
Определения ItemBase.c:8611
bool IsLiquidPresent()
Определения ItemBase.c:5801
bool IsFullQuantity()
Определения ItemBase.c:8403
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:6084
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6847
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6823
int m_CleannessMax
Определения ItemBase.c:4943
float m_VarStackMax
Определения ItemBase.c:4931
ref Timer m_PhysDropTimer
Определения ItemBase.c:5018
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7656
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8673
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4972
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5440
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5755
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7578
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8799
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5486
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8721
bool m_IsOverheatingEffectActive
Определения ItemBase.c:5003
int m_LiquidContainerMask
Определения ItemBase.c:4953
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9456
override int GetCleanness()
Определения ItemBase.c:8716
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9667
bool IsDeploySound()
Определения ItemBase.c:9756
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5695
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9199
int m_VarQuantityMin
Определения ItemBase.c:4928
void PerformDamageSystemReinit()
Определения ItemBase.c:9426
override void ClearInventory()
Определения ItemBase.c:8504
static int m_LastRegisteredWeaponID
Определения ItemBase.c:5000
ItemBase GetLightSourceItem()
Определения ItemBase.c:9650
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7674
override float GetItemOverheatThreshold()
Определения ItemBase.c:9600
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4965
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7788
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6762
float m_ItemModelLength
Определения ItemBase.c:4951
bool m_IsHologram
Определения ItemBase.c:4958
static int m_DebugActionsMask
Определения ItemBase.c:4918
void KillAllOverheatingParticles()
Определения ItemBase.c:5555
bool CanBeCookedOnStick()
Определения ItemBase.c:7561
override int GetQuantityMax()
Определения ItemBase.c:8349
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7232
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8759
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8876
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4961
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:9066
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9798
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4912
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9729
override bool IsBeingPlaced()
Определения ItemBase.c:5869
int GetQuantityInit()
Определения ItemBase.c:8387
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7174
bool IsResultOfSplit()
Определения ItemBase.c:7159
bool m_FixDamageSystemInit
Определения ItemBase.c:4963
float m_ImpactSpeed
Определения ItemBase.c:4947
bool m_IsStoreLoad
Определения ItemBase.c:4966
int GetLiquidTypeInit()
Определения ItemBase.c:8789
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4981
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5742
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6633
int m_AttachedAgents
Определения ItemBase.c:4989
string m_LockSoundSet
Определения ItemBase.c:5024
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5363
float m_VarQuantityPrev
Определения ItemBase.c:4926
bool IsSoundSynchRemote()
Определения ItemBase.c:9754
bool m_CanShowQuantity
Определения ItemBase.c:4967
override void OnRightClick()
Определения ItemBase.c:7014
int m_ColorComponentB
Определения ItemBase.c:4976
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4914
bool IsActionTargetVisible()
Определения ItemBase.c:9296
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:6119
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6412
bool m_IsBeingPlaced
Определения ItemBase.c:4957
int NameToID(string name)
Определения ItemBase.c:7761
void ~ItemBase()
Определения ItemBase.c:5640
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8651
void ClearStopItemSoundServer()
Определения ItemBase.c:9396
override string ChangeIntoOnDetach()
Определения ItemBase.c:6336
float m_VarWetMax
Определения ItemBase.c:4938
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6757
int GetLockType()
Определения ItemBase.c:8729
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9736
override float GetWet()
Определения ItemBase.c:8621
EffectSound m_SoundPlace
Определения ItemBase.c:9737
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8335
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8703
bool m_IsPlaceSound
Определения ItemBase.c:9740
override float GetWetMin()
Определения ItemBase.c:8631
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:5032
override bool KindOf(string tag)
Определения ItemBase.c:7690
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:336
string GetDebugText()
Определения ModifierBase.c:71
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
int GetID()
Определения ActionBase.c:1335
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:974
GetInputType()
Определения ActionBase.c:221
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1325
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:550
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1320
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения 3_Game/DayZ/Entities/Man.c:48
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)
Определения ItemBase.c:21
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)
Определения InventoryLocation.c:507
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
InventoryLocation.
Определения InventoryLocation.c:30
override bool CanDisplayCargo()
Определения TentBase.c:91
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override string GetFoldSoundset()
Определения BaseBuildingBase.c:108
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:7
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:934
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:199
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
Определения GardenBase.c:242
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:113
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:397
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1238
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:489
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:409
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:496
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:266
override void AfterStoreLoad()
Определения BarbedWire.c:155
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1037
override void OnVariablesSynchronized()
Определения GardenBase.c:97
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:982
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:331
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:1008
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1170
override void InitItemSounds()
Определения BaseBuildingBase.c:94
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1032
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:365
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения ItemBase.c:14
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:40
proto native float GetDamage(string zoneName, string healthType)
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:916
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:113
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:515
const int DEF_CHEMICAL
Определения 3_Game/DayZ/constants.c:516
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:712
array< int > TIntArray
Определения EnScript.c:714
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:811
const int VARIABLE_LIQUIDTYPE
Определения 3_Game/DayZ/constants.c:635
const int VARIABLE_CLEANNESS
Определения 3_Game/DayZ/constants.c:638
const int VARIABLE_COLOR
Определения 3_Game/DayZ/constants.c:637
const int VARIABLE_TEMPERATURE
Определения 3_Game/DayZ/constants.c:633
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const int VARIABLE_WET
Определения 3_Game/DayZ/constants.c:634
const int LIQUID_NONE
Определения 3_Game/DayZ/constants.c:532
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения 3_Game/DayZ/constants.c:456
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
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.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native int GetColor()