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

◆ OnPlacementComplete()

override void SpawnItemOnLocation::OnPlacementComplete ( Man player,
vector position = "0 0 0",
vector orientation = "0 0 0" )
protected

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

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