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

◆ ReadVarsFromCTX()

override bool SpawnItemOnLocation::ReadVarsFromCTX ( ParamsReadContext ctx,
int version = -1 )
protected

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

7924{
7925 override bool CanPutAsAttachment(EntityAI parent)
7926 {
7927 return true;
7928 }
7929};
7930
7932{
7933
7934};
7935
7936//const bool QUANTITY_DEBUG_REMOVE_ME = false;
7937
7938class ItemBase extends InventoryItem
7939{
7943
7945
7946 static int m_DebugActionsMask;
7948 // ============================================
7949 // Variable Manipulation System
7950 // ============================================
7951 // Quantity
7952
7953 float m_VarQuantity;
7954 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
7956 int m_VarQuantityMin;
7957 int m_VarQuantityMax;
7958 int m_Count;
7959 float m_VarStackMax;
7960 float m_StoreLoadedQuantity = float.LOWEST;
7961 // Wet
7962 float m_VarWet;
7963 float m_VarWetPrev;//for client to know wetness changed during synchronization
7964 float m_VarWetInit;
7965 float m_VarWetMin;
7966 float m_VarWetMax;
7967 // Cleanness
7968 int m_Cleanness;
7969 int m_CleannessInit;
7970 int m_CleannessMin;
7971 int m_CleannessMax;
7972 // impact sounds
7974 bool m_CanPlayImpactSound = true;
7975 float m_ImpactSpeed;
7977 //
7978 float m_HeatIsolation;
7979 float m_ItemModelLength;
7980 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
7982 int m_VarLiquidType;
7983 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
7984 int m_QuickBarBonus;
7985 bool m_IsBeingPlaced;
7986 bool m_IsHologram;
7987 bool m_IsTakeable;
7988 bool m_ThrowItemOnDrop;
7991 bool m_FixDamageSystemInit = false; //can be changed on storage version check
7992 bool can_this_be_combined; //Check if item can be combined
7993 bool m_CanThisBeSplit; //Check if item can be split
7994 bool m_IsStoreLoad = false;
7995 bool m_CanShowQuantity;
7996 bool m_HasQuantityBar;
7997 protected bool m_CanBeDigged;
7998 protected bool m_IsResultOfSplit
7999
8000 string m_SoundAttType;
8001 // items color variables
8006 //-------------------------------------------------------
8007
8008 // light source managing
8010
8014
8015 //==============================================
8016 // agent system
8017 private int m_AttachedAgents;
8018
8020 void TransferModifiers(PlayerBase reciever);
8021
8022
8023 // Weapons & suppressors particle effects
8027 ref static map<string, int> m_WeaponTypeToID;
8028 static int m_LastRegisteredWeaponID = 0;
8029
8030 // Overheating effects
8032 float m_OverheatingShots;
8033 ref Timer m_CheckOverheating;
8034 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
8035 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
8036 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
8037 ref array <ref OverheatingParticle> m_OverheatingParticles;
8038
8040 protected bool m_HideSelectionsBySlot;
8041
8042 // Admin Log
8043 PluginAdminLog m_AdminLog;
8044
8045 // misc
8046 ref Timer m_PhysDropTimer;
8047
8048 // Attachment Locking variables
8049 ref array<int> m_CompatibleLocks;
8050 protected int m_LockType;
8051 protected ref EffectSound m_LockingSound;
8052 protected string m_LockSoundSet;
8053
8054 // ItemSoundHandler variables
8055 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
8056 protected int m_SoundSyncPlay; // id for sound to play
8057 protected int m_SoundSyncStop; // id for sound to stop
8058 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
8059
8061
8062 //temperature
8063 private float m_TemperaturePerQuantityWeight;
8064
8065 // -------------------------------------------------------------------------
8066 void ItemBase()
8067 {
8068 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
8072
8073 if (!g_Game.IsDedicatedServer())
8074 {
8075 if (HasMuzzle())
8076 {
8078
8080 {
8082 }
8083 }
8084
8086 m_ActionsInitialize = false;
8087 }
8088
8089 m_OldLocation = null;
8090
8091 if (g_Game.IsServer())
8092 {
8093 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
8094 }
8095
8096 if (ConfigIsExisting("headSelectionsToHide"))
8097 {
8099 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
8100 }
8101
8102 m_HideSelectionsBySlot = false;
8103 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8104 {
8105 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
8106 }
8107
8108 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
8109
8110 m_IsResultOfSplit = false;
8111
8113 }
8114
8115 override void InitItemVariables()
8116 {
8117 super.InitItemVariables();
8118
8119 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
8120 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
8121 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
8122 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
8123 m_VarStackMax = ConfigGetFloat("varStackMax");
8124 m_Count = ConfigGetInt("count");
8125
8126 m_CanShowQuantity = ConfigGetBool("quantityShow");
8127 m_HasQuantityBar = ConfigGetBool("quantityBar");
8128
8129 m_CleannessInit = ConfigGetInt("varCleannessInit");
8131 m_CleannessMin = ConfigGetInt("varCleannessMin");
8132 m_CleannessMax = ConfigGetInt("varCleannessMax");
8133
8134 m_WantPlayImpactSound = false;
8135 m_ImpactSpeed = 0.0;
8136
8137 m_VarWetInit = ConfigGetFloat("varWetInit");
8139 m_VarWetMin = ConfigGetFloat("varWetMin");
8140 m_VarWetMax = ConfigGetFloat("varWetMax");
8141
8142 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
8143 if (IsLiquidContainer() && GetQuantity() != 0)
8145 m_IsBeingPlaced = false;
8146 m_IsHologram = false;
8147 m_IsTakeable = true;
8148 m_CanBeMovedOverride = false;
8152 m_CanBeDigged = ConfigGetBool("canBeDigged");
8153
8154 m_CompatibleLocks = new array<int>();
8155 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
8156 m_LockType = ConfigGetInt("lockType");
8157
8158 //Define if item can be split and set ability to be combined accordingly
8159 m_CanThisBeSplit = false;
8160 can_this_be_combined = false;
8161 if (ConfigIsExisting("canBeSplit"))
8162 {
8163 can_this_be_combined = ConfigGetBool("canBeSplit");
8165 }
8166
8167 m_ItemBehaviour = -1;
8168 if (ConfigIsExisting("itemBehaviour"))
8169 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
8170
8171 //RegisterNetSyncVariableInt("m_VariablesMask");
8172 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
8173 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
8174 RegisterNetSyncVariableInt("m_VarLiquidType");
8175 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8176
8177 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8178 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8179 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8180
8181 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8182 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8183 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8184 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8185
8186 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8187 RegisterNetSyncVariableBool("m_IsTakeable");
8188 RegisterNetSyncVariableBool("m_IsHologram");
8189
8192 {
8193 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
8194 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
8195 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
8196 }
8197
8198 m_LockSoundSet = ConfigGetString("lockSoundSet");
8199
8201 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8202 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
8203
8204 m_SoundSyncSlotID = -1;
8205 }
8206
8207 override int GetQuickBarBonus()
8208 {
8209 return m_QuickBarBonus;
8210 }
8211
8212 void InitializeActions()
8213 {
8215 if (!m_InputActionMap)
8216 {
8218 m_InputActionMap = iam;
8219 SetActions();
8221 }
8222 }
8223
8224 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
8225 {
8227 {
8228 m_ActionsInitialize = true;
8230 }
8231
8232 actions = m_InputActionMap.Get(action_input_type);
8233 }
8234
8235 void SetActions()
8236 {
8237 AddAction(ActionTakeItem);
8238 AddAction(ActionTakeItemToHands);
8239 AddAction(ActionWorldCraft);
8241 AddAction(ActionAttachWithSwitch);
8242 }
8243
8244 void SetActionAnimOverrides(); // Override action animation for specific item
8245
8246 void AddAction(typename actionName)
8247 {
8248 ActionBase action = ActionManagerBase.GetAction(actionName);
8249
8250 if (!action)
8251 {
8252 Debug.LogError("Action " + actionName + " dosn't exist!");
8253 return;
8254 }
8255
8256 typename ai = action.GetInputType();
8257 if (!ai)
8258 {
8259 m_ActionsInitialize = false;
8260 return;
8261 }
8262
8263 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8264 if (!action_array)
8265 {
8266 action_array = new array<ActionBase_Basic>;
8267 m_InputActionMap.Insert(ai, action_array);
8268 }
8269 if (LogManager.IsActionLogEnable())
8270 {
8271 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
8272 }
8273
8274 if (action_array.Find(action) != -1)
8275 {
8276 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
8277 }
8278 else
8279 {
8280 action_array.Insert(action);
8281 }
8282 }
8283
8284 void RemoveAction(typename actionName)
8285 {
8286 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8287 ActionBase action = player.GetActionManager().GetAction(actionName);
8288 typename ai = action.GetInputType();
8289 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
8290
8291 if (action_array)
8292 {
8293 action_array.RemoveItem(action);
8294 }
8295 }
8296
8297 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
8298 // Set -1 for params which should stay in default state
8299 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
8300 {
8301 ActionOverrideData overrideData = new ActionOverrideData();
8302 overrideData.m_CommandUID = commandUID;
8303 overrideData.m_CommandUIDProne = commandUIDProne;
8304 overrideData.m_StanceMask = stanceMask;
8305
8306 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
8307 if (!actionMap) // create new map of action > overidables map
8308 {
8309 actionMap = new TActionAnimOverrideMap();
8310 m_ItemActionOverrides.Insert(action, actionMap);
8311 }
8312
8313 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
8314
8315 }
8316
8317 void OnItemInHandsPlayerSwimStart(PlayerBase player);
8318
8319 ScriptedLightBase GetLight();
8320
8321 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8322 void LoadParticleConfigOnFire(int id)
8323 {
8324 if (!m_OnFireEffect)
8326
8329
8330 string config_to_search = "CfgVehicles";
8331 string muzzle_owner_config;
8332
8333 if (!m_OnFireEffect.Contains(id))
8334 {
8335 if (IsInherited(Weapon))
8336 config_to_search = "CfgWeapons";
8337
8338 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8339
8340 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8341
8342 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
8343
8344 if (config_OnFire_subclass_count > 0)
8345 {
8346 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8347
8348 for (int i = 0; i < config_OnFire_subclass_count; i++)
8349 {
8350 string particle_class = "";
8351 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8352 string config_OnFire_entry = config_OnFire_class + particle_class;
8353 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8354 WPOF_array.Insert(WPOF);
8355 }
8356
8357
8358 m_OnFireEffect.Insert(id, WPOF_array);
8359 }
8360 }
8361
8362 if (!m_OnBulletCasingEjectEffect.Contains(id))
8363 {
8364 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
8365 muzzle_owner_config = config_to_search + " " + GetType() + " ";
8366
8367 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8368
8369 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8370
8371 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8372 {
8373 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8374
8375 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8376 {
8377 string particle_class2 = "";
8378 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8379 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8380 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8381 WPOBE_array.Insert(WPOBE);
8382 }
8383
8384
8385 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
8386 }
8387 }
8388 }
8389
8390 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
8392 {
8395
8396 if (!m_OnOverheatingEffect.Contains(id))
8397 {
8398 string config_to_search = "CfgVehicles";
8399
8400 if (IsInherited(Weapon))
8401 config_to_search = "CfgWeapons";
8402
8403 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
8404 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8405
8406 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
8407 {
8408
8409 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
8410
8412 {
8413 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
8414 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8415 Error(error);
8416 return;
8417 }
8418
8419 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
8420 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
8421
8422
8423
8424 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8425 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8426
8427 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8428 {
8429 string particle_class = "";
8430 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8431 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8432 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
8433
8434 if (entry_type == CT_CLASS)
8435 {
8436 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8437 WPOOH_array.Insert(WPOF);
8438 }
8439 }
8440
8441
8442 m_OnOverheatingEffect.Insert(id, WPOOH_array);
8443 }
8444 }
8445 }
8446
8447 float GetOverheatingValue()
8448 {
8449 return m_OverheatingShots;
8450 }
8451
8452 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
8453 {
8454 if (m_MaxOverheatingValue > 0)
8455 {
8457
8458 if (!m_CheckOverheating)
8460
8462 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8463
8464 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8465 }
8466 }
8467
8468 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8469 {
8471 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8472
8474 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8475
8477 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8478
8480 {
8482 }
8483 }
8484
8486 {
8488 }
8489
8490 void OnOverheatingDecay()
8491 {
8492 if (m_MaxOverheatingValue > 0)
8493 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
8494 else
8496
8497 if (m_OverheatingShots <= 0)
8498 {
8501 }
8502 else
8503 {
8504 if (!m_CheckOverheating)
8506
8508 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
8509 }
8510
8511 CheckOverheating(this, "", this);
8512 }
8513
8514 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8515 {
8517 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
8518 }
8519
8520 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8521 {
8523 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
8525 }
8526
8527 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
8528 {
8530 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8531 }
8532
8533 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
8534 {
8536 m_OverheatingParticles = new array<ref OverheatingParticle>;
8537
8538 OverheatingParticle OP = new OverheatingParticle();
8539 OP.RegisterParticle(p);
8540 OP.SetOverheatingLimitMin(min_heat_coef);
8541 OP.SetOverheatingLimitMax(max_heat_coef);
8542 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
8543
8544 m_OverheatingParticles.Insert(OP);
8545 }
8546
8547 float GetOverheatingCoef()
8548 {
8549 if (m_MaxOverheatingValue > 0)
8551
8552 return -1;
8553 }
8554
8556 {
8558 {
8559 float overheat_coef = GetOverheatingCoef();
8560 int count = m_OverheatingParticles.Count();
8561
8562 for (int i = count; i > 0; --i)
8563 {
8564 int id = i - 1;
8565 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8566 Particle p = OP.GetParticle();
8567
8568 float overheat_min = OP.GetOverheatingLimitMin();
8569 float overheat_max = OP.GetOverheatingLimitMax();
8570
8571 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8572 {
8573 if (p)
8574 {
8575 p.Stop();
8576 OP.RegisterParticle(null);
8577 }
8578 }
8579 }
8580 }
8581 }
8582
8584 {
8586 {
8587 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
8588 {
8589 int id = i - 1;
8590 OverheatingParticle OP = m_OverheatingParticles.Get(id);
8591
8592 if (OP)
8593 {
8594 Particle p = OP.GetParticle();
8595
8596 if (p)
8597 {
8598 p.Stop();
8599 }
8600
8601 delete OP;
8602 }
8603 }
8604
8605 m_OverheatingParticles.Clear();
8607 }
8608 }
8609
8611 float GetInfectionChance(int system = 0, Param param = null)
8612 {
8613 return 0.0;
8614 }
8615
8616
8617 float GetDisinfectQuantity(int system = 0, Param param1 = null)
8618 {
8619 return 250;//default value
8620 }
8621
8622 float GetFilterDamageRatio()
8623 {
8624 return 0;
8625 }
8626
8628 bool HasMuzzle()
8629 {
8630 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
8631 return true;
8632
8633 return false;
8634 }
8635
8637 int GetMuzzleID()
8638 {
8639 if (!m_WeaponTypeToID)
8640 m_WeaponTypeToID = new map<string, int>;
8641
8642 if (m_WeaponTypeToID.Contains(GetType()))
8643 {
8644 return m_WeaponTypeToID.Get(GetType());
8645 }
8646 else
8647 {
8648 // Register new weapon ID
8650 }
8651
8653 }
8654
8661 {
8662 return -1;
8663 }
8664
8665
8666
8667 // -------------------------------------------------------------------------
8668 void ~ItemBase()
8669 {
8670 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
8671 {
8672 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8673 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8674
8675 if (r_index >= 0)
8676 {
8677 InventoryLocation r_il = new InventoryLocation;
8678 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8679
8680 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8681 int r_type = r_il.GetType();
8682 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
8683 {
8684 r_il.GetParent().GetOnReleaseLock().Invoke(this);
8685 }
8686 else if (r_type == InventoryLocationType.ATTACHMENT)
8687 {
8688 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
8689 }
8690
8691 }
8692
8693 player.GetHumanInventory().ClearUserReservedLocation(this);
8694 }
8695
8696 if (m_LockingSound)
8697 SEffectManager.DestroyEffect(m_LockingSound);
8698 }
8699
8700
8701
8702 // -------------------------------------------------------------------------
8703 static int GetDebugActionsMask()
8704 {
8705 return ItemBase.m_DebugActionsMask;
8706 }
8707
8708 static bool HasDebugActionsMask(int mask)
8709 {
8710 return ItemBase.m_DebugActionsMask & mask;
8711 }
8712
8713 static void SetDebugActionsMask(int mask)
8714 {
8715 ItemBase.m_DebugActionsMask = mask;
8716 }
8717
8718 static void AddDebugActionsMask(int mask)
8719 {
8720 ItemBase.m_DebugActionsMask |= mask;
8721 }
8722
8723 static void RemoveDebugActionsMask(int mask)
8724 {
8725 ItemBase.m_DebugActionsMask &= ~mask;
8726 }
8727
8728 static void ToggleDebugActionsMask(int mask)
8729 {
8730 if (HasDebugActionsMask(mask))
8731 {
8733 }
8734 else
8735 {
8736 AddDebugActionsMask(mask);
8737 }
8738 }
8739
8740 // -------------------------------------------------------------------------
8741 void SetCEBasedQuantity()
8742 {
8743 if (GetEconomyProfile())
8744 {
8745 float q_max = GetEconomyProfile().GetQuantityMax();
8746 if (q_max > 0)
8747 {
8748 float q_min = GetEconomyProfile().GetQuantityMin();
8749 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8750
8751 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
8752 {
8753 ComponentEnergyManager comp = GetCompEM();
8754 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
8755 {
8756 comp.SetEnergy0To1(quantity_randomized);
8757 }
8758 }
8759 else if (HasQuantity())
8760 {
8761 SetQuantityNormalized(quantity_randomized, false);
8762 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
8763 }
8764
8765 }
8766 }
8767 }
8768
8770 void LockToParent()
8771 {
8772 EntityAI parent = GetHierarchyParent();
8773
8774 if (parent)
8775 {
8776 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8777 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8778 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
8779 }
8780 }
8781
8783 void UnlockFromParent()
8784 {
8785 EntityAI parent = GetHierarchyParent();
8786
8787 if (parent)
8788 {
8789 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8790 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8791 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
8792 }
8793 }
8794
8795 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
8796 {
8797 /*
8798 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
8799 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
8800 */
8801 ItemBase item2 = ItemBase.Cast(entity2);
8802
8803 if (g_Game.IsClient())
8804 {
8805 if (ScriptInputUserData.CanStoreInputUserData())
8806 {
8807 ScriptInputUserData ctx = new ScriptInputUserData;
8809 ctx.Write(-1);
8810 ItemBase i1 = this; // @NOTE: workaround for correct serialization
8811 ctx.Write(i1);
8812 ctx.Write(item2);
8813 ctx.Write(use_stack_max);
8814 ctx.Write(-1);
8815 ctx.Send();
8816
8817 if (IsCombineAll(item2, use_stack_max))
8818 {
8819 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8820 }
8821 }
8822 }
8823 else if (!g_Game.IsMultiplayer())
8824 {
8825 CombineItems(item2, use_stack_max);
8826 }
8827 }
8828
8829 bool IsLiquidPresent()
8830 {
8831 return (GetLiquidType() != 0 && HasQuantity());
8832 }
8833
8834 bool IsLiquidContainer()
8835 {
8836 return m_LiquidContainerMask != 0;
8837 }
8838
8840 {
8841 return m_LiquidContainerMask;
8842 }
8843
8844 bool IsBloodContainer()
8845 {
8846 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
8847 return false;
8848 }
8849
8850 bool IsNVG()
8851 {
8852 return false;
8853 }
8854
8857 bool IsExplosive()
8858 {
8859 return false;
8860 }
8861
8863 {
8864 return "";
8865 }
8866
8868
8869 bool IsLightSource()
8870 {
8871 return false;
8872 }
8873
8875 {
8876 return true;
8877 }
8878
8879 //--- ACTION CONDITIONS
8880 //direction
8881 bool IsFacingPlayer(PlayerBase player, string selection)
8882 {
8883 return true;
8884 }
8885
8886 bool IsPlayerInside(PlayerBase player, string selection)
8887 {
8888 return true;
8889 }
8890
8891 override bool CanObstruct()
8892 {
8893 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
8894 return !player || !IsPlayerInside(player, "");
8895 }
8896
8897 override bool IsBeingPlaced()
8898 {
8899 return m_IsBeingPlaced;
8900 }
8901
8902 void SetIsBeingPlaced(bool is_being_placed)
8903 {
8904 m_IsBeingPlaced = is_being_placed;
8905 if (!is_being_placed)
8907 SetSynchDirty();
8908 }
8909
8910 //server-side
8911 void OnEndPlacement() {}
8912
8913 override bool IsHologram()
8914 {
8915 return m_IsHologram;
8916 }
8917
8918 bool CanBeDigged()
8919 {
8920 return m_CanBeDigged;
8921 }
8922
8924 {
8925 return 1;
8926 }
8927
8928 bool CanMakeGardenplot()
8929 {
8930 return false;
8931 }
8932
8933 void SetIsHologram(bool is_hologram)
8934 {
8935 m_IsHologram = is_hologram;
8936 SetSynchDirty();
8937 }
8938 /*
8939 protected float GetNutritionalEnergy()
8940 {
8941 Edible_Base edible = Edible_Base.Cast(this);
8942 return edible.GetFoodEnergy();
8943 }
8944
8945 protected float GetNutritionalWaterContent()
8946 {
8947 Edible_Base edible = Edible_Base.Cast(this);
8948 return edible.GetFoodWater();
8949 }
8950
8951 protected float GetNutritionalIndex()
8952 {
8953 Edible_Base edible = Edible_Base.Cast(this);
8954 return edible.GetFoodNutritionalIndex();
8955 }
8956
8957 protected float GetNutritionalFullnessIndex()
8958 {
8959 Edible_Base edible = Edible_Base.Cast(this);
8960 return edible.GetFoodTotalVolume();
8961 }
8962
8963 protected float GetNutritionalToxicity()
8964 {
8965 Edible_Base edible = Edible_Base.Cast(this);
8966 return edible.GetFoodToxicity();
8967
8968 }
8969 */
8970
8971
8972 // -------------------------------------------------------------------------
8973 override void OnMovedInsideCargo(EntityAI container)
8974 {
8975 super.OnMovedInsideCargo(container);
8976
8977 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8978 }
8979
8980 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8981 {
8982 super.EEItemLocationChanged(oldLoc, newLoc);
8983
8984 PlayerBase newPlayer = null;
8985 PlayerBase oldPlayer = null;
8986
8987 if (newLoc.GetParent())
8988 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8989
8990 if (oldLoc.GetParent())
8991 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8992
8993 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
8994 {
8995 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
8996
8997 if (rIndex >= 0)
8998 {
8999 InventoryLocation rIl = new InventoryLocation;
9000 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9001
9002 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9003 int rType = rIl.GetType();
9004 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
9005 {
9006 rIl.GetParent().GetOnReleaseLock().Invoke(this);
9007 }
9008 else if (rType == InventoryLocationType.ATTACHMENT)
9009 {
9010 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
9011 }
9012
9013 }
9014 }
9015
9016 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
9017 {
9018 if (newPlayer)
9019 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9020
9021 if (newPlayer == oldPlayer)
9022 {
9023 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9024 {
9025 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9026 {
9027 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9028 {
9029 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9030 }
9031 }
9032 else
9033 {
9034 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9035 }
9036 }
9037
9038 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9039 {
9040 int type = oldLoc.GetType();
9041 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
9042 {
9043 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9044 }
9045 else if (type == InventoryLocationType.ATTACHMENT)
9046 {
9047 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9048 }
9049 }
9050 if (!m_OldLocation)
9051 {
9052 m_OldLocation = new InventoryLocation;
9053 }
9054 m_OldLocation.Copy(oldLoc);
9055 }
9056 else
9057 {
9058 if (m_OldLocation)
9059 {
9060 m_OldLocation.Reset();
9061 }
9062 }
9063
9064 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
9065 }
9066 else
9067 {
9068 if (newPlayer)
9069 {
9070 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9071 if (resIndex >= 0)
9072 {
9073 InventoryLocation il = new InventoryLocation;
9074 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9075 ItemBase it = ItemBase.Cast(il.GetItem());
9076 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9077 int rel_type = il.GetType();
9078 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
9079 {
9080 il.GetParent().GetOnReleaseLock().Invoke(it);
9081 }
9082 else if (rel_type == InventoryLocationType.ATTACHMENT)
9083 {
9084 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
9085 }
9086 //it.GetOnReleaseLock().Invoke(it);
9087 }
9088 }
9089 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
9090 {
9091 //ThrowPhysically(oldPlayer, vector.Zero);
9092 m_ThrowItemOnDrop = false;
9093 }
9094
9095 if (m_OldLocation)
9096 {
9097 m_OldLocation.Reset();
9098 }
9099 }
9100
9101 if (oldLoc.GetType() == InventoryLocationType.TEMP)
9102 {
9103 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9104 }
9105
9106 if (newLoc.GetType() == InventoryLocationType.TEMP)
9107 {
9108 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9109 }
9110 }
9111
9112 override void EOnContact(IEntity other, Contact extra)
9113 {
9115 {
9116 int liquidType = -1;
9117 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
9118 if (impactSpeed > 0.0)
9119 {
9120 m_ImpactSpeed = impactSpeed;
9121 #ifndef SERVER
9122 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
9123 #else
9124 m_WantPlayImpactSound = true;
9125 SetSynchDirty();
9126 #endif
9127 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
9128 }
9129 }
9130
9131 #ifdef SERVER
9132 if (GetCompEM() && GetCompEM().IsPlugged())
9133 {
9134 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
9135 GetCompEM().UnplugThis();
9136 }
9137 #endif
9138 }
9139
9140 void RefreshPhysics();
9141
9142 override void OnCreatePhysics()
9143 {
9145 }
9146
9147 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9148 {
9149
9150 }
9151 // -------------------------------------------------------------------------
9152 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
9153 {
9154 super.OnItemLocationChanged(old_owner, new_owner);
9155
9156 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9157 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9158
9159 if (!relatedPlayer && playerNew)
9160 relatedPlayer = playerNew;
9161
9162 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9163 {
9164 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
9165 if (actionMgr)
9166 {
9167 ActionBase currentAction = actionMgr.GetRunningAction();
9168 if (currentAction)
9169 currentAction.OnItemLocationChanged(this);
9170 }
9171 }
9172
9173 Man ownerPlayerOld = null;
9174 Man ownerPlayerNew = null;
9175
9176 if (old_owner)
9177 {
9178 if (old_owner.IsMan())
9179 {
9180 ownerPlayerOld = Man.Cast(old_owner);
9181 }
9182 else
9183 {
9184 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9185 }
9186 }
9187 else
9188 {
9189 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
9190 {
9191 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
9192
9193 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
9194 {
9195 GetCompEM().UnplugThis();
9196 }
9197 }
9198 }
9199
9200 if (new_owner)
9201 {
9202 if (new_owner.IsMan())
9203 {
9204 ownerPlayerNew = Man.Cast(new_owner);
9205 }
9206 else
9207 {
9208 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9209 }
9210 }
9211
9212 if (ownerPlayerOld != ownerPlayerNew)
9213 {
9214 if (ownerPlayerOld)
9215 {
9216 array<EntityAI> subItemsExit = new array<EntityAI>;
9217 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
9218 for (int i = 0; i < subItemsExit.Count(); i++)
9219 {
9220 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
9221 itemExit.OnInventoryExit(ownerPlayerOld);
9222 }
9223 }
9224
9225 if (ownerPlayerNew)
9226 {
9227 array<EntityAI> subItemsEnter = new array<EntityAI>;
9228 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
9229 for (int j = 0; j < subItemsEnter.Count(); j++)
9230 {
9231 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
9232 itemEnter.OnInventoryEnter(ownerPlayerNew);
9233 }
9234 }
9235 }
9236 else if (ownerPlayerNew != null)
9237 {
9238 PlayerBase nplayer;
9239 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9240 {
9241 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9242 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
9243 for (int k = 0; k < subItemsUpdate.Count(); k++)
9244 {
9245 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
9246 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9247 }
9248 }
9249 }
9250
9251 if (old_owner)
9252 old_owner.OnChildItemRemoved(this);
9253 if (new_owner)
9254 new_owner.OnChildItemReceived(this);
9255 }
9256
9257 // -------------------------------------------------------------------------------
9258 override void EEDelete(EntityAI parent)
9259 {
9260 super.EEDelete(parent);
9261 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9262 if (player)
9263 {
9264 OnInventoryExit(player);
9265
9266 if (player.IsAlive())
9267 {
9268 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9269 if (r_index >= 0)
9270 {
9271 InventoryLocation r_il = new InventoryLocation;
9272 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9273
9274 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9275 int r_type = r_il.GetType();
9276 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9277 {
9278 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9279 }
9280 else if (r_type == InventoryLocationType.ATTACHMENT)
9281 {
9282 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9283 }
9284
9285 }
9286
9287 player.RemoveQuickBarEntityShortcut(this);
9288 }
9289 }
9290 }
9291 // -------------------------------------------------------------------------------
9292 override void EEKilled(Object killer)
9293 {
9294 super.EEKilled(killer);
9295
9297 if (killer && killer.IsFireplace() && CanExplodeInFire())
9298 {
9299 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9300 {
9301 if (IsMagazine())
9302 {
9303 if (Magazine.Cast(this).GetAmmoCount() > 0)
9304 {
9305 ExplodeAmmo();
9306 }
9307 }
9308 else
9309 {
9310 Explode(DamageType.EXPLOSION);
9311 }
9312 }
9313 }
9314 }
9315
9316 override void OnWasAttached(EntityAI parent, int slot_id)
9317 {
9318 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9319
9320 super.OnWasAttached(parent, slot_id);
9321
9322 if (HasQuantity())
9323 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9324
9325 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
9326 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
9327 }
9328
9329 override void OnWasDetached(EntityAI parent, int slot_id)
9330 {
9331 super.OnWasDetached(parent, slot_id);
9332
9333 if (HasQuantity())
9334 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9335
9336 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
9337 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
9338 }
9339
9340 override string ChangeIntoOnAttach(string slot)
9341 {
9342 int idx;
9343 TStringArray inventory_slots = new TStringArray;
9344 TStringArray attach_types = new TStringArray;
9345
9346 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9347 if (inventory_slots.Count() < 1) //is string
9348 {
9349 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9350 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9351 }
9352 else //is array
9353 {
9354 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9355 }
9356
9357 idx = inventory_slots.Find(slot);
9358 if (idx < 0)
9359 return "";
9360
9361 return attach_types.Get(idx);
9362 }
9363
9364 override string ChangeIntoOnDetach()
9365 {
9366 int idx = -1;
9367 string slot;
9368
9369 TStringArray inventory_slots = new TStringArray;
9370 TStringArray detach_types = new TStringArray;
9371
9372 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9373 if (inventory_slots.Count() < 1) //is string
9374 {
9375 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9376 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9377 }
9378 else //is array
9379 {
9380 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9381 if (detach_types.Count() < 1)
9382 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9383 }
9384
9385 for (int i = 0; i < inventory_slots.Count(); i++)
9386 {
9387 slot = inventory_slots.Get(i);
9388 }
9389
9390 if (slot != "")
9391 {
9392 if (detach_types.Count() == 1)
9393 idx = 0;
9394 else
9395 idx = inventory_slots.Find(slot);
9396 }
9397 if (idx < 0)
9398 return "";
9399
9400 return detach_types.Get(idx);
9401 }
9402
9403 void ExplodeAmmo()
9404 {
9405 //timer
9406 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
9407
9408 //min/max time
9409 float min_time = 1;
9410 float max_time = 3;
9411 float delay = Math.RandomFloat(min_time, max_time);
9412
9413 explode_timer.Run(delay, this, "DoAmmoExplosion");
9414 }
9415
9416 void DoAmmoExplosion()
9417 {
9418 Magazine magazine = Magazine.Cast(this);
9419 int pop_sounds_count = 6;
9420 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9421
9422 //play sound
9423 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9424 string sound_name = pop_sounds[ sound_idx ];
9425 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
9426
9427 //remove ammo count
9428 magazine.ServerAddAmmoCount(-1);
9429
9430 //if condition then repeat -> ExplodeAmmo
9431 float min_temp_to_explode = 100; //min temperature for item to explode
9432
9433 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
9434 {
9435 ExplodeAmmo();
9436 }
9437 }
9438
9439 // -------------------------------------------------------------------------------
9440 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9441 {
9442 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
9443
9444 const int CHANCE_DAMAGE_CARGO = 4;
9445 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9446 const int CHANCE_DAMAGE_NOTHING = 2;
9447
9448 if (IsClothing() || IsContainer() || IsItemTent())
9449 {
9450 float dmg = damageResult.GetDamage("","Health") * -0.5;
9451 int chances;
9452 int rnd;
9453
9454 if (GetInventory().GetCargo())
9455 {
9456 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9457 rnd = Math.RandomInt(0,chances);
9458
9459 if (rnd < CHANCE_DAMAGE_CARGO)
9460 {
9461 DamageItemInCargo(dmg);
9462 }
9463 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9464 {
9466 }
9467 }
9468 else
9469 {
9470 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9471 rnd = Math.RandomInt(0,chances);
9472
9473 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9474 {
9476 }
9477 }
9478 }
9479 }
9480
9481 bool DamageItemInCargo(float damage)
9482 {
9483 CargoBase cargo = GetInventory().GetCargo();
9484 if (cargo)
9485 {
9486 int item_count = cargo.GetItemCount();
9487 if (item_count > 0)
9488 {
9489 int random_pick = Math.RandomInt(0, item_count);
9490 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
9491 if (!item.IsExplosive())
9492 {
9493 item.AddHealth("","",damage);
9494 return true;
9495 }
9496 }
9497 }
9498 return false;
9499 }
9500
9501 bool DamageItemAttachments(float damage)
9502 {
9503 GameInventory inventory = GetInventory();
9504 int attachment_count = inventory.AttachmentCount();
9505 if (attachment_count > 0)
9506 {
9507 int random_pick = Math.RandomInt(0, attachment_count);
9508 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
9509 if (!attachment.IsExplosive())
9510 {
9511 attachment.AddHealth("","",damage);
9512 return true;
9513 }
9514 }
9515 return false;
9516 }
9517
9518 override bool IsSplitable()
9519 {
9520 return m_CanThisBeSplit;
9521 }
9522 //----------------
9523 override bool CanBeSplit()
9524 {
9525 if (IsSplitable() && (GetQuantity() > 1))
9526 return GetInventory().CanRemoveEntity();
9527
9528 return false;
9529 }
9530
9531 protected bool ShouldSplitQuantity(float quantity)
9532 {
9533 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
9534 if (!IsSplitable())
9535 return false;
9536
9537 // nothing to split?
9538 if (GetQuantity() <= 1)
9539 return false;
9540
9541 // check if we should re-use the item instead of creating a new copy?
9542 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
9543 int delta = GetQuantity() - quantity;
9544 if (delta == 0)
9545 return false;
9546
9547 // valid to split
9548 return true;
9549 }
9550
9551 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
9552 {
9553 if (g_Game.IsClient())
9554 {
9555 if (ScriptInputUserData.CanStoreInputUserData())
9556 {
9557 ScriptInputUserData ctx = new ScriptInputUserData;
9559 ctx.Write(1);
9560 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9561 ctx.Write(i1);
9562 ctx.Write(destination_entity);
9563 ctx.Write(true);
9564 ctx.Write(slot_id);
9565 ctx.Send();
9566 }
9567 }
9568 else if (!g_Game.IsMultiplayer())
9569 {
9570 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
9571 }
9572 }
9573
9574 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
9575 {
9576 float split_quantity_new;
9577 ItemBase new_item;
9578 float quantity = GetQuantity();
9579 float stack_max = GetTargetQuantityMax(slot_id);
9580 InventoryLocation loc = new InventoryLocation;
9581
9582 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9583 {
9584 if (stack_max <= GetQuantity())
9585 split_quantity_new = stack_max;
9586 else
9587 split_quantity_new = GetQuantity();
9588
9589 if (ShouldSplitQuantity(split_quantity_new))
9590 {
9591 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9592 if (new_item)
9593 {
9594 new_item.SetResultOfSplit(true);
9595 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9596 AddQuantity(-split_quantity_new, false, true);
9597 new_item.SetQuantity(split_quantity_new, false, true);
9598 }
9599 }
9600 }
9601 else if (destination_entity && slot_id == -1)
9602 {
9603 if (quantity > stack_max)
9604 split_quantity_new = stack_max;
9605 else
9606 split_quantity_new = quantity;
9607
9608 if (ShouldSplitQuantity(split_quantity_new))
9609 {
9610 GameInventory destinationInventory = destination_entity.GetInventory();
9611 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9612 {
9613 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9614 new_item = ItemBase.Cast(o);
9615 }
9616
9617 if (new_item)
9618 {
9619 new_item.SetResultOfSplit(true);
9620 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9621 AddQuantity(-split_quantity_new, false, true);
9622 new_item.SetQuantity(split_quantity_new, false, true);
9623 }
9624 }
9625 }
9626 else
9627 {
9628 if (stack_max != 0)
9629 {
9630 if (stack_max < GetQuantity())
9631 {
9632 split_quantity_new = GetQuantity() - stack_max;
9633 }
9634
9635 if (split_quantity_new == 0)
9636 {
9637 if (!g_Game.IsMultiplayer())
9638 player.PhysicalPredictiveDropItem(this);
9639 else
9640 player.ServerDropEntity(this);
9641 return;
9642 }
9643
9644 if (ShouldSplitQuantity(split_quantity_new))
9645 {
9646 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9647
9648 if (new_item)
9649 {
9650 new_item.SetResultOfSplit(true);
9651 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9652 SetQuantity(split_quantity_new, false, true);
9653 new_item.SetQuantity(stack_max, false, true);
9654 new_item.PlaceOnSurface();
9655 }
9656 }
9657 }
9658 }
9659 }
9660
9661 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
9662 {
9663 float split_quantity_new;
9664 ItemBase new_item;
9665 float quantity = GetQuantity();
9666 float stack_max = GetTargetQuantityMax(slot_id);
9667 InventoryLocation loc = new InventoryLocation;
9668
9669 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9670 {
9671 if (stack_max <= GetQuantity())
9672 split_quantity_new = stack_max;
9673 else
9674 split_quantity_new = GetQuantity();
9675
9676 if (ShouldSplitQuantity(split_quantity_new))
9677 {
9678 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
9679 if (new_item)
9680 {
9681 new_item.SetResultOfSplit(true);
9682 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9683 AddQuantity(-split_quantity_new, false, true);
9684 new_item.SetQuantity(split_quantity_new, false, true);
9685 }
9686 }
9687 }
9688 else if (destination_entity && slot_id == -1)
9689 {
9690 if (quantity > stack_max)
9691 split_quantity_new = stack_max;
9692 else
9693 split_quantity_new = quantity;
9694
9695 if (ShouldSplitQuantity(split_quantity_new))
9696 {
9697 GameInventory destinationInventory = destination_entity.GetInventory();
9698 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
9699 {
9700 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
9701 new_item = ItemBase.Cast(o);
9702 }
9703
9704 if (new_item)
9705 {
9706 new_item.SetResultOfSplit(true);
9707 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9708 AddQuantity(-split_quantity_new, false, true);
9709 new_item.SetQuantity(split_quantity_new, false, true);
9710 }
9711 }
9712 }
9713 else
9714 {
9715 if (stack_max != 0)
9716 {
9717 if (stack_max < GetQuantity())
9718 {
9719 split_quantity_new = GetQuantity() - stack_max;
9720 }
9721
9722 if (ShouldSplitQuantity(split_quantity_new))
9723 {
9724 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
9725
9726 if (new_item)
9727 {
9728 new_item.SetResultOfSplit(true);
9729 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9730 SetQuantity(split_quantity_new, false, true);
9731 new_item.SetQuantity(stack_max, false, true);
9732 new_item.PlaceOnSurface();
9733 }
9734 }
9735 }
9736 }
9737 }
9738
9739 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
9740 {
9741 if (g_Game.IsClient())
9742 {
9743 if (ScriptInputUserData.CanStoreInputUserData())
9744 {
9745 ScriptInputUserData ctx = new ScriptInputUserData;
9747 ctx.Write(4);
9748 ItemBase thiz = this; // @NOTE: workaround for correct serialization
9749 ctx.Write(thiz);
9750 dst.WriteToContext(ctx);
9751 ctx.Send();
9752 }
9753 }
9754 else if (!g_Game.IsMultiplayer())
9755 {
9757 }
9758 }
9759
9760 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
9761 {
9762 if (g_Game.IsClient())
9763 {
9764 if (ScriptInputUserData.CanStoreInputUserData())
9765 {
9766 ScriptInputUserData ctx = new ScriptInputUserData;
9768 ctx.Write(2);
9769 ItemBase dummy = this; // @NOTE: workaround for correct serialization
9770 ctx.Write(dummy);
9771 ctx.Write(destination_entity);
9772 ctx.Write(true);
9773 ctx.Write(idx);
9774 ctx.Write(row);
9775 ctx.Write(col);
9776 ctx.Send();
9777 }
9778 }
9779 else if (!g_Game.IsMultiplayer())
9780 {
9781 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
9782 }
9783 }
9784
9785 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
9786 {
9788 }
9789
9790 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
9791 {
9792 float quantity = GetQuantity();
9793 float split_quantity_new;
9794 ItemBase new_item;
9795 if (dst.IsValid())
9796 {
9797 int slot_id = dst.GetSlot();
9798 float stack_max = GetTargetQuantityMax(slot_id);
9799
9800 if (quantity > stack_max)
9801 split_quantity_new = stack_max;
9802 else
9803 split_quantity_new = quantity;
9804
9805 if (ShouldSplitQuantity(split_quantity_new))
9806 {
9807 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9808
9809 if (new_item)
9810 {
9811 new_item.SetResultOfSplit(true);
9812 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9813 AddQuantity(-split_quantity_new, false, true);
9814 new_item.SetQuantity(split_quantity_new, false, true);
9815 }
9816
9817 return new_item;
9818 }
9819 }
9820
9821 return null;
9822 }
9823
9824 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
9825 {
9826 float quantity = GetQuantity();
9827 float split_quantity_new;
9828 ItemBase new_item;
9829 if (destination_entity)
9830 {
9831 float stackable = GetTargetQuantityMax();
9832 if (quantity > stackable)
9833 split_quantity_new = stackable;
9834 else
9835 split_quantity_new = quantity;
9836
9837 if (ShouldSplitQuantity(split_quantity_new))
9838 {
9839 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
9840 if (new_item)
9841 {
9842 new_item.SetResultOfSplit(true);
9843 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9844 AddQuantity(-split_quantity_new, false, true);
9845 new_item.SetQuantity(split_quantity_new, false, true);
9846 }
9847 }
9848 }
9849 }
9850
9851 void SplitIntoStackMaxHandsClient(PlayerBase player)
9852 {
9853 if (g_Game.IsClient())
9854 {
9855 if (ScriptInputUserData.CanStoreInputUserData())
9856 {
9857 ScriptInputUserData ctx = new ScriptInputUserData;
9859 ctx.Write(3);
9860 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9861 ctx.Write(i1);
9862 ItemBase destination_entity = this;
9863 ctx.Write(destination_entity);
9864 ctx.Write(true);
9865 ctx.Write(0);
9866 ctx.Send();
9867 }
9868 }
9869 else if (!g_Game.IsMultiplayer())
9870 {
9871 SplitIntoStackMaxHands(player);
9872 }
9873 }
9874
9875 void SplitIntoStackMaxHands(PlayerBase player)
9876 {
9877 float quantity = GetQuantity();
9878 float split_quantity_new;
9879 ref ItemBase new_item;
9880 if (player)
9881 {
9882 float stackable = GetTargetQuantityMax();
9883 if (quantity > stackable)
9884 split_quantity_new = stackable;
9885 else
9886 split_quantity_new = quantity;
9887
9888 if (ShouldSplitQuantity(split_quantity_new))
9889 {
9890 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
9891 new_item = ItemBase.Cast(in_hands);
9892 if (new_item)
9893 {
9894 new_item.SetResultOfSplit(true);
9895 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9896 AddQuantity(-split_quantity_new, false, true);
9897 new_item.SetQuantity(split_quantity_new, false, true);
9898 }
9899 }
9900 }
9901 }
9902
9903 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
9904 {
9905 float quantity = GetQuantity();
9906 float split_quantity_new = Math.Floor(quantity * 0.5);
9907
9908 if (!ShouldSplitQuantity(split_quantity_new))
9909 return;
9910
9911 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
9912
9913 if (new_item)
9914 {
9915 if (new_item.GetQuantityMax() < split_quantity_new)
9916 {
9917 split_quantity_new = new_item.GetQuantityMax();
9918 }
9919
9920 new_item.SetResultOfSplit(true);
9921 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9922
9923 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9924 {
9925 AddQuantity(-1, false, true);
9926 new_item.SetQuantity(1, false, true);
9927 }
9928 else
9929 {
9930 AddQuantity(-split_quantity_new, false, true);
9931 new_item.SetQuantity(split_quantity_new, false, true);
9932 }
9933 }
9934 }
9935
9936 void SplitItem(PlayerBase player)
9937 {
9938 float quantity = GetQuantity();
9939 float split_quantity_new = Math.Floor(quantity / 2);
9940
9941 if (!ShouldSplitQuantity(split_quantity_new))
9942 return;
9943
9944 InventoryLocation invloc = new InventoryLocation;
9945 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
9946
9947 ItemBase new_item;
9948 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9949
9950 if (new_item)
9951 {
9952 if (new_item.GetQuantityMax() < split_quantity_new)
9953 {
9954 split_quantity_new = new_item.GetQuantityMax();
9955 }
9956 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
9957 {
9958 AddQuantity(-1, false, true);
9959 new_item.SetQuantity(1, false, true);
9960 }
9961 else if (split_quantity_new > 1)
9962 {
9963 AddQuantity(-split_quantity_new, false, true);
9964 new_item.SetQuantity(split_quantity_new, false, true);
9965 }
9966 }
9967 }
9968
9970 void OnQuantityChanged(float delta)
9971 {
9972 SetWeightDirty();
9973 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
9974
9975 if (parent)
9976 parent.OnAttachmentQuantityChangedEx(this, delta);
9977
9978 if (IsLiquidContainer())
9979 {
9980 if (GetQuantityNormalized() <= 0.0)
9981 {
9983 }
9984 else if (GetLiquidType() == LIQUID_NONE)
9985 {
9986 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
9988 }
9989 }
9990 }
9991
9994 {
9995 // insert code here
9996 }
9997
9999 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10000 {
10002 }
10003
10004 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10005 {
10006 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10007
10008 if (g_Game.IsServer())
10009 {
10010 if (newLevel == GameConstants.STATE_RUINED)
10011 {
10013 EntityAI parent = GetHierarchyParent();
10014 if (parent && parent.IsFireplace())
10015 {
10016 CargoBase cargo = GetInventory().GetCargo();
10017 if (cargo)
10018 {
10019 for (int i = 0; i < cargo.GetItemCount(); ++i)
10020 {
10021 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10022 }
10023 }
10024 }
10025 }
10026
10027 if (IsResultOfSplit())
10028 {
10029 // reset the splitting result flag, return to normal item behavior
10030 SetResultOfSplit(false);
10031 return;
10032 }
10033
10034 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10035 {
10036 SetCleanness(0);//unclean the item upon damage dealt
10037 }
10038 }
10039 }
10040
10041 // just the split? TODO: verify
10042 override void OnRightClick()
10043 {
10044 super.OnRightClick();
10045
10046 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
10047 {
10048 if (g_Game.IsClient())
10049 {
10050 if (ScriptInputUserData.CanStoreInputUserData())
10051 {
10052 EntityAI root = GetHierarchyRoot();
10053 Man playerOwner = GetHierarchyRootPlayer();
10054 InventoryLocation dst = new InventoryLocation;
10055
10056 // 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
10057 if (!playerOwner && root && root == this)
10058 {
10060 }
10061 else
10062 {
10063 // 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
10064 GetInventory().GetCurrentInventoryLocation(dst);
10065 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
10066 {
10067 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
10068 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
10069 {
10071 }
10072 else
10073 {
10074 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
10075 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
10076 this shouldnt cause issues within this scope*/
10077 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
10078 {
10080 }
10081 else
10082 {
10083 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10084 }
10085 }
10086 }
10087 }
10088
10089 ScriptInputUserData ctx = new ScriptInputUserData;
10091 ctx.Write(4);
10092 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10093 ctx.Write(thiz);
10094 dst.WriteToContext(ctx);
10095 ctx.Write(true); // dummy
10096 ctx.Send();
10097 }
10098 }
10099 else if (!g_Game.IsMultiplayer())
10100 {
10101 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
10102 }
10103 }
10104 }
10105
10106 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
10107 {
10108 if (root)
10109 {
10110 vector m4[4];
10111 root.GetTransform(m4);
10112 dst.SetGround(this, m4);
10113 }
10114 else
10115 {
10116 GetInventory().GetCurrentInventoryLocation(dst);
10117 }
10118 }
10119
10120 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
10121 {
10122 //TODO: delete check zero quantity check after fix double posts hands fsm events
10123 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
10124 return false;
10125
10126 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10127 return false;
10128
10129 //can_this_be_combined = ConfigGetBool("canBeSplit");
10131 return false;
10132
10133
10134 Magazine mag = Magazine.Cast(this);
10135 if (mag)
10136 {
10137 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10138 return false;
10139
10140 if (stack_max_limit)
10141 {
10142 Magazine other_mag = Magazine.Cast(other_item);
10143 if (other_item)
10144 {
10145 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10146 return false;
10147 }
10148
10149 }
10150 }
10151 else
10152 {
10153 //TODO: delete check zero quantity check after fix double posts hands fsm events
10154 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
10155 return false;
10156
10157 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
10158 return false;
10159 }
10160
10161 PlayerBase player = null;
10162 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
10163 {
10164 if (player.GetInventory().HasAttachment(this))
10165 return false;
10166
10167 if (player.IsItemsToDelete())
10168 return false;
10169 }
10170
10171 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10172 return false;
10173
10174 int slotID;
10175 string slotName;
10176 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10177 return false;
10178
10179 return true;
10180 }
10181
10182 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
10183 {
10184 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
10185 }
10186
10187 bool IsResultOfSplit()
10188 {
10189 return m_IsResultOfSplit;
10190 }
10191
10192 void SetResultOfSplit(bool value)
10193 {
10194 m_IsResultOfSplit = value;
10195 }
10196
10197 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
10198 {
10199 return ComputeQuantityUsedEx(other_item, use_stack_max);
10200 }
10201
10202 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
10203 {
10204 float other_item_quantity = other_item.GetQuantity();
10205 float this_free_space;
10206
10207 float stack_max = GetQuantityMax();
10208
10209 this_free_space = stack_max - GetQuantity();
10210
10211 if (other_item_quantity > this_free_space)
10212 {
10213 return this_free_space;
10214 }
10215 else
10216 {
10217 return other_item_quantity;
10218 }
10219 }
10220
10221 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
10222 {
10223 CombineItems(ItemBase.Cast(entity2),use_stack_max);
10224 }
10225
10226 void CombineItems(ItemBase other_item, bool use_stack_max = true)
10227 {
10228 if (!CanBeCombined(other_item, false))
10229 return;
10230
10231 if (!IsMagazine() && other_item)
10232 {
10233 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
10234 if (quantity_used != 0)
10235 {
10236 float hp1 = GetHealth01("","");
10237 float hp2 = other_item.GetHealth01("","");
10238 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
10239 hpResult = hpResult / (GetQuantity() + quantity_used);
10240
10241 hpResult *= GetMaxHealth();
10242 Math.Round(hpResult);
10243 SetHealth("", "Health", hpResult);
10244
10245 AddQuantity(quantity_used);
10246 other_item.AddQuantity(-quantity_used);
10247 }
10248 }
10249 OnCombine(other_item);
10250 }
10251
10252 void OnCombine(ItemBase other_item)
10253 {
10254 #ifdef SERVER
10255 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10256 GetHierarchyParent().IncreaseLifetimeUp();
10257 #endif
10258 };
10259
10260 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
10261 {
10262 PlayerBase p = PlayerBase.Cast(player);
10263
10264 array<int> recipesIds = p.m_Recipes;
10265 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10266 if (moduleRecipesManager)
10267 {
10268 EntityAI itemInHands = player.GetEntityInHands();
10269 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
10270 }
10271
10272 for (int i = 0;i < recipesIds.Count(); i++)
10273 {
10274 int key = recipesIds.Get(i);
10275 string recipeName = moduleRecipesManager.GetRecipeName(key);
10276 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
10277 }
10278 }
10279
10280 // -------------------------------------------------------------------------
10281 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10282 {
10283 super.GetDebugActions(outputList);
10284
10285 //quantity
10286 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
10287 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
10288 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
10289 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
10290 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10291
10292 //health
10293 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
10294 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
10295 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
10296 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10297 //temperature
10298 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
10299 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
10300 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
10301 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10302
10303 //wet
10304 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
10305 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
10306 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10307
10308 //liquidtype
10309 if (IsLiquidContainer())
10310 {
10311 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
10312 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
10313 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10314 }
10315
10316 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
10317 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10318
10319 // watch
10320 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
10321 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
10322 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10323
10324 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
10325
10326 InventoryLocation loc = new InventoryLocation();
10327 GetInventory().GetCurrentInventoryLocation(loc);
10328 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
10329 {
10330 if (Gizmo_IsSupported())
10331 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
10332 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
10333 }
10334
10335 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
10336 }
10337
10338 // -------------------------------------------------------------------------
10339 // -------------------------------------------------------------------------
10340 // -------------------------------------------------------------------------
10341 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
10342 {
10343 super.OnAction(action_id, player, ctx);
10344
10345 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
10346 {
10347 switch (action_id)
10348 {
10349 case EActions.GIZMO_OBJECT:
10350 if (GetGizmoApi())
10351 GetGizmoApi().SelectObject(this);
10352 return true;
10353 case EActions.GIZMO_PHYSICS:
10354 if (GetGizmoApi())
10355 GetGizmoApi().SelectPhysics(GetPhysics());
10356 return true;
10357 }
10358 }
10359
10360 if (g_Game.IsServer())
10361 {
10362 switch (action_id)
10363 {
10364 case EActions.DELETE:
10365 Delete();
10366 return true;
10367 }
10368 }
10369
10370 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
10371 {
10372 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
10373 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
10374 PlayerBase p = PlayerBase.Cast(player);
10375 if (EActions.RECIPES_RANGE_START < 1000)
10376 {
10377 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10378 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10379 }
10380 }
10381 #ifndef SERVER
10382 else if (action_id == EActions.WATCH_PLAYER)
10383 {
10384 PluginDeveloper.SetDeveloperItemClientEx(player);
10385 }
10386 #endif
10387 if (g_Game.IsServer())
10388 {
10389 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10390 {
10391 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10392 OnDebugButtonPressServer(id + 1);
10393 }
10394
10395 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10396 {
10397 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10398 InsertAgent(agent_id,100);
10399 }
10400
10401 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10402 {
10403 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10404 RemoveAgent(agent_id2);
10405 }
10406
10407 else if (action_id == EActions.ADD_QUANTITY)
10408 {
10409 if (IsMagazine())
10410 {
10411 Magazine mag = Magazine.Cast(this);
10412 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10413 }
10414 else
10415 {
10416 AddQuantity(GetQuantityMax() * 0.2);
10417 }
10418
10419 if (m_EM)
10420 {
10421 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10422 }
10423 //PrintVariables();
10424 }
10425
10426 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
10427 {
10428 if (IsMagazine())
10429 {
10430 Magazine mag2 = Magazine.Cast(this);
10431 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10432 }
10433 else
10434 {
10435 AddQuantity(- GetQuantityMax() * 0.2);
10436 }
10437 if (m_EM)
10438 {
10439 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10440 }
10441 //PrintVariables();
10442 }
10443
10444 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
10445 {
10446 SetQuantity(0);
10447
10448 if (m_EM)
10449 {
10450 m_EM.SetEnergy(0);
10451 }
10452 }
10453
10454 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
10455 {
10457
10458 if (m_EM)
10459 {
10460 m_EM.SetEnergy(m_EM.GetEnergyMax());
10461 }
10462 }
10463
10464 else if (action_id == EActions.ADD_HEALTH)
10465 {
10466 AddHealth("","",GetMaxHealth("","Health")/5);
10467 }
10468 else if (action_id == EActions.REMOVE_HEALTH)
10469 {
10470 AddHealth("","",-GetMaxHealth("","Health")/5);
10471 }
10472 else if (action_id == EActions.DESTROY_HEALTH)
10473 {
10474 SetHealth01("","",0);
10475 }
10476 else if (action_id == EActions.WATCH_ITEM)
10477 {
10479 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
10480 #ifdef DEVELOPER
10481 SetDebugDeveloper_item(this);
10482 #endif
10483 }
10484
10485 else if (action_id == EActions.ADD_TEMPERATURE)
10486 {
10487 AddTemperature(20);
10488 //PrintVariables();
10489 }
10490
10491 else if (action_id == EActions.REMOVE_TEMPERATURE)
10492 {
10493 AddTemperature(-20);
10494 //PrintVariables();
10495 }
10496
10497 else if (action_id == EActions.FLIP_FROZEN)
10498 {
10499 SetFrozen(!GetIsFrozen());
10500 //PrintVariables();
10501 }
10502
10503 else if (action_id == EActions.ADD_WETNESS)
10504 {
10505 AddWet(GetWetMax()/5);
10506 //PrintVariables();
10507 }
10508
10509 else if (action_id == EActions.REMOVE_WETNESS)
10510 {
10511 AddWet(-GetWetMax()/5);
10512 //PrintVariables();
10513 }
10514
10515 else if (action_id == EActions.LIQUIDTYPE_UP)
10516 {
10517 int curr_type = GetLiquidType();
10518 SetLiquidType(curr_type * 2);
10519 //AddWet(1);
10520 //PrintVariables();
10521 }
10522
10523 else if (action_id == EActions.LIQUIDTYPE_DOWN)
10524 {
10525 int curr_type2 = GetLiquidType();
10526 SetLiquidType(curr_type2 / 2);
10527 }
10528
10529 else if (action_id == EActions.MAKE_SPECIAL)
10530 {
10531 auto debugParams = DebugSpawnParams.WithPlayer(player);
10532 OnDebugSpawnEx(debugParams);
10533 }
10534
10535 }
10536
10537
10538 return false;
10539 }
10540
10541 // -------------------------------------------------------------------------
10542
10543
10546 void OnActivatedByTripWire();
10547
10549 void OnActivatedByItem(notnull ItemBase item);
10550
10551 //----------------------------------------------------------------
10552 //returns true if item is able to explode when put in fire
10553 bool CanExplodeInFire()
10554 {
10555 return false;
10556 }
10557
10558 //----------------------------------------------------------------
10559 bool CanEat()
10560 {
10561 return true;
10562 }
10563
10564 //----------------------------------------------------------------
10565 override bool IsIgnoredByConstruction()
10566 {
10567 return true;
10568 }
10569
10570 //----------------------------------------------------------------
10571 //has FoodStages in config?
10572 bool HasFoodStage()
10573 {
10574 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
10575 return g_Game.ConfigIsExisting(config_path);
10576 }
10577
10579 FoodStage GetFoodStage()
10580 {
10581 return null;
10582 }
10583
10584 bool CanBeCooked()
10585 {
10586 return false;
10587 }
10588
10589 bool CanBeCookedOnStick()
10590 {
10591 return false;
10592 }
10593
10595 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
10597
10598 //----------------------------------------------------------------
10599 bool CanRepair(ItemBase item_repair_kit)
10600 {
10601 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
10602 return module_repairing.CanRepair(this, item_repair_kit);
10603 }
10604
10605 //----------------------------------------------------------------
10606 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
10607 {
10608 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
10609 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10610 }
10611
10612 //----------------------------------------------------------------
10613 int GetItemSize()
10614 {
10615 /*
10616 vector v_size = this.ConfigGetVector("itemSize");
10617 int v_size_x = v_size[0];
10618 int v_size_y = v_size[1];
10619 int size = v_size_x * v_size_y;
10620 return size;
10621 */
10622
10623 return 1;
10624 }
10625
10626 //----------------------------------------------------------------
10627 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
10628 bool CanBeMovedOverride()
10629 {
10630 return m_CanBeMovedOverride;
10631 }
10632
10633 //----------------------------------------------------------------
10634 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
10635 void SetCanBeMovedOverride(bool setting)
10636 {
10637 m_CanBeMovedOverride = setting;
10638 }
10639
10640 //----------------------------------------------------------------
10648 void MessageToOwnerStatus(string text)
10649 {
10650 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10651
10652 if (player)
10653 {
10654 player.MessageStatus(text);
10655 }
10656 }
10657
10658 //----------------------------------------------------------------
10666 void MessageToOwnerAction(string text)
10667 {
10668 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10669
10670 if (player)
10671 {
10672 player.MessageAction(text);
10673 }
10674 }
10675
10676 //----------------------------------------------------------------
10684 void MessageToOwnerFriendly(string text)
10685 {
10686 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10687
10688 if (player)
10689 {
10690 player.MessageFriendly(text);
10691 }
10692 }
10693
10694 //----------------------------------------------------------------
10702 void MessageToOwnerImportant(string text)
10703 {
10704 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10705
10706 if (player)
10707 {
10708 player.MessageImportant(text);
10709 }
10710 }
10711
10712 override bool IsItemBase()
10713 {
10714 return true;
10715 }
10716
10717 // Checks if item is of questioned kind
10718 override bool KindOf(string tag)
10719 {
10720 bool found = false;
10721 string item_name = this.GetType();
10722 ref TStringArray item_tag_array = new TStringArray;
10723 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
10724
10725 int array_size = item_tag_array.Count();
10726 for (int i = 0; i < array_size; i++)
10727 {
10728 if (item_tag_array.Get(i) == tag)
10729 {
10730 found = true;
10731 break;
10732 }
10733 }
10734 return found;
10735 }
10736
10737
10738 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
10739 {
10740 //Debug.Log("OnRPC called");
10741 super.OnRPC(sender, rpc_type,ctx);
10742
10743 //Play soundset for attachment locking (ActionLockAttachment.c)
10744 switch (rpc_type)
10745 {
10746 #ifndef SERVER
10747 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10748 Param2<bool, string> p = new Param2<bool, string>(false, "");
10749
10750 if (!ctx.Read(p))
10751 return;
10752
10753 bool play = p.param1;
10754 string soundSet = p.param2;
10755
10756 if (play)
10757 {
10758 if (m_LockingSound)
10759 {
10761 {
10762 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10763 }
10764 }
10765 else
10766 {
10767 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
10768 }
10769 }
10770 else
10771 {
10772 SEffectManager.DestroyEffect(m_LockingSound);
10773 }
10774
10775 break;
10776 #endif
10777
10778 }
10779
10780 if (GetWrittenNoteData())
10781 {
10782 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
10783 }
10784 }
10785
10786 //-----------------------------
10787 // VARIABLE MANIPULATION SYSTEM
10788 //-----------------------------
10789 int NameToID(string name)
10790 {
10791 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10792 return plugin.GetID(name);
10793 }
10794
10795 string IDToName(int id)
10796 {
10797 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
10798 return plugin.GetName(id);
10799 }
10800
10802 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
10803 {
10804 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
10805 //read the flags
10806 int varFlags;
10807 if (!ctx.Read(varFlags))
10808 return;
10809
10810 if (varFlags & ItemVariableFlags.FLOAT)
10811 {
10812 ReadVarsFromCTX(ctx);
10813 }
10814 }
10815
10816 override void SerializeNumericalVars(array<float> floats_out)
10817 {
10818 //some variables handled on EntityAI level already!
10819 super.SerializeNumericalVars(floats_out);
10820
10821 // the order of serialization must be the same as the order of de-serialization
10822 //--------------------------------------------
10823 if (IsVariableSet(VARIABLE_QUANTITY))
10824 {
10825 floats_out.Insert(m_VarQuantity);
10826 }
10827 //--------------------------------------------
10828 if (IsVariableSet(VARIABLE_WET))
10829 {
10830 floats_out.Insert(m_VarWet);
10831 }
10832 //--------------------------------------------
10833 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10834 {
10835 floats_out.Insert(m_VarLiquidType);
10836 }
10837 //--------------------------------------------
10838 if (IsVariableSet(VARIABLE_COLOR))
10839 {
10840 floats_out.Insert(m_ColorComponentR);
10841 floats_out.Insert(m_ColorComponentG);
10842 floats_out.Insert(m_ColorComponentB);
10843 floats_out.Insert(m_ColorComponentA);
10844 }
10845 //--------------------------------------------
10846 if (IsVariableSet(VARIABLE_CLEANNESS))
10847 {
10848 floats_out.Insert(m_Cleanness);
10849 }
10850 }
10851
10852 override void DeSerializeNumericalVars(array<float> floats)
10853 {
10854 //some variables handled on EntityAI level already!
10855 super.DeSerializeNumericalVars(floats);
10856
10857 // the order of serialization must be the same as the order of de-serialization
10858 int index = 0;
10859 int mask = Math.Round(floats.Get(index));
10860
10861 index++;
10862 //--------------------------------------------
10863 if (mask & VARIABLE_QUANTITY)
10864 {
10865 if (m_IsStoreLoad)
10866 {
10867 SetStoreLoadedQuantity(floats.Get(index));
10868 }
10869 else
10870 {
10871 float quantity = floats.Get(index);
10872 SetQuantity(quantity, true, false, false, false);
10873 }
10874 index++;
10875 }
10876 //--------------------------------------------
10877 if (mask & VARIABLE_WET)
10878 {
10879 float wet = floats.Get(index);
10880 SetWet(wet);
10881 index++;
10882 }
10883 //--------------------------------------------
10884 if (mask & VARIABLE_LIQUIDTYPE)
10885 {
10886 int liquidtype = Math.Round(floats.Get(index));
10887 SetLiquidType(liquidtype);
10888 index++;
10889 }
10890 //--------------------------------------------
10891 if (mask & VARIABLE_COLOR)
10892 {
10893 m_ColorComponentR = Math.Round(floats.Get(index));
10894 index++;
10895 m_ColorComponentG = Math.Round(floats.Get(index));
10896 index++;
10897 m_ColorComponentB = Math.Round(floats.Get(index));
10898 index++;
10899 m_ColorComponentA = Math.Round(floats.Get(index));
10900 index++;
10901 }
10902 //--------------------------------------------
10903 if (mask & VARIABLE_CLEANNESS)
10904 {
10905 int cleanness = Math.Round(floats.Get(index));
10906 SetCleanness(cleanness);
10907 index++;
10908 }
10909 }
10910
10911 override void WriteVarsToCTX(ParamsWriteContext ctx)
10912 {
10913 super.WriteVarsToCTX(ctx);
10914
10915 //--------------------------------------------
10916 if (IsVariableSet(VARIABLE_QUANTITY))
10917 {
10918 ctx.Write(GetQuantity());
10919 }
10920 //--------------------------------------------
10921 if (IsVariableSet(VARIABLE_WET))
10922 {
10923 ctx.Write(GetWet());
10924 }
10925 //--------------------------------------------
10926 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
10927 {
10928 ctx.Write(GetLiquidType());
10929 }
10930 //--------------------------------------------
10931 if (IsVariableSet(VARIABLE_COLOR))
10932 {
10933 int r,g,b,a;
10934 GetColor(r,g,b,a);
10935 ctx.Write(r);
10936 ctx.Write(g);
10937 ctx.Write(b);
10938 ctx.Write(a);
10939 }
10940 //--------------------------------------------
10941 if (IsVariableSet(VARIABLE_CLEANNESS))
10942 {
10943 ctx.Write(GetCleanness());
10944 }
10945 }
10946
10947 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
10948 {
10949 if (!super.ReadVarsFromCTX(ctx,version))
10950 return false;
10951
10952 int intValue;
10953 float value;
10954
10955 if (version < 140)
10956 {
10957 if (!ctx.Read(intValue))
10958 return false;
10959
10960 m_VariablesMask = intValue;
10961 }
10962
10963 if (m_VariablesMask & VARIABLE_QUANTITY)
10964 {
10965 if (!ctx.Read(value))
10966 return false;
10967
10968 if (IsStoreLoad())
10969 {
10971 }
10972 else
10973 {
10974 SetQuantity(value, true, false, false, false);
10975 }
10976 }
10977 //--------------------------------------------
10978 if (version < 140)
10979 {
10980 if (m_VariablesMask & VARIABLE_TEMPERATURE)
10981 {
10982 if (!ctx.Read(value))
10983 return false;
10984 SetTemperatureDirect(value);
10985 }
10986 }
10987 //--------------------------------------------
10988 if (m_VariablesMask & VARIABLE_WET)
10989 {
10990 if (!ctx.Read(value))
10991 return false;
10992 SetWet(value);
10993 }
10994 //--------------------------------------------
10995 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
10996 {
10997 if (!ctx.Read(intValue))
10998 return false;
10999 SetLiquidType(intValue);
11000 }
11001 //--------------------------------------------
11002 if (m_VariablesMask & VARIABLE_COLOR)
11003 {
11004 int r,g,b,a;
11005 if (!ctx.Read(r))
11006 return false;
11007 if (!ctx.Read(g))
11008 return false;
11009 if (!ctx.Read(b))
11010 return false;
11011 if (!ctx.Read(a))
11012 return false;
11013
11014 SetColor(r,g,b,a);
11015 }
11016 //--------------------------------------------
11017 if (m_VariablesMask & VARIABLE_CLEANNESS)
11018 {
11019 if (!ctx.Read(intValue))
11020 return false;
11021 SetCleanness(intValue);
11022 }
11023 //--------------------------------------------
11024 if (version >= 138 && version < 140)
11025 {
11026 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11027 {
11028 if (!ctx.Read(intValue))
11029 return false;
11030 SetFrozen(intValue);
11031 }
11032 }
11033
11034 return true;
11035 }
11036
11037 //----------------------------------------------------------------
11038 override bool OnStoreLoad(ParamsReadContext ctx, int version)
11039 {
11040 m_IsStoreLoad = true;
11042 {
11043 m_FixDamageSystemInit = true;
11044 }
11045
11046 if (!super.OnStoreLoad(ctx, version))
11047 {
11048 m_IsStoreLoad = false;
11049 return false;
11050 }
11051
11052 if (version >= 114)
11053 {
11054 bool hasQuickBarIndexSaved;
11055
11056 if (!ctx.Read(hasQuickBarIndexSaved))
11057 {
11058 m_IsStoreLoad = false;
11059 return false;
11060 }
11061
11062 if (hasQuickBarIndexSaved)
11063 {
11064 int itmQBIndex;
11065
11066 //Load quickbar item bind
11067 if (!ctx.Read(itmQBIndex))
11068 {
11069 m_IsStoreLoad = false;
11070 return false;
11071 }
11072
11073 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11074 if (itmQBIndex != -1 && parentPlayer)
11075 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11076 }
11077 }
11078 else
11079 {
11080 // Backup of how it used to be
11081 PlayerBase player;
11082 int itemQBIndex;
11083 if (version == int.MAX)
11084 {
11085 if (!ctx.Read(itemQBIndex))
11086 {
11087 m_IsStoreLoad = false;
11088 return false;
11089 }
11090 }
11091 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11092 {
11093 //Load quickbar item bind
11094 if (!ctx.Read(itemQBIndex))
11095 {
11096 m_IsStoreLoad = false;
11097 return false;
11098 }
11099 if (itemQBIndex != -1 && player)
11100 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11101 }
11102 }
11103
11104 if (version < 140)
11105 {
11106 // variable management system
11107 if (!LoadVariables(ctx, version))
11108 {
11109 m_IsStoreLoad = false;
11110 return false;
11111 }
11112 }
11113
11114 //agent trasmission system
11115 if (!LoadAgents(ctx, version))
11116 {
11117 m_IsStoreLoad = false;
11118 return false;
11119 }
11120 if (version >= 132)
11121 {
11122 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11123 if (raib)
11124 {
11125 if (!raib.OnStoreLoad(ctx,version))
11126 {
11127 m_IsStoreLoad = false;
11128 return false;
11129 }
11130 }
11131 }
11132
11133 m_IsStoreLoad = false;
11134 return true;
11135 }
11136
11137 //----------------------------------------------------------------
11138
11139 override void OnStoreSave(ParamsWriteContext ctx)
11140 {
11141 super.OnStoreSave(ctx);
11142
11143 PlayerBase player;
11144 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11145 {
11146 ctx.Write(true); // Keep track of if we should actually read this in or not
11147 //Save quickbar item bind
11148 int itemQBIndex = -1;
11149 itemQBIndex = player.FindQuickBarEntityIndex(this);
11150 ctx.Write(itemQBIndex);
11151 }
11152 else
11153 {
11154 ctx.Write(false); // Keep track of if we should actually read this in or not
11155 }
11156
11157 SaveAgents(ctx);//agent trasmission system
11158
11159 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
11160 if (raib)
11161 {
11162 raib.OnStoreSave(ctx);
11163 }
11164 }
11165 //----------------------------------------------------------------
11166
11167 override void AfterStoreLoad()
11168 {
11169 super.AfterStoreLoad();
11170
11172 {
11174 }
11175
11176 if (GetStoreLoadedQuantity() != float.LOWEST)
11177 {
11179 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
11180 }
11181 }
11182
11183 override void EEOnAfterLoad()
11184 {
11185 super.EEOnAfterLoad();
11186
11188 {
11189 m_FixDamageSystemInit = false;
11190 }
11191
11194 }
11195
11196 bool CanBeDisinfected()
11197 {
11198 return false;
11199 }
11200
11201
11202 //----------------------------------------------------------------
11203 override void OnVariablesSynchronized()
11204 {
11205 if (m_Initialized)
11206 {
11207 #ifdef PLATFORM_CONSOLE
11208 //bruteforce it is
11209 if (IsSplitable())
11210 {
11211 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
11212 if (menu)
11213 {
11214 menu.Refresh();
11215 }
11216 }
11217 #endif
11218 }
11219
11221 {
11222 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
11223 m_WantPlayImpactSound = false;
11224 }
11225
11227 {
11228 SetWeightDirty();
11230 }
11231 if (m_VarWet != m_VarWetPrev)
11232 {
11235 }
11236
11237 if (m_SoundSyncPlay != 0)
11238 {
11241
11242 m_SoundSyncPlay = 0;
11243 m_SoundSyncSlotID = -1;
11244 }
11245 if (m_SoundSyncStop != 0)
11246 {
11248 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
11249 m_SoundSyncStop = 0;
11250 }
11251
11252 super.OnVariablesSynchronized();
11253 }
11254
11255 //------------------------- Quantity
11256 //----------------------------------------------------------------
11258 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
11259 {
11260 if (!IsServerCheck(allow_client))
11261 return false;
11262
11263 if (!HasQuantity())
11264 return false;
11265
11266 float min = GetQuantityMin();
11267 float max = GetQuantityMax();
11268
11269 if (value <= (min + 0.001))
11270 value = min;
11271
11272 if (value == min)
11273 {
11274 if (destroy_config)
11275 {
11276 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11277 if (dstr)
11278 {
11279 m_VarQuantity = Math.Clamp(value, min, max);
11280 this.Delete();
11281 return true;
11282 }
11283 }
11284 else if (destroy_forced)
11285 {
11286 m_VarQuantity = Math.Clamp(value, min, max);
11287 this.Delete();
11288 return true;
11289 }
11290 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
11291 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
11292 }
11293
11294 float delta = m_VarQuantity;
11295 m_VarQuantity = Math.Clamp(value, min, max);
11296
11297 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
11298 {
11299 EntityAI parent = GetHierarchyRoot();
11300 InventoryLocation iLoc = new InventoryLocation();
11301 GetInventory().GetCurrentInventoryLocation(iLoc);
11302 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
11303 {
11304 int iLocSlot = iLoc.GetSlot();
11305 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
11306 {
11307 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
11308 }
11309 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
11310 {
11311 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
11312 }
11313 }
11314 }
11315
11316 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
11317 {
11318 delta = m_VarQuantity - delta;
11319
11320 if (delta)
11321 OnQuantityChanged(delta);
11322 }
11323
11324 SetVariableMask(VARIABLE_QUANTITY);
11325
11326 return false;
11327 }
11328
11329 //----------------------------------------------------------------
11331 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
11332 {
11333 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
11334 }
11335 //----------------------------------------------------------------
11336 void SetQuantityMax()
11337 {
11338 float max = GetQuantityMax();
11339 SetQuantity(max);
11340 }
11341
11342 override void SetQuantityToMinimum()
11343 {
11344 float min = GetQuantityMin();
11345 SetQuantity(min);
11346 }
11347 //----------------------------------------------------------------
11349 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
11350 {
11351 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
11352 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
11353 SetQuantity(result, destroy_config, destroy_forced);
11354 }
11355
11356 //----------------------------------------------------------------
11358 override float GetQuantityNormalized()
11359 {
11360 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
11361 }
11362
11364 {
11365 return GetQuantityNormalized();
11366 }
11367
11368 /*void SetAmmoNormalized(float value)
11369 {
11370 float value_clamped = Math.Clamp(value, 0, 1);
11371 Magazine this_mag = Magazine.Cast(this);
11372 int max_rounds = this_mag.GetAmmoMax();
11373 int result = value * max_rounds;//can the rounded if higher precision is required
11374 this_mag.SetAmmoCount(result);
11375 }*/
11376 //----------------------------------------------------------------
11377 override int GetQuantityMax()
11378 {
11379 int slot = -1;
11380 GameInventory inventory = GetInventory();
11381 if (inventory)
11382 {
11383 InventoryLocation il = new InventoryLocation;
11384 inventory.GetCurrentInventoryLocation(il);
11385 slot = il.GetSlot();
11386 }
11387
11388 return GetTargetQuantityMax(slot);
11389 }
11390
11391 override int GetTargetQuantityMax(int attSlotID = -1)
11392 {
11393 float quantity_max = 0;
11394
11395 if (IsSplitable()) //only stackable/splitable items can check for stack size
11396 {
11397 if (attSlotID != -1)
11398 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11399
11400 if (quantity_max <= 0)
11401 quantity_max = m_VarStackMax;
11402 }
11403
11404 if (quantity_max <= 0)
11405 quantity_max = m_VarQuantityMax;
11406
11407 return quantity_max;
11408 }
11409 //----------------------------------------------------------------
11410 override int GetQuantityMin()
11411 {
11412 return m_VarQuantityMin;
11413 }
11414 //----------------------------------------------------------------
11415 int GetQuantityInit()
11416 {
11417 return m_VarQuantityInit;
11418 }
11419
11420 //----------------------------------------------------------------
11421 override bool HasQuantity()
11422 {
11423 return !(GetQuantityMax() - GetQuantityMin() == 0);
11424 }
11425
11426 override float GetQuantity()
11427 {
11428 return m_VarQuantity;
11429 }
11430
11431 bool IsFullQuantity()
11432 {
11433 return GetQuantity() >= GetQuantityMax();
11434 }
11435
11436 //Calculates weight of single item without attachments and cargo
11437 override float GetSingleInventoryItemWeightEx()
11438 {
11439 //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
11440 float weightEx = GetWeightEx();//overall weight of the item
11441 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
11442 return weightEx - special;
11443 }
11444
11445 // Obsolete, use GetSingleInventoryItemWeightEx() instead
11447 {
11449 }
11450
11451 override protected float GetWeightSpecialized(bool forceRecalc = false)
11452 {
11453 if (IsSplitable()) //quantity determines size of the stack
11454 {
11455 #ifdef DEVELOPER
11456 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11457 {
11458 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11459 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
11460 }
11461 #endif
11462
11463 return GetQuantity() * GetConfigWeightModified();
11464 }
11465 else if (HasEnergyManager())// items with energy manager
11466 {
11467 #ifdef DEVELOPER
11468 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11469 {
11470 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11471 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
11472 }
11473 #endif
11474 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11475 }
11476 else//everything else
11477 {
11478 #ifdef DEVELOPER
11479 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11480 {
11481 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11482 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
11483 }
11484 #endif
11485 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11486 }
11487 }
11488
11490 int GetNumberOfItems()
11491 {
11492 int item_count = 0;
11493 ItemBase item;
11494
11495 GameInventory inventory = GetInventory();
11496 CargoBase cargo = inventory.GetCargo();
11497 if (cargo != NULL)
11498 {
11499 item_count = cargo.GetItemCount();
11500 }
11501
11502 int nAttachments = inventory.AttachmentCount();
11503 for (int i = 0; i < nAttachments; ++i)
11504 {
11505 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
11506 if (item)
11507 item_count += item.GetNumberOfItems();
11508 }
11509 return item_count;
11510 }
11511
11513 float GetUnitWeight(bool include_wetness = true)
11514 {
11515 float weight = 0;
11516 float wetness = 1;
11517 if (include_wetness)
11518 wetness += GetWet();
11519 if (IsSplitable()) //quantity determines size of the stack
11520 {
11521 weight = wetness * m_ConfigWeight;
11522 }
11523 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
11524 {
11525 weight = 1;
11526 }
11527 return weight;
11528 }
11529
11530 //-----------------------------------------------------------------
11531
11532 override void ClearInventory()
11533 {
11534 GameInventory inventory = GetInventory();
11535 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
11536 {
11537 array<EntityAI> items = new array<EntityAI>;
11538 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
11539 for (int i = 0; i < items.Count(); ++i)
11540 {
11541 ItemBase item = ItemBase.Cast(items.Get(i));
11542 if (item)
11543 {
11544 g_Game.ObjectDelete(item);
11545 }
11546 }
11547 }
11548 }
11549
11550 //------------------------- Energy
11551
11552 //----------------------------------------------------------------
11553 float GetEnergy()
11554 {
11555 float energy = 0;
11556 if (HasEnergyManager())
11557 {
11558 energy = GetCompEM().GetEnergy();
11559 }
11560 return energy;
11561 }
11562
11563
11564 override void OnEnergyConsumed()
11565 {
11566 super.OnEnergyConsumed();
11567
11569 }
11570
11571 override void OnEnergyAdded()
11572 {
11573 super.OnEnergyAdded();
11574
11576 }
11577
11578 // Converts energy (from Energy Manager) to quantity, if enabled.
11580 {
11581 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11582 {
11583 if (HasQuantity())
11584 {
11585 float energy_0to1 = GetCompEM().GetEnergy0To1();
11586 SetQuantityNormalized(energy_0to1);
11587 }
11588 }
11589 }
11590
11591 //----------------------------------------------------------------
11592 float GetHeatIsolationInit()
11593 {
11594 return ConfigGetFloat("heatIsolation");
11595 }
11596
11597 float GetHeatIsolation()
11598 {
11599 return m_HeatIsolation;
11600 }
11601
11602 float GetDryingIncrement(string pIncrementName)
11603 {
11604 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
11605 if (g_Game.ConfigIsExisting(paramPath))
11606 return g_Game.ConfigGetFloat(paramPath);
11607
11608 return 0.0;
11609 }
11610
11611 float GetSoakingIncrement(string pIncrementName)
11612 {
11613 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
11614 if (g_Game.ConfigIsExisting(paramPath))
11615 return g_Game.ConfigGetFloat(paramPath);
11616
11617 return 0.0;
11618 }
11619 //----------------------------------------------------------------
11620 override void SetWet(float value, bool allow_client = false)
11621 {
11622 if (!IsServerCheck(allow_client))
11623 return;
11624
11625 float min = GetWetMin();
11626 float max = GetWetMax();
11627
11628 float previousValue = m_VarWet;
11629
11630 m_VarWet = Math.Clamp(value, min, max);
11631
11632 if (previousValue != m_VarWet)
11633 {
11634 SetVariableMask(VARIABLE_WET);
11635 OnWetChanged(m_VarWet, previousValue);
11636 }
11637 }
11638 //----------------------------------------------------------------
11639 override void AddWet(float value)
11640 {
11641 SetWet(GetWet() + value);
11642 }
11643 //----------------------------------------------------------------
11644 override void SetWetMax()
11645 {
11647 }
11648 //----------------------------------------------------------------
11649 override float GetWet()
11650 {
11651 return m_VarWet;
11652 }
11653 //----------------------------------------------------------------
11654 override float GetWetMax()
11655 {
11656 return m_VarWetMax;
11657 }
11658 //----------------------------------------------------------------
11659 override float GetWetMin()
11660 {
11661 return m_VarWetMin;
11662 }
11663 //----------------------------------------------------------------
11664 override float GetWetInit()
11665 {
11666 return m_VarWetInit;
11667 }
11668 //----------------------------------------------------------------
11669 override void OnWetChanged(float newVal, float oldVal)
11670 {
11671 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
11672 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
11673 if (newLevel != oldLevel)
11674 {
11675 OnWetLevelChanged(newLevel,oldLevel);
11676 }
11677 }
11678
11679 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
11680 {
11681 SetWeightDirty();
11682 }
11683
11684 override EWetnessLevel GetWetLevel()
11685 {
11686 return GetWetLevelInternal(m_VarWet);
11687 }
11688
11689 //----------------------------------------------------------------
11690
11691 override void SetStoreLoad(bool value)
11692 {
11693 m_IsStoreLoad = value;
11694 }
11695
11696 override bool IsStoreLoad()
11697 {
11698 return m_IsStoreLoad;
11699 }
11700
11701 override void SetStoreLoadedQuantity(float value)
11702 {
11703 m_StoreLoadedQuantity = value;
11704 }
11705
11706 override float GetStoreLoadedQuantity()
11707 {
11708 return m_StoreLoadedQuantity;
11709 }
11710
11711 //----------------------------------------------------------------
11712
11713 float GetItemModelLength()
11714 {
11715 if (ConfigIsExisting("itemModelLength"))
11716 {
11717 return ConfigGetFloat("itemModelLength");
11718 }
11719 return 0;
11720 }
11721
11722 float GetItemAttachOffset()
11723 {
11724 if (ConfigIsExisting("itemAttachOffset"))
11725 {
11726 return ConfigGetFloat("itemAttachOffset");
11727 }
11728 return 0;
11729 }
11730
11731 override void SetCleanness(int value, bool allow_client = false)
11732 {
11733 if (!IsServerCheck(allow_client))
11734 return;
11735
11736 int previousValue = m_Cleanness;
11737
11738 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
11739
11740 if (previousValue != m_Cleanness)
11741 SetVariableMask(VARIABLE_CLEANNESS);
11742 }
11743
11744 override int GetCleanness()
11745 {
11746 return m_Cleanness;
11747 }
11748
11750 {
11751 return true;
11752 }
11753
11754 //----------------------------------------------------------------
11755 // ATTACHMENT LOCKING
11756 // Getters relevant to generic ActionLockAttachment
11757 int GetLockType()
11758 {
11759 return m_LockType;
11760 }
11761
11762 string GetLockSoundSet()
11763 {
11764 return m_LockSoundSet;
11765 }
11766
11767 //----------------------------------------------------------------
11768 //------------------------- Color
11769 // sets items color variable given color components
11770 override void SetColor(int r, int g, int b, int a)
11771 {
11776 SetVariableMask(VARIABLE_COLOR);
11777 }
11779 override void GetColor(out int r,out int g,out int b,out int a)
11780 {
11785 }
11786
11787 bool IsColorSet()
11788 {
11789 return IsVariableSet(VARIABLE_COLOR);
11790 }
11791
11793 string GetColorString()
11794 {
11795 int r,g,b,a;
11796 GetColor(r,g,b,a);
11797 r = r/255;
11798 g = g/255;
11799 b = b/255;
11800 a = a/255;
11801 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11802 }
11803 //----------------------------------------------------------------
11804 //------------------------- LiquidType
11805
11806 override void SetLiquidType(int value, bool allow_client = false)
11807 {
11808 if (!IsServerCheck(allow_client))
11809 return;
11810
11811 int old = m_VarLiquidType;
11812 m_VarLiquidType = value;
11813 OnLiquidTypeChanged(old,value);
11814 SetVariableMask(VARIABLE_LIQUIDTYPE);
11815 }
11816
11817 int GetLiquidTypeInit()
11818 {
11819 return ConfigGetInt("varLiquidTypeInit");
11820 }
11821
11822 override int GetLiquidType()
11823 {
11824 return m_VarLiquidType;
11825 }
11826
11827 protected void OnLiquidTypeChanged(int oldType, int newType)
11828 {
11829 if (newType == LIQUID_NONE && GetIsFrozen())
11830 SetFrozen(false);
11831 }
11832
11834 void UpdateQuickbarShortcutVisibility(PlayerBase player)
11835 {
11836 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11837 }
11838
11839 // -------------------------------------------------------------------------
11841 void OnInventoryEnter(Man player)
11842 {
11843 PlayerBase nplayer;
11844 if (PlayerBase.CastTo(nplayer, player))
11845 {
11846 m_CanPlayImpactSound = true;
11847 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11848 }
11849 }
11850
11851 // -------------------------------------------------------------------------
11853 void OnInventoryExit(Man player)
11854 {
11855 PlayerBase nplayer;
11856 if (PlayerBase.CastTo(nplayer,player))
11857 {
11858 nplayer.SetEnableQuickBarEntityShortcut(this, false);
11859 }
11860
11861 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11862
11863 if (HasEnergyManager())
11864 {
11865 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
11866 }
11867 }
11868
11869 // ADVANCED PLACEMENT EVENTS
11870 override void OnPlacementStarted(Man player)
11871 {
11872 super.OnPlacementStarted(player);
11873
11874 SetTakeable(false);
11875 }
11876
11877 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
11878 {
11879 if (m_AdminLog)
11880 {
11881 m_AdminLog.OnPlacementComplete(player, this);
11882 }
11883
11884 super.OnPlacementComplete(player, position, orientation);
11885 }
11886
11887 //-----------------------------
11888 // AGENT SYSTEM
11889 //-----------------------------
11890 //--------------------------------------------------------------------------
11891 bool ContainsAgent(int agent_id)
11892 {
11893 if (agent_id & m_AttachedAgents)
11894 {
11895 return true;
11896 }
11897 else
11898 {
11899 return false;
11900 }
11901 }
11902
11903 //--------------------------------------------------------------------------
11904 override void RemoveAgent(int agent_id)
11905 {
11906 if (ContainsAgent(agent_id))
11907 {
11908 m_AttachedAgents = ~agent_id & m_AttachedAgents;
11909 }
11910 }
11911
11912 //--------------------------------------------------------------------------
11913 override void RemoveAllAgents()
11914 {
11915 m_AttachedAgents = 0;
11916 }
11917 //--------------------------------------------------------------------------
11918 override void RemoveAllAgentsExcept(int agent_to_keep)
11919 {
11920 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
11921 }
11922 // -------------------------------------------------------------------------
11923 override void InsertAgent(int agent, float count = 1)
11924 {
11925 if (count < 1)
11926 return;
11927 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
11929 }
11930
11932 void TransferAgents(int agents)
11933 {
11935 }
11936
11937 // -------------------------------------------------------------------------
11938 override int GetAgents()
11939 {
11940 return m_AttachedAgents;
11941 }
11942 //----------------------------------------------------------------------
11943
11944 /*int GetContaminationType()
11945 {
11946 int contamination_type;
11947
11948 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
11949 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
11950 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
11951 const int DIRTY_MASK = eAgents.WOUND_AGENT;
11952
11953 Edible_Base edible = Edible_Base.Cast(this);
11954 int agents = GetAgents();
11955 if (edible)
11956 {
11957 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
11958 if (profile)
11959 {
11960 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
11961 }
11962 }
11963 if (agents & CONTAMINATED_MASK)
11964 {
11965 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
11966 }
11967 if (agents & POISONED_MASK)
11968 {
11969 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
11970 }
11971 if (agents & NERVE_GAS_MASK)
11972 {
11973 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
11974 }
11975 if (agents & DIRTY_MASK)
11976 {
11977 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
11978 }
11979
11980 return agents;
11981 }*/
11982
11983 // -------------------------------------------------------------------------
11984 bool LoadAgents(ParamsReadContext ctx, int version)
11985 {
11986 if (!ctx.Read(m_AttachedAgents))
11987 return false;
11988 return true;
11989 }
11990 // -------------------------------------------------------------------------
11992 {
11993
11995 }
11996 // -------------------------------------------------------------------------
11997
11999 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12000 {
12001 super.CheckForRoofLimited(timeTresholdMS);
12002
12003 float time = g_Game.GetTime();
12004 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12005 {
12006 m_PreviousRoofTestTime = time;
12007 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12008 }
12009 }
12010
12011 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12012 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12013 {
12014 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12015 {
12016 return 0;
12017 }
12018
12019 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12020 {
12021 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12022 if (filter)
12023 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12024 else
12025 return 0;//otherwise return 0 when no filter attached
12026 }
12027
12028 string subclassPath, entryName;
12029
12030 switch (type)
12031 {
12032 case DEF_BIOLOGICAL:
12033 entryName = "biological";
12034 break;
12035 case DEF_CHEMICAL:
12036 entryName = "chemical";
12037 break;
12038 default:
12039 entryName = "biological";
12040 break;
12041 }
12042
12043 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
12044
12045 return g_Game.ConfigGetFloat(subclassPath + entryName);
12046 }
12047
12048
12049
12051 override void EEOnCECreate()
12052 {
12053 if (!IsMagazine())
12055
12057 }
12058
12059
12060 //-------------------------
12061 // OPEN/CLOSE USER ACTIONS
12062 //-------------------------
12064 void Open();
12065 void Close();
12066 bool IsOpen()
12067 {
12068 return true;
12069 }
12070
12071 override bool CanDisplayCargo()
12072 {
12073 return IsOpen();
12074 }
12075
12076
12077 // ------------------------------------------------------------
12078 // CONDITIONS
12079 // ------------------------------------------------------------
12080 override bool CanPutInCargo(EntityAI parent)
12081 {
12082 if (parent)
12083 {
12084 if (parent.IsInherited(DayZInfected))
12085 return true;
12086
12087 if (!parent.IsRuined())
12088 return true;
12089 }
12090
12091 return true;
12092 }
12093
12094 override bool CanPutAsAttachment(EntityAI parent)
12095 {
12096 if (!super.CanPutAsAttachment(parent))
12097 {
12098 return false;
12099 }
12100
12101 if (!IsRuined() && !parent.IsRuined())
12102 {
12103 return true;
12104 }
12105
12106 return false;
12107 }
12108
12109 override bool CanReceiveItemIntoCargo(EntityAI item)
12110 {
12111 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12112 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12113 // return false;
12114
12115 return super.CanReceiveItemIntoCargo(item);
12116 }
12117
12118 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
12119 {
12120 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12121 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12122 // return false;
12123
12124 GameInventory attachmentInv = attachment.GetInventory();
12125 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12126 {
12127 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12128 return false;
12129 }
12130
12131 InventoryLocation loc = new InventoryLocation();
12132 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12133 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
12134 return false;
12135
12136 return super.CanReceiveAttachment(attachment, slotId);
12137 }
12138
12139 override bool CanReleaseAttachment(EntityAI attachment)
12140 {
12141 if (!super.CanReleaseAttachment(attachment))
12142 return false;
12143
12144 return GetInventory().AreChildrenAccessible();
12145 }
12146
12147 /*override bool CanLoadAttachment(EntityAI attachment)
12148 {
12149 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
12150 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
12151 // return false;
12152
12153 GameInventory attachmentInv = attachment.GetInventory();
12154 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
12155 {
12156 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
12157 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
12158
12159 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12160 return false;
12161 }
12162
12163 return super.CanLoadAttachment(attachment);
12164 }*/
12165
12166 // Plays muzzle flash particle effects
12167 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12168 {
12169 int id = muzzle_owner.GetMuzzleID();
12170 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
12171
12172 if (WPOF_array)
12173 {
12174 for (int i = 0; i < WPOF_array.Count(); i++)
12175 {
12176 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12177
12178 if (WPOF)
12179 {
12180 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12181 }
12182 }
12183 }
12184 }
12185
12186 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
12187 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12188 {
12189 int id = muzzle_owner.GetMuzzleID();
12190 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
12191
12192 if (WPOBE_array)
12193 {
12194 for (int i = 0; i < WPOBE_array.Count(); i++)
12195 {
12196 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12197
12198 if (WPOBE)
12199 {
12200 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12201 }
12202 }
12203 }
12204 }
12205
12206 // Plays all weapon overheating particles
12207 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12208 {
12209 int id = muzzle_owner.GetMuzzleID();
12210 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12211
12212 if (WPOOH_array)
12213 {
12214 for (int i = 0; i < WPOOH_array.Count(); i++)
12215 {
12216 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12217
12218 if (WPOOH)
12219 {
12220 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12221 }
12222 }
12223 }
12224 }
12225
12226 // Updates all weapon overheating particles
12227 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12228 {
12229 int id = muzzle_owner.GetMuzzleID();
12230 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12231
12232 if (WPOOH_array)
12233 {
12234 for (int i = 0; i < WPOOH_array.Count(); i++)
12235 {
12236 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12237
12238 if (WPOOH)
12239 {
12240 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12241 }
12242 }
12243 }
12244 }
12245
12246 // Stops overheating particles
12247 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
12248 {
12249 int id = muzzle_owner.GetMuzzleID();
12250 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12251
12252 if (WPOOH_array)
12253 {
12254 for (int i = 0; i < WPOOH_array.Count(); i++)
12255 {
12256 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12257
12258 if (WPOOH)
12259 {
12260 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12261 }
12262 }
12263 }
12264 }
12265
12266 //----------------------------------------------------------------
12267 //Item Behaviour - unified approach
12268 override bool IsHeavyBehaviour()
12269 {
12270 if (m_ItemBehaviour == 0)
12271 {
12272 return true;
12273 }
12274
12275 return false;
12276 }
12277
12278 override bool IsOneHandedBehaviour()
12279 {
12280 if (m_ItemBehaviour == 1)
12281 {
12282 return true;
12283 }
12284
12285 return false;
12286 }
12287
12288 override bool IsTwoHandedBehaviour()
12289 {
12290 if (m_ItemBehaviour == 2)
12291 {
12292 return true;
12293 }
12294
12295 return false;
12296 }
12297
12298 bool IsDeployable()
12299 {
12300 return false;
12301 }
12302
12304 float GetDeployTime()
12305 {
12306 return UATimeSpent.DEFAULT_DEPLOY;
12307 }
12308
12309
12310 //----------------------------------------------------------------
12311 // Item Targeting (User Actions)
12312 override void SetTakeable(bool pState)
12313 {
12314 m_IsTakeable = pState;
12315 SetSynchDirty();
12316 }
12317
12318 override bool IsTakeable()
12319 {
12320 return m_IsTakeable;
12321 }
12322
12323 // For cases where we want to show object widget which cant be taken to hands
12325 {
12326 return false;
12327 }
12328
12330 protected void PreLoadSoundAttachmentType()
12331 {
12332 string att_type = "None";
12333
12334 if (ConfigIsExisting("soundAttType"))
12335 {
12336 att_type = ConfigGetString("soundAttType");
12337 }
12338
12339 m_SoundAttType = att_type;
12340 }
12341
12342 override string GetAttachmentSoundType()
12343 {
12344 return m_SoundAttType;
12345 }
12346
12347 //----------------------------------------------------------------
12348 //SOUNDS - ItemSoundHandler
12349 //----------------------------------------------------------------
12350
12351 string GetPlaceSoundset(); // played when deploy starts
12352 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
12353 string GetDeploySoundset(); // played when deploy sucessfully finishes
12354 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
12355 string GetFoldSoundset(); // played when fold sucessfully finishes
12356
12358 {
12359 if (!m_ItemSoundHandler)
12361
12362 return m_ItemSoundHandler;
12363 }
12364
12365 // override to initialize sounds
12366 protected void InitItemSounds()
12367 {
12368 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
12369 return;
12370
12372
12373 if (GetPlaceSoundset() != string.Empty)
12374 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
12375
12376 if (GetDeploySoundset() != string.Empty)
12377 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
12378
12379 SoundParameters params = new SoundParameters();
12380 params.m_Loop = true;
12381 if (GetLoopDeploySoundset() != string.Empty)
12382 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
12383 }
12384
12385 // Start sound using ItemSoundHandler
12386 void StartItemSoundServer(int id, int slotId)
12387 {
12388 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12389 {
12390 m_SoundSyncSlotID = slotId;
12391 m_SoundSyncPlay = id;
12392
12393 SetSynchDirty();
12394
12395 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
12396 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
12397 }
12398 }
12399
12400 void StartItemSoundServer(int id)
12401 {
12402 StartItemSoundServer(id, InventorySlots.INVALID);
12403 }
12404
12405 // Stop sound using ItemSoundHandler
12406 void StopItemSoundServer(int id)
12407 {
12408 if (!g_Game.IsServer())
12409 return;
12410
12411 m_SoundSyncStop = id;
12412 SetSynchDirty();
12413
12414 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
12415 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
12416 }
12417
12418 protected void ClearStartItemSoundServer()
12419 {
12420 m_SoundSyncPlay = 0;
12421 m_SoundSyncSlotID = InventorySlots.INVALID;
12422 }
12423
12424 protected void ClearStopItemSoundServer()
12425 {
12426 m_SoundSyncStop = 0;
12427 }
12428
12429 void OnApply(PlayerBase player);
12430
12432 {
12433 return 1.0;
12434 };
12435 //returns applicable selection
12436 array<string> GetHeadHidingSelection()
12437 {
12439 }
12440
12442 {
12444 }
12445
12446 WrittenNoteData GetWrittenNoteData() {};
12447
12449 {
12450 SetDynamicPhysicsLifeTime(0.01);
12451 m_ItemBeingDroppedPhys = false;
12452 }
12453
12455 {
12456 array<string> zone_names = new array<string>;
12457 GetDamageZones(zone_names);
12458 for (int i = 0; i < zone_names.Count(); i++)
12459 {
12460 SetHealthMax(zone_names.Get(i),"Health");
12461 }
12462 SetHealthMax("","Health");
12463 }
12464
12466 void SetZoneDamageCEInit()
12467 {
12468 float global_health = GetHealth01("","Health");
12469 array<string> zones = new array<string>;
12470 GetDamageZones(zones);
12471 //set damage of all zones to match global health level
12472 for (int i = 0; i < zones.Count(); i++)
12473 {
12474 SetHealth01(zones.Get(i),"Health",global_health);
12475 }
12476 }
12477
12479 bool IsCoverFaceForShave(string slot_name)
12480 {
12481 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12482 }
12483
12484 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12485 {
12486 if (!hasRootAsPlayer)
12487 {
12488 if (refParentIB)
12489 {
12490 // parent is wet
12491 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
12492 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12493 // parent has liquid inside
12494 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
12495 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12496 // drying
12497 else if (m_VarWet > m_VarWetMin)
12498 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
12499 }
12500 else
12501 {
12502 // drying on ground or inside non-itembase (car, ...)
12503 if (m_VarWet > m_VarWetMin)
12504 AddWet(-1 * delta * GetDryingIncrement("ground"));
12505 }
12506 }
12507 }
12508
12509 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12510 {
12512 {
12513 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
12514 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12515 {
12516 float heatPermCoef = 1.0;
12517 EntityAI ent = this;
12518 while (ent)
12519 {
12520 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12521 ent = ent.GetHierarchyParent();
12522 }
12523
12524 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12525 }
12526 }
12527 }
12528
12529 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
12530 {
12531 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
12532 EntityAI parent = GetHierarchyParent();
12533 if (!parent)
12534 {
12535 hasParent = false;
12536 hasRootAsPlayer = false;
12537 }
12538 else
12539 {
12540 hasParent = true;
12541 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12542 refParentIB = ItemBase.Cast(parent);
12543 }
12544 }
12545
12546 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
12547 {
12548 // this is stub, implemented on Edible_Base
12549 }
12550
12551 bool CanDecay()
12552 {
12553 // return true used on selected food clases so they can decay
12554 return false;
12555 }
12556
12557 protected bool CanProcessDecay()
12558 {
12559 // this is stub, implemented on Edible_Base class
12560 // used to determine whether it is still necessary for the food to decay
12561 return false;
12562 }
12563
12564 protected bool CanHaveWetness()
12565 {
12566 // return true used on selected items that have a wetness effect
12567 return false;
12568 }
12569
12571 bool CanBeConsumed(ConsumeConditionData data = null)
12572 {
12573 return !GetIsFrozen() && IsOpen();
12574 }
12575
12576 override void ProcessVariables()
12577 {
12578 bool hasParent = false, hasRootAsPlayer = false;
12579 ItemBase refParentIB;
12580
12581 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
12582 bool foodDecay = g_Game.IsFoodDecayEnabled();
12583
12584 if (wwtu || foodDecay)
12585 {
12586 bool processWetness = wwtu && CanHaveWetness();
12587 bool processTemperature = wwtu && CanHaveTemperature();
12588 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
12589
12590 if (processWetness || processTemperature || processDecay)
12591 {
12592 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
12593
12594 if (processWetness)
12595 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12596
12597 if (processTemperature)
12598 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12599
12600 if (processDecay)
12601 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12602 }
12603 }
12604 }
12605
12608 {
12609 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
12610 }
12611
12612 override float GetTemperatureFreezeThreshold()
12613 {
12615 return Liquid.GetFreezeThreshold(GetLiquidType());
12616
12617 return super.GetTemperatureFreezeThreshold();
12618 }
12619
12620 override float GetTemperatureThawThreshold()
12621 {
12623 return Liquid.GetThawThreshold(GetLiquidType());
12624
12625 return super.GetTemperatureThawThreshold();
12626 }
12627
12628 override float GetItemOverheatThreshold()
12629 {
12631 return Liquid.GetBoilThreshold(GetLiquidType());
12632
12633 return super.GetItemOverheatThreshold();
12634 }
12635
12636 override float GetTemperatureFreezeTime()
12637 {
12638 if (HasQuantity())
12639 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
12640
12641 return super.GetTemperatureFreezeTime();
12642 }
12643
12644 override float GetTemperatureThawTime()
12645 {
12646 if (HasQuantity())
12647 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
12648
12649 return super.GetTemperatureThawTime();
12650 }
12651
12653 void AffectLiquidContainerOnFill(int liquid_type, float amount);
12655 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
12656
12657 bool IsCargoException4x3(EntityAI item)
12658 {
12659 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12660 }
12661
12663 {
12664 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12665 }
12666
12668 void AddLightSourceItem(ItemBase lightsource)
12669 {
12670 m_LightSourceItem = lightsource;
12671 }
12672
12674 {
12675 m_LightSourceItem = null;
12676 }
12677
12679 {
12680 return m_LightSourceItem;
12681 }
12682
12684 array<int> GetValidFinishers()
12685 {
12686 return null;
12687 }
12688
12690 bool GetActionWidgetOverride(out typename name)
12691 {
12692 return false;
12693 }
12694
12695 bool PairWithDevice(notnull ItemBase otherDevice)
12696 {
12697 if (g_Game.IsServer())
12698 {
12699 ItemBase explosive = otherDevice;
12701 if (!trg)
12702 {
12703 trg = RemoteDetonatorTrigger.Cast(otherDevice);
12704 explosive = this;
12705 }
12706
12707 explosive.PairRemote(trg);
12708 trg.SetControlledDevice(explosive);
12709
12710 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12711 trg.SetPersistentPairID(persistentID);
12712 explosive.SetPersistentPairID(persistentID);
12713
12714 return true;
12715 }
12716 return false;
12717 }
12718
12720 float GetBaitEffectivity()
12721 {
12722 float ret = 1.0;
12723 if (HasQuantity())
12724 ret *= GetQuantityNormalized();
12725 ret *= GetHealth01();
12726
12727 return ret;
12728 }
12729
12730 #ifdef DEVELOPER
12731 override void SetDebugItem()
12732 {
12733 super.SetDebugItem();
12734 _itemBase = this;
12735 }
12736
12737 override string GetDebugText()
12738 {
12739 string text = super.GetDebugText();
12740
12741 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
12742 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
12743
12744 return text;
12745 }
12746 #endif
12747
12748 bool CanBeUsedForSuicide()
12749 {
12750 return true;
12751 }
12752
12754 //DEPRECATED BELOW
12756 // Backwards compatibility
12757 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
12758 {
12759 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
12760 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
12761 }
12762
12763 // replaced by ItemSoundHandler
12764 protected EffectSound m_SoundDeployFinish;
12765 protected EffectSound m_SoundPlace;
12766 protected EffectSound m_DeployLoopSoundEx;
12767 protected EffectSound m_SoundDeploy;
12768 bool m_IsPlaceSound;
12769 bool m_IsDeploySound;
12771
12772 string GetDeployFinishSoundset();
12773 void PlayDeploySound();
12774 void PlayDeployFinishSound();
12775 void PlayPlaceSound();
12776 void PlayDeployLoopSoundEx();
12777 void StopDeployLoopSoundEx();
12778 void SoundSynchRemoteReset();
12779 void SoundSynchRemote();
12780 bool UsesGlobalDeploy(){return false;}
12781 bool CanPlayDeployLoopSound(){return false;}
12783 bool IsPlaceSound(){return m_IsPlaceSound;}
12784 bool IsDeploySound(){return m_IsDeploySound;}
12785 void SetIsPlaceSound(bool is_place_sound);
12786 void SetIsDeploySound(bool is_deploy_sound);
12787
12788 [Obsolete("Use ItemSoundHandler instead")]
12790 void PlayAttachSound(string slot_type)
12791 {
12792 if (!g_Game.IsDedicatedServer())
12793 {
12794 if (ConfigIsExisting("attachSoundSet"))
12795 {
12796 string cfg_path = "";
12797 string soundset = "";
12798 string type_name = GetType();
12799
12800 TStringArray cfg_soundset_array = new TStringArray;
12801 TStringArray cfg_slot_array = new TStringArray;
12802 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12803 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12804
12805 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12806 {
12807 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12808 {
12809 if (cfg_slot_array[i] == slot_type)
12810 {
12811 soundset = cfg_soundset_array[i];
12812 break;
12813 }
12814 }
12815 }
12816
12817 if (soundset != "")
12818 {
12819 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
12820 sound.SetAutodestroy(true);
12821 }
12822 }
12823 }
12824 }
12825
12826 void PlayDetachSound(string slot_type) {}
12827}
12828
12829EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
12830{
12831 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
12832 if (entity)
12833 {
12834 bool is_item = entity.IsInherited(ItemBase);
12835 if (is_item && full_quantity)
12836 {
12837 ItemBase item = ItemBase.Cast(entity);
12838 item.SetQuantity(item.GetQuantityInit());
12839 }
12840 }
12841 else
12842 {
12843 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
12844 return NULL;
12845 }
12846 return entity;
12847}
12848
12849void SetupSpawnedItem(ItemBase item, float health, float quantity)
12850{
12851 if (item)
12852 {
12853 if (health > 0)
12854 item.SetHealth("", "", health);
12855
12856 if (item.CanHaveTemperature())
12857 {
12858 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
12859 if (item.CanFreeze())
12860 item.SetFrozen(false);
12861 }
12862
12863 if (item.HasEnergyManager())
12864 {
12865 if (quantity >= 0)
12866 {
12867 item.GetCompEM().SetEnergy0To1(quantity);
12868 }
12869 else
12870 {
12871 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
12872 }
12873 }
12874 else if (item.IsMagazine())
12875 {
12876 Magazine mag = Magazine.Cast(item);
12877 if (quantity >= 0)
12878 {
12879 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12880 }
12881 else
12882 {
12883 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
12884 }
12885
12886 }
12887 else
12888 {
12889 if (quantity >= 0)
12890 {
12891 item.SetQuantityNormalized(quantity, false);
12892 }
12893 else
12894 {
12895 item.SetQuantity(Math.AbsFloat(quantity));
12896 }
12897
12898 }
12899 }
12900}
12901
12902#ifdef DEVELOPER
12903ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
12904#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()

Используется в Entity::LoadVariables() и InventoryItem::OnSyncVariables().