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

◆ GetLiquidTypeInit()

int SpawnItemOnLocation::GetLiquidTypeInit ( )
protected

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

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

Используется в DisinfectantAlcohol::InitItemVariables(), DisinfectantSpray::InitItemVariables(), InventoryItem::InitItemVariables(), IodineTincture::InitItemVariables() и InventoryItem::OnQuantityChanged().