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

◆ PlayDetachSound()

void SpawnItemOnLocation::PlayDetachSound ( string slot_type)
protected

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

9190{
9191 override bool CanPutAsAttachment(EntityAI parent)
9192 {
9193 return true;
9194 }
9195};
9196
9197//const bool QUANTITY_DEBUG_REMOVE_ME = false;
9198
9199class ItemBase extends InventoryItem
9200{
9204
9206
9207 static int m_DebugActionsMask;
9209 // ============================================
9210 // Variable Manipulation System
9211 // ============================================
9212 // Quantity
9213
9214 float m_VarQuantity;
9215 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
9217 int m_VarQuantityMin;
9218 int m_VarQuantityMax;
9219 int m_Count;
9220 float m_VarStackMax;
9221 float m_StoreLoadedQuantity = float.LOWEST;
9222 // Wet
9223 float m_VarWet;
9224 float m_VarWetPrev;//for client to know wetness changed during synchronization
9225 float m_VarWetInit;
9226 float m_VarWetMin;
9227 float m_VarWetMax;
9228 // Cleanness
9229 int m_Cleanness;
9230 int m_CleannessInit;
9231 int m_CleannessMin;
9232 int m_CleannessMax;
9233 // impact sounds
9235 bool m_CanPlayImpactSound = true;
9236 float m_ImpactSpeed;
9238 //
9239 float m_HeatIsolation;
9240 float m_ItemModelLength;
9241 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
9243 int m_VarLiquidType;
9244 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
9245 int m_QuickBarBonus;
9246 bool m_IsBeingPlaced;
9247 bool m_IsHologram;
9248 bool m_IsTakeable;
9249 bool m_ThrowItemOnDrop;
9252 bool m_FixDamageSystemInit = false; //can be changed on storage version check
9253 bool can_this_be_combined; //Check if item can be combined
9254 bool m_CanThisBeSplit; //Check if item can be split
9255 bool m_IsStoreLoad = false;
9256 bool m_CanShowQuantity;
9257 bool m_HasQuantityBar;
9258 protected bool m_CanBeDigged;
9259 protected bool m_IsResultOfSplit
9260
9261 string m_SoundAttType;
9262 // items color variables
9267 //-------------------------------------------------------
9268
9269 // light source managing
9271
9275
9276 //==============================================
9277 // agent system
9278 private int m_AttachedAgents;
9279
9281 void TransferModifiers(PlayerBase reciever);
9282
9283
9284 // Weapons & suppressors particle effects
9289 static int m_LastRegisteredWeaponID = 0;
9290
9291 // Overheating effects
9293 float m_OverheatingShots;
9294 ref Timer m_CheckOverheating;
9295 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
9296 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
9297 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
9298 ref array <ref OverheatingParticle> m_OverheatingParticles;
9299
9301 protected bool m_HideSelectionsBySlot;
9302
9303 // Admin Log
9304 PluginAdminLog m_AdminLog;
9305
9306 // misc
9307 ref Timer m_PhysDropTimer;
9308
9309 // Attachment Locking variables
9310 ref array<int> m_CompatibleLocks;
9311 protected int m_LockType;
9312 protected ref EffectSound m_LockingSound;
9313 protected string m_LockSoundSet;
9314
9315 // ItemSoundHandler
9316 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
9317 protected int m_SoundSyncPlay; // id for sound to play
9318 protected int m_SoundSyncStop; // id for sound to stop
9320
9321 //temperature
9322 private float m_TemperaturePerQuantityWeight;
9323
9324 // -------------------------------------------------------------------------
9325 void ItemBase()
9326 {
9327 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
9331
9332 if (!GetGame().IsDedicatedServer())
9333 {
9334 if (HasMuzzle())
9335 {
9337
9339 {
9341 }
9342 }
9343
9345 m_ActionsInitialize = false;
9346 }
9347
9348 m_OldLocation = null;
9349
9350 if (GetGame().IsServer())
9351 {
9352 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
9353 }
9354
9355 if (ConfigIsExisting("headSelectionsToHide"))
9356 {
9358 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
9359 }
9360
9361 m_HideSelectionsBySlot = false;
9362 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9363 {
9364 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
9365 }
9366
9367 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
9368
9369 m_IsResultOfSplit = false;
9370
9372 }
9373
9374 override void InitItemVariables()
9375 {
9376 super.InitItemVariables();
9377
9378 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
9379 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
9380 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
9381 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
9382 m_VarStackMax = ConfigGetFloat("varStackMax");
9383 m_Count = ConfigGetInt("count");
9384
9385 m_CanShowQuantity = ConfigGetBool("quantityShow");
9386 m_HasQuantityBar = ConfigGetBool("quantityBar");
9387
9388 m_CleannessInit = ConfigGetInt("varCleannessInit");
9390 m_CleannessMin = ConfigGetInt("varCleannessMin");
9391 m_CleannessMax = ConfigGetInt("varCleannessMax");
9392
9393 m_WantPlayImpactSound = false;
9394 m_ImpactSpeed = 0.0;
9395
9396 m_VarWetInit = ConfigGetFloat("varWetInit");
9398 m_VarWetMin = ConfigGetFloat("varWetMin");
9399 m_VarWetMax = ConfigGetFloat("varWetMax");
9400
9401 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
9402 if (IsLiquidContainer() && GetQuantity() != 0)
9404 m_IsBeingPlaced = false;
9405 m_IsHologram = false;
9406 m_IsTakeable = true;
9407 m_CanBeMovedOverride = false;
9411 m_CanBeDigged = ConfigGetBool("canBeDigged");
9412
9413 m_CompatibleLocks = new array<int>();
9414 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
9415 m_LockType = ConfigGetInt("lockType");
9416
9417 //Define if item can be split and set ability to be combined accordingly
9418 m_CanThisBeSplit = false;
9419 can_this_be_combined = false;
9420 if (ConfigIsExisting("canBeSplit"))
9421 {
9422 can_this_be_combined = ConfigGetBool("canBeSplit");
9424 }
9425
9426 m_ItemBehaviour = -1;
9427 if (ConfigIsExisting("itemBehaviour"))
9428 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
9429
9430 //RegisterNetSyncVariableInt("m_VariablesMask");
9431 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9432 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
9433 RegisterNetSyncVariableInt("m_VarLiquidType");
9434 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9435
9436 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9437 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9438 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9439
9440 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9441 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9442 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9443 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9444
9445 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9446 RegisterNetSyncVariableBool("m_IsTakeable");
9447 RegisterNetSyncVariableBool("m_IsHologram");
9448
9449 InitItemSounds();
9451 {
9452 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
9453 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
9454 }
9455
9456 m_LockSoundSet = ConfigGetString("lockSoundSet");
9457
9459 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9460 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
9461
9462 }
9463
9464 override int GetQuickBarBonus()
9465 {
9466 return m_QuickBarBonus;
9467 }
9468
9469 void InitializeActions()
9470 {
9472 if (!m_InputActionMap)
9473 {
9475 m_InputActionMap = iam;
9476 SetActions();
9478 }
9479 }
9480
9481 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
9482 {
9484 {
9485 m_ActionsInitialize = true;
9487 }
9488
9489 actions = m_InputActionMap.Get(action_input_type);
9490 }
9491
9492 void SetActions()
9493 {
9494 AddAction(ActionTakeItem);
9495 AddAction(ActionTakeItemToHands);
9496 AddAction(ActionWorldCraft);
9498 AddAction(ActionAttachWithSwitch);
9499 }
9500
9501 void SetActionAnimOverrides(); // Override action animation for specific item
9502
9503 void AddAction(typename actionName)
9504 {
9505 ActionBase action = ActionManagerBase.GetAction(actionName);
9506
9507 if (!action)
9508 {
9509 Debug.LogError("Action " + actionName + " dosn't exist!");
9510 return;
9511 }
9512
9513 typename ai = action.GetInputType();
9514 if (!ai)
9515 {
9516 m_ActionsInitialize = false;
9517 return;
9518 }
9519
9520 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9521 if (!action_array)
9522 {
9523 action_array = new array<ActionBase_Basic>;
9524 m_InputActionMap.Insert(ai, action_array);
9525 }
9526 if (LogManager.IsActionLogEnable())
9527 {
9528 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
9529 }
9530
9531 if (action_array.Find(action) != -1)
9532 {
9533 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
9534 }
9535 else
9536 {
9537 action_array.Insert(action);
9538 }
9539 }
9540
9541 void RemoveAction(typename actionName)
9542 {
9543 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9544 ActionBase action = player.GetActionManager().GetAction(actionName);
9545 typename ai = action.GetInputType();
9546 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9547
9548 if (action_array)
9549 {
9550 action_array.RemoveItem(action);
9551 }
9552 }
9553
9554 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
9555 // Set -1 for params which should stay in default state
9556 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
9557 {
9558 ActionOverrideData overrideData = new ActionOverrideData();
9559 overrideData.m_CommandUID = commandUID;
9560 overrideData.m_CommandUIDProne = commandUIDProne;
9561 overrideData.m_StanceMask = stanceMask;
9562
9563 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
9564 if (!actionMap) // create new map of action > overidables map
9565 {
9566 actionMap = new TActionAnimOverrideMap();
9567 m_ItemActionOverrides.Insert(action, actionMap);
9568 }
9569
9570 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
9571
9572 }
9573
9574 void OnItemInHandsPlayerSwimStart(PlayerBase player);
9575
9576 ScriptedLightBase GetLight();
9577
9578 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9579 void LoadParticleConfigOnFire(int id)
9580 {
9581 if (!m_OnFireEffect)
9583
9586
9587 string config_to_search = "CfgVehicles";
9588 string muzzle_owner_config;
9589
9590 if (!m_OnFireEffect.Contains(id))
9591 {
9592 if (IsInherited(Weapon))
9593 config_to_search = "CfgWeapons";
9594
9595 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9596
9597 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9598
9599 int config_OnFire_subclass_count = GetGame().ConfigGetChildrenCount(config_OnFire_class);
9600
9601 if (config_OnFire_subclass_count > 0)
9602 {
9603 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9604
9605 for (int i = 0; i < config_OnFire_subclass_count; i++)
9606 {
9607 string particle_class = "";
9608 GetGame().ConfigGetChildName(config_OnFire_class, i, particle_class);
9609 string config_OnFire_entry = config_OnFire_class + particle_class;
9610 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9611 WPOF_array.Insert(WPOF);
9612 }
9613
9614
9615 m_OnFireEffect.Insert(id, WPOF_array);
9616 }
9617 }
9618
9619 if (!m_OnBulletCasingEjectEffect.Contains(id))
9620 {
9621 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
9622 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9623
9624 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9625
9626 int config_OnBulletCasingEject_count = GetGame().ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9627
9628 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9629 {
9630 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9631
9632 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9633 {
9634 string particle_class2 = "";
9635 GetGame().ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9636 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9637 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9638 WPOBE_array.Insert(WPOBE);
9639 }
9640
9641
9642 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
9643 }
9644 }
9645 }
9646
9647 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9649 {
9652
9653 if (!m_OnOverheatingEffect.Contains(id))
9654 {
9655 string config_to_search = "CfgVehicles";
9656
9657 if (IsInherited(Weapon))
9658 config_to_search = "CfgWeapons";
9659
9660 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
9661 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9662
9663 if (GetGame().ConfigIsExisting(config_OnOverheating_class))
9664 {
9665
9666 m_ShotsToStartOverheating = GetGame().ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
9667
9669 {
9670 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
9671 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9672 Error(error);
9673 return;
9674 }
9675
9676 m_OverheatingDecayInterval = GetGame().ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
9677 m_MaxOverheatingValue = GetGame().ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
9678
9679
9680
9681 int config_OnOverheating_subclass_count = GetGame().ConfigGetChildrenCount(config_OnOverheating_class);
9682 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9683
9684 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9685 {
9686 string particle_class = "";
9687 GetGame().ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9688 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9689 int entry_type = GetGame().ConfigGetType(config_OnOverheating_entry);
9690
9691 if (entry_type == CT_CLASS)
9692 {
9693 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9694 WPOOH_array.Insert(WPOF);
9695 }
9696 }
9697
9698
9699 m_OnOverheatingEffect.Insert(id, WPOOH_array);
9700 }
9701 }
9702 }
9703
9704 float GetOverheatingValue()
9705 {
9706 return m_OverheatingShots;
9707 }
9708
9709 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9710 {
9711 if (m_MaxOverheatingValue > 0)
9712 {
9714
9715 if (!m_CheckOverheating)
9717
9719 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9720
9721 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9722 }
9723 }
9724
9725 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9726 {
9728 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9729
9731 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9732
9734 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9735
9737 {
9739 }
9740 }
9741
9743 {
9745 }
9746
9747 void OnOverheatingDecay()
9748 {
9749 if (m_MaxOverheatingValue > 0)
9750 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9751 else
9753
9754 if (m_OverheatingShots <= 0)
9755 {
9758 }
9759 else
9760 {
9761 if (!m_CheckOverheating)
9763
9765 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9766 }
9767
9768 CheckOverheating(this, "", this);
9769 }
9770
9771 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9772 {
9774 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9775 }
9776
9777 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9778 {
9780 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9782 }
9783
9784 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9785 {
9787 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9788 }
9789
9790 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9791 {
9793 m_OverheatingParticles = new array<ref OverheatingParticle>;
9794
9795 OverheatingParticle OP = new OverheatingParticle();
9796 OP.RegisterParticle(p);
9797 OP.SetOverheatingLimitMin(min_heat_coef);
9798 OP.SetOverheatingLimitMax(max_heat_coef);
9799 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9800
9801 m_OverheatingParticles.Insert(OP);
9802 }
9803
9804 float GetOverheatingCoef()
9805 {
9806 if (m_MaxOverheatingValue > 0)
9808
9809 return -1;
9810 }
9811
9813 {
9815 {
9816 float overheat_coef = GetOverheatingCoef();
9817 int count = m_OverheatingParticles.Count();
9818
9819 for (int i = count; i > 0; --i)
9820 {
9821 int id = i - 1;
9822 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9823 Particle p = OP.GetParticle();
9824
9825 float overheat_min = OP.GetOverheatingLimitMin();
9826 float overheat_max = OP.GetOverheatingLimitMax();
9827
9828 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9829 {
9830 if (p)
9831 {
9832 p.Stop();
9833 OP.RegisterParticle(null);
9834 }
9835 }
9836 }
9837 }
9838 }
9839
9841 {
9843 {
9844 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9845 {
9846 int id = i - 1;
9847 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9848
9849 if (OP)
9850 {
9851 Particle p = OP.GetParticle();
9852
9853 if (p)
9854 {
9855 p.Stop();
9856 }
9857
9858 delete OP;
9859 }
9860 }
9861
9862 m_OverheatingParticles.Clear();
9864 }
9865 }
9866
9868 float GetInfectionChance(int system = 0, Param param = null)
9869 {
9870 return 0.0;
9871 }
9872
9873
9874 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9875 {
9876 return 250;//default value
9877 }
9878
9879 float GetFilterDamageRatio()
9880 {
9881 return 0;
9882 }
9883
9885 bool HasMuzzle()
9886 {
9887 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9888 return true;
9889
9890 return false;
9891 }
9892
9894 int GetMuzzleID()
9895 {
9896 if (!m_WeaponTypeToID)
9898
9899 if (m_WeaponTypeToID.Contains(GetType()))
9900 {
9901 return m_WeaponTypeToID.Get(GetType());
9902 }
9903 else
9904 {
9905 // Register new weapon ID
9907 }
9908
9910 }
9911
9918 {
9919 return -1;
9920 }
9921
9922
9923
9924 // -------------------------------------------------------------------------
9925 void ~ItemBase()
9926 {
9927 if (GetGame() && GetGame().GetPlayer() && (!GetGame().IsDedicatedServer()))
9928 {
9929 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
9930 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9931
9932 if (r_index >= 0)
9933 {
9934 InventoryLocation r_il = new InventoryLocation;
9935 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9936
9937 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9938 int r_type = r_il.GetType();
9939 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9940 {
9941 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9942 }
9943 else if (r_type == InventoryLocationType.ATTACHMENT)
9944 {
9945 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9946 }
9947
9948 }
9949
9950 player.GetHumanInventory().ClearUserReservedLocation(this);
9951 }
9952
9953 if (m_LockingSound)
9954 SEffectManager.DestroyEffect(m_LockingSound);
9955 }
9956
9957
9958
9959 // -------------------------------------------------------------------------
9960 static int GetDebugActionsMask()
9961 {
9962 return ItemBase.m_DebugActionsMask;
9963 }
9964
9965 static bool HasDebugActionsMask(int mask)
9966 {
9967 return ItemBase.m_DebugActionsMask & mask;
9968 }
9969
9970 static void SetDebugActionsMask(int mask)
9971 {
9972 ItemBase.m_DebugActionsMask = mask;
9973 }
9974
9975 static void AddDebugActionsMask(int mask)
9976 {
9977 ItemBase.m_DebugActionsMask |= mask;
9978 }
9979
9980 static void RemoveDebugActionsMask(int mask)
9981 {
9982 ItemBase.m_DebugActionsMask &= ~mask;
9983 }
9984
9985 static void ToggleDebugActionsMask(int mask)
9986 {
9987 if (HasDebugActionsMask(mask))
9988 {
9990 }
9991 else
9992 {
9993 AddDebugActionsMask(mask);
9994 }
9995 }
9996
9997 // -------------------------------------------------------------------------
9998 void SetCEBasedQuantity()
9999 {
10000 if (GetEconomyProfile())
10001 {
10002 float q_max = GetEconomyProfile().GetQuantityMax();
10003 if (q_max > 0)
10004 {
10005 float q_min = GetEconomyProfile().GetQuantityMin();
10006 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10007
10008 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
10009 {
10010 ComponentEnergyManager comp = GetCompEM();
10011 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
10012 {
10013 comp.SetEnergy0To1(quantity_randomized);
10014 }
10015 }
10016 else if (HasQuantity())
10017 {
10018 SetQuantityNormalized(quantity_randomized, false);
10019 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
10020 }
10021
10022 }
10023 }
10024 }
10025
10027 void LockToParent()
10028 {
10029 EntityAI parent = GetHierarchyParent();
10030
10031 if (parent)
10032 {
10033 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10034 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10035 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
10036 }
10037 }
10038
10040 void UnlockFromParent()
10041 {
10042 EntityAI parent = GetHierarchyParent();
10043
10044 if (parent)
10045 {
10046 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10047 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10048 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
10049 }
10050 }
10051
10052 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
10053 {
10054 /*
10055 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
10056 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, GetGame().GetPlayer());
10057 */
10058 ItemBase item2 = ItemBase.Cast(entity2);
10059
10060 if (GetGame().IsClient())
10061 {
10062 if (ScriptInputUserData.CanStoreInputUserData())
10063 {
10064 ScriptInputUserData ctx = new ScriptInputUserData;
10066 ctx.Write(-1);
10067 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10068 ctx.Write(i1);
10069 ctx.Write(item2);
10070 ctx.Write(use_stack_max);
10071 ctx.Write(-1);
10072 ctx.Send();
10073
10074 if (IsCombineAll(item2, use_stack_max))
10075 {
10076 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10077 }
10078 }
10079 }
10080 else if (!GetGame().IsMultiplayer())
10081 {
10082 CombineItems(item2, use_stack_max);
10083 }
10084 }
10085
10086 bool IsLiquidPresent()
10087 {
10088 return (GetLiquidType() != 0 && HasQuantity());
10089 }
10090
10091 bool IsLiquidContainer()
10092 {
10093 return m_LiquidContainerMask != 0;
10094 }
10095
10097 {
10098 return m_LiquidContainerMask;
10099 }
10100
10101 bool IsBloodContainer()
10102 {
10103 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
10104 return false;
10105 }
10106
10107 bool IsNVG()
10108 {
10109 return false;
10110 }
10111
10114 bool IsExplosive()
10115 {
10116 return false;
10117 }
10118
10120 {
10121 return "";
10122 }
10123
10125
10126 bool IsLightSource()
10127 {
10128 return false;
10129 }
10130
10132 {
10133 return true;
10134 }
10135
10136 //--- ACTION CONDITIONS
10137 //direction
10138 bool IsFacingPlayer(PlayerBase player, string selection)
10139 {
10140 return true;
10141 }
10142
10143 bool IsPlayerInside(PlayerBase player, string selection)
10144 {
10145 return true;
10146 }
10147
10148 override bool CanObstruct()
10149 {
10150 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10151 return !player || !IsPlayerInside(player, "");
10152 }
10153
10154 override bool IsBeingPlaced()
10155 {
10156 return m_IsBeingPlaced;
10157 }
10158
10159 void SetIsBeingPlaced(bool is_being_placed)
10160 {
10161 m_IsBeingPlaced = is_being_placed;
10162 if (!is_being_placed)
10164 SetSynchDirty();
10165 }
10166
10167 //server-side
10168 void OnEndPlacement() {}
10169
10170 override bool IsHologram()
10171 {
10172 return m_IsHologram;
10173 }
10174
10175 bool CanBeDigged()
10176 {
10177 return m_CanBeDigged;
10178 }
10179
10181 {
10182 return 1;
10183 }
10184
10185 bool CanMakeGardenplot()
10186 {
10187 return false;
10188 }
10189
10190 void SetIsHologram(bool is_hologram)
10191 {
10192 m_IsHologram = is_hologram;
10193 SetSynchDirty();
10194 }
10195 /*
10196 protected float GetNutritionalEnergy()
10197 {
10198 Edible_Base edible = Edible_Base.Cast(this);
10199 return edible.GetFoodEnergy();
10200 }
10201
10202 protected float GetNutritionalWaterContent()
10203 {
10204 Edible_Base edible = Edible_Base.Cast(this);
10205 return edible.GetFoodWater();
10206 }
10207
10208 protected float GetNutritionalIndex()
10209 {
10210 Edible_Base edible = Edible_Base.Cast(this);
10211 return edible.GetFoodNutritionalIndex();
10212 }
10213
10214 protected float GetNutritionalFullnessIndex()
10215 {
10216 Edible_Base edible = Edible_Base.Cast(this);
10217 return edible.GetFoodTotalVolume();
10218 }
10219
10220 protected float GetNutritionalToxicity()
10221 {
10222 Edible_Base edible = Edible_Base.Cast(this);
10223 return edible.GetFoodToxicity();
10224
10225 }
10226 */
10227
10228
10229 // -------------------------------------------------------------------------
10230 override void OnMovedInsideCargo(EntityAI container)
10231 {
10232 super.OnMovedInsideCargo(container);
10233
10234 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10235 }
10236
10237 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10238 {
10239 super.EEItemLocationChanged(oldLoc,newLoc);
10240
10241 PlayerBase new_player = null;
10242 PlayerBase old_player = null;
10243
10244 if (newLoc.GetParent())
10245 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10246
10247 if (oldLoc.GetParent())
10248 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10249
10250 if (old_player && oldLoc.GetType() == InventoryLocationType.HANDS)
10251 {
10252 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10253
10254 if (r_index >= 0)
10255 {
10256 InventoryLocation r_il = new InventoryLocation;
10257 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10258
10259 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10260 int r_type = r_il.GetType();
10261 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10262 {
10263 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10264 }
10265 else if (r_type == InventoryLocationType.ATTACHMENT)
10266 {
10267 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10268 }
10269
10270 }
10271 }
10272
10273 if (newLoc.GetType() == InventoryLocationType.HANDS)
10274 {
10275 if (new_player)
10276 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10277
10278 if (new_player == old_player)
10279 {
10280
10281 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10282 {
10283 if (oldLoc.GetType() == InventoryLocationType.CARGO)
10284 {
10285 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10286 {
10287 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10288 }
10289 }
10290 else
10291 {
10292 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10293 }
10294 }
10295
10296 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10297 {
10298 int type = oldLoc.GetType();
10299 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
10300 {
10301 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10302 }
10303 else if (type == InventoryLocationType.ATTACHMENT)
10304 {
10305 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10306 }
10307 }
10308 if (!m_OldLocation)
10309 {
10310 m_OldLocation = new InventoryLocation;
10311 }
10312 m_OldLocation.Copy(oldLoc);
10313 }
10314 else
10315 {
10316 if (m_OldLocation)
10317 {
10318 m_OldLocation.Reset();
10319 }
10320 }
10321
10323 }
10324 else
10325 {
10326 if (new_player)
10327 {
10328 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10329 if (res_index >= 0)
10330 {
10331 InventoryLocation il = new InventoryLocation;
10332 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10333 ItemBase it = ItemBase.Cast(il.GetItem());
10334 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10335 int rel_type = il.GetType();
10336 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
10337 {
10338 il.GetParent().GetOnReleaseLock().Invoke(it);
10339 }
10340 else if (rel_type == InventoryLocationType.ATTACHMENT)
10341 {
10342 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
10343 }
10344 //it.GetOnReleaseLock().Invoke(it);
10345 }
10346 }
10347 else if (old_player && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
10348 {
10349 //ThrowPhysically(old_player, vector.Zero);
10350 m_ThrowItemOnDrop = false;
10351 }
10352
10353 if (m_OldLocation)
10354 {
10355 m_OldLocation.Reset();
10356 }
10357 }
10358 }
10359
10360 override void EOnContact(IEntity other, Contact extra)
10361 {
10363 {
10364 int liquidType = -1;
10365 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
10366 if (impactSpeed > 0.0)
10367 {
10368 m_ImpactSpeed = impactSpeed;
10369 #ifndef SERVER
10370 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10371 #else
10372 m_WantPlayImpactSound = true;
10373 SetSynchDirty();
10374 #endif
10375 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
10376 }
10377 }
10378
10379 #ifdef SERVER
10380 if (GetCompEM() && GetCompEM().IsPlugged())
10381 {
10382 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
10383 GetCompEM().UnplugThis();
10384 }
10385 #endif
10386 }
10387
10388 void RefreshPhysics();
10389
10390 override void OnCreatePhysics()
10391 {
10393 }
10394
10395 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10396 {
10397
10398 }
10399 // -------------------------------------------------------------------------
10400 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
10401 {
10402 super.OnItemLocationChanged(old_owner, new_owner);
10403
10404 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10405 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10406
10407 if (!relatedPlayer && playerNew)
10408 relatedPlayer = playerNew;
10409
10410 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10411 {
10412 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
10413 if (actionMgr)
10414 {
10415 ActionBase currentAction = actionMgr.GetRunningAction();
10416 if (currentAction)
10417 currentAction.OnItemLocationChanged(this);
10418 }
10419 }
10420
10421 Man ownerPlayerOld = null;
10422 Man ownerPlayerNew = null;
10423
10424 if (old_owner)
10425 {
10426 if (old_owner.IsMan())
10427 {
10428 ownerPlayerOld = Man.Cast(old_owner);
10429 }
10430 else
10431 {
10432 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10433 }
10434 }
10435 else
10436 {
10437 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
10438 {
10439 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
10440
10441 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
10442 {
10443 GetCompEM().UnplugThis();
10444 }
10445 }
10446 }
10447
10448 if (new_owner)
10449 {
10450 if (new_owner.IsMan())
10451 {
10452 ownerPlayerNew = Man.Cast(new_owner);
10453 }
10454 else
10455 {
10456 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10457 }
10458 }
10459
10460 if (ownerPlayerOld != ownerPlayerNew)
10461 {
10462 if (ownerPlayerOld)
10463 {
10464 array<EntityAI> subItemsExit = new array<EntityAI>;
10465 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
10466 for (int i = 0; i < subItemsExit.Count(); i++)
10467 {
10468 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
10469 itemExit.OnInventoryExit(ownerPlayerOld);
10470 }
10471 }
10472
10473 if (ownerPlayerNew)
10474 {
10475 array<EntityAI> subItemsEnter = new array<EntityAI>;
10476 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
10477 for (int j = 0; j < subItemsEnter.Count(); j++)
10478 {
10479 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
10480 itemEnter.OnInventoryEnter(ownerPlayerNew);
10481 }
10482 }
10483 }
10484 else if (ownerPlayerNew != null)
10485 {
10486 PlayerBase nplayer;
10487 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10488 {
10489 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10490 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
10491 for (int k = 0; k < subItemsUpdate.Count(); k++)
10492 {
10493 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
10494 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10495 }
10496 }
10497 }
10498
10499 if (old_owner)
10500 old_owner.OnChildItemRemoved(this);
10501 if (new_owner)
10502 new_owner.OnChildItemReceived(this);
10503 }
10504
10505 // -------------------------------------------------------------------------------
10506 override void EEDelete(EntityAI parent)
10507 {
10508 super.EEDelete(parent);
10509 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10510 if (player)
10511 {
10512 OnInventoryExit(player);
10513
10514 if (player.IsAlive())
10515 {
10516 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10517 if (r_index >= 0)
10518 {
10519 InventoryLocation r_il = new InventoryLocation;
10520 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10521
10522 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10523 int r_type = r_il.GetType();
10524 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10525 {
10526 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10527 }
10528 else if (r_type == InventoryLocationType.ATTACHMENT)
10529 {
10530 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10531 }
10532
10533 }
10534
10535 player.RemoveQuickBarEntityShortcut(this);
10536 }
10537 }
10538 }
10539 // -------------------------------------------------------------------------------
10540 override void EEKilled(Object killer)
10541 {
10542 super.EEKilled(killer);
10543
10545 if (killer && killer.IsFireplace() && CanExplodeInFire())
10546 {
10547 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10548 {
10549 if (IsMagazine())
10550 {
10551 if (Magazine.Cast(this).GetAmmoCount() > 0)
10552 {
10553 ExplodeAmmo();
10554 }
10555 }
10556 else
10557 {
10558 Explode(DamageType.EXPLOSION);
10559 }
10560 }
10561 }
10562 }
10563
10564 override void OnWasAttached(EntityAI parent, int slot_id)
10565 {
10566 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10567
10568 super.OnWasAttached(parent, slot_id);
10569
10570 if (HasQuantity())
10571 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10572
10573 PlayAttachSound(InventorySlots.GetSlotName(slot_id));
10574 }
10575
10576 override void OnWasDetached(EntityAI parent, int slot_id)
10577 {
10578 super.OnWasDetached(parent, slot_id);
10579
10580 if (HasQuantity())
10581 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10582 }
10583
10584 override string ChangeIntoOnAttach(string slot)
10585 {
10586 int idx;
10587 TStringArray inventory_slots = new TStringArray;
10588 TStringArray attach_types = new TStringArray;
10589
10590 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10591 if (inventory_slots.Count() < 1) //is string
10592 {
10593 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10594 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10595 }
10596 else //is array
10597 {
10598 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10599 }
10600
10601 idx = inventory_slots.Find(slot);
10602 if (idx < 0)
10603 return "";
10604
10605 return attach_types.Get(idx);
10606 }
10607
10608 override string ChangeIntoOnDetach()
10609 {
10610 int idx = -1;
10611 string slot;
10612
10613 TStringArray inventory_slots = new TStringArray;
10614 TStringArray detach_types = new TStringArray;
10615
10616 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10617 if (inventory_slots.Count() < 1) //is string
10618 {
10619 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10620 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10621 }
10622 else //is array
10623 {
10624 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10625 if (detach_types.Count() < 1)
10626 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10627 }
10628
10629 for (int i = 0; i < inventory_slots.Count(); i++)
10630 {
10631 slot = inventory_slots.Get(i);
10632 }
10633
10634 if (slot != "")
10635 {
10636 if (detach_types.Count() == 1)
10637 idx = 0;
10638 else
10639 idx = inventory_slots.Find(slot);
10640 }
10641 if (idx < 0)
10642 return "";
10643
10644 return detach_types.Get(idx);
10645 }
10646
10647 void ExplodeAmmo()
10648 {
10649 //timer
10650 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
10651
10652 //min/max time
10653 float min_time = 1;
10654 float max_time = 3;
10655 float delay = Math.RandomFloat(min_time, max_time);
10656
10657 explode_timer.Run(delay, this, "DoAmmoExplosion");
10658 }
10659
10660 void DoAmmoExplosion()
10661 {
10662 Magazine magazine = Magazine.Cast(this);
10663 int pop_sounds_count = 6;
10664 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10665
10666 //play sound
10667 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10668 string sound_name = pop_sounds[ sound_idx ];
10669 GetGame().CreateSoundOnObject(this, sound_name, 20, false);
10670
10671 //remove ammo count
10672 magazine.ServerAddAmmoCount(-1);
10673
10674 //if condition then repeat -> ExplodeAmmo
10675 float min_temp_to_explode = 100; //min temperature for item to explode
10676
10677 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
10678 {
10679 ExplodeAmmo();
10680 }
10681 }
10682
10683 // -------------------------------------------------------------------------------
10684 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
10685 {
10686 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
10687
10688 const int CHANCE_DAMAGE_CARGO = 4;
10689 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10690 const int CHANCE_DAMAGE_NOTHING = 2;
10691
10692 if (IsClothing() || IsContainer() || IsItemTent())
10693 {
10694 float dmg = damageResult.GetDamage("","Health") * -0.5;
10695 int chances;
10696 int rnd;
10697
10698 if (GetInventory().GetCargo())
10699 {
10700 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10701 rnd = Math.RandomInt(0,chances);
10702
10703 if (rnd < CHANCE_DAMAGE_CARGO)
10704 {
10705 DamageItemInCargo(dmg);
10706 }
10707 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10708 {
10710 }
10711 }
10712 else
10713 {
10714 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10715 rnd = Math.RandomInt(0,chances);
10716
10717 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10718 {
10720 }
10721 }
10722 }
10723 }
10724
10725 bool DamageItemInCargo(float damage)
10726 {
10727 if (GetInventory().GetCargo())
10728 {
10729 int item_count = GetInventory().GetCargo().GetItemCount();
10730 if (item_count > 0)
10731 {
10732 int random_pick = Math.RandomInt(0, item_count);
10733 ItemBase item = ItemBase.Cast(GetInventory().GetCargo().GetItem(random_pick));
10734 if (!item.IsExplosive())
10735 {
10736 item.AddHealth("","",damage);
10737 return true;
10738 }
10739 }
10740 }
10741 return false;
10742 }
10743
10744 bool DamageItemAttachments(float damage)
10745 {
10746 int attachment_count = GetInventory().AttachmentCount();
10747 if (attachment_count > 0)
10748 {
10749 int random_pick = Math.RandomInt(0, attachment_count);
10750 ItemBase attachment = ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10751 if (!attachment.IsExplosive())
10752 {
10753 attachment.AddHealth("","",damage);
10754 return true;
10755 }
10756 }
10757 return false;
10758 }
10759
10760 override bool IsSplitable()
10761 {
10762 return m_CanThisBeSplit;
10763 }
10764 //----------------
10765 override bool CanBeSplit()
10766 {
10767 if (IsSplitable() && (GetQuantity() > 1))
10768 return GetInventory().CanRemoveEntity();
10769
10770 return false;
10771 }
10772
10773 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10774 {
10775 if (!CanBeSplit())
10776 return;
10777
10778 if (GetGame().IsClient())
10779 {
10780 if (ScriptInputUserData.CanStoreInputUserData())
10781 {
10782 ScriptInputUserData ctx = new ScriptInputUserData;
10784 ctx.Write(1);
10785 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10786 ctx.Write(i1);
10787 ctx.Write(destination_entity);
10788 ctx.Write(true);
10789 ctx.Write(slot_id);
10790 ctx.Send();
10791 }
10792 }
10793 else if (!GetGame().IsMultiplayer())
10794 {
10795 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(GetGame().GetPlayer()));
10796 }
10797 }
10798
10799 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10800 {
10801 if (!CanBeSplit())
10802 return;
10803
10804 float split_quantity_new;
10805 ref ItemBase new_item;
10806 float quantity = GetQuantity();
10807 float stack_max = GetTargetQuantityMax(slot_id);
10808 InventoryLocation loc = new InventoryLocation;
10809
10810 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10811 {
10812 if (stack_max <= GetQuantity())
10813 split_quantity_new = stack_max;
10814 else
10815 split_quantity_new = GetQuantity();
10816
10817 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10818 if (new_item)
10819 {
10820 new_item.SetResultOfSplit(true);
10821 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10822 AddQuantity(-split_quantity_new);
10823 new_item.SetQuantity(split_quantity_new);
10824 }
10825 }
10826 else if (destination_entity && slot_id == -1)
10827 {
10828 if (quantity > stack_max)
10829 split_quantity_new = stack_max;
10830 else
10831 split_quantity_new = quantity;
10832
10833 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10834 {
10835 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10836 new_item = ItemBase.Cast(o);
10837 }
10838
10839 if (new_item)
10840 {
10841 new_item.SetResultOfSplit(true);
10842 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10843 AddQuantity(-split_quantity_new);
10844 new_item.SetQuantity(split_quantity_new);
10845 }
10846 }
10847 else
10848 {
10849 if (stack_max != 0)
10850 {
10851 if (stack_max < GetQuantity())
10852 {
10853 split_quantity_new = GetQuantity() - stack_max;
10854 }
10855
10856 if (split_quantity_new == 0)
10857 {
10858 if (!GetGame().IsMultiplayer())
10859 player.PhysicalPredictiveDropItem(this);
10860 else
10861 player.ServerDropEntity(this);
10862 return;
10863 }
10864
10865 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10866
10867 if (new_item)
10868 {
10869 new_item.SetResultOfSplit(true);
10870 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10871 SetQuantity(split_quantity_new);
10872 new_item.SetQuantity(stack_max);
10873 new_item.PlaceOnSurface();
10874 }
10875 }
10876 }
10877 }
10878
10879 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10880 {
10881 if (!CanBeSplit())
10882 return;
10883
10884 float split_quantity_new;
10885 ref ItemBase new_item;
10886 float quantity = GetQuantity();
10887 float stack_max = GetTargetQuantityMax(slot_id);
10888 InventoryLocation loc = new InventoryLocation;
10889
10890 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10891 {
10892 if (stack_max <= GetQuantity())
10893 split_quantity_new = stack_max;
10894 else
10895 split_quantity_new = GetQuantity();
10896
10897 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10898 if (new_item)
10899 {
10900 new_item.SetResultOfSplit(true);
10901 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10902 AddQuantity(-split_quantity_new);
10903 new_item.SetQuantity(split_quantity_new);
10904 }
10905 }
10906 else if (destination_entity && slot_id == -1)
10907 {
10908 if (quantity > stack_max)
10909 split_quantity_new = stack_max;
10910 else
10911 split_quantity_new = quantity;
10912
10913 if (destination_entity.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10914 {
10915 Object o = destination_entity.GetInventory().LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10916 new_item = ItemBase.Cast(o);
10917 }
10918
10919 if (new_item)
10920 {
10921 new_item.SetResultOfSplit(true);
10922 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10923 AddQuantity(-split_quantity_new);
10924 new_item.SetQuantity(split_quantity_new);
10925 }
10926 }
10927 else
10928 {
10929 if (stack_max != 0)
10930 {
10931 if (stack_max < GetQuantity())
10932 {
10933 split_quantity_new = GetQuantity() - stack_max;
10934 }
10935
10936 new_item = ItemBase.Cast(GetGame().CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10937
10938 if (new_item)
10939 {
10940 new_item.SetResultOfSplit(true);
10941 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10942 SetQuantity(split_quantity_new);
10943 new_item.SetQuantity(stack_max);
10944 new_item.PlaceOnSurface();
10945 }
10946 }
10947 }
10948 }
10949
10950 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10951 {
10952 if (!CanBeSplit())
10953 return;
10954
10955 if (GetGame().IsClient())
10956 {
10957 if (ScriptInputUserData.CanStoreInputUserData())
10958 {
10959 ScriptInputUserData ctx = new ScriptInputUserData;
10961 ctx.Write(4);
10962 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10963 ctx.Write(thiz);
10964 dst.WriteToContext(ctx);
10965 ctx.Send();
10966 }
10967 }
10968 else if (!GetGame().IsMultiplayer())
10969 {
10971 }
10972 }
10973
10974 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10975 {
10976 if (!CanBeSplit())
10977 return;
10978
10979 if (GetGame().IsClient())
10980 {
10981 if (ScriptInputUserData.CanStoreInputUserData())
10982 {
10983 ScriptInputUserData ctx = new ScriptInputUserData;
10985 ctx.Write(2);
10986 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10987 ctx.Write(dummy);
10988 ctx.Write(destination_entity);
10989 ctx.Write(true);
10990 ctx.Write(idx);
10991 ctx.Write(row);
10992 ctx.Write(col);
10993 ctx.Send();
10994 }
10995 }
10996 else if (!GetGame().IsMultiplayer())
10997 {
10998 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10999 }
11000 }
11001
11002 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
11003 {
11005 }
11006
11007 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
11008 {
11009 if (!CanBeSplit())
11010 return this;
11011
11012 float quantity = GetQuantity();
11013 float split_quantity_new;
11014 ItemBase new_item;
11015 if (dst.IsValid())
11016 {
11017 int slot_id = dst.GetSlot();
11018 float stack_max = GetTargetQuantityMax(slot_id);
11019
11020 if (quantity > stack_max)
11021 split_quantity_new = stack_max;
11022 else
11023 split_quantity_new = quantity;
11024
11025 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
11026
11027 if (new_item)
11028 {
11029 new_item.SetResultOfSplit(true);
11030 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11031 AddQuantity(-split_quantity_new);
11032 new_item.SetQuantity(split_quantity_new);
11033 }
11034
11035 return new_item;
11036 }
11037
11038 return null;
11039 }
11040
11041 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
11042 {
11043 if (!CanBeSplit())
11044 return;
11045
11046 float quantity = GetQuantity();
11047 float split_quantity_new;
11048 ref ItemBase new_item;
11049 if (destination_entity)
11050 {
11051 float stackable = GetTargetQuantityMax();
11052 if (quantity > stackable)
11053 split_quantity_new = stackable;
11054 else
11055 split_quantity_new = quantity;
11056
11057 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
11058 if (new_item)
11059 {
11060 new_item.SetResultOfSplit(true);
11061 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11062 AddQuantity(-split_quantity_new);
11063 new_item.SetQuantity(split_quantity_new);
11064 }
11065 }
11066 }
11067
11068 void SplitIntoStackMaxHandsClient(PlayerBase player)
11069 {
11070 if (!CanBeSplit())
11071 return;
11072
11073 if (GetGame().IsClient())
11074 {
11075 if (ScriptInputUserData.CanStoreInputUserData())
11076 {
11077 ScriptInputUserData ctx = new ScriptInputUserData;
11079 ctx.Write(3);
11080 ItemBase i1 = this; // @NOTE: workaround for correct serialization
11081 ctx.Write(i1);
11082 ItemBase destination_entity = this;
11083 ctx.Write(destination_entity);
11084 ctx.Write(true);
11085 ctx.Write(0);
11086 ctx.Send();
11087 }
11088 }
11089 else if (!GetGame().IsMultiplayer())
11090 {
11091 SplitIntoStackMaxHands(player);
11092 }
11093 }
11094
11095 void SplitIntoStackMaxHands(PlayerBase player)
11096 {
11097 if (!CanBeSplit())
11098 return;
11099
11100 float quantity = GetQuantity();
11101 float split_quantity_new;
11102 ref ItemBase new_item;
11103 if (player)
11104 {
11105 float stackable = GetTargetQuantityMax();
11106 if (quantity > stackable)
11107 split_quantity_new = stackable;
11108 else
11109 split_quantity_new = quantity;
11110
11111 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
11112 new_item = ItemBase.Cast(in_hands);
11113 if (new_item)
11114 {
11115 new_item.SetResultOfSplit(true);
11116 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11117 AddQuantity(-split_quantity_new);
11118 new_item.SetQuantity(split_quantity_new);
11119 }
11120 }
11121 }
11122
11123 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
11124 {
11125 if (!CanBeSplit())
11126 return;
11127
11128 float quantity = GetQuantity();
11129 float split_quantity_new = Math.Floor(quantity * 0.5);
11130
11131 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
11132
11133 if (new_item)
11134 {
11135 if (new_item.GetQuantityMax() < split_quantity_new)
11136 {
11137 split_quantity_new = new_item.GetQuantityMax();
11138 }
11139
11140 new_item.SetResultOfSplit(true);
11141 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11142
11143 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11144 {
11145 AddQuantity(-1);
11146 new_item.SetQuantity(1);
11147 }
11148 else
11149 {
11150 AddQuantity(-split_quantity_new);
11151 new_item.SetQuantity(split_quantity_new);
11152 }
11153 }
11154 }
11155
11156 void SplitItem(PlayerBase player)
11157 {
11158 if (!CanBeSplit())
11159 return;
11160
11161 float quantity = GetQuantity();
11162 float split_quantity_new = Math.Floor(quantity / 2);
11163
11164 InventoryLocation invloc = new InventoryLocation;
11165 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
11166
11167 ItemBase new_item;
11168 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11169
11170 if (new_item)
11171 {
11172 if (new_item.GetQuantityMax() < split_quantity_new)
11173 {
11174 split_quantity_new = new_item.GetQuantityMax();
11175 }
11176 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11177 {
11178 AddQuantity(-1);
11179 new_item.SetQuantity(1);
11180 }
11181 else
11182 {
11183 AddQuantity(-split_quantity_new);
11184 new_item.SetQuantity(split_quantity_new);
11185 }
11186 }
11187 }
11188
11190 void OnQuantityChanged(float delta)
11191 {
11192 SetWeightDirty();
11193 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
11194
11195 if (parent)
11196 parent.OnAttachmentQuantityChangedEx(this, delta);
11197
11198 if (IsLiquidContainer())
11199 {
11200 if (GetQuantityNormalized() <= 0.0)
11201 {
11203 }
11204 else if (GetLiquidType() == LIQUID_NONE)
11205 {
11206 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
11208 }
11209 }
11210
11211 }
11212
11215 {
11216 // insert code here
11217 }
11218
11220 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
11221 {
11223 }
11224
11225 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
11226 {
11227 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11228
11229 if (GetGame().IsServer())
11230 {
11231 if (newLevel == GameConstants.STATE_RUINED)
11232 {
11234 EntityAI parent = GetHierarchyParent();
11235 if (parent && parent.IsFireplace())
11236 {
11237 CargoBase cargo = GetInventory().GetCargo();
11238 if (cargo)
11239 {
11240 for (int i = 0; i < cargo.GetItemCount(); ++i)
11241 {
11242 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
11243 }
11244 }
11245 }
11246 }
11247
11248 if (IsResultOfSplit())
11249 {
11250 // reset the splitting result flag, return to normal item behavior
11251 SetResultOfSplit(false);
11252 return;
11253 }
11254
11255 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11256 {
11257 SetCleanness(0);//unclean the item upon damage dealt
11258 }
11259 }
11260 }
11261
11262 // just the split? TODO: verify
11263 override void OnRightClick()
11264 {
11265 super.OnRightClick();
11266
11267 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !GetGame().GetPlayer().GetInventory().HasInventoryReservation(this,null))
11268 {
11269 if (GetGame().IsClient())
11270 {
11271 if (ScriptInputUserData.CanStoreInputUserData())
11272 {
11273 vector m4[4];
11274 PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
11275
11276 EntityAI root = GetHierarchyRoot();
11277
11278 InventoryLocation dst = new InventoryLocation;
11279 if (!player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.CARGO, dst))
11280 {
11281 if (root)
11282 {
11283 root.GetTransform(m4);
11284 dst.SetGround(this, m4);
11285 }
11286 else
11287 GetInventory().GetCurrentInventoryLocation(dst);
11288 }
11289 else
11290 {
11291 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
11292 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
11293 this shouldnt cause issues within this scope*/
11294 if (GetGame().GetPlayer().GetInventory().HasInventoryReservation(this, dst))
11295 {
11296 if (root)
11297 {
11298 root.GetTransform(m4);
11299 dst.SetGround(this, m4);
11300 }
11301 else
11302 GetInventory().GetCurrentInventoryLocation(dst);
11303 }
11304 else
11305 {
11306 GetGame().GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11307 }
11308 }
11309
11310 ScriptInputUserData ctx = new ScriptInputUserData;
11312 ctx.Write(4);
11313 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11314 ctx.Write(thiz);
11315 dst.WriteToContext(ctx);
11316 ctx.Write(true); // dummy
11317 ctx.Send();
11318 }
11319 }
11320 else if (!GetGame().IsMultiplayer())
11321 {
11322 SplitItem(PlayerBase.Cast(GetGame().GetPlayer()));
11323 }
11324 }
11325 }
11326
11327 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
11328 {
11329 //TODO: delete check zero quantity check after fix double posts hands fsm events
11330 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
11331 return false;
11332
11333 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11334 return false;
11335
11336 //can_this_be_combined = ConfigGetBool("canBeSplit");
11338 return false;
11339
11340
11341 Magazine mag = Magazine.Cast(this);
11342 if (mag)
11343 {
11344 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11345 return false;
11346
11347 if (stack_max_limit)
11348 {
11349 Magazine other_mag = Magazine.Cast(other_item);
11350 if (other_item)
11351 {
11352 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11353 return false;
11354 }
11355
11356 }
11357 }
11358 else
11359 {
11360 //TODO: delete check zero quantity check after fix double posts hands fsm events
11361 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
11362 return false;
11363
11364 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
11365 return false;
11366 }
11367
11368 PlayerBase player = null;
11369 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
11370 {
11371 if (player.GetInventory().HasAttachment(this))
11372 return false;
11373
11374 if (player.IsItemsToDelete())
11375 return false;
11376 }
11377
11378 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11379 return false;
11380
11381 int slotID;
11382 string slotName;
11383 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11384 return false;
11385
11386 return true;
11387 }
11388
11389 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
11390 {
11391 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
11392 }
11393
11394 bool IsResultOfSplit()
11395 {
11396 return m_IsResultOfSplit;
11397 }
11398
11399 void SetResultOfSplit(bool value)
11400 {
11401 m_IsResultOfSplit = value;
11402 }
11403
11404 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
11405 {
11406 return ComputeQuantityUsedEx(other_item, use_stack_max);
11407 }
11408
11409 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
11410 {
11411 float other_item_quantity = other_item.GetQuantity();
11412 float this_free_space;
11413
11414 float stack_max = GetQuantityMax();
11415
11416 this_free_space = stack_max - GetQuantity();
11417
11418 if (other_item_quantity > this_free_space)
11419 {
11420 return this_free_space;
11421 }
11422 else
11423 {
11424 return other_item_quantity;
11425 }
11426 }
11427
11428 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
11429 {
11430 CombineItems(ItemBase.Cast(entity2),use_stack_max);
11431 }
11432
11433 void CombineItems(ItemBase other_item, bool use_stack_max = true)
11434 {
11435 if (!CanBeCombined(other_item, false))
11436 return;
11437
11438 if (!IsMagazine() && other_item)
11439 {
11440 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
11441 if (quantity_used != 0)
11442 {
11443 float hp1 = GetHealth01("","");
11444 float hp2 = other_item.GetHealth01("","");
11445 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
11446 hpResult = hpResult / (GetQuantity() + quantity_used);
11447
11448 hpResult *= GetMaxHealth();
11449 Math.Round(hpResult);
11450 SetHealth("", "Health", hpResult);
11451
11452 AddQuantity(quantity_used);
11453 other_item.AddQuantity(-quantity_used);
11454 }
11455 }
11456 OnCombine(other_item);
11457 }
11458
11459 void OnCombine(ItemBase other_item)
11460 {
11461 #ifdef SERVER
11462 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11463 GetHierarchyParent().IncreaseLifetimeUp();
11464 #endif
11465 };
11466
11467 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
11468 {
11469 PlayerBase p = PlayerBase.Cast(player);
11470
11471 array<int> recipesIds = p.m_Recipes;
11472 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11473 if (moduleRecipesManager)
11474 {
11475 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11476 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
11477 }
11478
11479 for (int i = 0;i < recipesIds.Count(); i++)
11480 {
11481 int key = recipesIds.Get(i);
11482 string recipeName = moduleRecipesManager.GetRecipeName(key);
11483 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
11484 }
11485 }
11486
11487 // -------------------------------------------------------------------------
11488 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11489 {
11490 super.GetDebugActions(outputList);
11491
11492 //quantity
11493 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
11494 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
11495 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
11496 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
11497
11498 //health
11499 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
11500 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
11501 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
11502 //temperature
11503 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
11504 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
11505 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
11506
11507 //wet
11508 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
11509 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
11510
11511 //liquidtype
11512 if (IsLiquidContainer())
11513 {
11514 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
11515 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
11516 }
11517
11518 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
11519 // watch
11520 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
11521 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
11522
11523 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
11524 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
11525 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "", FadeColors.RED));
11526 }
11527
11528 // -------------------------------------------------------------------------
11529 // -------------------------------------------------------------------------
11530 // -------------------------------------------------------------------------
11531 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
11532 {
11533 super.OnAction(action_id, player, ctx);
11534 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
11535 {
11536 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11537 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
11538 PlayerBase p = PlayerBase.Cast(player);
11539 if (EActions.RECIPES_RANGE_START < 1000)
11540 {
11541 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11542 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11543 }
11544 }
11545 #ifndef SERVER
11546 else if (action_id == EActions.WATCH_PLAYER)
11547 {
11548 PluginDeveloper.SetDeveloperItemClientEx(player);
11549 }
11550 #endif
11551 if (GetGame().IsServer())
11552 {
11553 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11554 {
11555 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11556 OnDebugButtonPressServer(id + 1);
11557 }
11558
11559 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11560 {
11561 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11562 InsertAgent(agent_id,100);
11563 }
11564
11565 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11566 {
11567 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11568 RemoveAgent(agent_id2);
11569 }
11570
11571 else if (action_id == EActions.ADD_QUANTITY)
11572 {
11573 if (IsMagazine())
11574 {
11575 Magazine mag = Magazine.Cast(this);
11576 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11577 }
11578 else
11579 {
11580 AddQuantity(GetQuantityMax() * 0.2);
11581 }
11582
11583 if (m_EM)
11584 {
11585 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11586 }
11587 //PrintVariables();
11588 }
11589
11590 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
11591 {
11592 if (IsMagazine())
11593 {
11594 Magazine mag2 = Magazine.Cast(this);
11595 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11596 }
11597 else
11598 {
11599 AddQuantity(- GetQuantityMax() * 0.2);
11600 }
11601 if (m_EM)
11602 {
11603 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11604 }
11605 //PrintVariables();
11606 }
11607
11608 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
11609 {
11610 SetQuantity(0);
11611
11612 if (m_EM)
11613 {
11614 m_EM.SetEnergy(0);
11615 }
11616 }
11617
11618 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
11619 {
11621
11622 if (m_EM)
11623 {
11624 m_EM.SetEnergy(m_EM.GetEnergyMax());
11625 }
11626 }
11627
11628 else if (action_id == EActions.ADD_HEALTH)
11629 {
11630 AddHealth("","",GetMaxHealth("","Health")/5);
11631 }
11632 else if (action_id == EActions.REMOVE_HEALTH)
11633 {
11634 AddHealth("","",-GetMaxHealth("","Health")/5);
11635 }
11636 else if (action_id == EActions.DESTROY_HEALTH)
11637 {
11638 SetHealth01("","",0);
11639 }
11640 else if (action_id == EActions.WATCH_ITEM)
11641 {
11643 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
11644 #ifdef DEVELOPER
11645 SetDebugDeveloper_item(this);
11646 #endif
11647 }
11648
11649 else if (action_id == EActions.ADD_TEMPERATURE)
11650 {
11651 AddTemperature(20);
11652 //PrintVariables();
11653 }
11654
11655 else if (action_id == EActions.REMOVE_TEMPERATURE)
11656 {
11657 AddTemperature(-20);
11658 //PrintVariables();
11659 }
11660
11661 else if (action_id == EActions.FLIP_FROZEN)
11662 {
11663 SetFrozen(!GetIsFrozen());
11664 //PrintVariables();
11665 }
11666
11667 else if (action_id == EActions.ADD_WETNESS)
11668 {
11669 AddWet(GetWetMax()/5);
11670 //PrintVariables();
11671 }
11672
11673 else if (action_id == EActions.REMOVE_WETNESS)
11674 {
11675 AddWet(-GetWetMax()/5);
11676 //PrintVariables();
11677 }
11678
11679 else if (action_id == EActions.LIQUIDTYPE_UP)
11680 {
11681 int curr_type = GetLiquidType();
11682 SetLiquidType(curr_type * 2);
11683 //AddWet(1);
11684 //PrintVariables();
11685 }
11686
11687 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11688 {
11689 int curr_type2 = GetLiquidType();
11690 SetLiquidType(curr_type2 / 2);
11691 }
11692
11693 else if (action_id == EActions.MAKE_SPECIAL)
11694 {
11695 auto debugParams = DebugSpawnParams.WithPlayer(player);
11696 OnDebugSpawnEx(debugParams);
11697 }
11698
11699 else if (action_id == EActions.DELETE)
11700 {
11701 Delete();
11702 }
11703
11704 }
11705
11706
11707 return false;
11708 }
11709
11710 // -------------------------------------------------------------------------
11711
11712
11715 void OnActivatedByTripWire();
11716
11718 void OnActivatedByItem(notnull ItemBase item);
11719
11720 //----------------------------------------------------------------
11721 //returns true if item is able to explode when put in fire
11722 bool CanExplodeInFire()
11723 {
11724 return false;
11725 }
11726
11727 //----------------------------------------------------------------
11728 bool CanEat()
11729 {
11730 return true;
11731 }
11732
11733 //----------------------------------------------------------------
11734 override bool IsIgnoredByConstruction()
11735 {
11736 return true;
11737 }
11738
11739 //----------------------------------------------------------------
11740 //has FoodStages in config?
11741 bool HasFoodStage()
11742 {
11743 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11744 return GetGame().ConfigIsExisting(config_path);
11745 }
11746
11748 FoodStage GetFoodStage()
11749 {
11750 return null;
11751 }
11752
11753 bool CanBeCooked()
11754 {
11755 return false;
11756 }
11757
11758 bool CanBeCookedOnStick()
11759 {
11760 return false;
11761 }
11762
11764 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11766
11767 //----------------------------------------------------------------
11768 bool CanRepair(ItemBase item_repair_kit)
11769 {
11770 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11771 return module_repairing.CanRepair(this, item_repair_kit);
11772 }
11773
11774 //----------------------------------------------------------------
11775 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11776 {
11777 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11778 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11779 }
11780
11781 //----------------------------------------------------------------
11782 int GetItemSize()
11783 {
11784 /*
11785 vector v_size = this.ConfigGetVector("itemSize");
11786 int v_size_x = v_size[0];
11787 int v_size_y = v_size[1];
11788 int size = v_size_x * v_size_y;
11789 return size;
11790 */
11791
11792 return 1;
11793 }
11794
11795 //----------------------------------------------------------------
11796 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11797 bool CanBeMovedOverride()
11798 {
11799 return m_CanBeMovedOverride;
11800 }
11801
11802 //----------------------------------------------------------------
11803 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11804 void SetCanBeMovedOverride(bool setting)
11805 {
11806 m_CanBeMovedOverride = setting;
11807 }
11808
11809 //----------------------------------------------------------------
11817 void MessageToOwnerStatus(string text)
11818 {
11819 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11820
11821 if (player)
11822 {
11823 player.MessageStatus(text);
11824 }
11825 }
11826
11827 //----------------------------------------------------------------
11835 void MessageToOwnerAction(string text)
11836 {
11837 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11838
11839 if (player)
11840 {
11841 player.MessageAction(text);
11842 }
11843 }
11844
11845 //----------------------------------------------------------------
11853 void MessageToOwnerFriendly(string text)
11854 {
11855 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11856
11857 if (player)
11858 {
11859 player.MessageFriendly(text);
11860 }
11861 }
11862
11863 //----------------------------------------------------------------
11871 void MessageToOwnerImportant(string text)
11872 {
11873 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11874
11875 if (player)
11876 {
11877 player.MessageImportant(text);
11878 }
11879 }
11880
11881 override bool IsItemBase()
11882 {
11883 return true;
11884 }
11885
11886 // Checks if item is of questioned kind
11887 override bool KindOf(string tag)
11888 {
11889 bool found = false;
11890 string item_name = this.GetType();
11891 ref TStringArray item_tag_array = new TStringArray;
11892 GetGame().ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11893
11894 int array_size = item_tag_array.Count();
11895 for (int i = 0; i < array_size; i++)
11896 {
11897 if (item_tag_array.Get(i) == tag)
11898 {
11899 found = true;
11900 break;
11901 }
11902 }
11903 return found;
11904 }
11905
11906
11907 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11908 {
11909 //Debug.Log("OnRPC called");
11910 super.OnRPC(sender, rpc_type,ctx);
11911
11912 //Play soundset for attachment locking (ActionLockAttachment.c)
11913 switch (rpc_type)
11914 {
11915 #ifndef SERVER
11916 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11917 Param2<bool, string> p = new Param2<bool, string>(false, "");
11918
11919 if (!ctx.Read(p))
11920 return;
11921
11922 bool play = p.param1;
11923 string soundSet = p.param2;
11924
11925 if (play)
11926 {
11927 if (m_LockingSound)
11928 {
11930 {
11931 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11932 }
11933 }
11934 else
11935 {
11936 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11937 }
11938 }
11939 else
11940 {
11941 SEffectManager.DestroyEffect(m_LockingSound);
11942 }
11943
11944 break;
11945 #endif
11946
11947 }
11948
11949 if (GetWrittenNoteData())
11950 {
11951 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11952 }
11953 }
11954
11955 //-----------------------------
11956 // VARIABLE MANIPULATION SYSTEM
11957 //-----------------------------
11958 int NameToID(string name)
11959 {
11960 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11961 return plugin.GetID(name);
11962 }
11963
11964 string IDToName(int id)
11965 {
11966 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11967 return plugin.GetName(id);
11968 }
11969
11971 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11972 {
11973 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11974 //read the flags
11975 int varFlags;
11976 if (!ctx.Read(varFlags))
11977 return;
11978
11979 if (varFlags & ItemVariableFlags.FLOAT)
11980 {
11981 ReadVarsFromCTX(ctx);
11982 }
11983 }
11984
11985 override void SerializeNumericalVars(array<float> floats_out)
11986 {
11987 //some variables handled on EntityAI level already!
11988 super.SerializeNumericalVars(floats_out);
11989
11990 // the order of serialization must be the same as the order of de-serialization
11991 //--------------------------------------------
11992 if (IsVariableSet(VARIABLE_QUANTITY))
11993 {
11994 floats_out.Insert(m_VarQuantity);
11995 }
11996 //--------------------------------------------
11997 if (IsVariableSet(VARIABLE_WET))
11998 {
11999 floats_out.Insert(m_VarWet);
12000 }
12001 //--------------------------------------------
12002 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
12003 {
12004 floats_out.Insert(m_VarLiquidType);
12005 }
12006 //--------------------------------------------
12007 if (IsVariableSet(VARIABLE_COLOR))
12008 {
12009 floats_out.Insert(m_ColorComponentR);
12010 floats_out.Insert(m_ColorComponentG);
12011 floats_out.Insert(m_ColorComponentB);
12012 floats_out.Insert(m_ColorComponentA);
12013 }
12014 //--------------------------------------------
12015 if (IsVariableSet(VARIABLE_CLEANNESS))
12016 {
12017 floats_out.Insert(m_Cleanness);
12018 }
12019 }
12020
12021 override void DeSerializeNumericalVars(array<float> floats)
12022 {
12023 //some variables handled on EntityAI level already!
12024 super.DeSerializeNumericalVars(floats);
12025
12026 // the order of serialization must be the same as the order of de-serialization
12027 int index = 0;
12028 int mask = Math.Round(floats.Get(index));
12029
12030 index++;
12031 //--------------------------------------------
12032 if (mask & VARIABLE_QUANTITY)
12033 {
12034 if (m_IsStoreLoad)
12035 {
12036 SetStoreLoadedQuantity(floats.Get(index));
12037 }
12038 else
12039 {
12040 float quantity = floats.Get(index);
12041 SetQuantity(quantity, true, false, false, false);
12042 }
12043 index++;
12044 }
12045 //--------------------------------------------
12046 if (mask & VARIABLE_WET)
12047 {
12048 float wet = floats.Get(index);
12049 SetWet(wet);
12050 index++;
12051 }
12052 //--------------------------------------------
12053 if (mask & VARIABLE_LIQUIDTYPE)
12054 {
12055 int liquidtype = Math.Round(floats.Get(index));
12056 SetLiquidType(liquidtype);
12057 index++;
12058 }
12059 //--------------------------------------------
12060 if (mask & VARIABLE_COLOR)
12061 {
12062 m_ColorComponentR = Math.Round(floats.Get(index));
12063 index++;
12064 m_ColorComponentG = Math.Round(floats.Get(index));
12065 index++;
12066 m_ColorComponentB = Math.Round(floats.Get(index));
12067 index++;
12068 m_ColorComponentA = Math.Round(floats.Get(index));
12069 index++;
12070 }
12071 //--------------------------------------------
12072 if (mask & VARIABLE_CLEANNESS)
12073 {
12074 int cleanness = Math.Round(floats.Get(index));
12075 SetCleanness(cleanness);
12076 index++;
12077 }
12078 }
12079
12080 override void WriteVarsToCTX(ParamsWriteContext ctx)
12081 {
12082 super.WriteVarsToCTX(ctx);
12083
12084 //--------------------------------------------
12085 if (IsVariableSet(VARIABLE_QUANTITY))
12086 {
12087 ctx.Write(GetQuantity());
12088 }
12089 //--------------------------------------------
12090 if (IsVariableSet(VARIABLE_WET))
12091 {
12092 ctx.Write(GetWet());
12093 }
12094 //--------------------------------------------
12095 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
12096 {
12097 ctx.Write(GetLiquidType());
12098 }
12099 //--------------------------------------------
12100 if (IsVariableSet(VARIABLE_COLOR))
12101 {
12102 int r,g,b,a;
12103 GetColor(r,g,b,a);
12104 ctx.Write(r);
12105 ctx.Write(g);
12106 ctx.Write(b);
12107 ctx.Write(a);
12108 }
12109 //--------------------------------------------
12110 if (IsVariableSet(VARIABLE_CLEANNESS))
12111 {
12112 ctx.Write(GetCleanness());
12113 }
12114 }
12115
12116 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
12117 {
12118 if (!super.ReadVarsFromCTX(ctx,version))
12119 return false;
12120
12121 int intValue;
12122 float value;
12123
12124 if (version < 140)
12125 {
12126 if (!ctx.Read(intValue))
12127 return false;
12128
12129 m_VariablesMask = intValue;
12130 }
12131
12132 if (m_VariablesMask & VARIABLE_QUANTITY)
12133 {
12134 if (!ctx.Read(value))
12135 return false;
12136
12137 if (IsStoreLoad())
12138 {
12140 }
12141 else
12142 {
12143 SetQuantity(value, true, false, false, false);
12144 }
12145 }
12146 //--------------------------------------------
12147 if (version < 140)
12148 {
12149 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12150 {
12151 if (!ctx.Read(value))
12152 return false;
12153 SetTemperatureDirect(value);
12154 }
12155 }
12156 //--------------------------------------------
12157 if (m_VariablesMask & VARIABLE_WET)
12158 {
12159 if (!ctx.Read(value))
12160 return false;
12161 SetWet(value);
12162 }
12163 //--------------------------------------------
12164 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
12165 {
12166 if (!ctx.Read(intValue))
12167 return false;
12168 SetLiquidType(intValue);
12169 }
12170 //--------------------------------------------
12171 if (m_VariablesMask & VARIABLE_COLOR)
12172 {
12173 int r,g,b,a;
12174 if (!ctx.Read(r))
12175 return false;
12176 if (!ctx.Read(g))
12177 return false;
12178 if (!ctx.Read(b))
12179 return false;
12180 if (!ctx.Read(a))
12181 return false;
12182
12183 SetColor(r,g,b,a);
12184 }
12185 //--------------------------------------------
12186 if (m_VariablesMask & VARIABLE_CLEANNESS)
12187 {
12188 if (!ctx.Read(intValue))
12189 return false;
12190 SetCleanness(intValue);
12191 }
12192 //--------------------------------------------
12193 if (version >= 138 && version < 140)
12194 {
12195 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12196 {
12197 if (!ctx.Read(intValue))
12198 return false;
12199 SetFrozen(intValue);
12200 }
12201 }
12202
12203 return true;
12204 }
12205
12206 //----------------------------------------------------------------
12207 override bool OnStoreLoad(ParamsReadContext ctx, int version)
12208 {
12209 m_IsStoreLoad = true;
12211 {
12212 m_FixDamageSystemInit = true;
12213 }
12214
12215 if (!super.OnStoreLoad(ctx, version))
12216 {
12217 m_IsStoreLoad = false;
12218 return false;
12219 }
12220
12221 if (version >= 114)
12222 {
12223 bool hasQuickBarIndexSaved;
12224
12225 if (!ctx.Read(hasQuickBarIndexSaved))
12226 {
12227 m_IsStoreLoad = false;
12228 return false;
12229 }
12230
12231 if (hasQuickBarIndexSaved)
12232 {
12233 int itmQBIndex;
12234
12235 //Load quickbar item bind
12236 if (!ctx.Read(itmQBIndex))
12237 {
12238 m_IsStoreLoad = false;
12239 return false;
12240 }
12241
12242 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12243 if (itmQBIndex != -1 && parentPlayer)
12244 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12245 }
12246 }
12247 else
12248 {
12249 // Backup of how it used to be
12250 PlayerBase player;
12251 int itemQBIndex;
12252 if (version == int.MAX)
12253 {
12254 if (!ctx.Read(itemQBIndex))
12255 {
12256 m_IsStoreLoad = false;
12257 return false;
12258 }
12259 }
12260 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12261 {
12262 //Load quickbar item bind
12263 if (!ctx.Read(itemQBIndex))
12264 {
12265 m_IsStoreLoad = false;
12266 return false;
12267 }
12268 if (itemQBIndex != -1 && player)
12269 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12270 }
12271 }
12272
12273 if (version < 140)
12274 {
12275 // variable management system
12276 if (!LoadVariables(ctx, version))
12277 {
12278 m_IsStoreLoad = false;
12279 return false;
12280 }
12281 }
12282
12283 //agent trasmission system
12284 if (!LoadAgents(ctx, version))
12285 {
12286 m_IsStoreLoad = false;
12287 return false;
12288 }
12289 if (version >= 132)
12290 {
12291 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12292 if (raib)
12293 {
12294 if (!raib.OnStoreLoad(ctx,version))
12295 {
12296 m_IsStoreLoad = false;
12297 return false;
12298 }
12299 }
12300 }
12301
12302 m_IsStoreLoad = false;
12303 return true;
12304 }
12305
12306 //----------------------------------------------------------------
12307
12308 override void OnStoreSave(ParamsWriteContext ctx)
12309 {
12310 super.OnStoreSave(ctx);
12311
12312 PlayerBase player;
12313 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12314 {
12315 ctx.Write(true); // Keep track of if we should actually read this in or not
12316 //Save quickbar item bind
12317 int itemQBIndex = -1;
12318 itemQBIndex = player.FindQuickBarEntityIndex(this);
12319 ctx.Write(itemQBIndex);
12320 }
12321 else
12322 {
12323 ctx.Write(false); // Keep track of if we should actually read this in or not
12324 }
12325
12326 SaveAgents(ctx);//agent trasmission system
12327
12328 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12329 if (raib)
12330 {
12331 raib.OnStoreSave(ctx);
12332 }
12333 }
12334 //----------------------------------------------------------------
12335
12336 override void AfterStoreLoad()
12337 {
12338 super.AfterStoreLoad();
12339
12341 {
12343 }
12344
12345 if (GetStoreLoadedQuantity() != float.LOWEST)
12346 {
12348 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
12349 }
12350 }
12351
12352 override void EEOnAfterLoad()
12353 {
12354 super.EEOnAfterLoad();
12355
12357 {
12358 m_FixDamageSystemInit = false;
12359 }
12360
12363 }
12364
12365 bool CanBeDisinfected()
12366 {
12367 return false;
12368 }
12369
12370
12371 //----------------------------------------------------------------
12372 override void OnVariablesSynchronized()
12373 {
12374 if (m_Initialized)
12375 {
12376 #ifdef PLATFORM_CONSOLE
12377 //bruteforce it is
12378 if (IsSplitable())
12379 {
12380 UIScriptedMenu menu = GetGame().GetUIManager().FindMenu(MENU_INVENTORY);
12381 if (menu)
12382 {
12383 menu.Refresh();
12384 }
12385 }
12386 #endif
12387 }
12388
12390 {
12391 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
12392 m_WantPlayImpactSound = false;
12393 }
12394
12396 {
12397 SetWeightDirty();
12399 }
12400 if (m_VarWet != m_VarWetPrev)
12401 {
12404 }
12405
12406 if (m_SoundSyncPlay != 0)
12407 {
12408 m_ItemSoundHandler.PlayItemSoundClient(m_SoundSyncPlay);
12409 m_SoundSyncPlay = 0;
12410 }
12411 if (m_SoundSyncStop != 0)
12412 {
12413 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
12414 m_SoundSyncStop = 0;
12415 }
12416
12417 super.OnVariablesSynchronized();
12418 }
12419
12420 //------------------------- Quantity
12421 //----------------------------------------------------------------
12423 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
12424 {
12425 if (!IsServerCheck(allow_client))
12426 return false;
12427
12428 if (!HasQuantity())
12429 return false;
12430
12431 float min = GetQuantityMin();
12432 float max = GetQuantityMax();
12433
12434 if (value <= (min + 0.001))
12435 value = min;
12436
12437 if (value == min)
12438 {
12439 if (destroy_config)
12440 {
12441 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12442 if (dstr)
12443 {
12444 m_VarQuantity = Math.Clamp(value, min, max);
12445 this.Delete();
12446 return true;
12447 }
12448 }
12449 else if (destroy_forced)
12450 {
12451 m_VarQuantity = Math.Clamp(value, min, max);
12452 this.Delete();
12453 return true;
12454 }
12455 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
12456 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
12457 }
12458
12459 float delta = m_VarQuantity;
12460 m_VarQuantity = Math.Clamp(value, min, max);
12461
12462 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
12463 {
12464 delta = m_VarQuantity - delta;
12465
12466 if (delta)
12467 OnQuantityChanged(delta);
12468 }
12469
12470 SetVariableMask(VARIABLE_QUANTITY);
12471
12472 return false;
12473 }
12474
12475 //----------------------------------------------------------------
12477 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
12478 {
12479 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
12480 }
12481 //----------------------------------------------------------------
12482 void SetQuantityMax()
12483 {
12484 float max = GetQuantityMax();
12485 SetQuantity(max);
12486 }
12487
12488 override void SetQuantityToMinimum()
12489 {
12490 float min = GetQuantityMin();
12491 SetQuantity(min);
12492 }
12493 //----------------------------------------------------------------
12495 void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
12496 {
12497 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
12498 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
12499 SetQuantity(result, destroy_config, destroy_forced);
12500 }
12501
12502 //----------------------------------------------------------------
12504 override float GetQuantityNormalized()
12505 {
12506 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
12507 }
12508
12510 {
12511 return GetQuantityNormalized();
12512 }
12513
12514 /*void SetAmmoNormalized(float value)
12515 {
12516 float value_clamped = Math.Clamp(value, 0, 1);
12517 Magazine this_mag = Magazine.Cast(this);
12518 int max_rounds = this_mag.GetAmmoMax();
12519 int result = value * max_rounds;//can the rounded if higher precision is required
12520 this_mag.SetAmmoCount(result);
12521 }*/
12522 //----------------------------------------------------------------
12523 override int GetQuantityMax()
12524 {
12525 int slot = -1;
12526 if (GetInventory())
12527 {
12528 InventoryLocation il = new InventoryLocation;
12529 GetInventory().GetCurrentInventoryLocation(il);
12530 slot = il.GetSlot();
12531 }
12532
12533 return GetTargetQuantityMax(slot);
12534 }
12535
12536 override int GetTargetQuantityMax(int attSlotID = -1)
12537 {
12538 float quantity_max = 0;
12539
12540 if (IsSplitable()) //only stackable/splitable items can check for stack size
12541 {
12542 if (attSlotID != -1)
12543 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12544
12545 if (quantity_max <= 0)
12546 quantity_max = m_VarStackMax;
12547 }
12548
12549 if (quantity_max <= 0)
12550 quantity_max = m_VarQuantityMax;
12551
12552 return quantity_max;
12553 }
12554 //----------------------------------------------------------------
12555 override int GetQuantityMin()
12556 {
12557 return m_VarQuantityMin;
12558 }
12559 //----------------------------------------------------------------
12560 int GetQuantityInit()
12561 {
12562 return m_VarQuantityInit;
12563 }
12564
12565 //----------------------------------------------------------------
12566 override bool HasQuantity()
12567 {
12568 return !(GetQuantityMax() - GetQuantityMin() == 0);
12569 }
12570
12571 override float GetQuantity()
12572 {
12573 return m_VarQuantity;
12574 }
12575
12576 bool IsFullQuantity()
12577 {
12578 return GetQuantity() >= GetQuantityMax();
12579 }
12580
12581 //Calculates weight of single item without attachments and cargo
12582 override float GetSingleInventoryItemWeightEx()
12583 {
12584 //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
12585 float weightEx = GetWeightEx();//overall weight of the item
12586 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
12587 return weightEx - special;
12588 }
12589
12590 // Obsolete, use GetSingleInventoryItemWeightEx() instead
12592 {
12594 }
12595
12596 override protected float GetWeightSpecialized(bool forceRecalc = false)
12597 {
12598 if (IsSplitable()) //quantity determines size of the stack
12599 {
12600 #ifdef DEVELOPER
12601 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12602 {
12603 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12604 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
12605 }
12606 #endif
12607
12608 return GetQuantity() * GetConfigWeightModified();
12609 }
12610 else if (HasEnergyManager())// items with energy manager
12611 {
12612 #ifdef DEVELOPER
12613 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12614 {
12615 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12616 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
12617 }
12618 #endif
12619 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12620 }
12621 else//everything else
12622 {
12623 #ifdef DEVELOPER
12624 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12625 {
12626 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12627 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
12628 }
12629 #endif
12630 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12631 }
12632 }
12633
12635 int GetNumberOfItems()
12636 {
12637 int item_count = 0;
12638 ItemBase item;
12639
12640 if (GetInventory().GetCargo() != NULL)
12641 {
12642 item_count = GetInventory().GetCargo().GetItemCount();
12643 }
12644
12645 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12646 {
12647 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12648 if (item)
12649 item_count += item.GetNumberOfItems();
12650 }
12651 return item_count;
12652 }
12653
12655 float GetUnitWeight(bool include_wetness = true)
12656 {
12657 float weight = 0;
12658 float wetness = 1;
12659 if (include_wetness)
12660 wetness += GetWet();
12661 if (IsSplitable()) //quantity determines size of the stack
12662 {
12663 weight = wetness * m_ConfigWeight;
12664 }
12665 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12666 {
12667 weight = 1;
12668 }
12669 return weight;
12670 }
12671
12672 //-----------------------------------------------------------------
12673
12674 override void ClearInventory()
12675 {
12676 if ((GetGame().IsServer() || !GetGame().IsMultiplayer()) && GetInventory())
12677 {
12678 GameInventory inv = GetInventory();
12679 array<EntityAI> items = new array<EntityAI>;
12680 inv.EnumerateInventory(InventoryTraversalType.INORDER, items);
12681 for (int i = 0; i < items.Count(); i++)
12682 {
12683 ItemBase item = ItemBase.Cast(items.Get(i));
12684 if (item)
12685 {
12686 GetGame().ObjectDelete(item);
12687 }
12688 }
12689 }
12690 }
12691
12692 //------------------------- Energy
12693
12694 //----------------------------------------------------------------
12695 float GetEnergy()
12696 {
12697 float energy = 0;
12698 if (HasEnergyManager())
12699 {
12700 energy = GetCompEM().GetEnergy();
12701 }
12702 return energy;
12703 }
12704
12705
12706 override void OnEnergyConsumed()
12707 {
12708 super.OnEnergyConsumed();
12709
12711 }
12712
12713 override void OnEnergyAdded()
12714 {
12715 super.OnEnergyAdded();
12716
12718 }
12719
12720 // Converts energy (from Energy Manager) to quantity, if enabled.
12722 {
12723 if (GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12724 {
12725 if (HasQuantity())
12726 {
12727 float energy_0to1 = GetCompEM().GetEnergy0To1();
12728 SetQuantityNormalized(energy_0to1);
12729 }
12730 }
12731 }
12732
12733 //----------------------------------------------------------------
12734 float GetHeatIsolationInit()
12735 {
12736 return ConfigGetFloat("heatIsolation");
12737 }
12738
12739 float GetHeatIsolation()
12740 {
12741 return m_HeatIsolation;
12742 }
12743
12744 float GetDryingIncrement(string pIncrementName)
12745 {
12746 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12747 if (GetGame().ConfigIsExisting(paramPath))
12748 return GetGame().ConfigGetFloat(paramPath);
12749
12750 return 0.0;
12751 }
12752
12753 float GetSoakingIncrement(string pIncrementName)
12754 {
12755 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12756 if (GetGame().ConfigIsExisting(paramPath))
12757 return GetGame().ConfigGetFloat(paramPath);
12758
12759 return 0.0;
12760 }
12761 //----------------------------------------------------------------
12762 override void SetWet(float value, bool allow_client = false)
12763 {
12764 if (!IsServerCheck(allow_client))
12765 return;
12766
12767 float min = GetWetMin();
12768 float max = GetWetMax();
12769
12770 float previousValue = m_VarWet;
12771
12772 m_VarWet = Math.Clamp(value, min, max);
12773
12774 if (previousValue != m_VarWet)
12775 {
12776 SetVariableMask(VARIABLE_WET);
12777 OnWetChanged(m_VarWet, previousValue);
12778 }
12779 }
12780 //----------------------------------------------------------------
12781 override void AddWet(float value)
12782 {
12783 SetWet(GetWet() + value);
12784 }
12785 //----------------------------------------------------------------
12786 override void SetWetMax()
12787 {
12789 }
12790 //----------------------------------------------------------------
12791 override float GetWet()
12792 {
12793 return m_VarWet;
12794 }
12795 //----------------------------------------------------------------
12796 override float GetWetMax()
12797 {
12798 return m_VarWetMax;
12799 }
12800 //----------------------------------------------------------------
12801 override float GetWetMin()
12802 {
12803 return m_VarWetMin;
12804 }
12805 //----------------------------------------------------------------
12806 override float GetWetInit()
12807 {
12808 return m_VarWetInit;
12809 }
12810 //----------------------------------------------------------------
12811 override void OnWetChanged(float newVal, float oldVal)
12812 {
12813 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12814 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12815 if (newLevel != oldLevel)
12816 {
12817 OnWetLevelChanged(newLevel,oldLevel);
12818 }
12819 }
12820
12821 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12822 {
12823 SetWeightDirty();
12824 }
12825
12826 override EWetnessLevel GetWetLevel()
12827 {
12828 return GetWetLevelInternal(m_VarWet);
12829 }
12830
12831 //----------------------------------------------------------------
12832
12833 override void SetStoreLoad(bool value)
12834 {
12835 m_IsStoreLoad = value;
12836 }
12837
12838 override bool IsStoreLoad()
12839 {
12840 return m_IsStoreLoad;
12841 }
12842
12843 override void SetStoreLoadedQuantity(float value)
12844 {
12845 m_StoreLoadedQuantity = value;
12846 }
12847
12848 override float GetStoreLoadedQuantity()
12849 {
12850 return m_StoreLoadedQuantity;
12851 }
12852
12853 //----------------------------------------------------------------
12854
12855 float GetItemModelLength()
12856 {
12857 if (ConfigIsExisting("itemModelLength"))
12858 {
12859 return ConfigGetFloat("itemModelLength");
12860 }
12861 return 0;
12862 }
12863
12864 float GetItemAttachOffset()
12865 {
12866 if (ConfigIsExisting("itemAttachOffset"))
12867 {
12868 return ConfigGetFloat("itemAttachOffset");
12869 }
12870 return 0;
12871 }
12872
12873 override void SetCleanness(int value, bool allow_client = false)
12874 {
12875 if (!IsServerCheck(allow_client))
12876 return;
12877
12878 int previousValue = m_Cleanness;
12879
12880 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12881
12882 if (previousValue != m_Cleanness)
12883 SetVariableMask(VARIABLE_CLEANNESS);
12884 }
12885
12886 override int GetCleanness()
12887 {
12888 return m_Cleanness;
12889 }
12890
12892 {
12893 return true;
12894 }
12895
12896 //----------------------------------------------------------------
12897 // ATTACHMENT LOCKING
12898 // Getters relevant to generic ActionLockAttachment
12899 int GetLockType()
12900 {
12901 return m_LockType;
12902 }
12903
12904 string GetLockSoundSet()
12905 {
12906 return m_LockSoundSet;
12907 }
12908
12909 //----------------------------------------------------------------
12910 //------------------------- Color
12911 // sets items color variable given color components
12912 override void SetColor(int r, int g, int b, int a)
12913 {
12918 SetVariableMask(VARIABLE_COLOR);
12919 }
12921 override void GetColor(out int r,out int g,out int b,out int a)
12922 {
12927 }
12928
12929 bool IsColorSet()
12930 {
12931 return IsVariableSet(VARIABLE_COLOR);
12932 }
12933
12935 string GetColorString()
12936 {
12937 int r,g,b,a;
12938 GetColor(r,g,b,a);
12939 r = r/255;
12940 g = g/255;
12941 b = b/255;
12942 a = a/255;
12943 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12944 }
12945 //----------------------------------------------------------------
12946 //------------------------- LiquidType
12947
12948 override void SetLiquidType(int value, bool allow_client = false)
12949 {
12950 if (!IsServerCheck(allow_client))
12951 return;
12952
12953 int old = m_VarLiquidType;
12954 m_VarLiquidType = value;
12955 OnLiquidTypeChanged(old,value);
12956 SetVariableMask(VARIABLE_LIQUIDTYPE);
12957 }
12958
12959 int GetLiquidTypeInit()
12960 {
12961 return ConfigGetInt("varLiquidTypeInit");
12962 }
12963
12964 override int GetLiquidType()
12965 {
12966 return m_VarLiquidType;
12967 }
12968
12969 protected void OnLiquidTypeChanged(int oldType, int newType)
12970 {
12971 if (newType == LIQUID_NONE && GetIsFrozen())
12972 SetFrozen(false);
12973 }
12974
12976 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12977 {
12978 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12979 }
12980
12981 // -------------------------------------------------------------------------
12983 void OnInventoryEnter(Man player)
12984 {
12985 PlayerBase nplayer;
12986 if (PlayerBase.CastTo(nplayer, player))
12987 {
12988 m_CanPlayImpactSound = true;
12989 //nplayer.OnItemInventoryEnter(this);
12990 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12991 }
12992 }
12993
12994 // -------------------------------------------------------------------------
12996 void OnInventoryExit(Man player)
12997 {
12998 PlayerBase nplayer;
12999 if (PlayerBase.CastTo(nplayer,player))
13000 {
13001 //nplayer.OnItemInventoryExit(this);
13002 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13003
13004 }
13005
13006 //if (!GetGame().IsDedicatedServer())
13007 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13008
13009
13010 if (HasEnergyManager())
13011 {
13012 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
13013 }
13014 }
13015
13016 // ADVANCED PLACEMENT EVENTS
13017 override void OnPlacementStarted(Man player)
13018 {
13019 super.OnPlacementStarted(player);
13020
13021 SetTakeable(false);
13022 }
13023
13024 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
13025 {
13026 if (m_AdminLog)
13027 {
13028 m_AdminLog.OnPlacementComplete(player, this);
13029 }
13030
13031 super.OnPlacementComplete(player, position, orientation);
13032 }
13033
13034 //-----------------------------
13035 // AGENT SYSTEM
13036 //-----------------------------
13037 //--------------------------------------------------------------------------
13038 bool ContainsAgent(int agent_id)
13039 {
13040 if (agent_id & m_AttachedAgents)
13041 {
13042 return true;
13043 }
13044 else
13045 {
13046 return false;
13047 }
13048 }
13049
13050 //--------------------------------------------------------------------------
13051 override void RemoveAgent(int agent_id)
13052 {
13053 if (ContainsAgent(agent_id))
13054 {
13055 m_AttachedAgents = ~agent_id & m_AttachedAgents;
13056 }
13057 }
13058
13059 //--------------------------------------------------------------------------
13060 override void RemoveAllAgents()
13061 {
13062 m_AttachedAgents = 0;
13063 }
13064 //--------------------------------------------------------------------------
13065 override void RemoveAllAgentsExcept(int agent_to_keep)
13066 {
13067 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
13068 }
13069 // -------------------------------------------------------------------------
13070 override void InsertAgent(int agent, float count = 1)
13071 {
13072 if (count < 1)
13073 return;
13074 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
13076 }
13077
13079 void TransferAgents(int agents)
13080 {
13082 }
13083
13084 // -------------------------------------------------------------------------
13085 override int GetAgents()
13086 {
13087 return m_AttachedAgents;
13088 }
13089 //----------------------------------------------------------------------
13090
13091 /*int GetContaminationType()
13092 {
13093 int contamination_type;
13094
13095 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
13096 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
13097 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
13098 const int DIRTY_MASK = eAgents.WOUND_AGENT;
13099
13100 Edible_Base edible = Edible_Base.Cast(this);
13101 int agents = GetAgents();
13102 if (edible)
13103 {
13104 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
13105 if (profile)
13106 {
13107 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
13108 }
13109 }
13110 if (agents & CONTAMINATED_MASK)
13111 {
13112 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
13113 }
13114 if (agents & POISONED_MASK)
13115 {
13116 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
13117 }
13118 if (agents & NERVE_GAS_MASK)
13119 {
13120 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
13121 }
13122 if (agents & DIRTY_MASK)
13123 {
13124 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
13125 }
13126
13127 return agents;
13128 }*/
13129
13130 // -------------------------------------------------------------------------
13131 bool LoadAgents(ParamsReadContext ctx, int version)
13132 {
13133 if (!ctx.Read(m_AttachedAgents))
13134 return false;
13135 return true;
13136 }
13137 // -------------------------------------------------------------------------
13139 {
13140
13142 }
13143 // -------------------------------------------------------------------------
13144
13146 override void CheckForRoofLimited(float timeTresholdMS = 3000)
13147 {
13148 super.CheckForRoofLimited(timeTresholdMS);
13149
13150 float time = GetGame().GetTime();
13151 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13152 {
13153 m_PreviousRoofTestTime = time;
13154 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13155 }
13156 }
13157
13158 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
13159 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
13160 {
13161 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
13162 {
13163 return 0;
13164 }
13165
13166 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
13167 {
13168 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
13169 if (filter)
13170 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
13171 else
13172 return 0;//otherwise return 0 when no filter attached
13173 }
13174
13175 string subclassPath, entryName;
13176
13177 switch (type)
13178 {
13179 case DEF_BIOLOGICAL:
13180 entryName = "biological";
13181 break;
13182 case DEF_CHEMICAL:
13183 entryName = "chemical";
13184 break;
13185 default:
13186 entryName = "biological";
13187 break;
13188 }
13189
13190 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
13191
13192 return GetGame().ConfigGetFloat(subclassPath + entryName);
13193 }
13194
13195
13196
13198 override void EEOnCECreate()
13199 {
13200 if (!IsMagazine())
13202
13204 }
13205
13206
13207 //-------------------------
13208 // OPEN/CLOSE USER ACTIONS
13209 //-------------------------
13211 void Open();
13212 void Close();
13213 bool IsOpen()
13214 {
13215 return true;
13216 }
13217
13218 override bool CanDisplayCargo()
13219 {
13220 return IsOpen();
13221 }
13222
13223
13224 // ------------------------------------------------------------
13225 // CONDITIONS
13226 // ------------------------------------------------------------
13227 override bool CanPutInCargo(EntityAI parent)
13228 {
13229 if (parent)
13230 {
13231 if (parent.IsInherited(DayZInfected))
13232 return true;
13233
13234 if (!parent.IsRuined())
13235 return true;
13236 }
13237
13238 return true;
13239 }
13240
13241 override bool CanPutAsAttachment(EntityAI parent)
13242 {
13243 if (!super.CanPutAsAttachment(parent))
13244 {
13245 return false;
13246 }
13247
13248 if (!IsRuined() && !parent.IsRuined())
13249 {
13250 return true;
13251 }
13252
13253 return false;
13254 }
13255
13256 override bool CanReceiveItemIntoCargo(EntityAI item)
13257 {
13258 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13259 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13260 // return false;
13261
13262 return super.CanReceiveItemIntoCargo(item);
13263 }
13264
13265 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
13266 {
13267 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13268 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13269 // return false;
13270
13271 GameInventory attachmentInv = attachment.GetInventory();
13272 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13273 {
13274 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13275 return false;
13276 }
13277
13278 InventoryLocation loc = new InventoryLocation();
13279 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13280 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
13281 return false;
13282
13283 return super.CanReceiveAttachment(attachment, slotId);
13284 }
13285
13286 override bool CanReleaseAttachment(EntityAI attachment)
13287 {
13288 if (!super.CanReleaseAttachment(attachment))
13289 return false;
13290
13291 return GetInventory().AreChildrenAccessible();
13292 }
13293
13294 /*override bool CanLoadAttachment(EntityAI attachment)
13295 {
13296 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13297 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13298 // return false;
13299
13300 GameInventory attachmentInv = attachment.GetInventory();
13301 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13302 {
13303 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
13304 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
13305
13306 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13307 return false;
13308 }
13309
13310 return super.CanLoadAttachment(attachment);
13311 }*/
13312
13313 // Plays muzzle flash particle effects
13314 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13315 {
13316 int id = muzzle_owner.GetMuzzleID();
13317 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
13318
13319 if (WPOF_array)
13320 {
13321 for (int i = 0; i < WPOF_array.Count(); i++)
13322 {
13323 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13324
13325 if (WPOF)
13326 {
13327 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13328 }
13329 }
13330 }
13331 }
13332
13333 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
13334 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13335 {
13336 int id = muzzle_owner.GetMuzzleID();
13337 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
13338
13339 if (WPOBE_array)
13340 {
13341 for (int i = 0; i < WPOBE_array.Count(); i++)
13342 {
13343 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13344
13345 if (WPOBE)
13346 {
13347 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13348 }
13349 }
13350 }
13351 }
13352
13353 // Plays all weapon overheating particles
13354 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13355 {
13356 int id = muzzle_owner.GetMuzzleID();
13357 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13358
13359 if (WPOOH_array)
13360 {
13361 for (int i = 0; i < WPOOH_array.Count(); i++)
13362 {
13363 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13364
13365 if (WPOOH)
13366 {
13367 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13368 }
13369 }
13370 }
13371 }
13372
13373 // Updates all weapon overheating particles
13374 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13375 {
13376 int id = muzzle_owner.GetMuzzleID();
13377 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13378
13379 if (WPOOH_array)
13380 {
13381 for (int i = 0; i < WPOOH_array.Count(); i++)
13382 {
13383 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13384
13385 if (WPOOH)
13386 {
13387 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13388 }
13389 }
13390 }
13391 }
13392
13393 // Stops overheating particles
13394 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13395 {
13396 int id = muzzle_owner.GetMuzzleID();
13397 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13398
13399 if (WPOOH_array)
13400 {
13401 for (int i = 0; i < WPOOH_array.Count(); i++)
13402 {
13403 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13404
13405 if (WPOOH)
13406 {
13407 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13408 }
13409 }
13410 }
13411 }
13412
13413 //----------------------------------------------------------------
13414 //Item Behaviour - unified approach
13415 override bool IsHeavyBehaviour()
13416 {
13417 if (m_ItemBehaviour == 0)
13418 {
13419 return true;
13420 }
13421
13422 return false;
13423 }
13424
13425 override bool IsOneHandedBehaviour()
13426 {
13427 if (m_ItemBehaviour == 1)
13428 {
13429 return true;
13430 }
13431
13432 return false;
13433 }
13434
13435 override bool IsTwoHandedBehaviour()
13436 {
13437 if (m_ItemBehaviour == 2)
13438 {
13439 return true;
13440 }
13441
13442 return false;
13443 }
13444
13445 bool IsDeployable()
13446 {
13447 return false;
13448 }
13449
13451 float GetDeployTime()
13452 {
13453 return UATimeSpent.DEFAULT_DEPLOY;
13454 }
13455
13456
13457 //----------------------------------------------------------------
13458 // Item Targeting (User Actions)
13459 override void SetTakeable(bool pState)
13460 {
13461 m_IsTakeable = pState;
13462 SetSynchDirty();
13463 }
13464
13465 override bool IsTakeable()
13466 {
13467 return m_IsTakeable;
13468 }
13469
13470 // For cases where we want to show object widget which cant be taken to hands
13472 {
13473 return false;
13474 }
13475
13477 protected void PreLoadSoundAttachmentType()
13478 {
13479 string att_type = "None";
13480
13481 if (ConfigIsExisting("soundAttType"))
13482 {
13483 att_type = ConfigGetString("soundAttType");
13484 }
13485
13486 m_SoundAttType = att_type;
13487 }
13488
13489 override string GetAttachmentSoundType()
13490 {
13491 return m_SoundAttType;
13492 }
13493
13494 //----------------------------------------------------------------
13495 //SOUNDS - ItemSoundHandler
13496 //----------------------------------------------------------------
13497
13498 string GetPlaceSoundset(); // played when deploy starts
13499 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
13500 string GetDeploySoundset(); // played when deploy sucessfully finishes
13501
13503 {
13504 if (!m_ItemSoundHandler)
13506
13507 return m_ItemSoundHandler;
13508 }
13509
13510 // override to initialize sounds
13511 protected void InitItemSounds()
13512 {
13513 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty)
13514 return;
13515
13517
13518 if (GetPlaceSoundset() != string.Empty)
13519 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
13520
13521 if (GetDeploySoundset() != string.Empty)
13522 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
13523
13524 SoundParameters params = new SoundParameters();
13525 params.m_Loop = true;
13526 if (GetLoopDeploySoundset() != string.Empty)
13527 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
13528 }
13529
13530 // Start sound using ItemSoundHandler
13531 void StartItemSoundServer(int id)
13532 {
13533 if (!GetGame().IsServer())
13534 return;
13535
13536 m_SoundSyncPlay = id;
13537 SetSynchDirty();
13538
13539 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
13541 }
13542
13543 // Stop sound using ItemSoundHandler
13544 void StopItemSoundServer(int id)
13545 {
13546 if (!GetGame().IsServer())
13547 return;
13548
13549 m_SoundSyncStop = id;
13550 SetSynchDirty();
13551
13552 GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
13554 }
13555
13556 protected void ClearStartItemSoundServer()
13557 {
13558 m_SoundSyncPlay = 0;
13559 }
13560
13561 protected void ClearStopItemSoundServer()
13562 {
13563 m_SoundSyncStop = 0;
13564 }
13565
13567 void PlayAttachSound(string slot_type)
13568 {
13569 if (!GetGame().IsDedicatedServer())
13570 {
13571 if (ConfigIsExisting("attachSoundSet"))
13572 {
13573 string cfg_path = "";
13574 string soundset = "";
13575 string type_name = GetType();
13576
13577 TStringArray cfg_soundset_array = new TStringArray;
13578 TStringArray cfg_slot_array = new TStringArray;
13579 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13580 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13581
13582 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13583 {
13584 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13585 {
13586 if (cfg_slot_array[i] == slot_type)
13587 {
13588 soundset = cfg_soundset_array[i];
13589 break;
13590 }
13591 }
13592 }
13593
13594 if (soundset != "")
13595 {
13596 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13597 sound.SetAutodestroy(true);
13598 }
13599 }
13600 }
13601 }
13602
13603 void PlayDetachSound(string slot_type)
13604 {
13605 //TODO - evaluate if needed and devise universal config structure if so
13606 }
13607
13608 void OnApply(PlayerBase player);
13609
13611 {
13612 return 1.0;
13613 };
13614 //returns applicable selection
13615 array<string> GetHeadHidingSelection()
13616 {
13618 }
13619
13621 {
13623 }
13624
13625 WrittenNoteData GetWrittenNoteData() {};
13626
13628 {
13629 SetDynamicPhysicsLifeTime(0.01);
13630 m_ItemBeingDroppedPhys = false;
13631 }
13632
13634 {
13635 array<string> zone_names = new array<string>;
13636 GetDamageZones(zone_names);
13637 for (int i = 0; i < zone_names.Count(); i++)
13638 {
13639 SetHealthMax(zone_names.Get(i),"Health");
13640 }
13641 SetHealthMax("","Health");
13642 }
13643
13645 void SetZoneDamageCEInit()
13646 {
13647 float global_health = GetHealth01("","Health");
13648 array<string> zones = new array<string>;
13649 GetDamageZones(zones);
13650 //set damage of all zones to match global health level
13651 for (int i = 0; i < zones.Count(); i++)
13652 {
13653 SetHealth01(zones.Get(i),"Health",global_health);
13654 }
13655 }
13656
13658 bool IsCoverFaceForShave(string slot_name)
13659 {
13660 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13661 }
13662
13663 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13664 {
13665 if (!hasRootAsPlayer)
13666 {
13667 if (refParentIB)
13668 {
13669 // parent is wet
13670 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
13671 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13672 // parent has liquid inside
13673 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
13674 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13675 // drying
13676 else if (m_VarWet > m_VarWetMin)
13677 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
13678 }
13679 else
13680 {
13681 // drying on ground or inside non-itembase (car, ...)
13682 if (m_VarWet > m_VarWetMin)
13683 AddWet(-1 * delta * GetDryingIncrement("ground"));
13684 }
13685 }
13686 }
13687
13688 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13689 {
13691 {
13692 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
13693 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13694 {
13695 float heatPermCoef = 1.0;
13696 EntityAI ent = this;
13697 while (ent)
13698 {
13699 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13700 ent = ent.GetHierarchyParent();
13701 }
13702
13703 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13704 }
13705 }
13706 }
13707
13708 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13709 {
13710 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13711 EntityAI parent = GetHierarchyParent();
13712 if (!parent)
13713 {
13714 hasParent = false;
13715 hasRootAsPlayer = false;
13716 }
13717 else
13718 {
13719 hasParent = true;
13720 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13721 refParentIB = ItemBase.Cast(parent);
13722 }
13723 }
13724
13725 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13726 {
13727 // this is stub, implemented on Edible_Base
13728 }
13729
13730 bool CanDecay()
13731 {
13732 // return true used on selected food clases so they can decay
13733 return false;
13734 }
13735
13736 protected bool CanProcessDecay()
13737 {
13738 // this is stub, implemented on Edible_Base class
13739 // used to determine whether it is still necessary for the food to decay
13740 return false;
13741 }
13742
13743 protected bool CanHaveWetness()
13744 {
13745 // return true used on selected items that have a wetness effect
13746 return false;
13747 }
13748
13750 bool CanBeConsumed(ConsumeConditionData data = null)
13751 {
13752 return !GetIsFrozen() && IsOpen();
13753 }
13754
13755 override void ProcessVariables()
13756 {
13757 bool hasParent = false, hasRootAsPlayer = false;
13758 ItemBase refParentIB;
13759
13760 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13761 bool foodDecay = g_Game.IsFoodDecayEnabled();
13762
13763 if (wwtu || foodDecay)
13764 {
13765 bool processWetness = wwtu && CanHaveWetness();
13766 bool processTemperature = wwtu && CanHaveTemperature();
13767 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13768
13769 if (processWetness || processTemperature || processDecay)
13770 {
13771 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13772
13773 if (processWetness)
13774 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13775
13776 if (processTemperature)
13777 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13778
13779 if (processDecay)
13780 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13781 }
13782 }
13783 }
13784
13787 {
13788 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13789 }
13790
13791 override float GetTemperatureFreezeThreshold()
13792 {
13794 return Liquid.GetFreezeThreshold(GetLiquidType());
13795
13796 return super.GetTemperatureFreezeThreshold();
13797 }
13798
13799 override float GetTemperatureThawThreshold()
13800 {
13802 return Liquid.GetThawThreshold(GetLiquidType());
13803
13804 return super.GetTemperatureThawThreshold();
13805 }
13806
13807 override float GetItemOverheatThreshold()
13808 {
13810 return Liquid.GetBoilThreshold(GetLiquidType());
13811
13812 return super.GetItemOverheatThreshold();
13813 }
13814
13815 override float GetTemperatureFreezeTime()
13816 {
13817 if (HasQuantity())
13818 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13819
13820 return super.GetTemperatureFreezeTime();
13821 }
13822
13823 override float GetTemperatureThawTime()
13824 {
13825 if (HasQuantity())
13826 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13827
13828 return super.GetTemperatureThawTime();
13829 }
13830
13832 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13834 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13835
13836 bool IsCargoException4x3(EntityAI item)
13837 {
13838 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13839 }
13840
13842 {
13843 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13844 }
13845
13847 void AddLightSourceItem(ItemBase lightsource)
13848 {
13849 m_LightSourceItem = lightsource;
13850 }
13851
13853 {
13854 m_LightSourceItem = null;
13855 }
13856
13858 {
13859 return m_LightSourceItem;
13860 }
13861
13863 array<int> GetValidFinishers()
13864 {
13865 return null;
13866 }
13867
13869 bool GetActionWidgetOverride(out typename name)
13870 {
13871 return false;
13872 }
13873
13874 bool PairWithDevice(notnull ItemBase otherDevice)
13875 {
13876 if (GetGame().IsServer())
13877 {
13878 ItemBase explosive = otherDevice;
13880 if (!trg)
13881 {
13882 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13883 explosive = this;
13884 }
13885
13886 explosive.PairRemote(trg);
13887 trg.SetControlledDevice(explosive);
13888
13889 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13890 trg.SetPersistentPairID(persistentID);
13891 explosive.SetPersistentPairID(persistentID);
13892
13893 return true;
13894 }
13895 return false;
13896 }
13897
13899 float GetBaitEffectivity()
13900 {
13901 float ret = 1.0;
13902 if (HasQuantity())
13903 ret *= GetQuantityNormalized();
13904 ret *= GetHealth01();
13905
13906 return ret;
13907 }
13908
13909 #ifdef DEVELOPER
13910 override void SetDebugItem()
13911 {
13912 super.SetDebugItem();
13913 _itemBase = this;
13914 }
13915
13916 override string GetDebugText()
13917 {
13918 string text = super.GetDebugText();
13919
13920 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13921 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13922
13923 return text;
13924 }
13925 #endif
13926
13927 bool CanBeUsedForSuicide()
13928 {
13929 return true;
13930 }
13931
13933 //DEPRECATED BELOW
13935 // Backwards compatibility
13936 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13937 {
13938 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13939 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13940 }
13941
13942 // replaced by ItemSoundHandler
13943 protected EffectSound m_SoundDeployFinish;
13944 protected EffectSound m_SoundPlace;
13945 protected EffectSound m_DeployLoopSoundEx;
13946 protected EffectSound m_SoundDeploy;
13947 bool m_IsPlaceSound;
13948 bool m_IsDeploySound;
13950
13951 string GetDeployFinishSoundset();
13952 void PlayDeploySound();
13953 void PlayDeployFinishSound();
13954 void PlayPlaceSound();
13955 void PlayDeployLoopSoundEx();
13956 void StopDeployLoopSoundEx();
13957 void SoundSynchRemoteReset();
13958 void SoundSynchRemote();
13959 bool UsesGlobalDeploy(){return false;}
13960 bool CanPlayDeployLoopSound(){return false;}
13962 bool IsPlaceSound(){return m_IsPlaceSound;}
13963 bool IsDeploySound(){return m_IsDeploySound;}
13964 void SetIsPlaceSound(bool is_place_sound);
13965 void SetIsDeploySound(bool is_deploy_sound);
13966}
13967
13968EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13969{
13970 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13971 if (entity)
13972 {
13973 bool is_item = entity.IsInherited(ItemBase);
13974 if (is_item && full_quantity)
13975 {
13976 ItemBase item = ItemBase.Cast(entity);
13977 item.SetQuantity(item.GetQuantityInit());
13978 }
13979 }
13980 else
13981 {
13982 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13983 return NULL;
13984 }
13985 return entity;
13986}
13987
13988void SetupSpawnedItem(ItemBase item, float health, float quantity)
13989{
13990 if (item)
13991 {
13992 if (health > 0)
13993 item.SetHealth("", "", health);
13994
13995 if (item.CanHaveTemperature())
13996 {
13997 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13998 if (item.CanFreeze())
13999 item.SetFrozen(false);
14000 }
14001
14002 if (item.HasEnergyManager())
14003 {
14004 if (quantity >= 0)
14005 {
14006 item.GetCompEM().SetEnergy0To1(quantity);
14007 }
14008 else
14009 {
14010 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
14011 }
14012 }
14013 else if (item.IsMagazine())
14014 {
14015 Magazine mag = Magazine.Cast(item);
14016 if (quantity >= 0)
14017 {
14018 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14019 }
14020 else
14021 {
14022 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
14023 }
14024
14025 }
14026 else
14027 {
14028 if (quantity >= 0)
14029 {
14030 item.SetQuantityNormalized(quantity, false);
14031 }
14032 else
14033 {
14034 item.SetQuantity(Math.AbsFloat(quantity));
14035 }
14036
14037 }
14038 }
14039}
14040
14041#ifdef DEVELOPER
14042ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
14043#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Определения EntityAI.c:97
Param3 TSelectableActionInfo
EWetnessLevel
Определения EntityAI.c:2
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
const int INPUT_UDT_ITEM_MANIPULATION
Определения _constants.c:8
class LogManager EntityAI
eBleedingSourceType GetType()
Определения BleedingSource.c:63
ItemSuppressor SuppressorBase
Определения InventoryItem.c:7
void ActionDropItem()
Определения ActionDropItem.c:14
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
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
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3868
DayZGame GetDayZGame()
Определения DayZGame.c:3870
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:142
const int MAX
Определения EnConvert.c:27
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool CanHaveTemperature()
Определения FireplaceBase.c:557
class GP5GasMask extends MaskBase ItemBase
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:17
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6308
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5548
bool HidesSelectionBySlot()
Определения ItemBase.c:9203
float m_VarWetMin
Определения ItemBase.c:4809
void SplitItem(PlayerBase player)
Определения ItemBase.c:6739
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9424
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8653
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:8087
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5553
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:8796
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6706
override bool IsHeavyBehaviour()
Определения ItemBase.c:8998
override void SetWetMax()
Определения ItemBase.c:8369
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9241
void ClearStartItemSoundServer()
Определения ItemBase.c:9139
float m_VarWet
Определения ItemBase.c:4806
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9271
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:2
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8648
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4869
bool CanBeMovedOverride()
Определения ItemBase.c:7380
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8345
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4855
override void ProcessVariables()
Определения ItemBase.c:9338
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:4883
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8179
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8714
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8559
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5139
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:4881
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9374
bool m_IsSoundSynchRemote
Определения ItemBase.c:9532
float m_OverheatingShots
Определения ItemBase.c:4876
void StopItemSoundServer(int id)
Определения ItemBase.c:9127
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5568
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5292
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9398
ref array< int > m_CompatibleLocks
Определения ItemBase.c:4893
bool CanBeCooked()
Определения ItemBase.c:7336
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5635
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:4905
bool m_RecipesInitialized
Определения ItemBase.c:4791
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6382
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9382
override void OnEnergyConsumed()
Определения ItemBase.c:8289
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:8078
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:8218
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8409
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8174
ref TIntArray m_InteractActions
Определения ItemBase.c:4857
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7400
float m_VarQuantity
Определения ItemBase.c:4797
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9543
override float GetWetMax()
Определения ItemBase.c:8379
bool CanBeUsedForSuicide()
Определения ItemBase.c:9510
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7011
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5773
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7554
void StartItemSoundServer(int id)
Определения ItemBase.c:9114
void DoAmmoExplosion()
Определения ItemBase.c:6243
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4868
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6557
int GetItemSize()
Определения ItemBase.c:7365
bool m_CanBeMovedOverride
Определения ItemBase.c:4834
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6167
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5360
bool CanDecay()
Определения ItemBase.c:9313
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:8060
void SetQuantityMax()
Определения ItemBase.c:8065
override float GetQuantity()
Определения ItemBase.c:8154
int m_ColorComponentR
Определения ItemBase.c:4846
int m_ShotsToStartOverheating
Определения ItemBase.c:4878
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8394
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5367
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8897
void OnOverheatingDecay()
Определения ItemBase.c:5330
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8327
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4812
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5468
bool UsesGlobalDeploy()
Определения ItemBase.c:9542
int m_ItemBehaviour
Определения ItemBase.c:4827
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:8869
float m_HeatIsolation
Определения ItemBase.c:4822
float m_VarWetInit
Определения ItemBase.c:4808
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5813
void SetCEBasedQuantity()
Определения ItemBase.c:5581
bool m_CanPlayImpactSound
Определения ItemBase.c:4818
override string GetAttachmentSoundType()
Определения ItemBase.c:9072
float GetOverheatingCoef()
Определения ItemBase.c:5387
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9198
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9150
override bool IsStoreLoad()
Определения ItemBase.c:8421
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6987
bool IsLightSource()
Определения ItemBase.c:5709
bool m_HasQuantityBar
Определения ItemBase.c:4840
void SetResultOfSplit(bool value)
Определения ItemBase.c:6982
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6624
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6797
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5395
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8336
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8977
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8431
int m_LockType
Определения ItemBase.c:4894
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:4899
bool m_CanBeDigged
Определения ItemBase.c:4841
float m_ItemAttachOffset
Определения ItemBase.c:4824
float GetItemModelLength()
Определения ItemBase.c:8438
bool m_ThrowItemOnDrop
Определения ItemBase.c:4832
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7699
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8729
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8322
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7016
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9369
bool CanHaveWetness()
Определения ItemBase.c:9326
int m_CleannessMin
Определения ItemBase.c:4814
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8662
string IDToName(int id)
Определения ItemBase.c:7547
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9333
float GetHeatIsolationInit()
Определения ItemBase.c:8317
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7387
override bool HasQuantity()
Определения ItemBase.c:8149
float m_VarWetPrev
Определения ItemBase.c:4807
int m_SoundSyncStop
Определения ItemBase.c:4901
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9419
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4856
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5477
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5162
int m_VarLiquidType
Определения ItemBase.c:4826
int m_QuickBarBonus
Определения ItemBase.c:4828
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9060
override float GetWetInit()
Определения ItemBase.c:8389
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4820
int m_SoundSyncPlay
Определения ItemBase.c:4900
int m_MaxOverheatingValue
Определения ItemBase.c:4879
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4803
bool m_IsTakeable
Определения ItemBase.c:4831
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4871
string GetLockSoundSet()
Определения ItemBase.c:8487
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8518
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9446
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6803
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4783
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9085
override int GetQuantityMin()
Определения ItemBase.c:8138
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6533
override int GetQuickBarBonus()
Определения ItemBase.c:5047
override void SetTakeable(bool pState)
Определения ItemBase.c:9042
float m_OverheatingDecayInterval
Определения ItemBase.c:4880
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6356
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9291
bool CanProcessDecay()
Определения ItemBase.c:9319
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5558
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9435
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7351
bool can_this_be_combined
Определения ItemBase.c:4836
EffectSound m_SoundDeploy
Определения ItemBase.c:9529
int m_Count
Определения ItemBase.c:4802
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9482
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9034
override bool IsSplitable()
Определения ItemBase.c:6343
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6327
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7663
void ConvertEnergyToQuantity()
Определения ItemBase.c:8304
override void RemoveAllAgents()
Определения ItemBase.c:8643
override void SetQuantityToMinimum()
Определения ItemBase.c:8071
bool m_WantPlayImpactSound
Определения ItemBase.c:4817
override float GetTemperatureThawTime()
Определения ItemBase.c:9406
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4870
int m_ColorComponentG
Определения ItemBase.c:4847
float m_StoreLoadedQuantity
Определения ItemBase.c:4804
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7418
int m_ColorComponentA
Определения ItemBase.c:4849
int m_VarQuantityInit
Определения ItemBase.c:4799
float GetFilterDamageRatio()
Определения ItemBase.c:5462
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8531
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6773
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
Определения ItemBase.c:4884
bool IsOverheatingEffectActive()
Определения ItemBase.c:5325
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5742
int GetLiquidContainerMask()
Определения ItemBase.c:5679
ref Timer m_CheckOverheating
Определения ItemBase.c:4877
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:5373
float GetEnergy()
Определения ItemBase.c:8278
bool CanBeDigged()
Определения ItemBase.c:5758
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9452
bool IsNVG()
Определения ItemBase.c:5690
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8238
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9228
bool m_IsDeploySound
Определения ItemBase.c:9531
bool CanEat()
Определения ItemBase.c:7311
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8937
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9008
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9430
bool IsLiquidContainer()
Определения ItemBase.c:5674
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7331
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8165
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8721
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8119
int m_CleannessInit
Определения ItemBase.c:4813
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5457
override int GetAgents()
Определения ItemBase.c:8668
int m_VarQuantityMax
Определения ItemBase.c:4801
override bool IsHologram()
Определения ItemBase.c:5753
float GetItemAttachOffset()
Определения ItemBase.c:8447
bool IsPlaceSound()
Определения ItemBase.c:9545
static int GetDebugActionsMask()
Определения ItemBase.c:5543
override int GetLiquidType()
Определения ItemBase.c:8547
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9308
override bool IsItemBase()
Определения ItemBase.c:7464
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9018
void ExplodeAmmo()
Определения ItemBase.c:6230
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:6972
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8742
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8917
override void OnEnergyAdded()
Определения ItemBase.c:8296
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:5702
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9528
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7604
void StopItemDynamicPhysics()
Определения ItemBase.c:9210
bool HasFoodStage()
Определения ItemBase.c:7324
override void SetStoreLoad(bool value)
Определения ItemBase.c:8416
float GetOverheatingValue()
Определения ItemBase.c:5287
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8621
override void AddWet(float value)
Определения ItemBase.c:8364
bool IsLiquidPresent()
Определения ItemBase.c:5669
bool IsFullQuantity()
Определения ItemBase.c:8159
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:5943
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6678
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6651
int m_CleannessMax
Определения ItemBase.c:4815
float m_VarStackMax
Определения ItemBase.c:4803
ref Timer m_PhysDropTimer
Определения ItemBase.c:4890
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7436
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8426
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4844
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5308
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5623
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7358
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8552
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5354
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8474
bool m_IsOverheatingEffectActive
Определения ItemBase.c:4875
int m_LiquidContainerMask
Определения ItemBase.c:4825
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9246
override int GetCleanness()
Определения ItemBase.c:8469
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9457
bool IsDeploySound()
Определения ItemBase.c:9546
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5563
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:8957
int m_VarQuantityMin
Определения ItemBase.c:4800
void PerformDamageSystemReinit()
Определения ItemBase.c:9216
override void ClearInventory()
Определения ItemBase.c:8257
static int m_LastRegisteredWeaponID
Определения ItemBase.c:4872
ItemBase GetLightSourceItem()
Определения ItemBase.c:9440
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7454
override float GetItemOverheatThreshold()
Определения ItemBase.c:9390
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4837
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7568
void Open()
Implementations only.
Определения CannedFood.c:100
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6590
float m_ItemModelLength
Определения ItemBase.c:4823
bool m_IsHologram
Определения ItemBase.c:4830
static int m_DebugActionsMask
Определения ItemBase.c:4790
void KillAllOverheatingParticles()
Определения ItemBase.c:5423
bool CanBeCookedOnStick()
Определения ItemBase.c:7341
override int GetQuantityMax()
Определения ItemBase.c:8106
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7050
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8512
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8634
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4833
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:8824
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9186
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4784
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9519
override bool IsBeingPlaced()
Определения ItemBase.c:5737
int GetQuantityInit()
Определения ItemBase.c:8143
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:6992
bool IsResultOfSplit()
Определения ItemBase.c:6977
bool m_FixDamageSystemInit
Определения ItemBase.c:4835
float m_ImpactSpeed
Определения ItemBase.c:4819
bool m_IsStoreLoad
Определения ItemBase.c:4838
int GetLiquidTypeInit()
Определения ItemBase.c:8542
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4853
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5610
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6462
int m_AttachedAgents
Определения ItemBase.c:4861
string m_LockSoundSet
Определения ItemBase.c:4896
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5231
float m_VarQuantityPrev
Определения ItemBase.c:4798
bool IsSoundSynchRemote()
Определения ItemBase.c:9544
bool m_CanShowQuantity
Определения ItemBase.c:4839
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
Определения ItemBase.c:8781
override void OnRightClick()
Определения ItemBase.c:6846
int m_ColorComponentB
Определения ItemBase.c:4848
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4786
bool IsActionTargetVisible()
Определения ItemBase.c:9054
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:5978
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6267
bool m_IsBeingPlaced
Определения ItemBase.c:4829
int NameToID(string name)
Определения ItemBase.c:7541
void ~ItemBase()
Определения ItemBase.c:5508
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8404
void ClearStopItemSoundServer()
Определения ItemBase.c:9144
override string ChangeIntoOnDetach()
Определения ItemBase.c:6191
float m_VarWetMax
Определения ItemBase.c:4810
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6585
int GetLockType()
Определения ItemBase.c:8482
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9526
override float GetWet()
Определения ItemBase.c:8374
EffectSound m_SoundPlace
Определения ItemBase.c:9527
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8092
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8456
bool m_IsPlaceSound
Определения ItemBase.c:9530
override float GetWetMin()
Определения ItemBase.c:8384
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:4902
override bool KindOf(string tag)
Определения ItemBase.c:7470
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:321
string GetDebugText()
Определения ModifierBase.c:71
PlayerBase GetPlayer()
Определения ModifierBase.c:51
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:316
EntityAI GetItem()
Определения RadialQuickbarMenu.c:37
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
void Debug()
Определения UniversalTemperatureSource.c:349
int GetID()
Определения ActionBase.c:1321
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:962
GetInputType()
Определения ActionBase.c:215
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
Определения AnalyticsManagerClient.c:77
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
Определения DayZGame.c:1187
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
Определения Game.c:1513
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1280
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:541
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1275
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()
Определения Man.c:44
Определения Building.c:6
Определения constants.c:659
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
Определения ItemBase.c:15
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
Определения InventoryLocation.c:469
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:29
override bool CanDisplayCargo()
Определения UndergroundStash.c:24
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:6
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:913
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:149
override void OnWasDetached(EntityAI parent, int slot_id)
Определения InventoryItem.c:920
override void EEOnAfterLoad()
Определения GardenBase.c:187
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 void SetActions()
Определения InventoryItem.c:732
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:412
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1218
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:465
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:424
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:472
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:206
override void AfterStoreLoad()
Определения GardenBase.c:182
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1017
override void OnVariablesSynchronized()
Определения GardenBase.c:68
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
Определения InventoryItem.c:912
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:962
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:269
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:988
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1150
override void InitItemSounds()
Определения TentBase.c:810
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:1012
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 IsClothing()
Определения InventoryItem.c:840
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:341
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
Определения InventoryItem.c:731
Определения 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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto 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:64
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения Debug.c:816
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:100
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
proto native CGame GetGame()
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения constants.c:510
const int DEF_CHEMICAL
Определения constants.c:511
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:685
array< int > TIntArray
Определения EnScript.c:687
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения constants.c:806
const int VARIABLE_LIQUIDTYPE
Определения constants.c:630
const int VARIABLE_CLEANNESS
Определения constants.c:633
const int VARIABLE_COLOR
Определения constants.c:632
const int VARIABLE_TEMPERATURE
Определения constants.c:628
const int VARIABLE_QUANTITY
Определения constants.c:626
const int VARIABLE_WET
Определения constants.c:629
const int LIQUID_NONE
Определения constants.c:527
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения constants.c:451
const int SAT_DEBUG_ACTION
Определения constants.c:452
class JsonUndergroundAreaTriggerData GetPosition
Определения UndergroundAreaLoader.c:9
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
Определения tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения tools.c:8
proto native int GetColor()