8435{
8437 {
8438 return true;
8439 }
8440};
8441
8442
8443
8445{
8449
8451
8454
8455
8456
8457
8458
8467
8473
8478
8483
8504 protected bool m_IsResultOfSplit
8505
8507
8512
8513
8514
8516
8520
8521
8522
8524
8527
8528
8529
8535
8536
8544
8547
8548
8550
8551
8553
8554
8559
8560
8565
8566
8568
8569
8571 {
8576
8577 if (!
GetGame().IsDedicatedServer())
8578 {
8580 {
8582
8584 {
8586 }
8587 }
8588
8591 }
8592
8593 m_OldLocation = null;
8594
8596 {
8598 }
8599
8600 if (ConfigIsExisting("headSelectionsToHide"))
8601 {
8604 }
8605
8607 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8608 {
8610 }
8611
8613
8614 m_IsResultOfSplit = false;
8615
8617 }
8618
8620 {
8621 super.InitItemVariables();
8622
8628 m_Count = ConfigGetInt(
"count");
8629
8632
8637
8640
8645
8657
8661
8662
8665 if (ConfigIsExisting("canBeSplit"))
8666 {
8669 }
8670
8672 if (ConfigIsExisting("itemBehaviour"))
8674
8675
8678 RegisterNetSyncVariableInt("m_VarLiquidType");
8679 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8680
8681 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8682 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8683 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8684
8685 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8686 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8687 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8688 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8689
8690 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8691 RegisterNetSyncVariableBool("m_IsTakeable");
8692 RegisterNetSyncVariableBool("m_IsHologram");
8693
8696 {
8699 }
8700
8702
8704 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8706
8707 }
8708
8710 {
8712 }
8713
8715 {
8718 {
8723 }
8724 }
8725
8726 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8727 {
8729 {
8732 }
8733
8735 }
8736
8738 {
8744 }
8745
8747
8749 {
8751
8752 if (!action)
8753 {
8754 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8755 return;
8756 }
8757
8759 if (!ai)
8760 {
8762 return;
8763 }
8764
8766 if (!action_array)
8767 {
8768 action_array = new array<ActionBase_Basic>;
8770 }
8771 if (LogManager.IsActionLogEnable())
8772 {
8773 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8774 }
8775
8776 if (action_array.Find(action) != -1)
8777 {
8778 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8779 }
8780 else
8781 {
8782 action_array.Insert(action);
8783 }
8784 }
8785
8787 {
8789 ActionBase action = player.GetActionManager().GetAction(actionName);
8792
8793 if (action_array)
8794 {
8795 action_array.RemoveItem(action);
8796 }
8797 }
8798
8799
8800
8802 {
8803 ActionOverrideData overrideData = new ActionOverrideData();
8807
8809 if (!actionMap)
8810 {
8813 }
8814
8815 actionMap.Insert(this.
Type(), overrideData);
8816
8817 }
8818
8820
8822
8823
8825 {
8828
8831
8832 string config_to_search = "CfgVehicles";
8833 string muzzle_owner_config;
8834
8836 {
8837 if (IsInherited(Weapon))
8838 config_to_search = "CfgWeapons";
8839
8840 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8841
8842 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8843
8845
8846 if (config_OnFire_subclass_count > 0)
8847 {
8848 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8849
8850 for (int i = 0; i < config_OnFire_subclass_count; i++)
8851 {
8852 string particle_class = "";
8854 string config_OnFire_entry = config_OnFire_class + particle_class;
8855 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8856 WPOF_array.Insert(WPOF);
8857 }
8858
8859
8861 }
8862 }
8863
8865 {
8866 config_to_search = "CfgWeapons";
8867 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8868
8869 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8870
8872
8873 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8874 {
8875 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8876
8877 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8878 {
8879 string particle_class2 = "";
8881 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8882 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8883 WPOBE_array.Insert(WPOBE);
8884 }
8885
8886
8888 }
8889 }
8890 }
8891
8892
8894 {
8897
8899 {
8900 string config_to_search = "CfgVehicles";
8901
8902 if (IsInherited(Weapon))
8903 config_to_search = "CfgWeapons";
8904
8905 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8906 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8907
8908 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8909 {
8910
8912
8914 {
8916 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8918 return;
8919 }
8920
8923
8924
8925
8927 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8928
8929 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8930 {
8931 string particle_class = "";
8933 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8935
8936 if (entry_type == CT_CLASS)
8937 {
8938 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8939 WPOOH_array.Insert(WPOF);
8940 }
8941 }
8942
8943
8945 }
8946 }
8947 }
8948
8950 {
8952 }
8953
8955 {
8957 {
8959
8962
8965
8966 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8967 }
8968 }
8969
8971 {
8973 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8974
8976 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8977
8979 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8980
8982 {
8984 }
8985 }
8986
8988 {
8990 }
8991
8993 {
8996 else
8998
9000 {
9003 }
9004 else
9005 {
9008
9011 }
9012
9014 }
9015
9017 {
9019 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9020 }
9021
9023 {
9025 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9027 }
9028
9030 {
9032 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9033 }
9034
9036 {
9039
9040 OverheatingParticle OP = new OverheatingParticle();
9045
9047 }
9048
9050 {
9053
9054 return -1;
9055 }
9056
9058 {
9060 {
9063
9064 for (int i = count; i > 0; --i)
9065 {
9066 int id = i - 1;
9069
9072
9073 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9074 {
9075 if (p)
9076 {
9079 }
9080 }
9081 }
9082 }
9083 }
9084
9086 {
9088 {
9090 {
9091 int id = i - 1;
9093
9094 if (OP)
9095 {
9097
9098 if (p)
9099 {
9101 }
9102
9103 delete OP;
9104 }
9105 }
9106
9109 }
9110 }
9111
9114 {
9115 return 0.0;
9116 }
9117
9118
9120 {
9121 return 250;
9122 }
9123
9125 {
9126 return 0;
9127 }
9128
9131 {
9133 return true;
9134
9135 return false;
9136 }
9137
9140 {
9143
9145 {
9147 }
9148 else
9149 {
9150
9152 }
9153
9155 }
9156
9163 {
9164 return -1;
9165 }
9166
9167
9168
9169
9171 {
9173 {
9175 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9176
9177 if (r_index >= 0)
9178 {
9179 InventoryLocation r_il = new InventoryLocation;
9180 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9181
9182 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9185 {
9186 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9187 }
9189 {
9190 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9191 }
9192
9193 }
9194
9195 player.GetHumanInventory().ClearUserReservedLocation(this);
9196 }
9197
9200 }
9201
9202
9203
9204
9206 {
9207 return ItemBase.m_DebugActionsMask;
9208 }
9209
9211 {
9212 return ItemBase.m_DebugActionsMask & mask;
9213 }
9214
9216 {
9217 ItemBase.m_DebugActionsMask = mask;
9218 }
9219
9221 {
9222 ItemBase.m_DebugActionsMask |= mask;
9223 }
9224
9226 {
9227 ItemBase.m_DebugActionsMask &= ~mask;
9228 }
9229
9231 {
9233 {
9235 }
9236 else
9237 {
9239 }
9240 }
9241
9242
9244 {
9245 if (GetEconomyProfile())
9246 {
9247 float q_max = GetEconomyProfile().GetQuantityMax();
9248 if (q_max > 0)
9249 {
9250 float q_min = GetEconomyProfile().GetQuantityMin();
9251 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9252
9254 {
9255 ComponentEnergyManager comp = GetCompEM();
9257 {
9259 }
9260 }
9262 {
9264
9265 }
9266
9267 }
9268 }
9269 }
9270
9273 {
9274 EntityAI parent = GetHierarchyParent();
9275
9276 if (parent)
9277 {
9278 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9279 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9280 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9281 }
9282 }
9283
9286 {
9287 EntityAI parent = GetHierarchyParent();
9288
9289 if (parent)
9290 {
9291 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9292 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9293 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9294 }
9295 }
9296
9298 {
9299
9300
9301
9302
9304
9306 {
9307 if (ScriptInputUserData.CanStoreInputUserData())
9308 {
9309 ScriptInputUserData ctx = new ScriptInputUserData;
9315 ctx.
Write(use_stack_max);
9318
9320 {
9321 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9322 }
9323 }
9324 }
9325 else if (!
GetGame().IsMultiplayer())
9326 {
9328 }
9329 }
9330
9332 {
9334 }
9335
9337 {
9339 }
9340
9342 {
9344 }
9345
9347 {
9348
9349 return false;
9350 }
9351
9353 {
9354 return false;
9355 }
9356
9360 {
9361 return false;
9362 }
9363
9365 {
9366 return "";
9367 }
9368
9370
9372 {
9373 return false;
9374 }
9375
9377 {
9378 return true;
9379 }
9380
9381
9382
9384 {
9385 return true;
9386 }
9387
9389 {
9390 return true;
9391 }
9392
9394 {
9395 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9397 }
9398
9400 {
9402 }
9403
9405 {
9407 if (!is_being_placed)
9409 SetSynchDirty();
9410 }
9411
9412
9414
9416 {
9418 }
9419
9421 {
9423 }
9424
9426 {
9427 return 1;
9428 }
9429
9431 {
9432 return false;
9433 }
9434
9436 {
9438 SetSynchDirty();
9439 }
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9476 {
9477 super.OnMovedInsideCargo(container);
9478
9479 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9480 }
9481
9482 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9483 {
9484 super.EEItemLocationChanged(oldLoc,newLoc);
9485
9486 PlayerBase new_player = null;
9487 PlayerBase old_player = null;
9488
9489 if (newLoc.GetParent())
9490 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9491
9492 if (oldLoc.GetParent())
9493 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9494
9496 {
9497 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9498
9499 if (r_index >= 0)
9500 {
9501 InventoryLocation r_il = new InventoryLocation;
9502 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9503
9504 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9507 {
9508 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9509 }
9511 {
9512 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9513 }
9514
9515 }
9516 }
9517
9519 {
9520 if (new_player)
9521 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9522
9523 if (new_player == old_player)
9524 {
9525
9526 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9527 {
9529 {
9530 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9531 {
9532 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9533 }
9534 }
9535 else
9536 {
9537 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9538 }
9539 }
9540
9541 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9542 {
9543 int type = oldLoc.GetType();
9545 {
9546 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9547 }
9549 {
9550 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9551 }
9552 }
9553 if (!m_OldLocation)
9554 {
9555 m_OldLocation = new InventoryLocation;
9556 }
9557 m_OldLocation.Copy(oldLoc);
9558 }
9559 else
9560 {
9561 if (m_OldLocation)
9562 {
9563 m_OldLocation.Reset();
9564 }
9565 }
9566
9568 }
9569 else
9570 {
9571 if (new_player)
9572 {
9573 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9574 if (res_index >= 0)
9575 {
9576 InventoryLocation il = new InventoryLocation;
9577 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9579 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9582 {
9583 il.
GetParent().GetOnReleaseLock().Invoke(it);
9584 }
9586 {
9588 }
9589
9590 }
9591 }
9593 {
9594
9596 }
9597
9598 if (m_OldLocation)
9599 {
9600 m_OldLocation.Reset();
9601 }
9602 }
9603 }
9604
9605 override void EOnContact(IEntity other, Contact extra)
9606 {
9608 {
9609 int liquidType = -1;
9611 if (impactSpeed > 0.0)
9612 {
9614 #ifndef SERVER
9616 #else
9618 SetSynchDirty();
9619 #endif
9621 }
9622 }
9623
9624 #ifdef SERVER
9625 if (GetCompEM() && GetCompEM().IsPlugged())
9626 {
9627 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9628 GetCompEM().UnplugThis();
9629 }
9630 #endif
9631 }
9632
9634
9636 {
9638 }
9639
9641 {
9642
9643 }
9644
9646 {
9647 super.OnItemLocationChanged(old_owner, new_owner);
9648
9649 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9650 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9651
9652 if (!relatedPlayer && playerNew)
9653 relatedPlayer = playerNew;
9654
9655 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9656 {
9658 if (actionMgr)
9659 {
9660 ActionBase currentAction = actionMgr.GetRunningAction();
9661 if (currentAction)
9663 }
9664 }
9665
9666 Man ownerPlayerOld = null;
9667 Man ownerPlayerNew = null;
9668
9669 if (old_owner)
9670 {
9671 if (old_owner.
IsMan())
9672 {
9673 ownerPlayerOld = Man.Cast(old_owner);
9674 }
9675 else
9676 {
9677 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9678 }
9679 }
9680 else
9681 {
9683 {
9685
9686 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9687 {
9688 GetCompEM().UnplugThis();
9689 }
9690 }
9691 }
9692
9693 if (new_owner)
9694 {
9695 if (new_owner.
IsMan())
9696 {
9697 ownerPlayerNew = Man.Cast(new_owner);
9698 }
9699 else
9700 {
9701 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9702 }
9703 }
9704
9705 if (ownerPlayerOld != ownerPlayerNew)
9706 {
9707 if (ownerPlayerOld)
9708 {
9709 array<EntityAI> subItemsExit = new array<EntityAI>;
9711 for (int i = 0; i < subItemsExit.Count(); i++)
9712 {
9715 }
9716 }
9717
9718 if (ownerPlayerNew)
9719 {
9720 array<EntityAI> subItemsEnter = new array<EntityAI>;
9722 for (int j = 0; j < subItemsEnter.Count(); j++)
9723 {
9726 }
9727 }
9728 }
9729 else if (ownerPlayerNew != null)
9730 {
9731 PlayerBase nplayer;
9732 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9733 {
9734 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9736 for (int k = 0; k < subItemsUpdate.Count(); k++)
9737 {
9739 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9740 }
9741 }
9742 }
9743
9744 if (old_owner)
9745 old_owner.OnChildItemRemoved(this);
9746 if (new_owner)
9747 new_owner.OnChildItemReceived(this);
9748 }
9749
9750
9752 {
9753 super.EEDelete(parent);
9754 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9755 if (player)
9756 {
9758
9759 if (player.IsAlive())
9760 {
9761 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9762 if (r_index >= 0)
9763 {
9764 InventoryLocation r_il = new InventoryLocation;
9765 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9766
9767 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9770 {
9771 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9772 }
9774 {
9775 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9776 }
9777
9778 }
9779
9780 player.RemoveQuickBarEntityShortcut(this);
9781 }
9782 }
9783 }
9784
9786 {
9787 super.EEKilled(killer);
9788
9791 {
9792 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9793 {
9794 if (IsMagazine())
9795 {
9796 if (Magazine.Cast(this).GetAmmoCount() > 0)
9797 {
9799 }
9800 }
9801 else
9802 {
9804 }
9805 }
9806 }
9807 }
9808
9810 {
9811 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9812
9813 super.OnWasAttached(parent, slot_id);
9814
9817
9819 }
9820
9822 {
9823 super.OnWasDetached(parent, slot_id);
9824
9827 }
9828
9830 {
9831 int idx;
9834
9835 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9836 if (inventory_slots.Count() < 1)
9837 {
9838 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9839 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9840 }
9841 else
9842 {
9843 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9844 }
9845
9846 idx = inventory_slots.Find(slot);
9847 if (idx < 0)
9848 return "";
9849
9850 return attach_types.Get(idx);
9851 }
9852
9854 {
9855 int idx = -1;
9856 string slot;
9857
9860
9861 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9862 if (inventory_slots.Count() < 1)
9863 {
9864 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9865 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9866 }
9867 else
9868 {
9869 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9870 if (detach_types.Count() < 1)
9871 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9872 }
9873
9874 for (int i = 0; i < inventory_slots.Count(); i++)
9875 {
9876 slot = inventory_slots.Get(i);
9877 }
9878
9879 if (slot != "")
9880 {
9881 if (detach_types.Count() == 1)
9882 idx = 0;
9883 else
9884 idx = inventory_slots.Find(slot);
9885 }
9886 if (idx < 0)
9887 return "";
9888
9889 return detach_types.Get(idx);
9890 }
9891
9893 {
9894
9896
9897
9898 float min_time = 1;
9899 float max_time = 3;
9900 float delay = Math.RandomFloat(min_time, max_time);
9901
9902 explode_timer.Run(delay, this, "DoAmmoExplosion");
9903 }
9904
9906 {
9907 Magazine magazine = Magazine.Cast(this);
9908 int pop_sounds_count = 6;
9909 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9910
9911
9912 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9913 string sound_name = pop_sounds[ sound_idx ];
9915
9916
9917 magazine.ServerAddAmmoCount(-1);
9918
9919
9920 float min_temp_to_explode = 100;
9921
9922 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9923 {
9925 }
9926 }
9927
9928
9929 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9930 {
9931 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9932
9933 const int CHANCE_DAMAGE_CARGO = 4;
9934 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9935 const int CHANCE_DAMAGE_NOTHING = 2;
9936
9938 {
9939 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9940 int chances;
9941 int rnd;
9942
9943 if (GetInventory().GetCargo())
9944 {
9945 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9946 rnd = Math.RandomInt(0,chances);
9947
9948 if (rnd < CHANCE_DAMAGE_CARGO)
9949 {
9951 }
9952 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9953 {
9955 }
9956 }
9957 else
9958 {
9959 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9960 rnd = Math.RandomInt(0,chances);
9961
9962 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9963 {
9965 }
9966 }
9967 }
9968 }
9969
9971 {
9972 if (GetInventory().GetCargo())
9973 {
9974 int item_count = GetInventory().GetCargo().GetItemCount();
9975 if (item_count > 0)
9976 {
9977 int random_pick = Math.RandomInt(0, item_count);
9979 if (!item.IsExplosive())
9980 {
9981 item.AddHealth("","",damage);
9982 return true;
9983 }
9984 }
9985 }
9986 return false;
9987 }
9988
9990 {
9991 int attachment_count = GetInventory().AttachmentCount();
9992 if (attachment_count > 0)
9993 {
9994 int random_pick = Math.RandomInt(0, attachment_count);
9995 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9996 if (!attachment.IsExplosive())
9997 {
9998 attachment.AddHealth("","",damage);
9999 return true;
10000 }
10001 }
10002 return false;
10003 }
10004
10006 {
10008 }
10009
10011 {
10013 return GetInventory().CanRemoveEntity();
10014
10015 return false;
10016 }
10017
10019 {
10020
10022 return false;
10023
10024
10026 return false;
10027
10028
10029
10031 if (delta == 0)
10032 return false;
10033
10034
10035 return true;
10036 }
10037
10039 {
10041 {
10042 if (ScriptInputUserData.CanStoreInputUserData())
10043 {
10044 ScriptInputUserData ctx = new ScriptInputUserData;
10049 ctx.
Write(destination_entity);
10051 ctx.
Write(slot_id);
10053 }
10054 }
10055 else if (!
GetGame().IsMultiplayer())
10056 {
10058 }
10059 }
10060
10062 {
10063 float split_quantity_new;
10067 InventoryLocation loc = new InventoryLocation;
10068
10069 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10070 {
10072 split_quantity_new = stack_max;
10073 else
10075
10077 {
10078 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10079 if (new_item)
10080 {
10081 new_item.SetResultOfSplit(true);
10082 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10084 new_item.
SetQuantity(split_quantity_new,
false,
true);
10085 }
10086 }
10087 }
10088 else if (destination_entity && slot_id == -1)
10089 {
10090 if (quantity > stack_max)
10091 split_quantity_new = stack_max;
10092 else
10093 split_quantity_new = quantity;
10094
10096 {
10098 {
10101 }
10102
10103 if (new_item)
10104 {
10105 new_item.SetResultOfSplit(true);
10106 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10108 new_item.
SetQuantity(split_quantity_new,
false,
true);
10109 }
10110 }
10111 }
10112 else
10113 {
10114 if (stack_max != 0)
10115 {
10117 {
10119 }
10120
10121 if (split_quantity_new == 0)
10122 {
10123 if (!
GetGame().IsMultiplayer())
10124 player.PhysicalPredictiveDropItem(this);
10125 else
10126 player.ServerDropEntity(this);
10127 return;
10128 }
10129
10131 {
10133
10134 if (new_item)
10135 {
10136 new_item.SetResultOfSplit(true);
10137 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10140 new_item.PlaceOnSurface();
10141 }
10142 }
10143 }
10144 }
10145 }
10146
10148 {
10149 float split_quantity_new;
10153 InventoryLocation loc = new InventoryLocation;
10154
10155 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10156 {
10158 split_quantity_new = stack_max;
10159 else
10161
10163 {
10164 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10165 if (new_item)
10166 {
10167 new_item.SetResultOfSplit(true);
10168 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10170 new_item.
SetQuantity(split_quantity_new,
false,
true);
10171 }
10172 }
10173 }
10174 else if (destination_entity && slot_id == -1)
10175 {
10176 if (quantity > stack_max)
10177 split_quantity_new = stack_max;
10178 else
10179 split_quantity_new = quantity;
10180
10182 {
10184 {
10187 }
10188
10189 if (new_item)
10190 {
10191 new_item.SetResultOfSplit(true);
10192 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10194 new_item.
SetQuantity(split_quantity_new,
false,
true);
10195 }
10196 }
10197 }
10198 else
10199 {
10200 if (stack_max != 0)
10201 {
10203 {
10205 }
10206
10208 {
10210
10211 if (new_item)
10212 {
10213 new_item.SetResultOfSplit(true);
10214 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10217 new_item.PlaceOnSurface();
10218 }
10219 }
10220 }
10221 }
10222 }
10223
10225 {
10227 {
10228 if (ScriptInputUserData.CanStoreInputUserData())
10229 {
10230 ScriptInputUserData ctx = new ScriptInputUserData;
10235 dst.WriteToContext(ctx);
10237 }
10238 }
10239 else if (!
GetGame().IsMultiplayer())
10240 {
10242 }
10243 }
10244
10246 {
10248 {
10249 if (ScriptInputUserData.CanStoreInputUserData())
10250 {
10251 ScriptInputUserData ctx = new ScriptInputUserData;
10256 ctx.
Write(destination_entity);
10262 }
10263 }
10264 else if (!
GetGame().IsMultiplayer())
10265 {
10267 }
10268 }
10269
10271 {
10273 }
10274
10276 {
10278 float split_quantity_new;
10280 if (dst.IsValid())
10281 {
10282 int slot_id = dst.GetSlot();
10284
10285 if (quantity > stack_max)
10286 split_quantity_new = stack_max;
10287 else
10288 split_quantity_new = quantity;
10289
10291 {
10293
10294 if (new_item)
10295 {
10296 new_item.SetResultOfSplit(true);
10297 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10299 new_item.
SetQuantity(split_quantity_new,
false,
true);
10300 }
10301
10302 return new_item;
10303 }
10304 }
10305
10306 return null;
10307 }
10308
10310 {
10312 float split_quantity_new;
10314 if (destination_entity)
10315 {
10317 if (quantity > stackable)
10318 split_quantity_new = stackable;
10319 else
10320 split_quantity_new = quantity;
10321
10323 {
10324 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10325 if (new_item)
10326 {
10327 new_item.SetResultOfSplit(true);
10328 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10330 new_item.
SetQuantity(split_quantity_new,
false,
true);
10331 }
10332 }
10333 }
10334 }
10335
10337 {
10339 {
10340 if (ScriptInputUserData.CanStoreInputUserData())
10341 {
10342 ScriptInputUserData ctx = new ScriptInputUserData;
10347 ItemBase destination_entity =
this;
10348 ctx.
Write(destination_entity);
10352 }
10353 }
10354 else if (!
GetGame().IsMultiplayer())
10355 {
10357 }
10358 }
10359
10361 {
10363 float split_quantity_new;
10365 if (player)
10366 {
10368 if (quantity > stackable)
10369 split_quantity_new = stackable;
10370 else
10371 split_quantity_new = quantity;
10372
10374 {
10375 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10376 new_item =
ItemBase.Cast(in_hands);
10377 if (new_item)
10378 {
10379 new_item.SetResultOfSplit(true);
10380 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10382 new_item.SetQuantity(split_quantity_new, false, true);
10383 }
10384 }
10385 }
10386 }
10387
10389 {
10391 float split_quantity_new = Math.Floor(quantity * 0.5);
10392
10394 return;
10395
10397
10398 if (new_item)
10399 {
10400 if (new_item.GetQuantityMax() < split_quantity_new)
10401 {
10402 split_quantity_new = new_item.GetQuantityMax();
10403 }
10404
10405 new_item.SetResultOfSplit(true);
10406 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10407
10409 {
10412 }
10413 else
10414 {
10416 new_item.
SetQuantity(split_quantity_new,
false,
true);
10417 }
10418 }
10419 }
10420
10422 {
10424 float split_quantity_new = Math.Floor(quantity / 2);
10425
10427 return;
10428
10429 InventoryLocation invloc = new InventoryLocation;
10431
10433 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10434
10435 if (new_item)
10436 {
10437 if (new_item.GetQuantityMax() < split_quantity_new)
10438 {
10439 split_quantity_new = new_item.GetQuantityMax();
10440 }
10442 {
10445 }
10446 else if (split_quantity_new > 1)
10447 {
10449 new_item.
SetQuantity(split_quantity_new,
false,
true);
10450 }
10451 }
10452 }
10453
10456 {
10457 SetWeightDirty();
10459
10460 if (parent)
10461 parent.OnAttachmentQuantityChangedEx(this, delta);
10462
10464 {
10466 {
10468 }
10470 {
10471 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10473 }
10474 }
10475
10476 }
10477
10480 {
10481
10482 }
10483
10486 {
10488 }
10489
10491 {
10492 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10493
10495 {
10496 if (newLevel == GameConstants.STATE_RUINED)
10497 {
10499 EntityAI parent = GetHierarchyParent();
10500 if (parent && parent.IsFireplace())
10501 {
10502 CargoBase cargo = GetInventory().GetCargo();
10503 if (cargo)
10504 {
10506 {
10508 }
10509 }
10510 }
10511 }
10512
10514 {
10515
10517 return;
10518 }
10519
10520 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10521 {
10523 }
10524 }
10525 }
10526
10527
10529 {
10530 super.OnRightClick();
10531
10533 {
10535 {
10536 if (ScriptInputUserData.CanStoreInputUserData())
10537 {
10538 EntityAI root = GetHierarchyRoot();
10539 Man playerOwner = GetHierarchyRootPlayer();
10540 InventoryLocation dst = new InventoryLocation;
10541
10542
10543 if (!playerOwner && root && root == this)
10544 {
10546 }
10547 else
10548 {
10549
10550 GetInventory().GetCurrentInventoryLocation(dst);
10552 {
10555 {
10557 }
10558 else
10559 {
10561
10562
10563 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10564 {
10566 }
10567 else
10568 {
10569 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10570 }
10571 }
10572 }
10573 }
10574
10575 ScriptInputUserData ctx = new ScriptInputUserData;
10583 }
10584 }
10585 else if (!
GetGame().IsMultiplayer())
10586 {
10588 }
10589 }
10590 }
10591
10593 {
10594 if (root)
10595 {
10596 vector m4[4];
10597 root.GetTransform(m4);
10598 dst.SetGround(this, m4);
10599 }
10600 else
10601 {
10602 GetInventory().GetCurrentInventoryLocation(dst);
10603 }
10604 }
10605
10606 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10607 {
10608
10609 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10610 return false;
10611
10612 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10613 return false;
10614
10615
10617 return false;
10618
10619
10620 Magazine mag = Magazine.Cast(this);
10621 if (mag)
10622 {
10623 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10624 return false;
10625
10626 if (stack_max_limit)
10627 {
10628 Magazine other_mag = Magazine.Cast(other_item);
10629 if (other_item)
10630 {
10631 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10632 return false;
10633 }
10634
10635 }
10636 }
10637 else
10638 {
10639
10641 return false;
10642
10644 return false;
10645 }
10646
10647 PlayerBase player = null;
10648 if (CastTo(player, GetHierarchyRootPlayer()))
10649 {
10650 if (player.GetInventory().HasAttachment(this))
10651 return false;
10652
10653 if (player.IsItemsToDelete())
10654 return false;
10655 }
10656
10657 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10658 return false;
10659
10660 int slotID;
10662 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10663 return false;
10664
10665 return true;
10666 }
10667
10669 {
10671 }
10672
10674 {
10675 return m_IsResultOfSplit;
10676 }
10677
10679 {
10680 m_IsResultOfSplit = value;
10681 }
10682
10684 {
10686 }
10687
10689 {
10690 float other_item_quantity = other_item.GetQuantity();
10691 float this_free_space;
10692
10694
10696
10697 if (other_item_quantity > this_free_space)
10698 {
10699 return this_free_space;
10700 }
10701 else
10702 {
10703 return other_item_quantity;
10704 }
10705 }
10706
10708 {
10710 }
10711
10713 {
10715 return;
10716
10717 if (!IsMagazine() && other_item)
10718 {
10720 if (quantity_used != 0)
10721 {
10722 float hp1 = GetHealth01("","");
10723 float hp2 = other_item.GetHealth01("","");
10724 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10725 hpResult = hpResult / (
GetQuantity() + quantity_used);
10726
10727 hpResult *= GetMaxHealth();
10728 Math.Round(hpResult);
10729 SetHealth("", "Health", hpResult);
10730
10732 other_item.AddQuantity(-quantity_used);
10733 }
10734 }
10736 }
10737
10739 {
10740 #ifdef SERVER
10741 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10742 GetHierarchyParent().IncreaseLifetimeUp();
10743 #endif
10744 };
10745
10747 {
10748 PlayerBase p = PlayerBase.Cast(player);
10749
10750 array<int> recipesIds = p.m_Recipes;
10751 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10752 if (moduleRecipesManager)
10753 {
10754 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10755 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10756 }
10757
10758 for (int i = 0;i < recipesIds.Count(); i++)
10759 {
10760 int key = recipesIds.Get(i);
10761 string recipeName = moduleRecipesManager.GetRecipeName(key);
10763 }
10764 }
10765
10766
10767 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10768 {
10769 super.GetDebugActions(outputList);
10770
10771
10777
10778
10783
10788
10789
10793
10794
10796 {
10800 }
10801
10804
10805
10809
10811
10812 InventoryLocation loc = new InventoryLocation();
10813 GetInventory().GetCurrentInventoryLocation(loc);
10815 {
10816 if (Gizmo_IsSupported())
10819 }
10820
10822 }
10823
10824
10825
10826
10828 {
10829 super.OnAction(action_id, player, ctx);
10830
10832 {
10833 switch (action_id)
10834 {
10837 return true;
10840 return true;
10841 }
10842 }
10843
10845 {
10846 switch (action_id)
10847 {
10849 Delete();
10850 return true;
10851 }
10852 }
10853
10854 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10855 {
10856 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10857 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10858 PlayerBase p = PlayerBase.Cast(player);
10859 if (
EActions.RECIPES_RANGE_START < 1000)
10860 {
10861 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10862 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10863 }
10864 }
10865 #ifndef SERVER
10866 else if (action_id ==
EActions.WATCH_PLAYER)
10867 {
10868 PluginDeveloper.SetDeveloperItemClientEx(player);
10869 }
10870 #endif
10872 {
10873 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10874 {
10875 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10876 OnDebugButtonPressServer(id + 1);
10877 }
10878
10879 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10880 {
10881 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10883 }
10884
10885 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10886 {
10887 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10889 }
10890
10891 else if (action_id ==
EActions.ADD_QUANTITY)
10892 {
10893 if (IsMagazine())
10894 {
10895 Magazine mag = Magazine.Cast(this);
10896 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10897 }
10898 else
10899 {
10901 }
10902
10903 if (m_EM)
10904 {
10905 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10906 }
10907
10908 }
10909
10910 else if (action_id ==
EActions.REMOVE_QUANTITY)
10911 {
10912 if (IsMagazine())
10913 {
10914 Magazine mag2 = Magazine.Cast(this);
10915 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10916 }
10917 else
10918 {
10920 }
10921 if (m_EM)
10922 {
10923 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10924 }
10925
10926 }
10927
10928 else if (action_id ==
EActions.SET_QUANTITY_0)
10929 {
10931
10932 if (m_EM)
10933 {
10934 m_EM.SetEnergy(0);
10935 }
10936 }
10937
10938 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10939 {
10941
10942 if (m_EM)
10943 {
10944 m_EM.SetEnergy(m_EM.GetEnergyMax());
10945 }
10946 }
10947
10948 else if (action_id ==
EActions.ADD_HEALTH)
10949 {
10950 AddHealth("","",GetMaxHealth("","Health")/5);
10951 }
10952 else if (action_id ==
EActions.REMOVE_HEALTH)
10953 {
10954 AddHealth("","",-GetMaxHealth("","Health")/5);
10955 }
10956 else if (action_id ==
EActions.DESTROY_HEALTH)
10957 {
10958 SetHealth01("","",0);
10959 }
10960 else if (action_id ==
EActions.WATCH_ITEM)
10961 {
10963 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10964 #ifdef DEVELOPER
10965 SetDebugDeveloper_item(this);
10966 #endif
10967 }
10968
10969 else if (action_id ==
EActions.ADD_TEMPERATURE)
10970 {
10971 AddTemperature(20);
10972
10973 }
10974
10975 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10976 {
10977 AddTemperature(-20);
10978
10979 }
10980
10981 else if (action_id ==
EActions.FLIP_FROZEN)
10982 {
10983 SetFrozen(!GetIsFrozen());
10984
10985 }
10986
10987 else if (action_id ==
EActions.ADD_WETNESS)
10988 {
10990
10991 }
10992
10993 else if (action_id ==
EActions.REMOVE_WETNESS)
10994 {
10996
10997 }
10998
10999 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11000 {
11003
11004
11005 }
11006
11007 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11008 {
11011 }
11012
11013 else if (action_id ==
EActions.MAKE_SPECIAL)
11014 {
11015 auto debugParams = DebugSpawnParams.WithPlayer(player);
11016 OnDebugSpawnEx(debugParams);
11017 }
11018
11019 }
11020
11021
11022 return false;
11023 }
11024
11025
11026
11027
11031
11034
11035
11036
11038 {
11039 return false;
11040 }
11041
11042
11044 {
11045 return true;
11046 }
11047
11048
11050 {
11051 return true;
11052 }
11053
11054
11055
11057 {
11058 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11060 }
11061
11064 {
11065 return null;
11066 }
11067
11069 {
11070 return false;
11071 }
11072
11074 {
11075 return false;
11076 }
11077
11081
11082
11084 {
11085 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11086 return module_repairing.CanRepair(this, item_repair_kit);
11087 }
11088
11089
11090 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11091 {
11092 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11093 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11094 }
11095
11096
11098 {
11099
11100
11101
11102
11103
11104
11105
11106
11107 return 1;
11108 }
11109
11110
11111
11113 {
11115 }
11116
11117
11118
11120 {
11122 }
11123
11124
11133 {
11134 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11135
11136 if (player)
11137 {
11138 player.MessageStatus(text);
11139 }
11140 }
11141
11142
11151 {
11152 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11153
11154 if (player)
11155 {
11156 player.MessageAction(text);
11157 }
11158 }
11159
11160
11169 {
11170 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11171
11172 if (player)
11173 {
11174 player.MessageFriendly(text);
11175 }
11176 }
11177
11178
11187 {
11188 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11189
11190 if (player)
11191 {
11192 player.MessageImportant(text);
11193 }
11194 }
11195
11197 {
11198 return true;
11199 }
11200
11201
11202 override bool KindOf(
string tag)
11203 {
11204 bool found = false;
11205 string item_name = this.
GetType();
11208
11209 int array_size = item_tag_array.Count();
11210 for (int i = 0; i < array_size; i++)
11211 {
11212 if (item_tag_array.Get(i) == tag)
11213 {
11214 found = true;
11215 break;
11216 }
11217 }
11218 return found;
11219 }
11220
11221
11223 {
11224
11225 super.OnRPC(sender, rpc_type,ctx);
11226
11227
11228 switch (rpc_type)
11229 {
11230 #ifndef SERVER
11231 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11232 Param2<bool, string> p = new Param2<bool, string>(false, "");
11233
11235 return;
11236
11237 bool play = p.param1;
11238 string soundSet = p.param2;
11239
11240 if (play)
11241 {
11243 {
11245 {
11247 }
11248 }
11249 else
11250 {
11252 }
11253 }
11254 else
11255 {
11257 }
11258
11259 break;
11260 #endif
11261
11262 }
11263
11265 {
11267 }
11268 }
11269
11270
11271
11272
11274 {
11275 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11276 return plugin.GetID(
name);
11277 }
11278
11280 {
11281 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11282 return plugin.GetName(id);
11283 }
11284
11287 {
11288
11289
11290 int varFlags;
11291 if (!ctx.
Read(varFlags))
11292 return;
11293
11294 if (varFlags & ItemVariableFlags.FLOAT)
11295 {
11297 }
11298 }
11299
11301 {
11302
11303 super.SerializeNumericalVars(floats_out);
11304
11305
11306
11308 {
11310 }
11311
11313 {
11315 }
11316
11318 {
11320 }
11321
11323 {
11328 }
11329
11331 {
11333 }
11334 }
11335
11337 {
11338
11339 super.DeSerializeNumericalVars(floats);
11340
11341
11342 int index = 0;
11343 int mask = Math.Round(floats.Get(index));
11344
11345 index++;
11346
11348 {
11350 {
11352 }
11353 else
11354 {
11355 float quantity = floats.Get(index);
11356 SetQuantity(quantity,
true,
false,
false,
false);
11357 }
11358 index++;
11359 }
11360
11362 {
11363 float wet = floats.Get(index);
11365 index++;
11366 }
11367
11369 {
11370 int liquidtype = Math.Round(floats.Get(index));
11372 index++;
11373 }
11374
11376 {
11378 index++;
11380 index++;
11382 index++;
11384 index++;
11385 }
11386
11388 {
11389 int cleanness = Math.Round(floats.Get(index));
11391 index++;
11392 }
11393 }
11394
11396 {
11397 super.WriteVarsToCTX(ctx);
11398
11399
11401 {
11403 }
11404
11406 {
11408 }
11409
11411 {
11413 }
11414
11416 {
11417 int r,g,b,a;
11423 }
11424
11426 {
11428 }
11429 }
11430
11432 {
11433 if (!super.ReadVarsFromCTX(ctx,version))
11434 return false;
11435
11436 int intValue;
11437 float value;
11438
11439 if (version < 140)
11440 {
11441 if (!ctx.
Read(intValue))
11442 return false;
11443
11444 m_VariablesMask = intValue;
11445 }
11446
11448 {
11449 if (!ctx.
Read(value))
11450 return false;
11451
11453 {
11455 }
11456 else
11457 {
11459 }
11460 }
11461
11462 if (version < 140)
11463 {
11465 {
11466 if (!ctx.
Read(value))
11467 return false;
11468 SetTemperatureDirect(value);
11469 }
11470 }
11471
11473 {
11474 if (!ctx.
Read(value))
11475 return false;
11477 }
11478
11480 {
11481 if (!ctx.
Read(intValue))
11482 return false;
11484 }
11485
11487 {
11488 int r,g,b,a;
11490 return false;
11492 return false;
11494 return false;
11496 return false;
11497
11499 }
11500
11502 {
11503 if (!ctx.
Read(intValue))
11504 return false;
11506 }
11507
11508 if (version >= 138 && version < 140)
11509 {
11511 {
11512 if (!ctx.
Read(intValue))
11513 return false;
11514 SetFrozen(intValue);
11515 }
11516 }
11517
11518 return true;
11519 }
11520
11521
11523 {
11526 {
11528 }
11529
11530 if (!super.OnStoreLoad(ctx, version))
11531 {
11533 return false;
11534 }
11535
11536 if (version >= 114)
11537 {
11538 bool hasQuickBarIndexSaved;
11539
11540 if (!ctx.
Read(hasQuickBarIndexSaved))
11541 {
11543 return false;
11544 }
11545
11546 if (hasQuickBarIndexSaved)
11547 {
11548 int itmQBIndex;
11549
11550
11551 if (!ctx.
Read(itmQBIndex))
11552 {
11554 return false;
11555 }
11556
11557 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11558 if (itmQBIndex != -1 && parentPlayer)
11559 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11560 }
11561 }
11562 else
11563 {
11564
11565 PlayerBase player;
11566 int itemQBIndex;
11567 if (version ==
int.
MAX)
11568 {
11569 if (!ctx.
Read(itemQBIndex))
11570 {
11572 return false;
11573 }
11574 }
11575 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11576 {
11577
11578 if (!ctx.
Read(itemQBIndex))
11579 {
11581 return false;
11582 }
11583 if (itemQBIndex != -1 && player)
11584 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11585 }
11586 }
11587
11588 if (version < 140)
11589 {
11590
11591 if (!LoadVariables(ctx, version))
11592 {
11594 return false;
11595 }
11596 }
11597
11598
11600 {
11602 return false;
11603 }
11604 if (version >= 132)
11605 {
11607 if (raib)
11608 {
11610 {
11612 return false;
11613 }
11614 }
11615 }
11616
11618 return true;
11619 }
11620
11621
11622
11624 {
11625 super.OnStoreSave(ctx);
11626
11627 PlayerBase player;
11628 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11629 {
11631
11632 int itemQBIndex = -1;
11633 itemQBIndex = player.FindQuickBarEntityIndex(this);
11634 ctx.
Write(itemQBIndex);
11635 }
11636 else
11637 {
11639 }
11640
11642
11644 if (raib)
11645 {
11647 }
11648 }
11649
11650
11652 {
11653 super.AfterStoreLoad();
11654
11656 {
11658 }
11659
11661 {
11664 }
11665 }
11666
11668 {
11669 super.EEOnAfterLoad();
11670
11672 {
11674 }
11675
11678 }
11679
11681 {
11682 return false;
11683 }
11684
11685
11686
11688 {
11690 {
11691 #ifdef PLATFORM_CONSOLE
11692
11694 {
11696 if (menu)
11697 {
11699 }
11700 }
11701 #endif
11702 }
11703
11705 {
11708 }
11709
11711 {
11712 SetWeightDirty();
11714 }
11716 {
11719 }
11720
11722 {
11725 }
11727 {
11730 }
11731
11732 super.OnVariablesSynchronized();
11733 }
11734
11735
11736
11738 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11739 {
11740 if (!IsServerCheck(allow_client))
11741 return false;
11742
11744 return false;
11745
11748
11749 if (value <= (min + 0.001))
11750 value = min;
11751
11752 if (value == min)
11753 {
11754 if (destroy_config)
11755 {
11756 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11757 if (dstr)
11758 {
11760 this.Delete();
11761 return true;
11762 }
11763 }
11764 else if (destroy_forced)
11765 {
11767 this.Delete();
11768 return true;
11769 }
11770
11772 }
11773
11776
11778 {
11780
11781 if (delta)
11783 }
11784
11786
11787 return false;
11788 }
11789
11790
11792 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11793 {
11795 }
11796
11798 {
11801 }
11802
11804 {
11807 }
11808
11810 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11811 {
11812 float value_clamped = Math.Clamp(value, 0, 1);
11814 SetQuantity(result, destroy_config, destroy_forced);
11815 }
11816
11817
11820 {
11822 }
11823
11825 {
11827 }
11828
11829
11830
11831
11832
11833
11834
11835
11836
11837
11839 {
11840 int slot = -1;
11841 if (GetInventory())
11842 {
11843 InventoryLocation il = new InventoryLocation;
11844 GetInventory().GetCurrentInventoryLocation(il);
11846 }
11847
11849 }
11850
11852 {
11853 float quantity_max = 0;
11854
11856 {
11857 if (attSlotID != -1)
11858 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11859
11860 if (quantity_max <= 0)
11862 }
11863
11864 if (quantity_max <= 0)
11866
11867 return quantity_max;
11868 }
11869
11871 {
11873 }
11874
11876 {
11878 }
11879
11880
11882 {
11884 }
11885
11887 {
11889 }
11890
11892 {
11894 }
11895
11896
11898 {
11899
11900 float weightEx = GetWeightEx();
11901 float special = GetInventoryAndCargoWeight();
11902 return weightEx - special;
11903 }
11904
11905
11907 {
11909 }
11910
11912 {
11914 {
11915 #ifdef DEVELOPER
11916 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11917 {
11918 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11920 }
11921 #endif
11922
11923 return GetQuantity() * GetConfigWeightModified();
11924 }
11925 else if (HasEnergyManager())
11926 {
11927 #ifdef DEVELOPER
11928 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11929 {
11930 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11931 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11932 }
11933 #endif
11934 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11935 }
11936 else
11937 {
11938 #ifdef DEVELOPER
11939 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11940 {
11941 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11942 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11943 }
11944 #endif
11945 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11946 }
11947 }
11948
11951 {
11952 int item_count = 0;
11954
11955 if (GetInventory().GetCargo() != NULL)
11956 {
11957 item_count = GetInventory().GetCargo().GetItemCount();
11958 }
11959
11960 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11961 {
11962 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11963 if (item)
11964 item_count += item.GetNumberOfItems();
11965 }
11966 return item_count;
11967 }
11968
11971 {
11972 float weight = 0;
11973 float wetness = 1;
11974 if (include_wetness)
11977 {
11978 weight = wetness * m_ConfigWeight;
11979 }
11981 {
11982 weight = 1;
11983 }
11984 return weight;
11985 }
11986
11987
11988
11990 {
11991 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11992 {
11993 GameInventory inv = GetInventory();
11994 array<EntityAI> items = new array<EntityAI>;
11996 for (int i = 0; i < items.Count(); i++)
11997 {
11999 if (item)
12000 {
12002 }
12003 }
12004 }
12005 }
12006
12007
12008
12009
12011 {
12012 float energy = 0;
12013 if (HasEnergyManager())
12014 {
12015 energy = GetCompEM().GetEnergy();
12016 }
12017 return energy;
12018 }
12019
12020
12022 {
12023 super.OnEnergyConsumed();
12024
12026 }
12027
12029 {
12030 super.OnEnergyAdded();
12031
12033 }
12034
12035
12037 {
12038 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12039 {
12041 {
12042 float energy_0to1 = GetCompEM().GetEnergy0To1();
12044 }
12045 }
12046 }
12047
12048
12050 {
12051 return ConfigGetFloat("heatIsolation");
12052 }
12053
12055 {
12057 }
12058
12060 {
12061 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12062 if (
GetGame().ConfigIsExisting(paramPath))
12064
12065 return 0.0;
12066 }
12067
12069 {
12070 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12071 if (
GetGame().ConfigIsExisting(paramPath))
12073
12074 return 0.0;
12075 }
12076
12077 override void SetWet(
float value,
bool allow_client =
false)
12078 {
12079 if (!IsServerCheck(allow_client))
12080 return;
12081
12084
12086
12087 m_VarWet = Math.Clamp(value, min, max);
12088
12090 {
12093 }
12094 }
12095
12096 override void AddWet(
float value)
12097 {
12099 }
12100
12102 {
12104 }
12105
12107 {
12109 }
12110
12112 {
12114 }
12115
12117 {
12119 }
12120
12122 {
12124 }
12125
12126 override void OnWetChanged(
float newVal,
float oldVal)
12127 {
12130 if (newLevel != oldLevel)
12131 {
12133 }
12134 }
12135
12137 {
12138 SetWeightDirty();
12139 }
12140
12142 {
12143 return GetWetLevelInternal(
m_VarWet);
12144 }
12145
12146
12147
12149 {
12151 }
12152
12154 {
12156 }
12157
12159 {
12161 }
12162
12164 {
12166 }
12167
12168
12169
12171 {
12172 if (ConfigIsExisting("itemModelLength"))
12173 {
12174 return ConfigGetFloat("itemModelLength");
12175 }
12176 return 0;
12177 }
12178
12180 {
12181 if (ConfigIsExisting("itemAttachOffset"))
12182 {
12183 return ConfigGetFloat("itemAttachOffset");
12184 }
12185 return 0;
12186 }
12187
12188 override void SetCleanness(
int value,
bool allow_client =
false)
12189 {
12190 if (!IsServerCheck(allow_client))
12191 return;
12192
12194
12196
12199 }
12200
12202 {
12204 }
12205
12207 {
12208 return true;
12209 }
12210
12211
12212
12213
12215 {
12217 }
12218
12220 {
12222 }
12223
12224
12225
12226
12227 override void SetColor(
int r,
int g,
int b,
int a)
12228 {
12234 }
12236 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12237 {
12242 }
12243
12245 {
12247 }
12248
12251 {
12252 int r,g,b,a;
12254 r = r/255;
12255 g = g/255;
12256 b = b/255;
12257 a = a/255;
12258 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12259 }
12260
12261
12262
12263 override void SetLiquidType(
int value,
bool allow_client =
false)
12264 {
12265 if (!IsServerCheck(allow_client))
12266 return;
12267
12272 }
12273
12275 {
12276 return ConfigGetInt("varLiquidTypeInit");
12277 }
12278
12280 {
12282 }
12283
12285 {
12287 SetFrozen(false);
12288 }
12289
12292 {
12293 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12294 }
12295
12296
12299 {
12300 PlayerBase nplayer;
12301 if (PlayerBase.CastTo(nplayer, player))
12302 {
12304
12305 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12306 }
12307 }
12308
12309
12312 {
12313 PlayerBase nplayer;
12314 if (PlayerBase.CastTo(nplayer,player))
12315 {
12316
12317 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12318
12319 }
12320
12321
12322 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12323
12324
12325 if (HasEnergyManager())
12326 {
12327 GetCompEM().UpdatePlugState();
12328 }
12329 }
12330
12331
12333 {
12334 super.OnPlacementStarted(player);
12335
12337 }
12338
12339 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12340 {
12342 {
12343 m_AdminLog.OnPlacementComplete(player,
this);
12344 }
12345
12346 super.OnPlacementComplete(player, position, orientation);
12347 }
12348
12349
12350
12351
12352
12354 {
12356 {
12357 return true;
12358 }
12359 else
12360 {
12361 return false;
12362 }
12363 }
12364
12365
12367 {
12369 {
12371 }
12372 }
12373
12374
12376 {
12378 }
12379
12381 {
12383 }
12384
12385 override void InsertAgent(
int agent,
float count = 1)
12386 {
12387 if (count < 1)
12388 return;
12389
12391 }
12392
12395 {
12397 }
12398
12399
12401 {
12403 }
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12447 {
12449 return false;
12450 return true;
12451 }
12452
12454 {
12455
12457 }
12458
12459
12462 {
12463 super.CheckForRoofLimited(timeTresholdMS);
12464
12466 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12467 {
12468 m_PreviousRoofTestTime = time;
12469 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12470 }
12471 }
12472
12473
12475 {
12477 {
12478 return 0;
12479 }
12480
12481 if (GetInventory().GetAttachmentSlotsCount() != 0)
12482 {
12483 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12484 if (filter)
12485 return filter.GetProtectionLevel(type, false, system);
12486 else
12487 return 0;
12488 }
12489
12490 string subclassPath, entryName;
12491
12492 switch (type)
12493 {
12495 entryName = "biological";
12496 break;
12498 entryName = "chemical";
12499 break;
12500 default:
12501 entryName = "biological";
12502 break;
12503 }
12504
12505 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12506
12508 }
12509
12510
12511
12514 {
12515 if (!IsMagazine())
12517
12519 }
12520
12521
12522
12523
12524
12529 {
12530 return true;
12531 }
12532
12534 {
12536 }
12537
12538
12539
12540
12541
12543 {
12544 if (parent)
12545 {
12546 if (parent.IsInherited(DayZInfected))
12547 return true;
12548
12549 if (!parent.IsRuined())
12550 return true;
12551 }
12552
12553 return true;
12554 }
12555
12557 {
12558 if (!super.CanPutAsAttachment(parent))
12559 {
12560 return false;
12561 }
12562
12563 if (!IsRuined() && !parent.IsRuined())
12564 {
12565 return true;
12566 }
12567
12568 return false;
12569 }
12570
12572 {
12573
12574
12575
12576
12577 return super.CanReceiveItemIntoCargo(item);
12578 }
12579
12581 {
12582
12583
12584
12585
12586 GameInventory attachmentInv = attachment.GetInventory();
12588 {
12589 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12590 return false;
12591 }
12592
12593 InventoryLocation loc = new InventoryLocation();
12594 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12595 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12596 return false;
12597
12598 return super.CanReceiveAttachment(attachment, slotId);
12599 }
12600
12602 {
12603 if (!super.CanReleaseAttachment(attachment))
12604 return false;
12605
12606 return GetInventory().AreChildrenAccessible();
12607 }
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12630 {
12631 int id = muzzle_owner.GetMuzzleID();
12632 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12633
12634 if (WPOF_array)
12635 {
12636 for (int i = 0; i < WPOF_array.Count(); i++)
12637 {
12638 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12639
12640 if (WPOF)
12641 {
12642 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12643 }
12644 }
12645 }
12646 }
12647
12648
12650 {
12651 int id = muzzle_owner.GetMuzzleID();
12653
12654 if (WPOBE_array)
12655 {
12656 for (int i = 0; i < WPOBE_array.Count(); i++)
12657 {
12658 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12659
12660 if (WPOBE)
12661 {
12662 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12663 }
12664 }
12665 }
12666 }
12667
12668
12670 {
12671 int id = muzzle_owner.GetMuzzleID();
12672 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12673
12674 if (WPOOH_array)
12675 {
12676 for (int i = 0; i < WPOOH_array.Count(); i++)
12677 {
12678 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12679
12680 if (WPOOH)
12681 {
12682 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12683 }
12684 }
12685 }
12686 }
12687
12688
12690 {
12691 int id = muzzle_owner.GetMuzzleID();
12692 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12693
12694 if (WPOOH_array)
12695 {
12696 for (int i = 0; i < WPOOH_array.Count(); i++)
12697 {
12698 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12699
12700 if (WPOOH)
12701 {
12702 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12703 }
12704 }
12705 }
12706 }
12707
12708
12710 {
12711 int id = muzzle_owner.GetMuzzleID();
12712 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12713
12714 if (WPOOH_array)
12715 {
12716 for (int i = 0; i < WPOOH_array.Count(); i++)
12717 {
12718 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12719
12720 if (WPOOH)
12721 {
12722 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12723 }
12724 }
12725 }
12726 }
12727
12728
12729
12731 {
12733 {
12734 return true;
12735 }
12736
12737 return false;
12738 }
12739
12741 {
12743 {
12744 return true;
12745 }
12746
12747 return false;
12748 }
12749
12751 {
12753 {
12754 return true;
12755 }
12756
12757 return false;
12758 }
12759
12761 {
12762 return false;
12763 }
12764
12767 {
12768 return UATimeSpent.DEFAULT_DEPLOY;
12769 }
12770
12771
12772
12773
12775 {
12777 SetSynchDirty();
12778 }
12779
12781 {
12783 }
12784
12785
12787 {
12788 return false;
12789 }
12790
12793 {
12794 string att_type = "None";
12795
12796 if (ConfigIsExisting("soundAttType"))
12797 {
12798 att_type = ConfigGetString("soundAttType");
12799 }
12800
12802 }
12803
12805 {
12807 }
12808
12809
12810
12811
12812
12818
12820 {
12823
12825 }
12826
12827
12829 {
12831 return;
12832
12834
12837
12840
12841 SoundParameters params = new SoundParameters();
12845 }
12846
12847
12849 {
12851 return;
12852
12854 SetSynchDirty();
12855
12858 }
12859
12860
12862 {
12864 return;
12865
12867 SetSynchDirty();
12868
12871 }
12872
12874 {
12876 }
12877
12879 {
12881 }
12882
12885 {
12886 if (!
GetGame().IsDedicatedServer())
12887 {
12888 if (ConfigIsExisting("attachSoundSet"))
12889 {
12890 string cfg_path = "";
12891 string soundset = "";
12892 string type_name =
GetType();
12893
12896 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12897 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12898
12899 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12900 {
12901 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12902 {
12903 if (cfg_slot_array[i] == slot_type)
12904 {
12905 soundset = cfg_soundset_array[i];
12906 break;
12907 }
12908 }
12909 }
12910
12911 if (soundset != "")
12912 {
12913 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12915 }
12916 }
12917 }
12918 }
12919
12921 {
12922
12923 }
12924
12925 void OnApply(PlayerBase player);
12926
12928 {
12929 return 1.0;
12930 };
12931
12933 {
12935 }
12936
12938 {
12940 }
12941
12943
12945 {
12946 SetDynamicPhysicsLifeTime(0.01);
12948 }
12949
12951 {
12952 array<string> zone_names = new array<string>;
12953 GetDamageZones(zone_names);
12954 for (int i = 0; i < zone_names.Count(); i++)
12955 {
12956 SetHealthMax(zone_names.Get(i),"Health");
12957 }
12958 SetHealthMax("","Health");
12959 }
12960
12963 {
12964 float global_health = GetHealth01("","Health");
12965 array<string> zones = new array<string>;
12966 GetDamageZones(zones);
12967
12968 for (int i = 0; i < zones.Count(); i++)
12969 {
12970 SetHealth01(zones.Get(i),"Health",global_health);
12971 }
12972 }
12973
12976 {
12977 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12978 }
12979
12981 {
12982 if (!hasRootAsPlayer)
12983 {
12984 if (refParentIB)
12985 {
12986
12987 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12988 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12989
12990 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12991 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12992
12995 }
12996 else
12997 {
12998
13001 }
13002 }
13003 }
13004
13006 {
13008 {
13009 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13010 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13011 {
13012 float heatPermCoef = 1.0;
13014 while (ent)
13015 {
13016 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13017 ent = ent.GetHierarchyParent();
13018 }
13019
13020 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13021 }
13022 }
13023 }
13024
13026 {
13027
13028 EntityAI parent = GetHierarchyParent();
13029 if (!parent)
13030 {
13031 hasParent = false;
13032 hasRootAsPlayer = false;
13033 }
13034 else
13035 {
13036 hasParent = true;
13037 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13038 refParentIB =
ItemBase.Cast(parent);
13039 }
13040 }
13041
13042 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13043 {
13044
13045 }
13046
13048 {
13049
13050 return false;
13051 }
13052
13054 {
13055
13056
13057 return false;
13058 }
13059
13061 {
13062
13063 return false;
13064 }
13065
13068 {
13069 return !GetIsFrozen() &&
IsOpen();
13070 }
13071
13073 {
13074 bool hasParent = false, hasRootAsPlayer = false;
13076
13077 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13078 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13079
13080 if (wwtu || foodDecay)
13081 {
13085
13086 if (processWetness || processTemperature || processDecay)
13087 {
13089
13090 if (processWetness)
13091 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13092
13093 if (processTemperature)
13095
13096 if (processDecay)
13097 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13098 }
13099 }
13100 }
13101
13104 {
13106 }
13107
13109 {
13112
13113 return super.GetTemperatureFreezeThreshold();
13114 }
13115
13117 {
13120
13121 return super.GetTemperatureThawThreshold();
13122 }
13123
13125 {
13128
13129 return super.GetItemOverheatThreshold();
13130 }
13131
13133 {
13135 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13136
13137 return super.GetTemperatureFreezeTime();
13138 }
13139
13141 {
13143 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13144
13145 return super.GetTemperatureThawTime();
13146 }
13147
13152
13154 {
13155 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13156 }
13157
13159 {
13160 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13161 }
13162
13165 {
13167 }
13168
13170 {
13172 }
13173
13175 {
13177 }
13178
13181 {
13182 return null;
13183 }
13184
13187 {
13188 return false;
13189 }
13190
13192 {
13194 {
13197 if (!trg)
13198 {
13200 explosive = this;
13201 }
13202
13203 explosive.PairRemote(trg);
13205
13206 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13207 trg.SetPersistentPairID(persistentID);
13208 explosive.SetPersistentPairID(persistentID);
13209
13210 return true;
13211 }
13212 return false;
13213 }
13214
13217 {
13218 float ret = 1.0;
13221 ret *= GetHealth01();
13222
13223 return ret;
13224 }
13225
13226 #ifdef DEVELOPER
13227 override void SetDebugItem()
13228 {
13229 super.SetDebugItem();
13230 _itemBase = this;
13231 }
13232
13234 {
13235 string text = super.GetDebugText();
13236
13238 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13239
13240 return text;
13241 }
13242 #endif
13243
13245 {
13246 return true;
13247 }
13248
13250
13252
13254 {
13257 }
13258
13259
13267
13283}
13284
13286{
13288 if (entity)
13289 {
13290 bool is_item = entity.IsInherited(
ItemBase);
13291 if (is_item && full_quantity)
13292 {
13295 }
13296 }
13297 else
13298 {
13300 return NULL;
13301 }
13302 return entity;
13303}
13304
13306{
13307 if (item)
13308 {
13309 if (health > 0)
13310 item.SetHealth("", "", health);
13311
13312 if (item.CanHaveTemperature())
13313 {
13315 if (item.CanFreeze())
13316 item.SetFrozen(false);
13317 }
13318
13319 if (item.HasEnergyManager())
13320 {
13321 if (quantity >= 0)
13322 {
13323 item.GetCompEM().SetEnergy0To1(quantity);
13324 }
13325 else
13326 {
13328 }
13329 }
13330 else if (item.IsMagazine())
13331 {
13332 Magazine mag = Magazine.Cast(item);
13333 if (quantity >= 0)
13334 {
13335 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13336 }
13337 else
13338 {
13340 }
13341
13342 }
13343 else
13344 {
13345 if (quantity >= 0)
13346 {
13347 item.SetQuantityNormalized(quantity, false);
13348 }
13349 else
13350 {
13352 }
13353
13354 }
13355 }
13356}
13357
13358#ifdef DEVELOPER
13360#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
Open
Implementations only.
override void EEOnCECreate()
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 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)
bool ShouldSplitQuantity(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)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
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()
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)
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 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 void GizmoSelectObject(Object object)
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 native void GizmoSelectPhysics(Physics physics)
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
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 string GetFoldSoundset()
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 string GetLoopFoldSoundset()
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.