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

◆ IsColorSet()

bool SpawnItemOnLocation::IsColorSet ( )
protected

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

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