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

◆ HidesSelectionBySlot()

bool SpawnItemOnLocation::HidesSelectionBySlot ( )
protected

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

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