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

◆ IsActionTargetVisible()

bool SpawnItemOnLocation::IsActionTargetVisible ( )
protected

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

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