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

◆ IsOpen()

override bool IsOpen ( )
protected

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

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

Используется в InventoryItem::CanBeConsumed(), FireplaceBase::CanBeIgnitedBy(), FireplaceBase::CanDisplayAttachmentCategory(), FireplaceBase::CanDisplayCargo(), InventoryItem::CanDisplayCargo(), FireplaceBase::CanExtinguishFire(), FireplaceBase::CanIgniteItem(), FireplaceBase::CanPutInCargo(), FireplaceBase::CanPutIntoHands(), FireplaceBase::CanReceiveAttachment(), FireplaceBase::CanReceiveItemIntoCargo(), FireplaceBase::CanReleaseCargo(), FireplaceBase::CanShowSmoke(), FireplaceBase::IsThisIgnitionSuccessful() и FireplaceBase::UpdateVisualState().