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

◆ GetDeployTime()

float SpawnItemOnLocation::GetDeployTime ( )
protected

how long it takes to deploy this item in seconds

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

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