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

◆ SetTakeable()

override void SpawnItemOnLocation::SetTakeable ( bool pState)
protected

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

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

Используется в Barrel_ColorBase::Close(), FireplaceBase::Close(), Barrel_ColorBase::CloseLoad(), FireplaceBase::CloseLoad(), ImprovisedExplosive::EEHealthLevelChanged(), Plastic_Explosive::EEHealthLevelChanged(), EEItemAttached(), EEItemDetached(), LockServer(), Grenade_Base::OnActivateFinished(), Grenade_Base::OnActivateImmediate(), ImprovisedExplosive::OnDisarmed(), Plastic_Explosive::OnDisarmed(), ItemOptics::OnInventoryExit(), InventoryItem::OnPlacementStarted(), ItemOptics::OnWasAttached(), ItemOptics::OnWasDetached(), Barrel_ColorBase::Open(), FireplaceBase::Open(), Barrel_ColorBase::OpenLoad(), FireplaceBase::OpenLoad(), PlantBase(), ItemBase::SetMountedState() и UnlockServer().