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

◆ StopItemSoundServer()

void SpawnItemOnLocation::StopItemSoundServer ( int id)
protected

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

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