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

◆ GetBandagingEffectivity()

float SpawnItemOnLocation::GetBandagingEffectivity ( )
protected

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

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