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

◆ GetProtectionLevel()

float SpawnItemOnLocation::GetProtectionLevel ( int type,
bool consider_filter = false,
int system = 0 )
protected

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

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