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

◆ IsActionTargetVisible()

bool SpawnItemOnLocation::IsActionTargetVisible ( )
protected

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

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