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

◆ CanDisplayCargo()

override bool SpawnItemOnLocation::CanDisplayCargo ( )
protected

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

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