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

◆ SetTakeable()

override void SpawnItemOnLocation::SetTakeable ( bool pState)
protected

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

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

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