Send message to owner player in red color.
7458{
7460 {
7461 return true;
7462 }
7463};
7464
7465
7466
7468{
7472
7474
7477
7478
7479
7480
7481
7490
7496
7501
7506
7527 protected bool m_IsResultOfSplit
7528
7530
7535
7536
7537
7539
7543
7544
7545
7547
7550
7551
7552
7558
7559
7567
7570
7571
7573
7574
7576
7577
7582
7583
7588
7589
7591
7592
7594 {
7599
7600 if (!
GetGame().IsDedicatedServer())
7601 {
7603 {
7605
7607 {
7609 }
7610 }
7611
7614 }
7615
7616 m_OldLocation = null;
7617
7619 {
7621 }
7622
7623 if (ConfigIsExisting("headSelectionsToHide"))
7624 {
7627 }
7628
7630 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7631 {
7633 }
7634
7636
7637 m_IsResultOfSplit = false;
7638
7640 }
7641
7643 {
7644 super.InitItemVariables();
7645
7651 m_Count = ConfigGetInt(
"count");
7652
7655
7660
7663
7668
7680
7684
7685
7688 if (ConfigIsExisting("canBeSplit"))
7689 {
7692 }
7693
7695 if (ConfigIsExisting("itemBehaviour"))
7697
7698
7701 RegisterNetSyncVariableInt("m_VarLiquidType");
7702 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7703
7704 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7705 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7706 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7707
7708 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7709 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7710 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7711 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7712
7713 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7714 RegisterNetSyncVariableBool("m_IsTakeable");
7715 RegisterNetSyncVariableBool("m_IsHologram");
7716
7719 {
7722 }
7723
7725
7727 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7729
7730 }
7731
7733 {
7735 }
7736
7738 {
7741 {
7746 }
7747 }
7748
7749 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7750 {
7752 {
7755 }
7756
7758 }
7759
7761 {
7767 }
7768
7770
7772 {
7774
7775 if (!action)
7776 {
7777 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7778 return;
7779 }
7780
7782 if (!ai)
7783 {
7785 return;
7786 }
7787
7789 if (!action_array)
7790 {
7791 action_array = new array<ActionBase_Basic>;
7793 }
7794 if (LogManager.IsActionLogEnable())
7795 {
7796 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7797 }
7798
7799 if (action_array.Find(action) != -1)
7800 {
7801 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7802 }
7803 else
7804 {
7805 action_array.Insert(action);
7806 }
7807 }
7808
7810 {
7812 ActionBase action = player.GetActionManager().GetAction(actionName);
7815
7816 if (action_array)
7817 {
7818 action_array.RemoveItem(action);
7819 }
7820 }
7821
7822
7823
7825 {
7826 ActionOverrideData overrideData = new ActionOverrideData();
7830
7832 if (!actionMap)
7833 {
7836 }
7837
7838 actionMap.Insert(this.
Type(), overrideData);
7839
7840 }
7841
7843
7845
7846
7848 {
7851
7854
7855 string config_to_search = "CfgVehicles";
7856 string muzzle_owner_config;
7857
7859 {
7860 if (IsInherited(Weapon))
7861 config_to_search = "CfgWeapons";
7862
7863 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7864
7865 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7866
7868
7869 if (config_OnFire_subclass_count > 0)
7870 {
7871 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7872
7873 for (int i = 0; i < config_OnFire_subclass_count; i++)
7874 {
7875 string particle_class = "";
7877 string config_OnFire_entry = config_OnFire_class + particle_class;
7878 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7879 WPOF_array.Insert(WPOF);
7880 }
7881
7882
7884 }
7885 }
7886
7888 {
7889 config_to_search = "CfgWeapons";
7890 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7891
7892 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7893
7895
7896 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7897 {
7898 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7899
7900 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7901 {
7902 string particle_class2 = "";
7904 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7905 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7906 WPOBE_array.Insert(WPOBE);
7907 }
7908
7909
7911 }
7912 }
7913 }
7914
7915
7917 {
7920
7922 {
7923 string config_to_search = "CfgVehicles";
7924
7925 if (IsInherited(Weapon))
7926 config_to_search = "CfgWeapons";
7927
7928 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7929 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7930
7931 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7932 {
7933
7935
7937 {
7939 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7941 return;
7942 }
7943
7946
7947
7948
7950 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7951
7952 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7953 {
7954 string particle_class = "";
7956 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7958
7959 if (entry_type == CT_CLASS)
7960 {
7961 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7962 WPOOH_array.Insert(WPOF);
7963 }
7964 }
7965
7966
7968 }
7969 }
7970 }
7971
7973 {
7975 }
7976
7978 {
7980 {
7982
7985
7988
7989 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7990 }
7991 }
7992
7994 {
7996 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7997
7999 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8000
8002 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8003
8005 {
8007 }
8008 }
8009
8011 {
8013 }
8014
8016 {
8019 else
8021
8023 {
8026 }
8027 else
8028 {
8031
8034 }
8035
8037 }
8038
8040 {
8042 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8043 }
8044
8046 {
8048 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8050 }
8051
8053 {
8055 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8056 }
8057
8059 {
8062
8063 OverheatingParticle OP = new OverheatingParticle();
8068
8070 }
8071
8073 {
8076
8077 return -1;
8078 }
8079
8081 {
8083 {
8086
8087 for (int i = count; i > 0; --i)
8088 {
8089 int id = i - 1;
8092
8095
8096 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8097 {
8098 if (p)
8099 {
8102 }
8103 }
8104 }
8105 }
8106 }
8107
8109 {
8111 {
8113 {
8114 int id = i - 1;
8116
8117 if (OP)
8118 {
8120
8121 if (p)
8122 {
8124 }
8125
8126 delete OP;
8127 }
8128 }
8129
8132 }
8133 }
8134
8137 {
8138 return 0.0;
8139 }
8140
8141
8143 {
8144 return 250;
8145 }
8146
8148 {
8149 return 0;
8150 }
8151
8154 {
8156 return true;
8157
8158 return false;
8159 }
8160
8163 {
8166
8168 {
8170 }
8171 else
8172 {
8173
8175 }
8176
8178 }
8179
8186 {
8187 return -1;
8188 }
8189
8190
8191
8192
8194 {
8196 {
8198 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8199
8200 if (r_index >= 0)
8201 {
8202 InventoryLocation r_il = new InventoryLocation;
8203 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8204
8205 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8208 {
8209 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8210 }
8212 {
8213 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8214 }
8215
8216 }
8217
8218 player.GetHumanInventory().ClearUserReservedLocation(this);
8219 }
8220
8223 }
8224
8225
8226
8227
8229 {
8230 return ItemBase.m_DebugActionsMask;
8231 }
8232
8234 {
8235 return ItemBase.m_DebugActionsMask & mask;
8236 }
8237
8239 {
8240 ItemBase.m_DebugActionsMask = mask;
8241 }
8242
8244 {
8245 ItemBase.m_DebugActionsMask |= mask;
8246 }
8247
8249 {
8250 ItemBase.m_DebugActionsMask &= ~mask;
8251 }
8252
8254 {
8256 {
8258 }
8259 else
8260 {
8262 }
8263 }
8264
8265
8267 {
8268 if (GetEconomyProfile())
8269 {
8270 float q_max = GetEconomyProfile().GetQuantityMax();
8271 if (q_max > 0)
8272 {
8273 float q_min = GetEconomyProfile().GetQuantityMin();
8274 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8275
8277 {
8278 ComponentEnergyManager comp = GetCompEM();
8280 {
8282 }
8283 }
8285 {
8287
8288 }
8289
8290 }
8291 }
8292 }
8293
8296 {
8297 EntityAI parent = GetHierarchyParent();
8298
8299 if (parent)
8300 {
8301 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8302 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8303 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8304 }
8305 }
8306
8309 {
8310 EntityAI parent = GetHierarchyParent();
8311
8312 if (parent)
8313 {
8314 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8315 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8316 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
8317 }
8318 }
8319
8321 {
8322
8323
8324
8325
8327
8329 {
8330 if (ScriptInputUserData.CanStoreInputUserData())
8331 {
8332 ScriptInputUserData ctx = new ScriptInputUserData;
8338 ctx.
Write(use_stack_max);
8341
8343 {
8344 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8345 }
8346 }
8347 }
8348 else if (!
GetGame().IsMultiplayer())
8349 {
8351 }
8352 }
8353
8355 {
8357 }
8358
8360 {
8362 }
8363
8365 {
8367 }
8368
8370 {
8371
8372 return false;
8373 }
8374
8376 {
8377 return false;
8378 }
8379
8383 {
8384 return false;
8385 }
8386
8388 {
8389 return "";
8390 }
8391
8393
8395 {
8396 return false;
8397 }
8398
8400 {
8401 return true;
8402 }
8403
8404
8405
8407 {
8408 return true;
8409 }
8410
8412 {
8413 return true;
8414 }
8415
8417 {
8418 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8420 }
8421
8423 {
8425 }
8426
8428 {
8430 if (!is_being_placed)
8432 SetSynchDirty();
8433 }
8434
8435
8437
8439 {
8441 }
8442
8444 {
8446 }
8447
8449 {
8450 return 1;
8451 }
8452
8454 {
8455 return false;
8456 }
8457
8459 {
8461 SetSynchDirty();
8462 }
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8499 {
8500 super.OnMovedInsideCargo(container);
8501
8502 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8503 }
8504
8505 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8506 {
8507 super.EEItemLocationChanged(oldLoc,newLoc);
8508
8509 PlayerBase new_player = null;
8510 PlayerBase old_player = null;
8511
8512 if (newLoc.GetParent())
8513 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8514
8515 if (oldLoc.GetParent())
8516 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8517
8519 {
8520 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8521
8522 if (r_index >= 0)
8523 {
8524 InventoryLocation r_il = new InventoryLocation;
8525 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8526
8527 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8530 {
8531 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8532 }
8534 {
8535 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8536 }
8537
8538 }
8539 }
8540
8542 {
8543 if (new_player)
8544 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8545
8546 if (new_player == old_player)
8547 {
8548
8549 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8550 {
8552 {
8553 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8554 {
8555 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8556 }
8557 }
8558 else
8559 {
8560 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8561 }
8562 }
8563
8564 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8565 {
8566 int type = oldLoc.GetType();
8568 {
8569 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8570 }
8572 {
8573 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8574 }
8575 }
8576 if (!m_OldLocation)
8577 {
8578 m_OldLocation = new InventoryLocation;
8579 }
8580 m_OldLocation.Copy(oldLoc);
8581 }
8582 else
8583 {
8584 if (m_OldLocation)
8585 {
8586 m_OldLocation.Reset();
8587 }
8588 }
8589
8591 }
8592 else
8593 {
8594 if (new_player)
8595 {
8596 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8597 if (res_index >= 0)
8598 {
8599 InventoryLocation il = new InventoryLocation;
8600 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8602 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8605 {
8606 il.
GetParent().GetOnReleaseLock().Invoke(it);
8607 }
8609 {
8611 }
8612
8613 }
8614 }
8616 {
8617
8619 }
8620
8621 if (m_OldLocation)
8622 {
8623 m_OldLocation.Reset();
8624 }
8625 }
8626 }
8627
8628 override void EOnContact(IEntity other, Contact extra)
8629 {
8631 {
8632 int liquidType = -1;
8634 if (impactSpeed > 0.0)
8635 {
8637 #ifndef SERVER
8639 #else
8641 SetSynchDirty();
8642 #endif
8644 }
8645 }
8646
8647 #ifdef SERVER
8648 if (GetCompEM() && GetCompEM().IsPlugged())
8649 {
8650 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8651 GetCompEM().UnplugThis();
8652 }
8653 #endif
8654 }
8655
8657
8659 {
8661 }
8662
8664 {
8665
8666 }
8667
8669 {
8670 super.OnItemLocationChanged(old_owner, new_owner);
8671
8672 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8673 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8674
8675 if (!relatedPlayer && playerNew)
8676 relatedPlayer = playerNew;
8677
8678 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8679 {
8681 if (actionMgr)
8682 {
8683 ActionBase currentAction = actionMgr.GetRunningAction();
8684 if (currentAction)
8686 }
8687 }
8688
8689 Man ownerPlayerOld = null;
8690 Man ownerPlayerNew = null;
8691
8692 if (old_owner)
8693 {
8694 if (old_owner.
IsMan())
8695 {
8696 ownerPlayerOld = Man.Cast(old_owner);
8697 }
8698 else
8699 {
8700 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8701 }
8702 }
8703 else
8704 {
8706 {
8708
8709 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8710 {
8711 GetCompEM().UnplugThis();
8712 }
8713 }
8714 }
8715
8716 if (new_owner)
8717 {
8718 if (new_owner.
IsMan())
8719 {
8720 ownerPlayerNew = Man.Cast(new_owner);
8721 }
8722 else
8723 {
8724 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8725 }
8726 }
8727
8728 if (ownerPlayerOld != ownerPlayerNew)
8729 {
8730 if (ownerPlayerOld)
8731 {
8732 array<EntityAI> subItemsExit = new array<EntityAI>;
8734 for (int i = 0; i < subItemsExit.Count(); i++)
8735 {
8738 }
8739 }
8740
8741 if (ownerPlayerNew)
8742 {
8743 array<EntityAI> subItemsEnter = new array<EntityAI>;
8745 for (int j = 0; j < subItemsEnter.Count(); j++)
8746 {
8749 }
8750 }
8751 }
8752 else if (ownerPlayerNew != null)
8753 {
8754 PlayerBase nplayer;
8755 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8756 {
8757 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8759 for (int k = 0; k < subItemsUpdate.Count(); k++)
8760 {
8762 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8763 }
8764 }
8765 }
8766
8767 if (old_owner)
8768 old_owner.OnChildItemRemoved(this);
8769 if (new_owner)
8770 new_owner.OnChildItemReceived(this);
8771 }
8772
8773
8775 {
8776 super.EEDelete(parent);
8777 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8778 if (player)
8779 {
8781
8782 if (player.IsAlive())
8783 {
8784 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8785 if (r_index >= 0)
8786 {
8787 InventoryLocation r_il = new InventoryLocation;
8788 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8789
8790 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8793 {
8794 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8795 }
8797 {
8798 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8799 }
8800
8801 }
8802
8803 player.RemoveQuickBarEntityShortcut(this);
8804 }
8805 }
8806 }
8807
8809 {
8810 super.EEKilled(killer);
8811
8814 {
8815 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8816 {
8817 if (IsMagazine())
8818 {
8819 if (Magazine.Cast(this).GetAmmoCount() > 0)
8820 {
8822 }
8823 }
8824 else
8825 {
8827 }
8828 }
8829 }
8830 }
8831
8833 {
8834 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8835
8836 super.OnWasAttached(parent, slot_id);
8837
8840
8842 }
8843
8845 {
8846 super.OnWasDetached(parent, slot_id);
8847
8850 }
8851
8853 {
8854 int idx;
8857
8858 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8859 if (inventory_slots.Count() < 1)
8860 {
8861 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8862 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8863 }
8864 else
8865 {
8866 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8867 }
8868
8869 idx = inventory_slots.Find(slot);
8870 if (idx < 0)
8871 return "";
8872
8873 return attach_types.Get(idx);
8874 }
8875
8877 {
8878 int idx = -1;
8879 string slot;
8880
8883
8884 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8885 if (inventory_slots.Count() < 1)
8886 {
8887 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8888 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8889 }
8890 else
8891 {
8892 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8893 if (detach_types.Count() < 1)
8894 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8895 }
8896
8897 for (int i = 0; i < inventory_slots.Count(); i++)
8898 {
8899 slot = inventory_slots.Get(i);
8900 }
8901
8902 if (slot != "")
8903 {
8904 if (detach_types.Count() == 1)
8905 idx = 0;
8906 else
8907 idx = inventory_slots.Find(slot);
8908 }
8909 if (idx < 0)
8910 return "";
8911
8912 return detach_types.Get(idx);
8913 }
8914
8916 {
8917
8919
8920
8921 float min_time = 1;
8922 float max_time = 3;
8923 float delay = Math.RandomFloat(min_time, max_time);
8924
8925 explode_timer.Run(delay, this, "DoAmmoExplosion");
8926 }
8927
8929 {
8930 Magazine magazine = Magazine.Cast(this);
8931 int pop_sounds_count = 6;
8932 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8933
8934
8935 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8936 string sound_name = pop_sounds[ sound_idx ];
8938
8939
8940 magazine.ServerAddAmmoCount(-1);
8941
8942
8943 float min_temp_to_explode = 100;
8944
8945 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8946 {
8948 }
8949 }
8950
8951
8952 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8953 {
8954 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8955
8956 const int CHANCE_DAMAGE_CARGO = 4;
8957 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8958 const int CHANCE_DAMAGE_NOTHING = 2;
8959
8961 {
8962 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8963 int chances;
8964 int rnd;
8965
8966 if (GetInventory().GetCargo())
8967 {
8968 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8969 rnd = Math.RandomInt(0,chances);
8970
8971 if (rnd < CHANCE_DAMAGE_CARGO)
8972 {
8974 }
8975 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8976 {
8978 }
8979 }
8980 else
8981 {
8982 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8983 rnd = Math.RandomInt(0,chances);
8984
8985 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8986 {
8988 }
8989 }
8990 }
8991 }
8992
8994 {
8995 if (GetInventory().GetCargo())
8996 {
8997 int item_count = GetInventory().GetCargo().GetItemCount();
8998 if (item_count > 0)
8999 {
9000 int random_pick = Math.RandomInt(0, item_count);
9002 if (!item.IsExplosive())
9003 {
9004 item.AddHealth("","",damage);
9005 return true;
9006 }
9007 }
9008 }
9009 return false;
9010 }
9011
9013 {
9014 int attachment_count = GetInventory().AttachmentCount();
9015 if (attachment_count > 0)
9016 {
9017 int random_pick = Math.RandomInt(0, attachment_count);
9018 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9019 if (!attachment.IsExplosive())
9020 {
9021 attachment.AddHealth("","",damage);
9022 return true;
9023 }
9024 }
9025 return false;
9026 }
9027
9029 {
9031 }
9032
9034 {
9036 return GetInventory().CanRemoveEntity();
9037
9038 return false;
9039 }
9040
9042 {
9044 return;
9045
9047 {
9048 if (ScriptInputUserData.CanStoreInputUserData())
9049 {
9050 ScriptInputUserData ctx = new ScriptInputUserData;
9055 ctx.
Write(destination_entity);
9059 }
9060 }
9061 else if (!
GetGame().IsMultiplayer())
9062 {
9064 }
9065 }
9066
9068 {
9070 return;
9071
9072 float split_quantity_new;
9076 InventoryLocation loc = new InventoryLocation;
9077
9078 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9079 {
9081 split_quantity_new = stack_max;
9082 else
9084
9085 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9086 if (new_item)
9087 {
9088 new_item.SetResultOfSplit(true);
9089 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9091 new_item.SetQuantity(split_quantity_new);
9092 }
9093 }
9094 else if (destination_entity && slot_id == -1)
9095 {
9096 if (quantity > stack_max)
9097 split_quantity_new = stack_max;
9098 else
9099 split_quantity_new = quantity;
9100
9102 {
9105 }
9106
9107 if (new_item)
9108 {
9109 new_item.SetResultOfSplit(true);
9110 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9112 new_item.SetQuantity(split_quantity_new);
9113 }
9114 }
9115 else
9116 {
9117 if (stack_max != 0)
9118 {
9120 {
9122 }
9123
9124 if (split_quantity_new == 0)
9125 {
9126 if (!
GetGame().IsMultiplayer())
9127 player.PhysicalPredictiveDropItem(this);
9128 else
9129 player.ServerDropEntity(this);
9130 return;
9131 }
9132
9134
9135 if (new_item)
9136 {
9137 new_item.SetResultOfSplit(true);
9138 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9140 new_item.SetQuantity(stack_max);
9141 new_item.PlaceOnSurface();
9142 }
9143 }
9144 }
9145 }
9146
9148 {
9150 return;
9151
9152 float split_quantity_new;
9156 InventoryLocation loc = new InventoryLocation;
9157
9158 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9159 {
9161 split_quantity_new = stack_max;
9162 else
9164
9165 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9166 if (new_item)
9167 {
9168 new_item.SetResultOfSplit(true);
9169 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9171 new_item.SetQuantity(split_quantity_new);
9172 }
9173 }
9174 else if (destination_entity && slot_id == -1)
9175 {
9176 if (quantity > stack_max)
9177 split_quantity_new = stack_max;
9178 else
9179 split_quantity_new = quantity;
9180
9182 {
9185 }
9186
9187 if (new_item)
9188 {
9189 new_item.SetResultOfSplit(true);
9190 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9192 new_item.SetQuantity(split_quantity_new);
9193 }
9194 }
9195 else
9196 {
9197 if (stack_max != 0)
9198 {
9200 {
9202 }
9203
9205
9206 if (new_item)
9207 {
9208 new_item.SetResultOfSplit(true);
9209 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9211 new_item.SetQuantity(stack_max);
9212 new_item.PlaceOnSurface();
9213 }
9214 }
9215 }
9216 }
9217
9219 {
9221 return;
9222
9224 {
9225 if (ScriptInputUserData.CanStoreInputUserData())
9226 {
9227 ScriptInputUserData ctx = new ScriptInputUserData;
9232 dst.WriteToContext(ctx);
9234 }
9235 }
9236 else if (!
GetGame().IsMultiplayer())
9237 {
9239 }
9240 }
9241
9243 {
9245 return;
9246
9248 {
9249 if (ScriptInputUserData.CanStoreInputUserData())
9250 {
9251 ScriptInputUserData ctx = new ScriptInputUserData;
9256 ctx.
Write(destination_entity);
9262 }
9263 }
9264 else if (!
GetGame().IsMultiplayer())
9265 {
9267 }
9268 }
9269
9271 {
9273 }
9274
9276 {
9278 return this;
9279
9281 float split_quantity_new;
9283 if (dst.IsValid())
9284 {
9285 int slot_id = dst.GetSlot();
9287
9288 if (quantity > stack_max)
9289 split_quantity_new = stack_max;
9290 else
9291 split_quantity_new = quantity;
9292
9294
9295 if (new_item)
9296 {
9297 new_item.SetResultOfSplit(true);
9298 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9301 }
9302
9303 return new_item;
9304 }
9305
9306 return null;
9307 }
9308
9310 {
9312 return;
9313
9315 float split_quantity_new;
9317 if (destination_entity)
9318 {
9320 if (quantity > stackable)
9321 split_quantity_new = stackable;
9322 else
9323 split_quantity_new = quantity;
9324
9325 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
9326 if (new_item)
9327 {
9328 new_item.SetResultOfSplit(true);
9329 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9331 new_item.SetQuantity(split_quantity_new);
9332 }
9333 }
9334 }
9335
9337 {
9339 return;
9340
9342 {
9343 if (ScriptInputUserData.CanStoreInputUserData())
9344 {
9345 ScriptInputUserData ctx = new ScriptInputUserData;
9350 ItemBase destination_entity =
this;
9351 ctx.
Write(destination_entity);
9355 }
9356 }
9357 else if (!
GetGame().IsMultiplayer())
9358 {
9360 }
9361 }
9362
9364 {
9366 return;
9367
9369 float split_quantity_new;
9371 if (player)
9372 {
9374 if (quantity > stackable)
9375 split_quantity_new = stackable;
9376 else
9377 split_quantity_new = quantity;
9378
9379 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
9380 new_item =
ItemBase.Cast(in_hands);
9381 if (new_item)
9382 {
9383 new_item.SetResultOfSplit(true);
9384 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9386 new_item.SetQuantity(split_quantity_new);
9387 }
9388 }
9389 }
9390
9392 {
9394 return;
9395
9397 float split_quantity_new = Math.Floor(quantity * 0.5);
9398
9400
9401 if (new_item)
9402 {
9403 if (new_item.GetQuantityMax() < split_quantity_new)
9404 {
9405 split_quantity_new = new_item.GetQuantityMax();
9406 }
9407
9408 new_item.SetResultOfSplit(true);
9409 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9410
9412 {
9415 }
9416 else
9417 {
9420 }
9421 }
9422 }
9423
9425 {
9427 return;
9428
9430 float split_quantity_new = Math.Floor(quantity / 2);
9431
9432 InventoryLocation invloc = new InventoryLocation;
9434
9436 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9437
9438 if (new_item)
9439 {
9440 if (new_item.GetQuantityMax() < split_quantity_new)
9441 {
9442 split_quantity_new = new_item.GetQuantityMax();
9443 }
9445 {
9448 }
9449 else
9450 {
9453 }
9454 }
9455 }
9456
9459 {
9460 SetWeightDirty();
9462
9463 if (parent)
9464 parent.OnAttachmentQuantityChangedEx(this, delta);
9465
9467 {
9469 {
9471 }
9473 {
9474 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9476 }
9477 }
9478
9479 }
9480
9483 {
9484
9485 }
9486
9489 {
9491 }
9492
9494 {
9495 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9496
9498 {
9499 if (newLevel == GameConstants.STATE_RUINED)
9500 {
9502 EntityAI parent = GetHierarchyParent();
9503 if (parent && parent.IsFireplace())
9504 {
9505 CargoBase cargo = GetInventory().GetCargo();
9506 if (cargo)
9507 {
9509 {
9511 }
9512 }
9513 }
9514 }
9515
9517 {
9518
9520 return;
9521 }
9522
9523 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9524 {
9526 }
9527 }
9528 }
9529
9530
9532 {
9533 super.OnRightClick();
9534
9536 {
9538 {
9539 if (ScriptInputUserData.CanStoreInputUserData())
9540 {
9541 vector m4[4];
9543
9544 EntityAI root = GetHierarchyRoot();
9545
9546 InventoryLocation dst = new InventoryLocation;
9548 {
9549 if (root)
9550 {
9551 root.GetTransform(m4);
9553 }
9554 else
9555 GetInventory().GetCurrentInventoryLocation(dst);
9556 }
9557 else
9558 {
9560
9561
9562 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9563 {
9564 if (root)
9565 {
9566 root.GetTransform(m4);
9568 }
9569 else
9570 GetInventory().GetCurrentInventoryLocation(dst);
9571 }
9572 else
9573 {
9574 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9575 }
9576 }
9577
9578 ScriptInputUserData ctx = new ScriptInputUserData;
9586 }
9587 }
9588 else if (!
GetGame().IsMultiplayer())
9589 {
9591 }
9592 }
9593 }
9594
9595 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9596 {
9597
9598 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9599 return false;
9600
9601 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9602 return false;
9603
9604
9606 return false;
9607
9608
9609 Magazine mag = Magazine.Cast(this);
9610 if (mag)
9611 {
9612 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9613 return false;
9614
9615 if (stack_max_limit)
9616 {
9617 Magazine other_mag = Magazine.Cast(other_item);
9618 if (other_item)
9619 {
9620 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9621 return false;
9622 }
9623
9624 }
9625 }
9626 else
9627 {
9628
9630 return false;
9631
9633 return false;
9634 }
9635
9636 PlayerBase player = null;
9637 if (CastTo(player, GetHierarchyRootPlayer()))
9638 {
9639 if (player.GetInventory().HasAttachment(this))
9640 return false;
9641
9642 if (player.IsItemsToDelete())
9643 return false;
9644 }
9645
9646 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9647 return false;
9648
9649 int slotID;
9651 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9652 return false;
9653
9654 return true;
9655 }
9656
9658 {
9660 }
9661
9663 {
9664 return m_IsResultOfSplit;
9665 }
9666
9668 {
9669 m_IsResultOfSplit = value;
9670 }
9671
9673 {
9675 }
9676
9678 {
9679 float other_item_quantity = other_item.GetQuantity();
9680 float this_free_space;
9681
9683
9685
9686 if (other_item_quantity > this_free_space)
9687 {
9688 return this_free_space;
9689 }
9690 else
9691 {
9692 return other_item_quantity;
9693 }
9694 }
9695
9697 {
9699 }
9700
9702 {
9704 return;
9705
9706 if (!IsMagazine() && other_item)
9707 {
9709 if (quantity_used != 0)
9710 {
9711 float hp1 = GetHealth01("","");
9712 float hp2 = other_item.GetHealth01("","");
9713 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9714 hpResult = hpResult / (
GetQuantity() + quantity_used);
9715
9716 hpResult *= GetMaxHealth();
9717 Math.Round(hpResult);
9718 SetHealth("", "Health", hpResult);
9719
9721 other_item.AddQuantity(-quantity_used);
9722 }
9723 }
9725 }
9726
9728 {
9729 #ifdef SERVER
9730 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9731 GetHierarchyParent().IncreaseLifetimeUp();
9732 #endif
9733 };
9734
9736 {
9737 PlayerBase p = PlayerBase.Cast(player);
9738
9739 array<int> recipesIds = p.m_Recipes;
9740 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9741 if (moduleRecipesManager)
9742 {
9743 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9744 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9745 }
9746
9747 for (int i = 0;i < recipesIds.Count(); i++)
9748 {
9749 int key = recipesIds.Get(i);
9750 string recipeName = moduleRecipesManager.GetRecipeName(key);
9752 }
9753 }
9754
9755
9756 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9757 {
9758 super.GetDebugActions(outputList);
9759
9760
9765
9766
9770
9774
9775
9778
9779
9781 {
9784 }
9785
9787
9790
9794 }
9795
9796
9797
9798
9800 {
9801 super.OnAction(action_id, player, ctx);
9802 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9803 {
9804 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9805 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9806 PlayerBase p = PlayerBase.Cast(player);
9807 if (
EActions.RECIPES_RANGE_START < 1000)
9808 {
9809 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9810 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9811 }
9812 }
9813 #ifndef SERVER
9814 else if (action_id ==
EActions.WATCH_PLAYER)
9815 {
9816 PluginDeveloper.SetDeveloperItemClientEx(player);
9817 }
9818 #endif
9820 {
9821 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9822 {
9823 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9824 OnDebugButtonPressServer(id + 1);
9825 }
9826
9827 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9828 {
9829 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9831 }
9832
9833 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9834 {
9835 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9837 }
9838
9839 else if (action_id ==
EActions.ADD_QUANTITY)
9840 {
9841 if (IsMagazine())
9842 {
9843 Magazine mag = Magazine.Cast(this);
9844 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9845 }
9846 else
9847 {
9849 }
9850
9851 if (m_EM)
9852 {
9853 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9854 }
9855
9856 }
9857
9858 else if (action_id ==
EActions.REMOVE_QUANTITY)
9859 {
9860 if (IsMagazine())
9861 {
9862 Magazine mag2 = Magazine.Cast(this);
9863 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9864 }
9865 else
9866 {
9868 }
9869 if (m_EM)
9870 {
9871 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
9872 }
9873
9874 }
9875
9876 else if (action_id ==
EActions.SET_QUANTITY_0)
9877 {
9879
9880 if (m_EM)
9881 {
9882 m_EM.SetEnergy(0);
9883 }
9884 }
9885
9886 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9887 {
9889
9890 if (m_EM)
9891 {
9892 m_EM.SetEnergy(m_EM.GetEnergyMax());
9893 }
9894 }
9895
9896 else if (action_id ==
EActions.ADD_HEALTH)
9897 {
9898 AddHealth("","",GetMaxHealth("","Health")/5);
9899 }
9900 else if (action_id ==
EActions.REMOVE_HEALTH)
9901 {
9902 AddHealth("","",-GetMaxHealth("","Health")/5);
9903 }
9904 else if (action_id ==
EActions.DESTROY_HEALTH)
9905 {
9906 SetHealth01("","",0);
9907 }
9908 else if (action_id ==
EActions.WATCH_ITEM)
9909 {
9911 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9912 #ifdef DEVELOPER
9913 SetDebugDeveloper_item(this);
9914 #endif
9915 }
9916
9917 else if (action_id ==
EActions.ADD_TEMPERATURE)
9918 {
9919 AddTemperature(20);
9920
9921 }
9922
9923 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9924 {
9925 AddTemperature(-20);
9926
9927 }
9928
9929 else if (action_id ==
EActions.FLIP_FROZEN)
9930 {
9931 SetFrozen(!GetIsFrozen());
9932
9933 }
9934
9935 else if (action_id ==
EActions.ADD_WETNESS)
9936 {
9938
9939 }
9940
9941 else if (action_id ==
EActions.REMOVE_WETNESS)
9942 {
9944
9945 }
9946
9947 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9948 {
9951
9952
9953 }
9954
9955 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9956 {
9959 }
9960
9961 else if (action_id ==
EActions.MAKE_SPECIAL)
9962 {
9963 auto debugParams = DebugSpawnParams.WithPlayer(player);
9964 OnDebugSpawnEx(debugParams);
9965 }
9966
9967 else if (action_id ==
EActions.DELETE)
9968 {
9969 Delete();
9970 }
9971
9972 }
9973
9974
9975 return false;
9976 }
9977
9978
9979
9980
9984
9987
9988
9989
9991 {
9992 return false;
9993 }
9994
9995
9997 {
9998 return true;
9999 }
10000
10001
10003 {
10004 return true;
10005 }
10006
10007
10008
10010 {
10011 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10013 }
10014
10017 {
10018 return null;
10019 }
10020
10022 {
10023 return false;
10024 }
10025
10027 {
10028 return false;
10029 }
10030
10034
10035
10037 {
10038 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10039 return module_repairing.CanRepair(this, item_repair_kit);
10040 }
10041
10042
10043 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10044 {
10045 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10046 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10047 }
10048
10049
10051 {
10052
10053
10054
10055
10056
10057
10058
10059
10060 return 1;
10061 }
10062
10063
10064
10066 {
10068 }
10069
10070
10071
10073 {
10075 }
10076
10077
10086 {
10087 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10088
10089 if (player)
10090 {
10091 player.MessageStatus(text);
10092 }
10093 }
10094
10095
10104 {
10105 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10106
10107 if (player)
10108 {
10109 player.MessageAction(text);
10110 }
10111 }
10112
10113
10122 {
10123 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10124
10125 if (player)
10126 {
10127 player.MessageFriendly(text);
10128 }
10129 }
10130
10131
10140 {
10141 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10142
10143 if (player)
10144 {
10145 player.MessageImportant(text);
10146 }
10147 }
10148
10150 {
10151 return true;
10152 }
10153
10154
10155 override bool KindOf(
string tag)
10156 {
10157 bool found = false;
10158 string item_name = this.
GetType();
10161
10162 int array_size = item_tag_array.Count();
10163 for (int i = 0; i < array_size; i++)
10164 {
10165 if (item_tag_array.Get(i) == tag)
10166 {
10167 found = true;
10168 break;
10169 }
10170 }
10171 return found;
10172 }
10173
10174
10176 {
10177
10178 super.OnRPC(sender, rpc_type,ctx);
10179
10180
10181 switch (rpc_type)
10182 {
10183 #ifndef SERVER
10184 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10185 Param2<bool, string> p = new Param2<bool, string>(false, "");
10186
10188 return;
10189
10190 bool play = p.param1;
10191 string soundSet = p.param2;
10192
10193 if (play)
10194 {
10196 {
10198 {
10200 }
10201 }
10202 else
10203 {
10205 }
10206 }
10207 else
10208 {
10210 }
10211
10212 break;
10213 #endif
10214
10215 }
10216
10218 {
10220 }
10221 }
10222
10223
10224
10225
10227 {
10228 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10229 return plugin.GetID(
name);
10230 }
10231
10233 {
10234 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10235 return plugin.GetName(id);
10236 }
10237
10240 {
10241
10242
10243 int varFlags;
10244 if (!ctx.
Read(varFlags))
10245 return;
10246
10247 if (varFlags & ItemVariableFlags.FLOAT)
10248 {
10250 }
10251 }
10252
10254 {
10255
10256 super.SerializeNumericalVars(floats_out);
10257
10258
10259
10261 {
10263 }
10264
10266 {
10268 }
10269
10271 {
10273 }
10274
10276 {
10281 }
10282
10284 {
10286 }
10287 }
10288
10290 {
10291
10292 super.DeSerializeNumericalVars(floats);
10293
10294
10295 int index = 0;
10296 int mask = Math.Round(floats.Get(index));
10297
10298 index++;
10299
10301 {
10303 {
10305 }
10306 else
10307 {
10308 float quantity = floats.Get(index);
10309 SetQuantity(quantity,
true,
false,
false,
false);
10310 }
10311 index++;
10312 }
10313
10315 {
10316 float wet = floats.Get(index);
10318 index++;
10319 }
10320
10322 {
10323 int liquidtype = Math.Round(floats.Get(index));
10325 index++;
10326 }
10327
10329 {
10331 index++;
10333 index++;
10335 index++;
10337 index++;
10338 }
10339
10341 {
10342 int cleanness = Math.Round(floats.Get(index));
10344 index++;
10345 }
10346 }
10347
10349 {
10350 super.WriteVarsToCTX(ctx);
10351
10352
10354 {
10356 }
10357
10359 {
10361 }
10362
10364 {
10366 }
10367
10369 {
10370 int r,g,b,a;
10376 }
10377
10379 {
10381 }
10382 }
10383
10385 {
10386 if (!super.ReadVarsFromCTX(ctx,version))
10387 return false;
10388
10389 int intValue;
10390 float value;
10391
10392 if (version < 140)
10393 {
10394 if (!ctx.
Read(intValue))
10395 return false;
10396
10397 m_VariablesMask = intValue;
10398 }
10399
10401 {
10402 if (!ctx.
Read(value))
10403 return false;
10404
10406 {
10408 }
10409 else
10410 {
10412 }
10413 }
10414
10415 if (version < 140)
10416 {
10418 {
10419 if (!ctx.
Read(value))
10420 return false;
10421 SetTemperatureDirect(value);
10422 }
10423 }
10424
10426 {
10427 if (!ctx.
Read(value))
10428 return false;
10430 }
10431
10433 {
10434 if (!ctx.
Read(intValue))
10435 return false;
10437 }
10438
10440 {
10441 int r,g,b,a;
10443 return false;
10445 return false;
10447 return false;
10449 return false;
10450
10452 }
10453
10455 {
10456 if (!ctx.
Read(intValue))
10457 return false;
10459 }
10460
10461 if (version >= 138 && version < 140)
10462 {
10464 {
10465 if (!ctx.
Read(intValue))
10466 return false;
10467 SetFrozen(intValue);
10468 }
10469 }
10470
10471 return true;
10472 }
10473
10474
10476 {
10479 {
10481 }
10482
10483 if (!super.OnStoreLoad(ctx, version))
10484 {
10486 return false;
10487 }
10488
10489 if (version >= 114)
10490 {
10491 bool hasQuickBarIndexSaved;
10492
10493 if (!ctx.
Read(hasQuickBarIndexSaved))
10494 {
10496 return false;
10497 }
10498
10499 if (hasQuickBarIndexSaved)
10500 {
10501 int itmQBIndex;
10502
10503
10504 if (!ctx.
Read(itmQBIndex))
10505 {
10507 return false;
10508 }
10509
10510 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10511 if (itmQBIndex != -1 && parentPlayer)
10512 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10513 }
10514 }
10515 else
10516 {
10517
10518 PlayerBase player;
10519 int itemQBIndex;
10520 if (version ==
int.
MAX)
10521 {
10522 if (!ctx.
Read(itemQBIndex))
10523 {
10525 return false;
10526 }
10527 }
10528 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10529 {
10530
10531 if (!ctx.
Read(itemQBIndex))
10532 {
10534 return false;
10535 }
10536 if (itemQBIndex != -1 && player)
10537 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10538 }
10539 }
10540
10541 if (version < 140)
10542 {
10543
10544 if (!LoadVariables(ctx, version))
10545 {
10547 return false;
10548 }
10549 }
10550
10551
10553 {
10555 return false;
10556 }
10557 if (version >= 132)
10558 {
10560 if (raib)
10561 {
10563 {
10565 return false;
10566 }
10567 }
10568 }
10569
10571 return true;
10572 }
10573
10574
10575
10577 {
10578 super.OnStoreSave(ctx);
10579
10580 PlayerBase player;
10581 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10582 {
10584
10585 int itemQBIndex = -1;
10586 itemQBIndex = player.FindQuickBarEntityIndex(this);
10587 ctx.
Write(itemQBIndex);
10588 }
10589 else
10590 {
10592 }
10593
10595
10597 if (raib)
10598 {
10600 }
10601 }
10602
10603
10605 {
10606 super.AfterStoreLoad();
10607
10609 {
10611 }
10612
10614 {
10617 }
10618 }
10619
10621 {
10622 super.EEOnAfterLoad();
10623
10625 {
10627 }
10628
10631 }
10632
10634 {
10635 return false;
10636 }
10637
10638
10639
10641 {
10643 {
10644 #ifdef PLATFORM_CONSOLE
10645
10647 {
10649 if (menu)
10650 {
10652 }
10653 }
10654 #endif
10655 }
10656
10658 {
10661 }
10662
10664 {
10665 SetWeightDirty();
10667 }
10669 {
10672 }
10673
10675 {
10678 }
10680 {
10683 }
10684
10685 super.OnVariablesSynchronized();
10686 }
10687
10688
10689
10691 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10692 {
10693 if (!IsServerCheck(allow_client))
10694 return false;
10695
10697 return false;
10698
10701
10702 if (value <= (min + 0.001))
10703 value = min;
10704
10705 if (value == min)
10706 {
10707 if (destroy_config)
10708 {
10709 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10710 if (dstr)
10711 {
10713 this.Delete();
10714 return true;
10715 }
10716 }
10717 else if (destroy_forced)
10718 {
10720 this.Delete();
10721 return true;
10722 }
10723
10725 }
10726
10729
10731 {
10733
10734 if (delta)
10736 }
10737
10739
10740 return false;
10741 }
10742
10743
10745 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10746 {
10748 }
10749
10751 {
10754 }
10755
10757 {
10760 }
10761
10764 {
10765 float value_clamped = Math.Clamp(value, 0, 1);
10767 SetQuantity(result, destroy_config, destroy_forced);
10768 }
10769
10770
10773 {
10775 }
10776
10778 {
10780 }
10781
10782
10783
10784
10785
10786
10787
10788
10789
10790
10792 {
10793 int slot = -1;
10794 if (GetInventory())
10795 {
10796 InventoryLocation il = new InventoryLocation;
10797 GetInventory().GetCurrentInventoryLocation(il);
10799 }
10800
10802 }
10803
10805 {
10806 float quantity_max = 0;
10807
10809 {
10810 if (attSlotID != -1)
10811 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10812
10813 if (quantity_max <= 0)
10815 }
10816
10817 if (quantity_max <= 0)
10819
10820 return quantity_max;
10821 }
10822
10824 {
10826 }
10827
10829 {
10831 }
10832
10833
10835 {
10837 }
10838
10840 {
10842 }
10843
10845 {
10847 }
10848
10849
10851 {
10852
10853 float weightEx = GetWeightEx();
10854 float special = GetInventoryAndCargoWeight();
10855 return weightEx - special;
10856 }
10857
10858
10860 {
10862 }
10863
10865 {
10867 {
10868 #ifdef DEVELOPER
10869 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10870 {
10871 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10873 }
10874 #endif
10875
10876 return GetQuantity() * GetConfigWeightModified();
10877 }
10878 else if (HasEnergyManager())
10879 {
10880 #ifdef DEVELOPER
10881 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10882 {
10883 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10884 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10885 }
10886 #endif
10887 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10888 }
10889 else
10890 {
10891 #ifdef DEVELOPER
10892 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10893 {
10894 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10895 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10896 }
10897 #endif
10898 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10899 }
10900 }
10901
10904 {
10905 int item_count = 0;
10907
10908 if (GetInventory().GetCargo() != NULL)
10909 {
10910 item_count = GetInventory().GetCargo().GetItemCount();
10911 }
10912
10913 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10914 {
10915 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10916 if (item)
10917 item_count += item.GetNumberOfItems();
10918 }
10919 return item_count;
10920 }
10921
10924 {
10925 float weight = 0;
10926 float wetness = 1;
10927 if (include_wetness)
10930 {
10931 weight = wetness * m_ConfigWeight;
10932 }
10934 {
10935 weight = 1;
10936 }
10937 return weight;
10938 }
10939
10940
10941
10943 {
10944 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10945 {
10946 GameInventory inv = GetInventory();
10947 array<EntityAI> items = new array<EntityAI>;
10949 for (int i = 0; i < items.Count(); i++)
10950 {
10952 if (item)
10953 {
10955 }
10956 }
10957 }
10958 }
10959
10960
10961
10962
10964 {
10965 float energy = 0;
10966 if (HasEnergyManager())
10967 {
10968 energy = GetCompEM().GetEnergy();
10969 }
10970 return energy;
10971 }
10972
10973
10975 {
10976 super.OnEnergyConsumed();
10977
10979 }
10980
10982 {
10983 super.OnEnergyAdded();
10984
10986 }
10987
10988
10990 {
10991 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10992 {
10994 {
10995 float energy_0to1 = GetCompEM().GetEnergy0To1();
10997 }
10998 }
10999 }
11000
11001
11003 {
11004 return ConfigGetFloat("heatIsolation");
11005 }
11006
11008 {
11010 }
11011
11013 {
11014 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11015 if (
GetGame().ConfigIsExisting(paramPath))
11017
11018 return 0.0;
11019 }
11020
11022 {
11023 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11024 if (
GetGame().ConfigIsExisting(paramPath))
11026
11027 return 0.0;
11028 }
11029
11030 override void SetWet(
float value,
bool allow_client =
false)
11031 {
11032 if (!IsServerCheck(allow_client))
11033 return;
11034
11037
11039
11040 m_VarWet = Math.Clamp(value, min, max);
11041
11043 {
11046 }
11047 }
11048
11049 override void AddWet(
float value)
11050 {
11052 }
11053
11055 {
11057 }
11058
11060 {
11062 }
11063
11065 {
11067 }
11068
11070 {
11072 }
11073
11075 {
11077 }
11078
11079 override void OnWetChanged(
float newVal,
float oldVal)
11080 {
11083 if (newLevel != oldLevel)
11084 {
11086 }
11087 }
11088
11090 {
11091 SetWeightDirty();
11092 }
11093
11095 {
11096 return GetWetLevelInternal(
m_VarWet);
11097 }
11098
11099
11100
11102 {
11104 }
11105
11107 {
11109 }
11110
11112 {
11114 }
11115
11117 {
11119 }
11120
11121
11122
11124 {
11125 if (ConfigIsExisting("itemModelLength"))
11126 {
11127 return ConfigGetFloat("itemModelLength");
11128 }
11129 return 0;
11130 }
11131
11133 {
11134 if (ConfigIsExisting("itemAttachOffset"))
11135 {
11136 return ConfigGetFloat("itemAttachOffset");
11137 }
11138 return 0;
11139 }
11140
11141 override void SetCleanness(
int value,
bool allow_client =
false)
11142 {
11143 if (!IsServerCheck(allow_client))
11144 return;
11145
11147
11149
11152 }
11153
11155 {
11157 }
11158
11160 {
11161 return true;
11162 }
11163
11164
11165
11166
11168 {
11170 }
11171
11173 {
11175 }
11176
11177
11178
11179
11180 override void SetColor(
int r,
int g,
int b,
int a)
11181 {
11187 }
11189 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11190 {
11195 }
11196
11198 {
11200 }
11201
11204 {
11205 int r,g,b,a;
11207 r = r/255;
11208 g = g/255;
11209 b = b/255;
11210 a = a/255;
11211 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11212 }
11213
11214
11215
11216 override void SetLiquidType(
int value,
bool allow_client =
false)
11217 {
11218 if (!IsServerCheck(allow_client))
11219 return;
11220
11225 }
11226
11228 {
11229 return ConfigGetInt("varLiquidTypeInit");
11230 }
11231
11233 {
11235 }
11236
11238 {
11240 SetFrozen(false);
11241 }
11242
11245 {
11246 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11247 }
11248
11249
11252 {
11253 PlayerBase nplayer;
11254 if (PlayerBase.CastTo(nplayer, player))
11255 {
11257
11258 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11259 }
11260 }
11261
11262
11265 {
11266 PlayerBase nplayer;
11267 if (PlayerBase.CastTo(nplayer,player))
11268 {
11269
11270 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11271
11272 }
11273
11274
11275 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11276
11277
11278 if (HasEnergyManager())
11279 {
11280 GetCompEM().UpdatePlugState();
11281 }
11282 }
11283
11284
11286 {
11287 super.OnPlacementStarted(player);
11288
11290 }
11291
11292 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11293 {
11295 {
11296 m_AdminLog.OnPlacementComplete(player,
this);
11297 }
11298
11299 super.OnPlacementComplete(player, position, orientation);
11300 }
11301
11302
11303
11304
11305
11307 {
11309 {
11310 return true;
11311 }
11312 else
11313 {
11314 return false;
11315 }
11316 }
11317
11318
11320 {
11322 {
11324 }
11325 }
11326
11327
11329 {
11331 }
11332
11334 {
11336 }
11337
11338 override void InsertAgent(
int agent,
float count = 1)
11339 {
11340 if (count < 1)
11341 return;
11342
11344 }
11345
11348 {
11350 }
11351
11352
11354 {
11356 }
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
11371
11372
11373
11374
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
11396
11397
11398
11400 {
11402 return false;
11403 return true;
11404 }
11405
11407 {
11408
11410 }
11411
11412
11415 {
11416 super.CheckForRoofLimited(timeTresholdMS);
11417
11419 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11420 {
11421 m_PreviousRoofTestTime = time;
11422 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11423 }
11424 }
11425
11426
11428 {
11430 {
11431 return 0;
11432 }
11433
11434 if (GetInventory().GetAttachmentSlotsCount() != 0)
11435 {
11436 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
11437 if (filter)
11438 return filter.GetProtectionLevel(type, false, system);
11439 else
11440 return 0;
11441 }
11442
11443 string subclassPath, entryName;
11444
11445 switch (type)
11446 {
11448 entryName = "biological";
11449 break;
11451 entryName = "chemical";
11452 break;
11453 default:
11454 entryName = "biological";
11455 break;
11456 }
11457
11458 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11459
11461 }
11462
11463
11464
11467 {
11468 if (!IsMagazine())
11470
11472 }
11473
11474
11475
11476
11477
11482 {
11483 return true;
11484 }
11485
11487 {
11489 }
11490
11491
11492
11493
11494
11496 {
11497 if (parent)
11498 {
11499 if (parent.IsInherited(DayZInfected))
11500 return true;
11501
11502 if (!parent.IsRuined())
11503 return true;
11504 }
11505
11506 return true;
11507 }
11508
11510 {
11511 if (!super.CanPutAsAttachment(parent))
11512 {
11513 return false;
11514 }
11515
11516 if (!IsRuined() && !parent.IsRuined())
11517 {
11518 return true;
11519 }
11520
11521 return false;
11522 }
11523
11525 {
11526
11527
11528
11529
11530 return super.CanReceiveItemIntoCargo(item);
11531 }
11532
11534 {
11535
11536
11537
11538
11539 GameInventory attachmentInv = attachment.GetInventory();
11541 {
11542 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11543 return false;
11544 }
11545
11546 InventoryLocation loc = new InventoryLocation();
11547 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11548 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11549 return false;
11550
11551 return super.CanReceiveAttachment(attachment, slotId);
11552 }
11553
11555 {
11556 if (!super.CanReleaseAttachment(attachment))
11557 return false;
11558
11559 return GetInventory().AreChildrenAccessible();
11560 }
11561
11562
11563
11564
11565
11566
11567
11568
11569
11570
11571
11572
11573
11574
11575
11576
11577
11578
11579
11580
11581
11583 {
11584 int id = muzzle_owner.GetMuzzleID();
11585 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11586
11587 if (WPOF_array)
11588 {
11589 for (int i = 0; i < WPOF_array.Count(); i++)
11590 {
11591 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11592
11593 if (WPOF)
11594 {
11595 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11596 }
11597 }
11598 }
11599 }
11600
11601
11603 {
11604 int id = muzzle_owner.GetMuzzleID();
11606
11607 if (WPOBE_array)
11608 {
11609 for (int i = 0; i < WPOBE_array.Count(); i++)
11610 {
11611 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11612
11613 if (WPOBE)
11614 {
11615 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11616 }
11617 }
11618 }
11619 }
11620
11621
11623 {
11624 int id = muzzle_owner.GetMuzzleID();
11625 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11626
11627 if (WPOOH_array)
11628 {
11629 for (int i = 0; i < WPOOH_array.Count(); i++)
11630 {
11631 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11632
11633 if (WPOOH)
11634 {
11635 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11636 }
11637 }
11638 }
11639 }
11640
11641
11643 {
11644 int id = muzzle_owner.GetMuzzleID();
11645 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11646
11647 if (WPOOH_array)
11648 {
11649 for (int i = 0; i < WPOOH_array.Count(); i++)
11650 {
11651 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11652
11653 if (WPOOH)
11654 {
11655 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11656 }
11657 }
11658 }
11659 }
11660
11661
11663 {
11664 int id = muzzle_owner.GetMuzzleID();
11665 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11666
11667 if (WPOOH_array)
11668 {
11669 for (int i = 0; i < WPOOH_array.Count(); i++)
11670 {
11671 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11672
11673 if (WPOOH)
11674 {
11675 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11676 }
11677 }
11678 }
11679 }
11680
11681
11682
11684 {
11686 {
11687 return true;
11688 }
11689
11690 return false;
11691 }
11692
11694 {
11696 {
11697 return true;
11698 }
11699
11700 return false;
11701 }
11702
11704 {
11706 {
11707 return true;
11708 }
11709
11710 return false;
11711 }
11712
11714 {
11715 return false;
11716 }
11717
11720 {
11721 return UATimeSpent.DEFAULT_DEPLOY;
11722 }
11723
11724
11725
11726
11728 {
11730 SetSynchDirty();
11731 }
11732
11734 {
11736 }
11737
11738
11740 {
11741 return false;
11742 }
11743
11746 {
11747 string att_type = "None";
11748
11749 if (ConfigIsExisting("soundAttType"))
11750 {
11751 att_type = ConfigGetString("soundAttType");
11752 }
11753
11755 }
11756
11758 {
11760 }
11761
11762
11763
11764
11765
11769
11771 {
11774
11776 }
11777
11778
11780 {
11782 return;
11783
11785
11788
11791
11792 SoundParameters params = new SoundParameters();
11796 }
11797
11798
11800 {
11802 return;
11803
11805 SetSynchDirty();
11806
11809 }
11810
11811
11813 {
11815 return;
11816
11818 SetSynchDirty();
11819
11822 }
11823
11825 {
11827 }
11828
11830 {
11832 }
11833
11836 {
11837 if (!
GetGame().IsDedicatedServer())
11838 {
11839 if (ConfigIsExisting("attachSoundSet"))
11840 {
11841 string cfg_path = "";
11842 string soundset = "";
11843 string type_name =
GetType();
11844
11847 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11848 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11849
11850 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11851 {
11852 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11853 {
11854 if (cfg_slot_array[i] == slot_type)
11855 {
11856 soundset = cfg_soundset_array[i];
11857 break;
11858 }
11859 }
11860 }
11861
11862 if (soundset != "")
11863 {
11864 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11866 }
11867 }
11868 }
11869 }
11870
11872 {
11873
11874 }
11875
11876 void OnApply(PlayerBase player);
11877
11879 {
11880 return 1.0;
11881 };
11882
11884 {
11886 }
11887
11889 {
11891 }
11892
11894
11896 {
11897 SetDynamicPhysicsLifeTime(0.01);
11899 }
11900
11902 {
11903 array<string> zone_names = new array<string>;
11904 GetDamageZones(zone_names);
11905 for (int i = 0; i < zone_names.Count(); i++)
11906 {
11907 SetHealthMax(zone_names.Get(i),"Health");
11908 }
11909 SetHealthMax("","Health");
11910 }
11911
11914 {
11915 float global_health = GetHealth01("","Health");
11916 array<string> zones = new array<string>;
11917 GetDamageZones(zones);
11918
11919 for (int i = 0; i < zones.Count(); i++)
11920 {
11921 SetHealth01(zones.Get(i),"Health",global_health);
11922 }
11923 }
11924
11927 {
11928 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11929 }
11930
11932 {
11933 if (!hasRootAsPlayer)
11934 {
11935 if (refParentIB)
11936 {
11937
11938 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11939 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11940
11941 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11942 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11943
11946 }
11947 else
11948 {
11949
11952 }
11953 }
11954 }
11955
11957 {
11959 {
11960 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11961 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11962 {
11963 float heatPermCoef = 1.0;
11965 while (ent)
11966 {
11967 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11968 ent = ent.GetHierarchyParent();
11969 }
11970
11971 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11972 }
11973 }
11974 }
11975
11977 {
11978
11979 EntityAI parent = GetHierarchyParent();
11980 if (!parent)
11981 {
11982 hasParent = false;
11983 hasRootAsPlayer = false;
11984 }
11985 else
11986 {
11987 hasParent = true;
11988 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11989 refParentIB =
ItemBase.Cast(parent);
11990 }
11991 }
11992
11993 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11994 {
11995
11996 }
11997
11999 {
12000
12001 return false;
12002 }
12003
12005 {
12006
12007
12008 return false;
12009 }
12010
12012 {
12013
12014 return false;
12015 }
12016
12019 {
12020 return !GetIsFrozen() &&
IsOpen();
12021 }
12022
12024 {
12025 bool hasParent = false, hasRootAsPlayer = false;
12027
12028 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12029 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12030
12031 if (wwtu || foodDecay)
12032 {
12036
12037 if (processWetness || processTemperature || processDecay)
12038 {
12040
12041 if (processWetness)
12042 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12043
12044 if (processTemperature)
12046
12047 if (processDecay)
12048 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12049 }
12050 }
12051 }
12052
12055 {
12057 }
12058
12060 {
12063
12064 return super.GetTemperatureFreezeThreshold();
12065 }
12066
12068 {
12071
12072 return super.GetTemperatureThawThreshold();
12073 }
12074
12076 {
12079
12080 return super.GetItemOverheatThreshold();
12081 }
12082
12084 {
12086 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12087
12088 return super.GetTemperatureFreezeTime();
12089 }
12090
12092 {
12094 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12095
12096 return super.GetTemperatureThawTime();
12097 }
12098
12103
12105 {
12106 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12107 }
12108
12110 {
12111 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12112 }
12113
12116 {
12118 }
12119
12121 {
12123 }
12124
12126 {
12128 }
12129
12132 {
12133 return null;
12134 }
12135
12138 {
12139 return false;
12140 }
12141
12143 {
12145 {
12148 if (!trg)
12149 {
12151 explosive = this;
12152 }
12153
12154 explosive.PairRemote(trg);
12156
12157 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12158 trg.SetPersistentPairID(persistentID);
12159 explosive.SetPersistentPairID(persistentID);
12160
12161 return true;
12162 }
12163 return false;
12164 }
12165
12168 {
12169 float ret = 1.0;
12172 ret *= GetHealth01();
12173
12174 return ret;
12175 }
12176
12177 #ifdef DEVELOPER
12178 override void SetDebugItem()
12179 {
12180 super.SetDebugItem();
12181 _itemBase = this;
12182 }
12183
12185 {
12186 string text = super.GetDebugText();
12187
12189 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12190
12191 return text;
12192 }
12193 #endif
12194
12196 {
12197 return true;
12198 }
12199
12201
12203
12205 {
12208 }
12209
12210
12218
12234}
12235
12237{
12239 if (entity)
12240 {
12241 bool is_item = entity.IsInherited(
ItemBase);
12242 if (is_item && full_quantity)
12243 {
12246 }
12247 }
12248 else
12249 {
12251 return NULL;
12252 }
12253 return entity;
12254}
12255
12257{
12258 if (item)
12259 {
12260 if (health > 0)
12261 item.SetHealth("", "", health);
12262
12263 if (item.CanHaveTemperature())
12264 {
12266 if (item.CanFreeze())
12267 item.SetFrozen(false);
12268 }
12269
12270 if (item.HasEnergyManager())
12271 {
12272 if (quantity >= 0)
12273 {
12274 item.GetCompEM().SetEnergy0To1(quantity);
12275 }
12276 else
12277 {
12279 }
12280 }
12281 else if (item.IsMagazine())
12282 {
12283 Magazine mag = Magazine.Cast(item);
12284 if (quantity >= 0)
12285 {
12286 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12287 }
12288 else
12289 {
12291 }
12292
12293 }
12294 else
12295 {
12296 if (quantity >= 0)
12297 {
12298 item.SetQuantityNormalized(quantity, false);
12299 }
12300 else
12301 {
12303 }
12304
12305 }
12306 }
12307}
12308
12309#ifdef DEVELOPER
12311#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
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...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
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...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
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()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
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)
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()
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)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
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)
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
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
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.