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

◆ GetItemAttachOffset()

float SpawnItemOnLocation::GetItemAttachOffset ( )
protected

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

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

Используется в InventoryItem::InitItemVariables().