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

◆ IsOneHandedBehaviour()

override bool SpawnItemOnLocation::IsOneHandedBehaviour ( )
protected

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

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