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

◆ StopItemDynamicPhysics()

void SpawnItemOnLocation::StopItemDynamicPhysics ( )
protected

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

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