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

◆ StopOverheatingParticles()

static void SpawnItemOnLocation::StopOverheatingParticles ( ItemBase weapon,
string ammoType,
ItemBase muzzle_owner,
ItemBase suppressor,
string config_to_search )
staticprotected

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

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