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

◆ RemoveAgent()

override void SpawnItemOnLocation::RemoveAgent ( int agent_id)
protected

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

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

Используется в InventoryItem::OnAction().