Send message to owner player in green color.
7440{
7442 {
7443 return true;
7444 }
7445};
7446
7447
7448
7450{
7454
7456
7459
7460
7461
7462
7463
7472
7478
7483
7488
7509 protected bool m_IsResultOfSplit
7510
7512
7517
7518
7519
7521
7525
7526
7527
7529
7532
7533
7534
7540
7541
7549
7552
7553
7555
7556
7558
7559
7564
7565
7570
7571
7573
7574
7576 {
7581
7582 if (!
GetGame().IsDedicatedServer())
7583 {
7585 {
7587
7589 {
7591 }
7592 }
7593
7596 }
7597
7598 m_OldLocation = null;
7599
7601 {
7603 }
7604
7605 if (ConfigIsExisting("headSelectionsToHide"))
7606 {
7609 }
7610
7612 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
7613 {
7615 }
7616
7618
7619 m_IsResultOfSplit = false;
7620
7622 }
7623
7625 {
7626 super.InitItemVariables();
7627
7633 m_Count = ConfigGetInt(
"count");
7634
7637
7642
7645
7650
7662
7666
7667
7670 if (ConfigIsExisting("canBeSplit"))
7671 {
7674 }
7675
7677 if (ConfigIsExisting("itemBehaviour"))
7679
7680
7683 RegisterNetSyncVariableInt("m_VarLiquidType");
7684 RegisterNetSyncVariableInt("m_Cleanness",0,1);
7685
7686 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
7687 RegisterNetSyncVariableFloat("m_ImpactSpeed");
7688 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
7689
7690 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
7691 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
7692 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
7693 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
7694
7695 RegisterNetSyncVariableBool("m_IsBeingPlaced");
7696 RegisterNetSyncVariableBool("m_IsTakeable");
7697 RegisterNetSyncVariableBool("m_IsHologram");
7698
7701 {
7704 }
7705
7707
7709 if (ConfigIsExisting("temperaturePerQuantityWeight"))
7711
7712 }
7713
7715 {
7717 }
7718
7720 {
7723 {
7728 }
7729 }
7730
7731 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
7732 {
7734 {
7737 }
7738
7740 }
7741
7743 {
7749 }
7750
7752
7754 {
7756
7757 if (!action)
7758 {
7759 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
7760 return;
7761 }
7762
7764 if (!ai)
7765 {
7767 return;
7768 }
7769
7771 if (!action_array)
7772 {
7773 action_array = new array<ActionBase_Basic>;
7775 }
7776 if (LogManager.IsActionLogEnable())
7777 {
7778 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
7779 }
7780
7781 if (action_array.Find(action) != -1)
7782 {
7783 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
7784 }
7785 else
7786 {
7787 action_array.Insert(action);
7788 }
7789 }
7790
7792 {
7794 ActionBase action = player.GetActionManager().GetAction(actionName);
7797
7798 if (action_array)
7799 {
7800 action_array.RemoveItem(action);
7801 }
7802 }
7803
7804
7805
7807 {
7808 ActionOverrideData overrideData = new ActionOverrideData();
7812
7814 if (!actionMap)
7815 {
7818 }
7819
7820 actionMap.Insert(this.
Type(), overrideData);
7821
7822 }
7823
7825
7827
7828
7830 {
7833
7836
7837 string config_to_search = "CfgVehicles";
7838 string muzzle_owner_config;
7839
7841 {
7842 if (IsInherited(Weapon))
7843 config_to_search = "CfgWeapons";
7844
7845 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7846
7847 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
7848
7850
7851 if (config_OnFire_subclass_count > 0)
7852 {
7853 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
7854
7855 for (int i = 0; i < config_OnFire_subclass_count; i++)
7856 {
7857 string particle_class = "";
7859 string config_OnFire_entry = config_OnFire_class + particle_class;
7860 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
7861 WPOF_array.Insert(WPOF);
7862 }
7863
7864
7866 }
7867 }
7868
7870 {
7871 config_to_search = "CfgWeapons";
7872 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7873
7874 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
7875
7877
7878 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
7879 {
7880 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
7881
7882 for (i = 0; i < config_OnBulletCasingEject_count; i++)
7883 {
7884 string particle_class2 = "";
7886 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
7887 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
7888 WPOBE_array.Insert(WPOBE);
7889 }
7890
7891
7893 }
7894 }
7895 }
7896
7897
7899 {
7902
7904 {
7905 string config_to_search = "CfgVehicles";
7906
7907 if (IsInherited(Weapon))
7908 config_to_search = "CfgWeapons";
7909
7910 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
7911 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
7912
7913 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
7914 {
7915
7917
7919 {
7921 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
7923 return;
7924 }
7925
7928
7929
7930
7932 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
7933
7934 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
7935 {
7936 string particle_class = "";
7938 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
7940
7941 if (entry_type == CT_CLASS)
7942 {
7943 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
7944 WPOOH_array.Insert(WPOF);
7945 }
7946 }
7947
7948
7950 }
7951 }
7952 }
7953
7955 {
7957 }
7958
7960 {
7962 {
7964
7967
7970
7971 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7972 }
7973 }
7974
7976 {
7978 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7979
7981 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7982
7984 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
7985
7987 {
7989 }
7990 }
7991
7993 {
7995 }
7996
7998 {
8001 else
8003
8005 {
8008 }
8009 else
8010 {
8013
8016 }
8017
8019 }
8020
8022 {
8024 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8025 }
8026
8028 {
8030 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8032 }
8033
8035 {
8037 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8038 }
8039
8041 {
8044
8045 OverheatingParticle OP = new OverheatingParticle();
8050
8052 }
8053
8055 {
8058
8059 return -1;
8060 }
8061
8063 {
8065 {
8068
8069 for (int i = count; i > 0; --i)
8070 {
8071 int id = i - 1;
8074
8077
8078 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8079 {
8080 if (p)
8081 {
8084 }
8085 }
8086 }
8087 }
8088 }
8089
8091 {
8093 {
8095 {
8096 int id = i - 1;
8098
8099 if (OP)
8100 {
8102
8103 if (p)
8104 {
8106 }
8107
8108 delete OP;
8109 }
8110 }
8111
8114 }
8115 }
8116
8119 {
8120 return 0.0;
8121 }
8122
8123
8125 {
8126 return 250;
8127 }
8128
8130 {
8131 return 0;
8132 }
8133
8136 {
8138 return true;
8139
8140 return false;
8141 }
8142
8145 {
8148
8150 {
8152 }
8153 else
8154 {
8155
8157 }
8158
8160 }
8161
8168 {
8169 return -1;
8170 }
8171
8172
8173
8174
8176 {
8178 {
8180 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8181
8182 if (r_index >= 0)
8183 {
8184 InventoryLocation r_il = new InventoryLocation;
8185 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8186
8187 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8190 {
8191 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8192 }
8194 {
8195 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8196 }
8197
8198 }
8199
8200 player.GetHumanInventory().ClearUserReservedLocation(this);
8201 }
8202
8205 }
8206
8207
8208
8209
8211 {
8212 return ItemBase.m_DebugActionsMask;
8213 }
8214
8216 {
8217 return ItemBase.m_DebugActionsMask & mask;
8218 }
8219
8221 {
8222 ItemBase.m_DebugActionsMask = mask;
8223 }
8224
8226 {
8227 ItemBase.m_DebugActionsMask |= mask;
8228 }
8229
8231 {
8232 ItemBase.m_DebugActionsMask &= ~mask;
8233 }
8234
8236 {
8238 {
8240 }
8241 else
8242 {
8244 }
8245 }
8246
8247
8249 {
8250 if (GetEconomyProfile())
8251 {
8252 float q_max = GetEconomyProfile().GetQuantityMax();
8253 if (q_max > 0)
8254 {
8255 float q_min = GetEconomyProfile().GetQuantityMin();
8256 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8257
8259 {
8260 ComponentEnergyManager comp = GetCompEM();
8262 {
8264 }
8265 }
8267 {
8269
8270 }
8271
8272 }
8273 }
8274 }
8275
8278 {
8279 EntityAI parent = GetHierarchyParent();
8280
8281 if (parent)
8282 {
8283 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8284 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8285 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8286 }
8287 }
8288
8291 {
8292 EntityAI parent = GetHierarchyParent();
8293
8294 if (parent)
8295 {
8296 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8297 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8298 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
8299 }
8300 }
8301
8303 {
8304
8305
8306
8307
8309
8311 {
8312 if (ScriptInputUserData.CanStoreInputUserData())
8313 {
8314 ScriptInputUserData ctx = new ScriptInputUserData;
8320 ctx.
Write(use_stack_max);
8323
8325 {
8326 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8327 }
8328 }
8329 }
8330 else if (!
GetGame().IsMultiplayer())
8331 {
8333 }
8334 }
8335
8337 {
8339 }
8340
8342 {
8344 }
8345
8347 {
8349 }
8350
8352 {
8353
8354 return false;
8355 }
8356
8358 {
8359 return false;
8360 }
8361
8365 {
8366 return false;
8367 }
8368
8370 {
8371 return "";
8372 }
8373
8375
8377 {
8378 return false;
8379 }
8380
8382 {
8383 return true;
8384 }
8385
8386
8387
8389 {
8390 return true;
8391 }
8392
8394 {
8395 return true;
8396 }
8397
8399 {
8400 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8402 }
8403
8405 {
8407 }
8408
8410 {
8412 if (!is_being_placed)
8414 SetSynchDirty();
8415 }
8416
8417
8419
8421 {
8423 }
8424
8426 {
8428 }
8429
8431 {
8432 return 1;
8433 }
8434
8436 {
8437 return false;
8438 }
8439
8441 {
8443 SetSynchDirty();
8444 }
8445
8446
8447
8448
8449
8450
8451
8452
8453
8454
8455
8456
8457
8458
8459
8460
8461
8462
8463
8464
8465
8466
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8481 {
8482 super.OnMovedInsideCargo(container);
8483
8484 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8485 }
8486
8487 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
8488 {
8489 super.EEItemLocationChanged(oldLoc,newLoc);
8490
8491 PlayerBase new_player = null;
8492 PlayerBase old_player = null;
8493
8494 if (newLoc.GetParent())
8495 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
8496
8497 if (oldLoc.GetParent())
8498 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
8499
8501 {
8502 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
8503
8504 if (r_index >= 0)
8505 {
8506 InventoryLocation r_il = new InventoryLocation;
8507 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8508
8509 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8512 {
8513 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8514 }
8516 {
8517 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8518 }
8519
8520 }
8521 }
8522
8524 {
8525 if (new_player)
8526 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
8527
8528 if (new_player == old_player)
8529 {
8530
8531 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
8532 {
8534 {
8535 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
8536 {
8537 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8538 }
8539 }
8540 else
8541 {
8542 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
8543 }
8544 }
8545
8546 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
8547 {
8548 int type = oldLoc.GetType();
8550 {
8551 oldLoc.GetParent().GetOnSetLock().Invoke(this);
8552 }
8554 {
8555 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
8556 }
8557 }
8558 if (!m_OldLocation)
8559 {
8560 m_OldLocation = new InventoryLocation;
8561 }
8562 m_OldLocation.Copy(oldLoc);
8563 }
8564 else
8565 {
8566 if (m_OldLocation)
8567 {
8568 m_OldLocation.Reset();
8569 }
8570 }
8571
8573 }
8574 else
8575 {
8576 if (new_player)
8577 {
8578 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
8579 if (res_index >= 0)
8580 {
8581 InventoryLocation il = new InventoryLocation;
8582 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
8584 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
8587 {
8588 il.
GetParent().GetOnReleaseLock().Invoke(it);
8589 }
8591 {
8593 }
8594
8595 }
8596 }
8598 {
8599
8601 }
8602
8603 if (m_OldLocation)
8604 {
8605 m_OldLocation.Reset();
8606 }
8607 }
8608 }
8609
8610 override void EOnContact(IEntity other, Contact extra)
8611 {
8613 {
8614 int liquidType = -1;
8616 if (impactSpeed > 0.0)
8617 {
8619 #ifndef SERVER
8621 #else
8623 SetSynchDirty();
8624 #endif
8626 }
8627 }
8628
8629 #ifdef SERVER
8630 if (GetCompEM() && GetCompEM().IsPlugged())
8631 {
8632 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
8633 GetCompEM().UnplugThis();
8634 }
8635 #endif
8636 }
8637
8639
8641 {
8643 }
8644
8646 {
8647
8648 }
8649
8651 {
8652 super.OnItemLocationChanged(old_owner, new_owner);
8653
8654 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
8655 PlayerBase playerNew = PlayerBase.Cast(new_owner);
8656
8657 if (!relatedPlayer && playerNew)
8658 relatedPlayer = playerNew;
8659
8660 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
8661 {
8663 if (actionMgr)
8664 {
8665 ActionBase currentAction = actionMgr.GetRunningAction();
8666 if (currentAction)
8668 }
8669 }
8670
8671 Man ownerPlayerOld = null;
8672 Man ownerPlayerNew = null;
8673
8674 if (old_owner)
8675 {
8676 if (old_owner.
IsMan())
8677 {
8678 ownerPlayerOld = Man.Cast(old_owner);
8679 }
8680 else
8681 {
8682 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
8683 }
8684 }
8685 else
8686 {
8688 {
8690
8691 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
8692 {
8693 GetCompEM().UnplugThis();
8694 }
8695 }
8696 }
8697
8698 if (new_owner)
8699 {
8700 if (new_owner.
IsMan())
8701 {
8702 ownerPlayerNew = Man.Cast(new_owner);
8703 }
8704 else
8705 {
8706 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
8707 }
8708 }
8709
8710 if (ownerPlayerOld != ownerPlayerNew)
8711 {
8712 if (ownerPlayerOld)
8713 {
8714 array<EntityAI> subItemsExit = new array<EntityAI>;
8716 for (int i = 0; i < subItemsExit.Count(); i++)
8717 {
8720 }
8721 }
8722
8723 if (ownerPlayerNew)
8724 {
8725 array<EntityAI> subItemsEnter = new array<EntityAI>;
8727 for (int j = 0; j < subItemsEnter.Count(); j++)
8728 {
8731 }
8732 }
8733 }
8734 else if (ownerPlayerNew != null)
8735 {
8736 PlayerBase nplayer;
8737 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
8738 {
8739 array<EntityAI> subItemsUpdate = new array<EntityAI>;
8741 for (int k = 0; k < subItemsUpdate.Count(); k++)
8742 {
8744 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
8745 }
8746 }
8747 }
8748
8749 if (old_owner)
8750 old_owner.OnChildItemRemoved(this);
8751 if (new_owner)
8752 new_owner.OnChildItemReceived(this);
8753 }
8754
8755
8757 {
8758 super.EEDelete(parent);
8759 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
8760 if (player)
8761 {
8763
8764 if (player.IsAlive())
8765 {
8766 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8767 if (r_index >= 0)
8768 {
8769 InventoryLocation r_il = new InventoryLocation;
8770 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8771
8772 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8775 {
8776 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8777 }
8779 {
8780 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8781 }
8782
8783 }
8784
8785 player.RemoveQuickBarEntityShortcut(this);
8786 }
8787 }
8788 }
8789
8791 {
8792 super.EEKilled(killer);
8793
8796 {
8797 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
8798 {
8799 if (IsMagazine())
8800 {
8801 if (Magazine.Cast(this).GetAmmoCount() > 0)
8802 {
8804 }
8805 }
8806 else
8807 {
8809 }
8810 }
8811 }
8812 }
8813
8815 {
8816 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
8817
8818 super.OnWasAttached(parent, slot_id);
8819
8822
8824 }
8825
8827 {
8828 super.OnWasDetached(parent, slot_id);
8829
8832 }
8833
8835 {
8836 int idx;
8839
8840 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8841 if (inventory_slots.Count() < 1)
8842 {
8843 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
8844 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
8845 }
8846 else
8847 {
8848 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
8849 }
8850
8851 idx = inventory_slots.Find(slot);
8852 if (idx < 0)
8853 return "";
8854
8855 return attach_types.Get(idx);
8856 }
8857
8859 {
8860 int idx = -1;
8861 string slot;
8862
8865
8866 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
8867 if (inventory_slots.Count() < 1)
8868 {
8869 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
8870 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8871 }
8872 else
8873 {
8874 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
8875 if (detach_types.Count() < 1)
8876 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
8877 }
8878
8879 for (int i = 0; i < inventory_slots.Count(); i++)
8880 {
8881 slot = inventory_slots.Get(i);
8882 }
8883
8884 if (slot != "")
8885 {
8886 if (detach_types.Count() == 1)
8887 idx = 0;
8888 else
8889 idx = inventory_slots.Find(slot);
8890 }
8891 if (idx < 0)
8892 return "";
8893
8894 return detach_types.Get(idx);
8895 }
8896
8898 {
8899
8901
8902
8903 float min_time = 1;
8904 float max_time = 3;
8905 float delay = Math.RandomFloat(min_time, max_time);
8906
8907 explode_timer.Run(delay, this, "DoAmmoExplosion");
8908 }
8909
8911 {
8912 Magazine magazine = Magazine.Cast(this);
8913 int pop_sounds_count = 6;
8914 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
8915
8916
8917 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
8918 string sound_name = pop_sounds[ sound_idx ];
8920
8921
8922 magazine.ServerAddAmmoCount(-1);
8923
8924
8925 float min_temp_to_explode = 100;
8926
8927 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
8928 {
8930 }
8931 }
8932
8933
8934 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
8935 {
8936 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
8937
8938 const int CHANCE_DAMAGE_CARGO = 4;
8939 const int CHANCE_DAMAGE_ATTACHMENT = 1;
8940 const int CHANCE_DAMAGE_NOTHING = 2;
8941
8943 {
8944 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
8945 int chances;
8946 int rnd;
8947
8948 if (GetInventory().GetCargo())
8949 {
8950 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8951 rnd = Math.RandomInt(0,chances);
8952
8953 if (rnd < CHANCE_DAMAGE_CARGO)
8954 {
8956 }
8957 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
8958 {
8960 }
8961 }
8962 else
8963 {
8964 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
8965 rnd = Math.RandomInt(0,chances);
8966
8967 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
8968 {
8970 }
8971 }
8972 }
8973 }
8974
8976 {
8977 if (GetInventory().GetCargo())
8978 {
8979 int item_count = GetInventory().GetCargo().GetItemCount();
8980 if (item_count > 0)
8981 {
8982 int random_pick = Math.RandomInt(0, item_count);
8984 if (!item.IsExplosive())
8985 {
8986 item.AddHealth("","",damage);
8987 return true;
8988 }
8989 }
8990 }
8991 return false;
8992 }
8993
8995 {
8996 int attachment_count = GetInventory().AttachmentCount();
8997 if (attachment_count > 0)
8998 {
8999 int random_pick = Math.RandomInt(0, attachment_count);
9000 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9001 if (!attachment.IsExplosive())
9002 {
9003 attachment.AddHealth("","",damage);
9004 return true;
9005 }
9006 }
9007 return false;
9008 }
9009
9011 {
9013 }
9014
9016 {
9018 return GetInventory().CanRemoveEntity();
9019
9020 return false;
9021 }
9022
9024 {
9026 return;
9027
9029 {
9030 if (ScriptInputUserData.CanStoreInputUserData())
9031 {
9032 ScriptInputUserData ctx = new ScriptInputUserData;
9037 ctx.
Write(destination_entity);
9041 }
9042 }
9043 else if (!
GetGame().IsMultiplayer())
9044 {
9046 }
9047 }
9048
9050 {
9052 return;
9053
9054 float split_quantity_new;
9058 InventoryLocation loc = new InventoryLocation;
9059
9060 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9061 {
9063 split_quantity_new = stack_max;
9064 else
9066
9067 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9068 if (new_item)
9069 {
9070 new_item.SetResultOfSplit(true);
9071 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9073 new_item.SetQuantity(split_quantity_new);
9074 }
9075 }
9076 else if (destination_entity && slot_id == -1)
9077 {
9078 if (quantity > stack_max)
9079 split_quantity_new = stack_max;
9080 else
9081 split_quantity_new = quantity;
9082
9084 {
9087 }
9088
9089 if (new_item)
9090 {
9091 new_item.SetResultOfSplit(true);
9092 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9094 new_item.SetQuantity(split_quantity_new);
9095 }
9096 }
9097 else
9098 {
9099 if (stack_max != 0)
9100 {
9102 {
9104 }
9105
9106 if (split_quantity_new == 0)
9107 {
9108 if (!
GetGame().IsMultiplayer())
9109 player.PhysicalPredictiveDropItem(this);
9110 else
9111 player.ServerDropEntity(this);
9112 return;
9113 }
9114
9116
9117 if (new_item)
9118 {
9119 new_item.SetResultOfSplit(true);
9120 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9122 new_item.SetQuantity(stack_max);
9123 new_item.PlaceOnSurface();
9124 }
9125 }
9126 }
9127 }
9128
9130 {
9132 return;
9133
9134 float split_quantity_new;
9138 InventoryLocation loc = new InventoryLocation;
9139
9140 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9141 {
9143 split_quantity_new = stack_max;
9144 else
9146
9147 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9148 if (new_item)
9149 {
9150 new_item.SetResultOfSplit(true);
9151 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9153 new_item.SetQuantity(split_quantity_new);
9154 }
9155 }
9156 else if (destination_entity && slot_id == -1)
9157 {
9158 if (quantity > stack_max)
9159 split_quantity_new = stack_max;
9160 else
9161 split_quantity_new = quantity;
9162
9164 {
9167 }
9168
9169 if (new_item)
9170 {
9171 new_item.SetResultOfSplit(true);
9172 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9174 new_item.SetQuantity(split_quantity_new);
9175 }
9176 }
9177 else
9178 {
9179 if (stack_max != 0)
9180 {
9182 {
9184 }
9185
9187
9188 if (new_item)
9189 {
9190 new_item.SetResultOfSplit(true);
9191 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9193 new_item.SetQuantity(stack_max);
9194 new_item.PlaceOnSurface();
9195 }
9196 }
9197 }
9198 }
9199
9201 {
9203 return;
9204
9206 {
9207 if (ScriptInputUserData.CanStoreInputUserData())
9208 {
9209 ScriptInputUserData ctx = new ScriptInputUserData;
9214 dst.WriteToContext(ctx);
9216 }
9217 }
9218 else if (!
GetGame().IsMultiplayer())
9219 {
9221 }
9222 }
9223
9225 {
9227 return;
9228
9230 {
9231 if (ScriptInputUserData.CanStoreInputUserData())
9232 {
9233 ScriptInputUserData ctx = new ScriptInputUserData;
9238 ctx.
Write(destination_entity);
9244 }
9245 }
9246 else if (!
GetGame().IsMultiplayer())
9247 {
9249 }
9250 }
9251
9253 {
9255 }
9256
9258 {
9260 return this;
9261
9263 float split_quantity_new;
9265 if (dst.IsValid())
9266 {
9267 int slot_id = dst.GetSlot();
9269
9270 if (quantity > stack_max)
9271 split_quantity_new = stack_max;
9272 else
9273 split_quantity_new = quantity;
9274
9276
9277 if (new_item)
9278 {
9279 new_item.SetResultOfSplit(true);
9280 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9283 }
9284
9285 return new_item;
9286 }
9287
9288 return null;
9289 }
9290
9292 {
9294 return;
9295
9297 float split_quantity_new;
9299 if (destination_entity)
9300 {
9302 if (quantity > stackable)
9303 split_quantity_new = stackable;
9304 else
9305 split_quantity_new = quantity;
9306
9307 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
9308 if (new_item)
9309 {
9310 new_item.SetResultOfSplit(true);
9311 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9313 new_item.SetQuantity(split_quantity_new);
9314 }
9315 }
9316 }
9317
9319 {
9321 return;
9322
9324 {
9325 if (ScriptInputUserData.CanStoreInputUserData())
9326 {
9327 ScriptInputUserData ctx = new ScriptInputUserData;
9332 ItemBase destination_entity =
this;
9333 ctx.
Write(destination_entity);
9337 }
9338 }
9339 else if (!
GetGame().IsMultiplayer())
9340 {
9342 }
9343 }
9344
9346 {
9348 return;
9349
9351 float split_quantity_new;
9353 if (player)
9354 {
9356 if (quantity > stackable)
9357 split_quantity_new = stackable;
9358 else
9359 split_quantity_new = quantity;
9360
9361 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
9362 new_item =
ItemBase.Cast(in_hands);
9363 if (new_item)
9364 {
9365 new_item.SetResultOfSplit(true);
9366 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9368 new_item.SetQuantity(split_quantity_new);
9369 }
9370 }
9371 }
9372
9374 {
9376 return;
9377
9379 float split_quantity_new = Math.Floor(quantity * 0.5);
9380
9382
9383 if (new_item)
9384 {
9385 if (new_item.GetQuantityMax() < split_quantity_new)
9386 {
9387 split_quantity_new = new_item.GetQuantityMax();
9388 }
9389
9390 new_item.SetResultOfSplit(true);
9391 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9392
9394 {
9397 }
9398 else
9399 {
9402 }
9403 }
9404 }
9405
9407 {
9409 return;
9410
9412 float split_quantity_new = Math.Floor(quantity / 2);
9413
9414 InventoryLocation invloc = new InventoryLocation;
9416
9418 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
9419
9420 if (new_item)
9421 {
9422 if (new_item.GetQuantityMax() < split_quantity_new)
9423 {
9424 split_quantity_new = new_item.GetQuantityMax();
9425 }
9427 {
9430 }
9431 else
9432 {
9435 }
9436 }
9437 }
9438
9441 {
9442 SetWeightDirty();
9444
9445 if (parent)
9446 parent.OnAttachmentQuantityChangedEx(this, delta);
9447
9449 {
9451 {
9453 }
9455 {
9456 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
9458 }
9459 }
9460
9461 }
9462
9465 {
9466
9467 }
9468
9471 {
9473 }
9474
9476 {
9477 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
9478
9480 {
9481 if (newLevel == GameConstants.STATE_RUINED)
9482 {
9484 EntityAI parent = GetHierarchyParent();
9485 if (parent && parent.IsFireplace())
9486 {
9487 CargoBase cargo = GetInventory().GetCargo();
9488 if (cargo)
9489 {
9491 {
9493 }
9494 }
9495 }
9496 }
9497
9499 {
9500
9502 return;
9503 }
9504
9505 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
9506 {
9508 }
9509 }
9510 }
9511
9512
9514 {
9515 super.OnRightClick();
9516
9518 {
9520 {
9521 if (ScriptInputUserData.CanStoreInputUserData())
9522 {
9523 vector m4[4];
9525
9526 EntityAI root = GetHierarchyRoot();
9527
9528 InventoryLocation dst = new InventoryLocation;
9530 {
9531 if (root)
9532 {
9533 root.GetTransform(m4);
9535 }
9536 else
9537 GetInventory().GetCurrentInventoryLocation(dst);
9538 }
9539 else
9540 {
9542
9543
9544 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
9545 {
9546 if (root)
9547 {
9548 root.GetTransform(m4);
9550 }
9551 else
9552 GetInventory().GetCurrentInventoryLocation(dst);
9553 }
9554 else
9555 {
9556 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
9557 }
9558 }
9559
9560 ScriptInputUserData ctx = new ScriptInputUserData;
9568 }
9569 }
9570 else if (!
GetGame().IsMultiplayer())
9571 {
9573 }
9574 }
9575 }
9576
9577 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
9578 {
9579
9580 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
9581 return false;
9582
9583 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
9584 return false;
9585
9586
9588 return false;
9589
9590
9591 Magazine mag = Magazine.Cast(this);
9592 if (mag)
9593 {
9594 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
9595 return false;
9596
9597 if (stack_max_limit)
9598 {
9599 Magazine other_mag = Magazine.Cast(other_item);
9600 if (other_item)
9601 {
9602 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
9603 return false;
9604 }
9605
9606 }
9607 }
9608 else
9609 {
9610
9612 return false;
9613
9615 return false;
9616 }
9617
9618 PlayerBase player = null;
9619 if (CastTo(player, GetHierarchyRootPlayer()))
9620 {
9621 if (player.GetInventory().HasAttachment(this))
9622 return false;
9623
9624 if (player.IsItemsToDelete())
9625 return false;
9626 }
9627
9628 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
9629 return false;
9630
9631 int slotID;
9633 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
9634 return false;
9635
9636 return true;
9637 }
9638
9640 {
9642 }
9643
9645 {
9646 return m_IsResultOfSplit;
9647 }
9648
9650 {
9651 m_IsResultOfSplit = value;
9652 }
9653
9655 {
9657 }
9658
9660 {
9661 float other_item_quantity = other_item.GetQuantity();
9662 float this_free_space;
9663
9665
9667
9668 if (other_item_quantity > this_free_space)
9669 {
9670 return this_free_space;
9671 }
9672 else
9673 {
9674 return other_item_quantity;
9675 }
9676 }
9677
9679 {
9681 }
9682
9684 {
9686 return;
9687
9688 if (!IsMagazine() && other_item)
9689 {
9691 if (quantity_used != 0)
9692 {
9693 float hp1 = GetHealth01("","");
9694 float hp2 = other_item.GetHealth01("","");
9695 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
9696 hpResult = hpResult / (
GetQuantity() + quantity_used);
9697
9698 hpResult *= GetMaxHealth();
9699 Math.Round(hpResult);
9700 SetHealth("", "Health", hpResult);
9701
9703 other_item.AddQuantity(-quantity_used);
9704 }
9705 }
9707 }
9708
9710 {
9711 #ifdef SERVER
9712 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
9713 GetHierarchyParent().IncreaseLifetimeUp();
9714 #endif
9715 };
9716
9718 {
9719 PlayerBase p = PlayerBase.Cast(player);
9720
9721 array<int> recipesIds = p.m_Recipes;
9722 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9723 if (moduleRecipesManager)
9724 {
9725 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
9726 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
9727 }
9728
9729 for (int i = 0;i < recipesIds.Count(); i++)
9730 {
9731 int key = recipesIds.Get(i);
9732 string recipeName = moduleRecipesManager.GetRecipeName(key);
9734 }
9735 }
9736
9737
9738 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
9739 {
9740 super.GetDebugActions(outputList);
9741
9742
9747
9748
9752
9756
9757
9760
9761
9763 {
9766 }
9767
9769
9772
9776 }
9777
9778
9779
9780
9782 {
9783 super.OnAction(action_id, player, ctx);
9784 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
9785 {
9786 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
9787 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
9788 PlayerBase p = PlayerBase.Cast(player);
9789 if (
EActions.RECIPES_RANGE_START < 1000)
9790 {
9791 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
9792 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
9793 }
9794 }
9795 #ifndef SERVER
9796 else if (action_id ==
EActions.WATCH_PLAYER)
9797 {
9798 PluginDeveloper.SetDeveloperItemClientEx(player);
9799 }
9800 #endif
9802 {
9803 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
9804 {
9805 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
9806 OnDebugButtonPressServer(id + 1);
9807 }
9808
9809 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
9810 {
9811 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
9813 }
9814
9815 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
9816 {
9817 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
9819 }
9820
9821 else if (action_id ==
EActions.ADD_QUANTITY)
9822 {
9823 if (IsMagazine())
9824 {
9825 Magazine mag = Magazine.Cast(this);
9826 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
9827 }
9828 else
9829 {
9831 }
9832
9833 if (m_EM)
9834 {
9835 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
9836 }
9837
9838 }
9839
9840 else if (action_id ==
EActions.REMOVE_QUANTITY)
9841 {
9842 if (IsMagazine())
9843 {
9844 Magazine mag2 = Magazine.Cast(this);
9845 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
9846 }
9847 else
9848 {
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.SET_QUANTITY_0)
9859 {
9861
9862 if (m_EM)
9863 {
9864 m_EM.SetEnergy(0);
9865 }
9866 }
9867
9868 else if (action_id ==
EActions.SET_MAX_QUANTITY)
9869 {
9871
9872 if (m_EM)
9873 {
9874 m_EM.SetEnergy(m_EM.GetEnergyMax());
9875 }
9876 }
9877
9878 else if (action_id ==
EActions.ADD_HEALTH)
9879 {
9880 AddHealth("","",GetMaxHealth("","Health")/5);
9881 }
9882 else if (action_id ==
EActions.REMOVE_HEALTH)
9883 {
9884 AddHealth("","",-GetMaxHealth("","Health")/5);
9885 }
9886 else if (action_id ==
EActions.DESTROY_HEALTH)
9887 {
9888 SetHealth01("","",0);
9889 }
9890 else if (action_id ==
EActions.WATCH_ITEM)
9891 {
9893 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
9894 #ifdef DEVELOPER
9895 SetDebugDeveloper_item(this);
9896 #endif
9897 }
9898
9899 else if (action_id ==
EActions.ADD_TEMPERATURE)
9900 {
9901 AddTemperature(20);
9902
9903 }
9904
9905 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
9906 {
9907 AddTemperature(-20);
9908
9909 }
9910
9911 else if (action_id ==
EActions.FLIP_FROZEN)
9912 {
9913 SetFrozen(!GetIsFrozen());
9914
9915 }
9916
9917 else if (action_id ==
EActions.ADD_WETNESS)
9918 {
9920
9921 }
9922
9923 else if (action_id ==
EActions.REMOVE_WETNESS)
9924 {
9926
9927 }
9928
9929 else if (action_id ==
EActions.LIQUIDTYPE_UP)
9930 {
9933
9934
9935 }
9936
9937 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
9938 {
9941 }
9942
9943 else if (action_id ==
EActions.MAKE_SPECIAL)
9944 {
9945 auto debugParams = DebugSpawnParams.WithPlayer(player);
9946 OnDebugSpawnEx(debugParams);
9947 }
9948
9949 else if (action_id ==
EActions.DELETE)
9950 {
9951 Delete();
9952 }
9953
9954 }
9955
9956
9957 return false;
9958 }
9959
9960
9961
9962
9966
9969
9970
9971
9973 {
9974 return false;
9975 }
9976
9977
9979 {
9980 return true;
9981 }
9982
9983
9985 {
9986 return true;
9987 }
9988
9989
9990
9992 {
9993 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
9995 }
9996
9999 {
10000 return null;
10001 }
10002
10004 {
10005 return false;
10006 }
10007
10009 {
10010 return false;
10011 }
10012
10016
10017
10019 {
10020 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10021 return module_repairing.CanRepair(this, item_repair_kit);
10022 }
10023
10024
10025 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10026 {
10027 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10028 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10029 }
10030
10031
10033 {
10034
10035
10036
10037
10038
10039
10040
10041
10042 return 1;
10043 }
10044
10045
10046
10048 {
10050 }
10051
10052
10053
10055 {
10057 }
10058
10059
10068 {
10069 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10070
10071 if (player)
10072 {
10073 player.MessageStatus(text);
10074 }
10075 }
10076
10077
10086 {
10087 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10088
10089 if (player)
10090 {
10091 player.MessageAction(text);
10092 }
10093 }
10094
10095
10104 {
10105 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10106
10107 if (player)
10108 {
10109 player.MessageFriendly(text);
10110 }
10111 }
10112
10113
10122 {
10123 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10124
10125 if (player)
10126 {
10127 player.MessageImportant(text);
10128 }
10129 }
10130
10132 {
10133 return true;
10134 }
10135
10136
10137 override bool KindOf(
string tag)
10138 {
10139 bool found = false;
10140 string item_name = this.
GetType();
10143
10144 int array_size = item_tag_array.Count();
10145 for (int i = 0; i < array_size; i++)
10146 {
10147 if (item_tag_array.Get(i) == tag)
10148 {
10149 found = true;
10150 break;
10151 }
10152 }
10153 return found;
10154 }
10155
10156
10158 {
10159
10160 super.OnRPC(sender, rpc_type,ctx);
10161
10162
10163 switch (rpc_type)
10164 {
10165 #ifndef SERVER
10166 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10167 Param2<bool, string> p = new Param2<bool, string>(false, "");
10168
10170 return;
10171
10172 bool play = p.param1;
10173 string soundSet = p.param2;
10174
10175 if (play)
10176 {
10178 {
10180 {
10182 }
10183 }
10184 else
10185 {
10187 }
10188 }
10189 else
10190 {
10192 }
10193
10194 break;
10195 #endif
10196
10197 }
10198
10200 {
10202 }
10203 }
10204
10205
10206
10207
10209 {
10210 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10211 return plugin.GetID(
name);
10212 }
10213
10215 {
10216 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10217 return plugin.GetName(id);
10218 }
10219
10222 {
10223
10224
10225 int varFlags;
10226 if (!ctx.
Read(varFlags))
10227 return;
10228
10229 if (varFlags & ItemVariableFlags.FLOAT)
10230 {
10232 }
10233 }
10234
10236 {
10237
10238 super.SerializeNumericalVars(floats_out);
10239
10240
10241
10243 {
10245 }
10246
10248 {
10250 }
10251
10253 {
10255 }
10256
10258 {
10263 }
10264
10266 {
10268 }
10269 }
10270
10272 {
10273
10274 super.DeSerializeNumericalVars(floats);
10275
10276
10277 int index = 0;
10278 int mask = Math.Round(floats.Get(index));
10279
10280 index++;
10281
10283 {
10285 {
10287 }
10288 else
10289 {
10290 float quantity = floats.Get(index);
10291 SetQuantity(quantity,
true,
false,
false,
false);
10292 }
10293 index++;
10294 }
10295
10297 {
10298 float wet = floats.Get(index);
10300 index++;
10301 }
10302
10304 {
10305 int liquidtype = Math.Round(floats.Get(index));
10307 index++;
10308 }
10309
10311 {
10313 index++;
10315 index++;
10317 index++;
10319 index++;
10320 }
10321
10323 {
10324 int cleanness = Math.Round(floats.Get(index));
10326 index++;
10327 }
10328 }
10329
10331 {
10332 super.WriteVarsToCTX(ctx);
10333
10334
10336 {
10338 }
10339
10341 {
10343 }
10344
10346 {
10348 }
10349
10351 {
10352 int r,g,b,a;
10358 }
10359
10361 {
10363 }
10364 }
10365
10367 {
10368 if (!super.ReadVarsFromCTX(ctx,version))
10369 return false;
10370
10371 int intValue;
10372 float value;
10373
10374 if (version < 140)
10375 {
10376 if (!ctx.
Read(intValue))
10377 return false;
10378
10379 m_VariablesMask = intValue;
10380 }
10381
10383 {
10384 if (!ctx.
Read(value))
10385 return false;
10386
10388 {
10390 }
10391 else
10392 {
10394 }
10395 }
10396
10397 if (version < 140)
10398 {
10400 {
10401 if (!ctx.
Read(value))
10402 return false;
10403 SetTemperatureDirect(value);
10404 }
10405 }
10406
10408 {
10409 if (!ctx.
Read(value))
10410 return false;
10412 }
10413
10415 {
10416 if (!ctx.
Read(intValue))
10417 return false;
10419 }
10420
10422 {
10423 int r,g,b,a;
10425 return false;
10427 return false;
10429 return false;
10431 return false;
10432
10434 }
10435
10437 {
10438 if (!ctx.
Read(intValue))
10439 return false;
10441 }
10442
10443 if (version >= 138 && version < 140)
10444 {
10446 {
10447 if (!ctx.
Read(intValue))
10448 return false;
10449 SetFrozen(intValue);
10450 }
10451 }
10452
10453 return true;
10454 }
10455
10456
10458 {
10461 {
10463 }
10464
10465 if (!super.OnStoreLoad(ctx, version))
10466 {
10468 return false;
10469 }
10470
10471 if (version >= 114)
10472 {
10473 bool hasQuickBarIndexSaved;
10474
10475 if (!ctx.
Read(hasQuickBarIndexSaved))
10476 {
10478 return false;
10479 }
10480
10481 if (hasQuickBarIndexSaved)
10482 {
10483 int itmQBIndex;
10484
10485
10486 if (!ctx.
Read(itmQBIndex))
10487 {
10489 return false;
10490 }
10491
10492 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
10493 if (itmQBIndex != -1 && parentPlayer)
10494 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
10495 }
10496 }
10497 else
10498 {
10499
10500 PlayerBase player;
10501 int itemQBIndex;
10502 if (version ==
int.
MAX)
10503 {
10504 if (!ctx.
Read(itemQBIndex))
10505 {
10507 return false;
10508 }
10509 }
10510 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
10511 {
10512
10513 if (!ctx.
Read(itemQBIndex))
10514 {
10516 return false;
10517 }
10518 if (itemQBIndex != -1 && player)
10519 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
10520 }
10521 }
10522
10523 if (version < 140)
10524 {
10525
10526 if (!LoadVariables(ctx, version))
10527 {
10529 return false;
10530 }
10531 }
10532
10533
10535 {
10537 return false;
10538 }
10539 if (version >= 132)
10540 {
10542 if (raib)
10543 {
10545 {
10547 return false;
10548 }
10549 }
10550 }
10551
10553 return true;
10554 }
10555
10556
10557
10559 {
10560 super.OnStoreSave(ctx);
10561
10562 PlayerBase player;
10563 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
10564 {
10566
10567 int itemQBIndex = -1;
10568 itemQBIndex = player.FindQuickBarEntityIndex(this);
10569 ctx.
Write(itemQBIndex);
10570 }
10571 else
10572 {
10574 }
10575
10577
10579 if (raib)
10580 {
10582 }
10583 }
10584
10585
10587 {
10588 super.AfterStoreLoad();
10589
10591 {
10593 }
10594
10596 {
10599 }
10600 }
10601
10603 {
10604 super.EEOnAfterLoad();
10605
10607 {
10609 }
10610
10613 }
10614
10616 {
10617 return false;
10618 }
10619
10620
10621
10623 {
10625 {
10626 #ifdef PLATFORM_CONSOLE
10627
10629 {
10631 if (menu)
10632 {
10634 }
10635 }
10636 #endif
10637 }
10638
10640 {
10643 }
10644
10646 {
10647 SetWeightDirty();
10649 }
10651 {
10654 }
10655
10657 {
10660 }
10662 {
10665 }
10666
10667 super.OnVariablesSynchronized();
10668 }
10669
10670
10671
10673 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
10674 {
10675 if (!IsServerCheck(allow_client))
10676 return false;
10677
10679 return false;
10680
10683
10684 if (value <= (min + 0.001))
10685 value = min;
10686
10687 if (value == min)
10688 {
10689 if (destroy_config)
10690 {
10691 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
10692 if (dstr)
10693 {
10695 this.Delete();
10696 return true;
10697 }
10698 }
10699 else if (destroy_forced)
10700 {
10702 this.Delete();
10703 return true;
10704 }
10705
10707 }
10708
10711
10713 {
10715
10716 if (delta)
10718 }
10719
10721
10722 return false;
10723 }
10724
10725
10727 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
10728 {
10730 }
10731
10733 {
10736 }
10737
10739 {
10742 }
10743
10746 {
10747 float value_clamped = Math.Clamp(value, 0, 1);
10749 SetQuantity(result, destroy_config, destroy_forced);
10750 }
10751
10752
10755 {
10757 }
10758
10760 {
10762 }
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10774 {
10775 int slot = -1;
10776 if (GetInventory())
10777 {
10778 InventoryLocation il = new InventoryLocation;
10779 GetInventory().GetCurrentInventoryLocation(il);
10781 }
10782
10784 }
10785
10787 {
10788 float quantity_max = 0;
10789
10791 {
10792 if (attSlotID != -1)
10793 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
10794
10795 if (quantity_max <= 0)
10797 }
10798
10799 if (quantity_max <= 0)
10801
10802 return quantity_max;
10803 }
10804
10806 {
10808 }
10809
10811 {
10813 }
10814
10815
10817 {
10819 }
10820
10822 {
10824 }
10825
10827 {
10829 }
10830
10831
10833 {
10834
10835 float weightEx = GetWeightEx();
10836 float special = GetInventoryAndCargoWeight();
10837 return weightEx - special;
10838 }
10839
10840
10842 {
10844 }
10845
10847 {
10849 {
10850 #ifdef DEVELOPER
10851 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10852 {
10853 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
10855 }
10856 #endif
10857
10858 return GetQuantity() * GetConfigWeightModified();
10859 }
10860 else if (HasEnergyManager())
10861 {
10862 #ifdef DEVELOPER
10863 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10864 {
10865 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
10866 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
10867 }
10868 #endif
10869 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
10870 }
10871 else
10872 {
10873 #ifdef DEVELOPER
10874 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
10875 {
10876 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
10877 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
10878 }
10879 #endif
10880 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
10881 }
10882 }
10883
10886 {
10887 int item_count = 0;
10889
10890 if (GetInventory().GetCargo() != NULL)
10891 {
10892 item_count = GetInventory().GetCargo().GetItemCount();
10893 }
10894
10895 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
10896 {
10897 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
10898 if (item)
10899 item_count += item.GetNumberOfItems();
10900 }
10901 return item_count;
10902 }
10903
10906 {
10907 float weight = 0;
10908 float wetness = 1;
10909 if (include_wetness)
10912 {
10913 weight = wetness * m_ConfigWeight;
10914 }
10916 {
10917 weight = 1;
10918 }
10919 return weight;
10920 }
10921
10922
10923
10925 {
10926 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
10927 {
10928 GameInventory inv = GetInventory();
10929 array<EntityAI> items = new array<EntityAI>;
10931 for (int i = 0; i < items.Count(); i++)
10932 {
10934 if (item)
10935 {
10937 }
10938 }
10939 }
10940 }
10941
10942
10943
10944
10946 {
10947 float energy = 0;
10948 if (HasEnergyManager())
10949 {
10950 energy = GetCompEM().GetEnergy();
10951 }
10952 return energy;
10953 }
10954
10955
10957 {
10958 super.OnEnergyConsumed();
10959
10961 }
10962
10964 {
10965 super.OnEnergyAdded();
10966
10968 }
10969
10970
10972 {
10973 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
10974 {
10976 {
10977 float energy_0to1 = GetCompEM().GetEnergy0To1();
10979 }
10980 }
10981 }
10982
10983
10985 {
10986 return ConfigGetFloat("heatIsolation");
10987 }
10988
10990 {
10992 }
10993
10995 {
10996 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
10997 if (
GetGame().ConfigIsExisting(paramPath))
10999
11000 return 0.0;
11001 }
11002
11004 {
11005 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11006 if (
GetGame().ConfigIsExisting(paramPath))
11008
11009 return 0.0;
11010 }
11011
11012 override void SetWet(
float value,
bool allow_client =
false)
11013 {
11014 if (!IsServerCheck(allow_client))
11015 return;
11016
11019
11021
11022 m_VarWet = Math.Clamp(value, min, max);
11023
11025 {
11028 }
11029 }
11030
11031 override void AddWet(
float value)
11032 {
11034 }
11035
11037 {
11039 }
11040
11042 {
11044 }
11045
11047 {
11049 }
11050
11052 {
11054 }
11055
11057 {
11059 }
11060
11061 override void OnWetChanged(
float newVal,
float oldVal)
11062 {
11065 if (newLevel != oldLevel)
11066 {
11068 }
11069 }
11070
11072 {
11073 SetWeightDirty();
11074 }
11075
11077 {
11078 return GetWetLevelInternal(
m_VarWet);
11079 }
11080
11081
11082
11084 {
11086 }
11087
11089 {
11091 }
11092
11094 {
11096 }
11097
11099 {
11101 }
11102
11103
11104
11106 {
11107 if (ConfigIsExisting("itemModelLength"))
11108 {
11109 return ConfigGetFloat("itemModelLength");
11110 }
11111 return 0;
11112 }
11113
11115 {
11116 if (ConfigIsExisting("itemAttachOffset"))
11117 {
11118 return ConfigGetFloat("itemAttachOffset");
11119 }
11120 return 0;
11121 }
11122
11123 override void SetCleanness(
int value,
bool allow_client =
false)
11124 {
11125 if (!IsServerCheck(allow_client))
11126 return;
11127
11129
11131
11134 }
11135
11137 {
11139 }
11140
11142 {
11143 return true;
11144 }
11145
11146
11147
11148
11150 {
11152 }
11153
11155 {
11157 }
11158
11159
11160
11161
11162 override void SetColor(
int r,
int g,
int b,
int a)
11163 {
11169 }
11171 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11172 {
11177 }
11178
11180 {
11182 }
11183
11186 {
11187 int r,g,b,a;
11189 r = r/255;
11190 g = g/255;
11191 b = b/255;
11192 a = a/255;
11193 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11194 }
11195
11196
11197
11198 override void SetLiquidType(
int value,
bool allow_client =
false)
11199 {
11200 if (!IsServerCheck(allow_client))
11201 return;
11202
11207 }
11208
11210 {
11211 return ConfigGetInt("varLiquidTypeInit");
11212 }
11213
11215 {
11217 }
11218
11220 {
11222 SetFrozen(false);
11223 }
11224
11227 {
11228 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11229 }
11230
11231
11234 {
11235 PlayerBase nplayer;
11236 if (PlayerBase.CastTo(nplayer, player))
11237 {
11239
11240 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11241 }
11242 }
11243
11244
11247 {
11248 PlayerBase nplayer;
11249 if (PlayerBase.CastTo(nplayer,player))
11250 {
11251
11252 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11253
11254 }
11255
11256
11257 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11258
11259
11260 if (HasEnergyManager())
11261 {
11262 GetCompEM().UpdatePlugState();
11263 }
11264 }
11265
11266
11268 {
11269 super.OnPlacementStarted(player);
11270
11272 }
11273
11274 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11275 {
11277 {
11278 m_AdminLog.OnPlacementComplete(player,
this);
11279 }
11280
11281 super.OnPlacementComplete(player, position, orientation);
11282 }
11283
11284
11285
11286
11287
11289 {
11291 {
11292 return true;
11293 }
11294 else
11295 {
11296 return false;
11297 }
11298 }
11299
11300
11302 {
11304 {
11306 }
11307 }
11308
11309
11311 {
11313 }
11314
11316 {
11318 }
11319
11320 override void InsertAgent(
int agent,
float count = 1)
11321 {
11322 if (count < 1)
11323 return;
11324
11326 }
11327
11330 {
11332 }
11333
11334
11336 {
11338 }
11339
11340
11341
11342
11343
11344
11345
11346
11347
11348
11349
11350
11351
11352
11353
11354
11355
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
11382 {
11384 return false;
11385 return true;
11386 }
11387
11389 {
11390
11392 }
11393
11394
11397 {
11398 super.CheckForRoofLimited(timeTresholdMS);
11399
11401 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
11402 {
11403 m_PreviousRoofTestTime = time;
11404 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
11405 }
11406 }
11407
11408
11410 {
11412 {
11413 return 0;
11414 }
11415
11416 if (GetInventory().GetAttachmentSlotsCount() != 0)
11417 {
11418 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
11419 if (filter)
11420 return filter.GetProtectionLevel(type, false, system);
11421 else
11422 return 0;
11423 }
11424
11425 string subclassPath, entryName;
11426
11427 switch (type)
11428 {
11430 entryName = "biological";
11431 break;
11433 entryName = "chemical";
11434 break;
11435 default:
11436 entryName = "biological";
11437 break;
11438 }
11439
11440 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
11441
11443 }
11444
11445
11446
11449 {
11450 if (!IsMagazine())
11452
11454 }
11455
11456
11457
11458
11459
11464 {
11465 return true;
11466 }
11467
11469 {
11471 }
11472
11473
11474
11475
11476
11478 {
11479 if (parent)
11480 {
11481 if (parent.IsInherited(DayZInfected))
11482 return true;
11483
11484 if (!parent.IsRuined())
11485 return true;
11486 }
11487
11488 return true;
11489 }
11490
11492 {
11493 if (!super.CanPutAsAttachment(parent))
11494 {
11495 return false;
11496 }
11497
11498 if (!IsRuined() && !parent.IsRuined())
11499 {
11500 return true;
11501 }
11502
11503 return false;
11504 }
11505
11507 {
11508
11509
11510
11511
11512 return super.CanReceiveItemIntoCargo(item);
11513 }
11514
11516 {
11517
11518
11519
11520
11521 GameInventory attachmentInv = attachment.GetInventory();
11523 {
11524 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
11525 return false;
11526 }
11527
11528 InventoryLocation loc = new InventoryLocation();
11529 attachment.GetInventory().GetCurrentInventoryLocation(loc);
11530 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
11531 return false;
11532
11533 return super.CanReceiveAttachment(attachment, slotId);
11534 }
11535
11537 {
11538 if (!super.CanReleaseAttachment(attachment))
11539 return false;
11540
11541 return GetInventory().AreChildrenAccessible();
11542 }
11543
11544
11545
11546
11547
11548
11549
11550
11551
11552
11553
11554
11555
11556
11557
11558
11559
11560
11561
11562
11563
11565 {
11566 int id = muzzle_owner.GetMuzzleID();
11567 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
11568
11569 if (WPOF_array)
11570 {
11571 for (int i = 0; i < WPOF_array.Count(); i++)
11572 {
11573 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
11574
11575 if (WPOF)
11576 {
11577 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
11578 }
11579 }
11580 }
11581 }
11582
11583
11585 {
11586 int id = muzzle_owner.GetMuzzleID();
11588
11589 if (WPOBE_array)
11590 {
11591 for (int i = 0; i < WPOBE_array.Count(); i++)
11592 {
11593 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
11594
11595 if (WPOBE)
11596 {
11597 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11598 }
11599 }
11600 }
11601 }
11602
11603
11605 {
11606 int id = muzzle_owner.GetMuzzleID();
11607 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11608
11609 if (WPOOH_array)
11610 {
11611 for (int i = 0; i < WPOOH_array.Count(); i++)
11612 {
11613 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11614
11615 if (WPOOH)
11616 {
11617 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
11618 }
11619 }
11620 }
11621 }
11622
11623
11625 {
11626 int id = muzzle_owner.GetMuzzleID();
11627 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11628
11629 if (WPOOH_array)
11630 {
11631 for (int i = 0; i < WPOOH_array.Count(); i++)
11632 {
11633 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11634
11635 if (WPOOH)
11636 {
11637 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11638 }
11639 }
11640 }
11641 }
11642
11643
11645 {
11646 int id = muzzle_owner.GetMuzzleID();
11647 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
11648
11649 if (WPOOH_array)
11650 {
11651 for (int i = 0; i < WPOOH_array.Count(); i++)
11652 {
11653 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
11654
11655 if (WPOOH)
11656 {
11657 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
11658 }
11659 }
11660 }
11661 }
11662
11663
11664
11666 {
11668 {
11669 return true;
11670 }
11671
11672 return false;
11673 }
11674
11676 {
11678 {
11679 return true;
11680 }
11681
11682 return false;
11683 }
11684
11686 {
11688 {
11689 return true;
11690 }
11691
11692 return false;
11693 }
11694
11696 {
11697 return false;
11698 }
11699
11702 {
11703 return UATimeSpent.DEFAULT_DEPLOY;
11704 }
11705
11706
11707
11708
11710 {
11712 SetSynchDirty();
11713 }
11714
11716 {
11718 }
11719
11720
11722 {
11723 return false;
11724 }
11725
11728 {
11729 string att_type = "None";
11730
11731 if (ConfigIsExisting("soundAttType"))
11732 {
11733 att_type = ConfigGetString("soundAttType");
11734 }
11735
11737 }
11738
11740 {
11742 }
11743
11744
11745
11746
11747
11751
11753 {
11756
11758 }
11759
11760
11762 {
11764 return;
11765
11767
11770
11773
11774 SoundParameters params = new SoundParameters();
11778 }
11779
11780
11782 {
11784 return;
11785
11787 SetSynchDirty();
11788
11791 }
11792
11793
11795 {
11797 return;
11798
11800 SetSynchDirty();
11801
11804 }
11805
11807 {
11809 }
11810
11812 {
11814 }
11815
11818 {
11819 if (!
GetGame().IsDedicatedServer())
11820 {
11821 if (ConfigIsExisting("attachSoundSet"))
11822 {
11823 string cfg_path = "";
11824 string soundset = "";
11825 string type_name =
GetType();
11826
11829 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
11830 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
11831
11832 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
11833 {
11834 for (int i = 0; i < cfg_soundset_array.Count(); i++)
11835 {
11836 if (cfg_slot_array[i] == slot_type)
11837 {
11838 soundset = cfg_soundset_array[i];
11839 break;
11840 }
11841 }
11842 }
11843
11844 if (soundset != "")
11845 {
11846 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
11848 }
11849 }
11850 }
11851 }
11852
11854 {
11855
11856 }
11857
11858 void OnApply(PlayerBase player);
11859
11861 {
11862 return 1.0;
11863 };
11864
11866 {
11868 }
11869
11871 {
11873 }
11874
11876
11878 {
11879 SetDynamicPhysicsLifeTime(0.01);
11881 }
11882
11884 {
11885 array<string> zone_names = new array<string>;
11886 GetDamageZones(zone_names);
11887 for (int i = 0; i < zone_names.Count(); i++)
11888 {
11889 SetHealthMax(zone_names.Get(i),"Health");
11890 }
11891 SetHealthMax("","Health");
11892 }
11893
11896 {
11897 float global_health = GetHealth01("","Health");
11898 array<string> zones = new array<string>;
11899 GetDamageZones(zones);
11900
11901 for (int i = 0; i < zones.Count(); i++)
11902 {
11903 SetHealth01(zones.Get(i),"Health",global_health);
11904 }
11905 }
11906
11909 {
11910 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
11911 }
11912
11914 {
11915 if (!hasRootAsPlayer)
11916 {
11917 if (refParentIB)
11918 {
11919
11920 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
11921 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
11922
11923 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
11924 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
11925
11928 }
11929 else
11930 {
11931
11934 }
11935 }
11936 }
11937
11939 {
11941 {
11942 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
11943 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
11944 {
11945 float heatPermCoef = 1.0;
11947 while (ent)
11948 {
11949 heatPermCoef *= ent.GetHeatPermeabilityCoef();
11950 ent = ent.GetHierarchyParent();
11951 }
11952
11953 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
11954 }
11955 }
11956 }
11957
11959 {
11960
11961 EntityAI parent = GetHierarchyParent();
11962 if (!parent)
11963 {
11964 hasParent = false;
11965 hasRootAsPlayer = false;
11966 }
11967 else
11968 {
11969 hasParent = true;
11970 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
11971 refParentIB =
ItemBase.Cast(parent);
11972 }
11973 }
11974
11975 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
11976 {
11977
11978 }
11979
11981 {
11982
11983 return false;
11984 }
11985
11987 {
11988
11989
11990 return false;
11991 }
11992
11994 {
11995
11996 return false;
11997 }
11998
12001 {
12002 return !GetIsFrozen() &&
IsOpen();
12003 }
12004
12006 {
12007 bool hasParent = false, hasRootAsPlayer = false;
12009
12010 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12011 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12012
12013 if (wwtu || foodDecay)
12014 {
12018
12019 if (processWetness || processTemperature || processDecay)
12020 {
12022
12023 if (processWetness)
12024 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12025
12026 if (processTemperature)
12028
12029 if (processDecay)
12030 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12031 }
12032 }
12033 }
12034
12037 {
12039 }
12040
12042 {
12045
12046 return super.GetTemperatureFreezeThreshold();
12047 }
12048
12050 {
12053
12054 return super.GetTemperatureThawThreshold();
12055 }
12056
12058 {
12061
12062 return super.GetItemOverheatThreshold();
12063 }
12064
12066 {
12068 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12069
12070 return super.GetTemperatureFreezeTime();
12071 }
12072
12074 {
12076 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12077
12078 return super.GetTemperatureThawTime();
12079 }
12080
12085
12087 {
12088 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12089 }
12090
12092 {
12093 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12094 }
12095
12098 {
12100 }
12101
12103 {
12105 }
12106
12108 {
12110 }
12111
12114 {
12115 return null;
12116 }
12117
12120 {
12121 return false;
12122 }
12123
12125 {
12127 {
12130 if (!trg)
12131 {
12133 explosive = this;
12134 }
12135
12136 explosive.PairRemote(trg);
12138
12139 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12140 trg.SetPersistentPairID(persistentID);
12141 explosive.SetPersistentPairID(persistentID);
12142
12143 return true;
12144 }
12145 return false;
12146 }
12147
12150 {
12151 float ret = 1.0;
12154 ret *= GetHealth01();
12155
12156 return ret;
12157 }
12158
12159 #ifdef DEVELOPER
12160 override void SetDebugItem()
12161 {
12162 super.SetDebugItem();
12163 _itemBase = this;
12164 }
12165
12167 {
12168 string text = super.GetDebugText();
12169
12171 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12172
12173 return text;
12174 }
12175 #endif
12176
12178 {
12179 return true;
12180 }
12181
12183
12185
12187 {
12190 }
12191
12192
12200
12216}
12217
12219{
12221 if (entity)
12222 {
12223 bool is_item = entity.IsInherited(
ItemBase);
12224 if (is_item && full_quantity)
12225 {
12228 }
12229 }
12230 else
12231 {
12233 return NULL;
12234 }
12235 return entity;
12236}
12237
12239{
12240 if (item)
12241 {
12242 if (health > 0)
12243 item.SetHealth("", "", health);
12244
12245 if (item.CanHaveTemperature())
12246 {
12248 if (item.CanFreeze())
12249 item.SetFrozen(false);
12250 }
12251
12252 if (item.HasEnergyManager())
12253 {
12254 if (quantity >= 0)
12255 {
12256 item.GetCompEM().SetEnergy0To1(quantity);
12257 }
12258 else
12259 {
12261 }
12262 }
12263 else if (item.IsMagazine())
12264 {
12265 Magazine mag = Magazine.Cast(item);
12266 if (quantity >= 0)
12267 {
12268 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12269 }
12270 else
12271 {
12273 }
12274
12275 }
12276 else
12277 {
12278 if (quantity >= 0)
12279 {
12280 item.SetQuantityNormalized(quantity, false);
12281 }
12282 else
12283 {
12285 }
12286
12287 }
12288 }
12289}
12290
12291#ifdef DEVELOPER
12293#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.