8577{
8579 {
8580 return true;
8581 }
8582};
8583
8584
8585
8587{
8591
8593
8596
8597
8598
8599
8600
8609
8615
8620
8625
8646 protected bool m_IsResultOfSplit
8647
8649
8654
8655
8656
8658
8662
8663
8664
8666
8669
8670
8671
8677
8678
8686
8689
8690
8692
8693
8695
8696
8701
8702
8707
8708
8710
8711
8713 {
8718
8719 if (!
GetGame().IsDedicatedServer())
8720 {
8722 {
8724
8726 {
8728 }
8729 }
8730
8733 }
8734
8735 m_OldLocation = null;
8736
8738 {
8740 }
8741
8742 if (ConfigIsExisting("headSelectionsToHide"))
8743 {
8746 }
8747
8749 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8750 {
8752 }
8753
8755
8756 m_IsResultOfSplit = false;
8757
8759 }
8760
8762 {
8763 super.InitItemVariables();
8764
8770 m_Count = ConfigGetInt(
"count");
8771
8774
8779
8782
8787
8799
8803
8804
8807 if (ConfigIsExisting("canBeSplit"))
8808 {
8811 }
8812
8814 if (ConfigIsExisting("itemBehaviour"))
8816
8817
8820 RegisterNetSyncVariableInt("m_VarLiquidType");
8821 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8822
8823 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8824 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8825 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8826
8827 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8828 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8829 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8830 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8831
8832 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8833 RegisterNetSyncVariableBool("m_IsTakeable");
8834 RegisterNetSyncVariableBool("m_IsHologram");
8835
8838 {
8841 }
8842
8844
8846 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8848
8849 }
8850
8852 {
8854 }
8855
8857 {
8860 {
8865 }
8866 }
8867
8868 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8869 {
8871 {
8874 }
8875
8877 }
8878
8880 {
8886 }
8887
8889
8891 {
8893
8894 if (!action)
8895 {
8896 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8897 return;
8898 }
8899
8901 if (!ai)
8902 {
8904 return;
8905 }
8906
8908 if (!action_array)
8909 {
8910 action_array = new array<ActionBase_Basic>;
8912 }
8913 if (LogManager.IsActionLogEnable())
8914 {
8915 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8916 }
8917
8918 if (action_array.Find(action) != -1)
8919 {
8920 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8921 }
8922 else
8923 {
8924 action_array.Insert(action);
8925 }
8926 }
8927
8929 {
8931 ActionBase action = player.GetActionManager().GetAction(actionName);
8934
8935 if (action_array)
8936 {
8937 action_array.RemoveItem(action);
8938 }
8939 }
8940
8941
8942
8944 {
8945 ActionOverrideData overrideData = new ActionOverrideData();
8949
8951 if (!actionMap)
8952 {
8955 }
8956
8957 actionMap.Insert(this.
Type(), overrideData);
8958
8959 }
8960
8962
8964
8965
8967 {
8970
8973
8974 string config_to_search = "CfgVehicles";
8975 string muzzle_owner_config;
8976
8978 {
8979 if (IsInherited(Weapon))
8980 config_to_search = "CfgWeapons";
8981
8982 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8983
8984 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8985
8987
8988 if (config_OnFire_subclass_count > 0)
8989 {
8990 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8991
8992 for (int i = 0; i < config_OnFire_subclass_count; i++)
8993 {
8994 string particle_class = "";
8996 string config_OnFire_entry = config_OnFire_class + particle_class;
8997 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8998 WPOF_array.Insert(WPOF);
8999 }
9000
9001
9003 }
9004 }
9005
9007 {
9008 config_to_search = "CfgWeapons";
9009 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9010
9011 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9012
9014
9015 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9016 {
9017 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9018
9019 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9020 {
9021 string particle_class2 = "";
9023 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9024 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9025 WPOBE_array.Insert(WPOBE);
9026 }
9027
9028
9030 }
9031 }
9032 }
9033
9034
9036 {
9039
9041 {
9042 string config_to_search = "CfgVehicles";
9043
9044 if (IsInherited(Weapon))
9045 config_to_search = "CfgWeapons";
9046
9047 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9048 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9049
9050 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9051 {
9052
9054
9056 {
9058 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9060 return;
9061 }
9062
9065
9066
9067
9069 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9070
9071 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9072 {
9073 string particle_class = "";
9075 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9077
9078 if (entry_type == CT_CLASS)
9079 {
9080 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9081 WPOOH_array.Insert(WPOF);
9082 }
9083 }
9084
9085
9087 }
9088 }
9089 }
9090
9092 {
9094 }
9095
9097 {
9099 {
9101
9104
9107
9108 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9109 }
9110 }
9111
9113 {
9115 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9116
9118 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9119
9121 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9122
9124 {
9126 }
9127 }
9128
9130 {
9132 }
9133
9135 {
9138 else
9140
9142 {
9145 }
9146 else
9147 {
9150
9153 }
9154
9156 }
9157
9159 {
9161 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9162 }
9163
9165 {
9167 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9169 }
9170
9172 {
9174 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9175 }
9176
9178 {
9181
9182 OverheatingParticle OP = new OverheatingParticle();
9187
9189 }
9190
9192 {
9195
9196 return -1;
9197 }
9198
9200 {
9202 {
9205
9206 for (int i = count; i > 0; --i)
9207 {
9208 int id = i - 1;
9211
9214
9215 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9216 {
9217 if (p)
9218 {
9221 }
9222 }
9223 }
9224 }
9225 }
9226
9228 {
9230 {
9232 {
9233 int id = i - 1;
9235
9236 if (OP)
9237 {
9239
9240 if (p)
9241 {
9243 }
9244
9245 delete OP;
9246 }
9247 }
9248
9251 }
9252 }
9253
9256 {
9257 return 0.0;
9258 }
9259
9260
9262 {
9263 return 250;
9264 }
9265
9267 {
9268 return 0;
9269 }
9270
9273 {
9275 return true;
9276
9277 return false;
9278 }
9279
9282 {
9285
9287 {
9289 }
9290 else
9291 {
9292
9294 }
9295
9297 }
9298
9305 {
9306 return -1;
9307 }
9308
9309
9310
9311
9313 {
9315 {
9317 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9318
9319 if (r_index >= 0)
9320 {
9321 InventoryLocation r_il = new InventoryLocation;
9322 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9323
9324 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9327 {
9328 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9329 }
9331 {
9332 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9333 }
9334
9335 }
9336
9337 player.GetHumanInventory().ClearUserReservedLocation(this);
9338 }
9339
9342 }
9343
9344
9345
9346
9348 {
9349 return ItemBase.m_DebugActionsMask;
9350 }
9351
9353 {
9354 return ItemBase.m_DebugActionsMask & mask;
9355 }
9356
9358 {
9359 ItemBase.m_DebugActionsMask = mask;
9360 }
9361
9363 {
9364 ItemBase.m_DebugActionsMask |= mask;
9365 }
9366
9368 {
9369 ItemBase.m_DebugActionsMask &= ~mask;
9370 }
9371
9373 {
9375 {
9377 }
9378 else
9379 {
9381 }
9382 }
9383
9384
9386 {
9387 if (GetEconomyProfile())
9388 {
9389 float q_max = GetEconomyProfile().GetQuantityMax();
9390 if (q_max > 0)
9391 {
9392 float q_min = GetEconomyProfile().GetQuantityMin();
9393 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9394
9396 {
9397 ComponentEnergyManager comp = GetCompEM();
9399 {
9401 }
9402 }
9404 {
9406
9407 }
9408
9409 }
9410 }
9411 }
9412
9415 {
9416 EntityAI parent = GetHierarchyParent();
9417
9418 if (parent)
9419 {
9420 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9421 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9422 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9423 }
9424 }
9425
9428 {
9429 EntityAI parent = GetHierarchyParent();
9430
9431 if (parent)
9432 {
9433 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9434 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9435 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9436 }
9437 }
9438
9440 {
9441
9442
9443
9444
9446
9448 {
9449 if (ScriptInputUserData.CanStoreInputUserData())
9450 {
9451 ScriptInputUserData ctx = new ScriptInputUserData;
9457 ctx.
Write(use_stack_max);
9460
9462 {
9463 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9464 }
9465 }
9466 }
9467 else if (!
GetGame().IsMultiplayer())
9468 {
9470 }
9471 }
9472
9474 {
9476 }
9477
9479 {
9481 }
9482
9484 {
9486 }
9487
9489 {
9490
9491 return false;
9492 }
9493
9495 {
9496 return false;
9497 }
9498
9502 {
9503 return false;
9504 }
9505
9507 {
9508 return "";
9509 }
9510
9512
9514 {
9515 return false;
9516 }
9517
9519 {
9520 return true;
9521 }
9522
9523
9524
9526 {
9527 return true;
9528 }
9529
9531 {
9532 return true;
9533 }
9534
9536 {
9537 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9539 }
9540
9542 {
9544 }
9545
9547 {
9549 if (!is_being_placed)
9551 SetSynchDirty();
9552 }
9553
9554
9556
9558 {
9560 }
9561
9563 {
9565 }
9566
9568 {
9569 return 1;
9570 }
9571
9573 {
9574 return false;
9575 }
9576
9578 {
9580 SetSynchDirty();
9581 }
9582
9583
9584
9585
9586
9587
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
9604
9605
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9618 {
9619 super.OnMovedInsideCargo(container);
9620
9621 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9622 }
9623
9624 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9625 {
9626 super.EEItemLocationChanged(oldLoc,newLoc);
9627
9628 PlayerBase new_player = null;
9629 PlayerBase old_player = null;
9630
9631 if (newLoc.GetParent())
9632 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9633
9634 if (oldLoc.GetParent())
9635 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9636
9638 {
9639 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9640
9641 if (r_index >= 0)
9642 {
9643 InventoryLocation r_il = new InventoryLocation;
9644 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9645
9646 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9649 {
9650 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9651 }
9653 {
9654 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9655 }
9656
9657 }
9658 }
9659
9661 {
9662 if (new_player)
9663 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9664
9665 if (new_player == old_player)
9666 {
9667
9668 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9669 {
9671 {
9672 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9673 {
9674 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9675 }
9676 }
9677 else
9678 {
9679 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9680 }
9681 }
9682
9683 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9684 {
9685 int type = oldLoc.GetType();
9687 {
9688 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9689 }
9691 {
9692 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9693 }
9694 }
9695 if (!m_OldLocation)
9696 {
9697 m_OldLocation = new InventoryLocation;
9698 }
9699 m_OldLocation.Copy(oldLoc);
9700 }
9701 else
9702 {
9703 if (m_OldLocation)
9704 {
9705 m_OldLocation.Reset();
9706 }
9707 }
9708
9710 }
9711 else
9712 {
9713 if (new_player)
9714 {
9715 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9716 if (res_index >= 0)
9717 {
9718 InventoryLocation il = new InventoryLocation;
9719 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9721 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9724 {
9725 il.
GetParent().GetOnReleaseLock().Invoke(it);
9726 }
9728 {
9730 }
9731
9732 }
9733 }
9735 {
9736
9738 }
9739
9740 if (m_OldLocation)
9741 {
9742 m_OldLocation.Reset();
9743 }
9744 }
9745 }
9746
9747 override void EOnContact(IEntity other, Contact extra)
9748 {
9750 {
9751 int liquidType = -1;
9753 if (impactSpeed > 0.0)
9754 {
9756 #ifndef SERVER
9758 #else
9760 SetSynchDirty();
9761 #endif
9763 }
9764 }
9765
9766 #ifdef SERVER
9767 if (GetCompEM() && GetCompEM().IsPlugged())
9768 {
9769 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9770 GetCompEM().UnplugThis();
9771 }
9772 #endif
9773 }
9774
9776
9778 {
9780 }
9781
9783 {
9784
9785 }
9786
9788 {
9789 super.OnItemLocationChanged(old_owner, new_owner);
9790
9791 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9792 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9793
9794 if (!relatedPlayer && playerNew)
9795 relatedPlayer = playerNew;
9796
9797 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9798 {
9800 if (actionMgr)
9801 {
9802 ActionBase currentAction = actionMgr.GetRunningAction();
9803 if (currentAction)
9805 }
9806 }
9807
9808 Man ownerPlayerOld = null;
9809 Man ownerPlayerNew = null;
9810
9811 if (old_owner)
9812 {
9813 if (old_owner.
IsMan())
9814 {
9815 ownerPlayerOld = Man.Cast(old_owner);
9816 }
9817 else
9818 {
9819 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9820 }
9821 }
9822 else
9823 {
9825 {
9827
9828 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9829 {
9830 GetCompEM().UnplugThis();
9831 }
9832 }
9833 }
9834
9835 if (new_owner)
9836 {
9837 if (new_owner.
IsMan())
9838 {
9839 ownerPlayerNew = Man.Cast(new_owner);
9840 }
9841 else
9842 {
9843 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9844 }
9845 }
9846
9847 if (ownerPlayerOld != ownerPlayerNew)
9848 {
9849 if (ownerPlayerOld)
9850 {
9851 array<EntityAI> subItemsExit = new array<EntityAI>;
9853 for (int i = 0; i < subItemsExit.Count(); i++)
9854 {
9857 }
9858 }
9859
9860 if (ownerPlayerNew)
9861 {
9862 array<EntityAI> subItemsEnter = new array<EntityAI>;
9864 for (int j = 0; j < subItemsEnter.Count(); j++)
9865 {
9868 }
9869 }
9870 }
9871 else if (ownerPlayerNew != null)
9872 {
9873 PlayerBase nplayer;
9874 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9875 {
9876 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9878 for (int k = 0; k < subItemsUpdate.Count(); k++)
9879 {
9881 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9882 }
9883 }
9884 }
9885
9886 if (old_owner)
9887 old_owner.OnChildItemRemoved(this);
9888 if (new_owner)
9889 new_owner.OnChildItemReceived(this);
9890 }
9891
9892
9894 {
9895 super.EEDelete(parent);
9896 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9897 if (player)
9898 {
9900
9901 if (player.IsAlive())
9902 {
9903 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9904 if (r_index >= 0)
9905 {
9906 InventoryLocation r_il = new InventoryLocation;
9907 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9908
9909 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9912 {
9913 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9914 }
9916 {
9917 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9918 }
9919
9920 }
9921
9922 player.RemoveQuickBarEntityShortcut(this);
9923 }
9924 }
9925 }
9926
9928 {
9929 super.EEKilled(killer);
9930
9933 {
9934 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9935 {
9936 if (IsMagazine())
9937 {
9938 if (Magazine.Cast(this).GetAmmoCount() > 0)
9939 {
9941 }
9942 }
9943 else
9944 {
9946 }
9947 }
9948 }
9949 }
9950
9952 {
9953 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9954
9955 super.OnWasAttached(parent, slot_id);
9956
9959
9961 }
9962
9964 {
9965 super.OnWasDetached(parent, slot_id);
9966
9969 }
9970
9972 {
9973 int idx;
9976
9977 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9978 if (inventory_slots.Count() < 1)
9979 {
9980 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9981 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9982 }
9983 else
9984 {
9985 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9986 }
9987
9988 idx = inventory_slots.Find(slot);
9989 if (idx < 0)
9990 return "";
9991
9992 return attach_types.Get(idx);
9993 }
9994
9996 {
9997 int idx = -1;
9998 string slot;
9999
10002
10003 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10004 if (inventory_slots.Count() < 1)
10005 {
10006 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10007 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10008 }
10009 else
10010 {
10011 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10012 if (detach_types.Count() < 1)
10013 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10014 }
10015
10016 for (int i = 0; i < inventory_slots.Count(); i++)
10017 {
10018 slot = inventory_slots.Get(i);
10019 }
10020
10021 if (slot != "")
10022 {
10023 if (detach_types.Count() == 1)
10024 idx = 0;
10025 else
10026 idx = inventory_slots.Find(slot);
10027 }
10028 if (idx < 0)
10029 return "";
10030
10031 return detach_types.Get(idx);
10032 }
10033
10035 {
10036
10038
10039
10040 float min_time = 1;
10041 float max_time = 3;
10042 float delay = Math.RandomFloat(min_time, max_time);
10043
10044 explode_timer.Run(delay, this, "DoAmmoExplosion");
10045 }
10046
10048 {
10049 Magazine magazine = Magazine.Cast(this);
10050 int pop_sounds_count = 6;
10051 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10052
10053
10054 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10055 string sound_name = pop_sounds[ sound_idx ];
10057
10058
10059 magazine.ServerAddAmmoCount(-1);
10060
10061
10062 float min_temp_to_explode = 100;
10063
10064 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10065 {
10067 }
10068 }
10069
10070
10071 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10072 {
10073 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10074
10075 const int CHANCE_DAMAGE_CARGO = 4;
10076 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10077 const int CHANCE_DAMAGE_NOTHING = 2;
10078
10080 {
10081 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10082 int chances;
10083 int rnd;
10084
10085 if (GetInventory().GetCargo())
10086 {
10087 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10088 rnd = Math.RandomInt(0,chances);
10089
10090 if (rnd < CHANCE_DAMAGE_CARGO)
10091 {
10093 }
10094 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10095 {
10097 }
10098 }
10099 else
10100 {
10101 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10102 rnd = Math.RandomInt(0,chances);
10103
10104 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10105 {
10107 }
10108 }
10109 }
10110 }
10111
10113 {
10114 if (GetInventory().GetCargo())
10115 {
10116 int item_count = GetInventory().GetCargo().GetItemCount();
10117 if (item_count > 0)
10118 {
10119 int random_pick = Math.RandomInt(0, item_count);
10121 if (!item.IsExplosive())
10122 {
10123 item.AddHealth("","",damage);
10124 return true;
10125 }
10126 }
10127 }
10128 return false;
10129 }
10130
10132 {
10133 int attachment_count = GetInventory().AttachmentCount();
10134 if (attachment_count > 0)
10135 {
10136 int random_pick = Math.RandomInt(0, attachment_count);
10137 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10138 if (!attachment.IsExplosive())
10139 {
10140 attachment.AddHealth("","",damage);
10141 return true;
10142 }
10143 }
10144 return false;
10145 }
10146
10148 {
10150 }
10151
10153 {
10155 return GetInventory().CanRemoveEntity();
10156
10157 return false;
10158 }
10159
10161 {
10162
10164 return false;
10165
10166
10168 return false;
10169
10170
10171
10173 if (delta == 0)
10174 return false;
10175
10176
10177 return true;
10178 }
10179
10181 {
10183 {
10184 if (ScriptInputUserData.CanStoreInputUserData())
10185 {
10186 ScriptInputUserData ctx = new ScriptInputUserData;
10191 ctx.
Write(destination_entity);
10193 ctx.
Write(slot_id);
10195 }
10196 }
10197 else if (!
GetGame().IsMultiplayer())
10198 {
10200 }
10201 }
10202
10204 {
10205 float split_quantity_new;
10209 InventoryLocation loc = new InventoryLocation;
10210
10211 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10212 {
10214 split_quantity_new = stack_max;
10215 else
10217
10219 {
10220 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10221 if (new_item)
10222 {
10223 new_item.SetResultOfSplit(true);
10224 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10226 new_item.
SetQuantity(split_quantity_new,
false,
true);
10227 }
10228 }
10229 }
10230 else if (destination_entity && slot_id == -1)
10231 {
10232 if (quantity > stack_max)
10233 split_quantity_new = stack_max;
10234 else
10235 split_quantity_new = quantity;
10236
10238 {
10240 {
10243 }
10244
10245 if (new_item)
10246 {
10247 new_item.SetResultOfSplit(true);
10248 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10250 new_item.
SetQuantity(split_quantity_new,
false,
true);
10251 }
10252 }
10253 }
10254 else
10255 {
10256 if (stack_max != 0)
10257 {
10259 {
10261 }
10262
10263 if (split_quantity_new == 0)
10264 {
10265 if (!
GetGame().IsMultiplayer())
10266 player.PhysicalPredictiveDropItem(this);
10267 else
10268 player.ServerDropEntity(this);
10269 return;
10270 }
10271
10273 {
10275
10276 if (new_item)
10277 {
10278 new_item.SetResultOfSplit(true);
10279 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10282 new_item.PlaceOnSurface();
10283 }
10284 }
10285 }
10286 }
10287 }
10288
10290 {
10291 float split_quantity_new;
10295 InventoryLocation loc = new InventoryLocation;
10296
10297 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10298 {
10300 split_quantity_new = stack_max;
10301 else
10303
10305 {
10306 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10307 if (new_item)
10308 {
10309 new_item.SetResultOfSplit(true);
10310 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10312 new_item.
SetQuantity(split_quantity_new,
false,
true);
10313 }
10314 }
10315 }
10316 else if (destination_entity && slot_id == -1)
10317 {
10318 if (quantity > stack_max)
10319 split_quantity_new = stack_max;
10320 else
10321 split_quantity_new = quantity;
10322
10324 {
10326 {
10329 }
10330
10331 if (new_item)
10332 {
10333 new_item.SetResultOfSplit(true);
10334 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10336 new_item.
SetQuantity(split_quantity_new,
false,
true);
10337 }
10338 }
10339 }
10340 else
10341 {
10342 if (stack_max != 0)
10343 {
10345 {
10347 }
10348
10350 {
10352
10353 if (new_item)
10354 {
10355 new_item.SetResultOfSplit(true);
10356 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10359 new_item.PlaceOnSurface();
10360 }
10361 }
10362 }
10363 }
10364 }
10365
10367 {
10369 {
10370 if (ScriptInputUserData.CanStoreInputUserData())
10371 {
10372 ScriptInputUserData ctx = new ScriptInputUserData;
10377 dst.WriteToContext(ctx);
10379 }
10380 }
10381 else if (!
GetGame().IsMultiplayer())
10382 {
10384 }
10385 }
10386
10388 {
10390 {
10391 if (ScriptInputUserData.CanStoreInputUserData())
10392 {
10393 ScriptInputUserData ctx = new ScriptInputUserData;
10398 ctx.
Write(destination_entity);
10404 }
10405 }
10406 else if (!
GetGame().IsMultiplayer())
10407 {
10409 }
10410 }
10411
10413 {
10415 }
10416
10418 {
10420 float split_quantity_new;
10422 if (dst.IsValid())
10423 {
10424 int slot_id = dst.GetSlot();
10426
10427 if (quantity > stack_max)
10428 split_quantity_new = stack_max;
10429 else
10430 split_quantity_new = quantity;
10431
10433 {
10435
10436 if (new_item)
10437 {
10438 new_item.SetResultOfSplit(true);
10439 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10441 new_item.
SetQuantity(split_quantity_new,
false,
true);
10442 }
10443
10444 return new_item;
10445 }
10446 }
10447
10448 return null;
10449 }
10450
10452 {
10454 float split_quantity_new;
10456 if (destination_entity)
10457 {
10459 if (quantity > stackable)
10460 split_quantity_new = stackable;
10461 else
10462 split_quantity_new = quantity;
10463
10465 {
10466 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10467 if (new_item)
10468 {
10469 new_item.SetResultOfSplit(true);
10470 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10472 new_item.
SetQuantity(split_quantity_new,
false,
true);
10473 }
10474 }
10475 }
10476 }
10477
10479 {
10481 {
10482 if (ScriptInputUserData.CanStoreInputUserData())
10483 {
10484 ScriptInputUserData ctx = new ScriptInputUserData;
10489 ItemBase destination_entity =
this;
10490 ctx.
Write(destination_entity);
10494 }
10495 }
10496 else if (!
GetGame().IsMultiplayer())
10497 {
10499 }
10500 }
10501
10503 {
10505 float split_quantity_new;
10507 if (player)
10508 {
10510 if (quantity > stackable)
10511 split_quantity_new = stackable;
10512 else
10513 split_quantity_new = quantity;
10514
10516 {
10517 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10518 new_item =
ItemBase.Cast(in_hands);
10519 if (new_item)
10520 {
10521 new_item.SetResultOfSplit(true);
10522 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10524 new_item.SetQuantity(split_quantity_new, false, true);
10525 }
10526 }
10527 }
10528 }
10529
10531 {
10533 float split_quantity_new = Math.Floor(quantity * 0.5);
10534
10536 return;
10537
10539
10540 if (new_item)
10541 {
10542 if (new_item.GetQuantityMax() < split_quantity_new)
10543 {
10544 split_quantity_new = new_item.GetQuantityMax();
10545 }
10546
10547 new_item.SetResultOfSplit(true);
10548 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10549
10551 {
10554 }
10555 else
10556 {
10558 new_item.
SetQuantity(split_quantity_new,
false,
true);
10559 }
10560 }
10561 }
10562
10564 {
10566 float split_quantity_new = Math.Floor(quantity / 2);
10567
10569 return;
10570
10571 InventoryLocation invloc = new InventoryLocation;
10573
10575 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10576
10577 if (new_item)
10578 {
10579 if (new_item.GetQuantityMax() < split_quantity_new)
10580 {
10581 split_quantity_new = new_item.GetQuantityMax();
10582 }
10584 {
10587 }
10588 else if (split_quantity_new > 1)
10589 {
10591 new_item.
SetQuantity(split_quantity_new,
false,
true);
10592 }
10593 }
10594 }
10595
10598 {
10599 SetWeightDirty();
10601
10602 if (parent)
10603 parent.OnAttachmentQuantityChangedEx(this, delta);
10604
10606 {
10608 {
10610 }
10612 {
10613 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10615 }
10616 }
10617
10618 }
10619
10622 {
10623
10624 }
10625
10628 {
10630 }
10631
10633 {
10634 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10635
10637 {
10638 if (newLevel == GameConstants.STATE_RUINED)
10639 {
10641 EntityAI parent = GetHierarchyParent();
10642 if (parent && parent.IsFireplace())
10643 {
10644 CargoBase cargo = GetInventory().GetCargo();
10645 if (cargo)
10646 {
10648 {
10650 }
10651 }
10652 }
10653 }
10654
10656 {
10657
10659 return;
10660 }
10661
10662 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10663 {
10665 }
10666 }
10667 }
10668
10669
10671 {
10672 super.OnRightClick();
10673
10675 {
10677 {
10678 if (ScriptInputUserData.CanStoreInputUserData())
10679 {
10680 EntityAI root = GetHierarchyRoot();
10681 Man playerOwner = GetHierarchyRootPlayer();
10682 InventoryLocation dst = new InventoryLocation;
10683
10684
10685 if (!playerOwner && root && root == this)
10686 {
10688 }
10689 else
10690 {
10691
10692 GetInventory().GetCurrentInventoryLocation(dst);
10694 {
10697 {
10699 }
10700 else
10701 {
10703
10704
10705 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10706 {
10708 }
10709 else
10710 {
10711 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10712 }
10713 }
10714 }
10715 }
10716
10717 ScriptInputUserData ctx = new ScriptInputUserData;
10725 }
10726 }
10727 else if (!
GetGame().IsMultiplayer())
10728 {
10730 }
10731 }
10732 }
10733
10735 {
10736 if (root)
10737 {
10738 vector m4[4];
10739 root.GetTransform(m4);
10740 dst.SetGround(this, m4);
10741 }
10742 else
10743 {
10744 GetInventory().GetCurrentInventoryLocation(dst);
10745 }
10746 }
10747
10748 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10749 {
10750
10751 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10752 return false;
10753
10754 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10755 return false;
10756
10757
10759 return false;
10760
10761
10762 Magazine mag = Magazine.Cast(this);
10763 if (mag)
10764 {
10765 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10766 return false;
10767
10768 if (stack_max_limit)
10769 {
10770 Magazine other_mag = Magazine.Cast(other_item);
10771 if (other_item)
10772 {
10773 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10774 return false;
10775 }
10776
10777 }
10778 }
10779 else
10780 {
10781
10783 return false;
10784
10786 return false;
10787 }
10788
10789 PlayerBase player = null;
10790 if (CastTo(player, GetHierarchyRootPlayer()))
10791 {
10792 if (player.GetInventory().HasAttachment(this))
10793 return false;
10794
10795 if (player.IsItemsToDelete())
10796 return false;
10797 }
10798
10799 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10800 return false;
10801
10802 int slotID;
10804 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10805 return false;
10806
10807 return true;
10808 }
10809
10811 {
10813 }
10814
10816 {
10817 return m_IsResultOfSplit;
10818 }
10819
10821 {
10822 m_IsResultOfSplit = value;
10823 }
10824
10826 {
10828 }
10829
10831 {
10832 float other_item_quantity = other_item.GetQuantity();
10833 float this_free_space;
10834
10836
10838
10839 if (other_item_quantity > this_free_space)
10840 {
10841 return this_free_space;
10842 }
10843 else
10844 {
10845 return other_item_quantity;
10846 }
10847 }
10848
10850 {
10852 }
10853
10855 {
10857 return;
10858
10859 if (!IsMagazine() && other_item)
10860 {
10862 if (quantity_used != 0)
10863 {
10864 float hp1 = GetHealth01("","");
10865 float hp2 = other_item.GetHealth01("","");
10866 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10867 hpResult = hpResult / (
GetQuantity() + quantity_used);
10868
10869 hpResult *= GetMaxHealth();
10870 Math.Round(hpResult);
10871 SetHealth("", "Health", hpResult);
10872
10874 other_item.AddQuantity(-quantity_used);
10875 }
10876 }
10878 }
10879
10881 {
10882 #ifdef SERVER
10883 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10884 GetHierarchyParent().IncreaseLifetimeUp();
10885 #endif
10886 };
10887
10889 {
10890 PlayerBase p = PlayerBase.Cast(player);
10891
10892 array<int> recipesIds = p.m_Recipes;
10893 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10894 if (moduleRecipesManager)
10895 {
10896 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10897 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10898 }
10899
10900 for (int i = 0;i < recipesIds.Count(); i++)
10901 {
10902 int key = recipesIds.Get(i);
10903 string recipeName = moduleRecipesManager.GetRecipeName(key);
10905 }
10906 }
10907
10908
10909 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10910 {
10911 super.GetDebugActions(outputList);
10912
10913
10919
10920
10925
10930
10931
10935
10936
10938 {
10942 }
10943
10946
10947
10951
10953
10954 InventoryLocation loc = new InventoryLocation();
10955 GetInventory().GetCurrentInventoryLocation(loc);
10957 {
10958 if (Gizmo_IsSupported())
10961 }
10962
10964 }
10965
10966
10967
10968
10970 {
10971 super.OnAction(action_id, player, ctx);
10972
10974 {
10975 switch (action_id)
10976 {
10979 return true;
10982 return true;
10983 }
10984 }
10985
10987 {
10988 switch (action_id)
10989 {
10991 Delete();
10992 return true;
10993 }
10994 }
10995
10996 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10997 {
10998 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10999 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11000 PlayerBase p = PlayerBase.Cast(player);
11001 if (
EActions.RECIPES_RANGE_START < 1000)
11002 {
11003 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11004 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11005 }
11006 }
11007 #ifndef SERVER
11008 else if (action_id ==
EActions.WATCH_PLAYER)
11009 {
11010 PluginDeveloper.SetDeveloperItemClientEx(player);
11011 }
11012 #endif
11014 {
11015 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11016 {
11017 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11018 OnDebugButtonPressServer(id + 1);
11019 }
11020
11021 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11022 {
11023 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11025 }
11026
11027 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11028 {
11029 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11031 }
11032
11033 else if (action_id ==
EActions.ADD_QUANTITY)
11034 {
11035 if (IsMagazine())
11036 {
11037 Magazine mag = Magazine.Cast(this);
11038 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11039 }
11040 else
11041 {
11043 }
11044
11045 if (m_EM)
11046 {
11047 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11048 }
11049
11050 }
11051
11052 else if (action_id ==
EActions.REMOVE_QUANTITY)
11053 {
11054 if (IsMagazine())
11055 {
11056 Magazine mag2 = Magazine.Cast(this);
11057 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11058 }
11059 else
11060 {
11062 }
11063 if (m_EM)
11064 {
11065 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11066 }
11067
11068 }
11069
11070 else if (action_id ==
EActions.SET_QUANTITY_0)
11071 {
11073
11074 if (m_EM)
11075 {
11076 m_EM.SetEnergy(0);
11077 }
11078 }
11079
11080 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11081 {
11083
11084 if (m_EM)
11085 {
11086 m_EM.SetEnergy(m_EM.GetEnergyMax());
11087 }
11088 }
11089
11090 else if (action_id ==
EActions.ADD_HEALTH)
11091 {
11092 AddHealth("","",GetMaxHealth("","Health")/5);
11093 }
11094 else if (action_id ==
EActions.REMOVE_HEALTH)
11095 {
11096 AddHealth("","",-GetMaxHealth("","Health")/5);
11097 }
11098 else if (action_id ==
EActions.DESTROY_HEALTH)
11099 {
11100 SetHealth01("","",0);
11101 }
11102 else if (action_id ==
EActions.WATCH_ITEM)
11103 {
11105 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11106 #ifdef DEVELOPER
11107 SetDebugDeveloper_item(this);
11108 #endif
11109 }
11110
11111 else if (action_id ==
EActions.ADD_TEMPERATURE)
11112 {
11113 AddTemperature(20);
11114
11115 }
11116
11117 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11118 {
11119 AddTemperature(-20);
11120
11121 }
11122
11123 else if (action_id ==
EActions.FLIP_FROZEN)
11124 {
11125 SetFrozen(!GetIsFrozen());
11126
11127 }
11128
11129 else if (action_id ==
EActions.ADD_WETNESS)
11130 {
11132
11133 }
11134
11135 else if (action_id ==
EActions.REMOVE_WETNESS)
11136 {
11138
11139 }
11140
11141 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11142 {
11145
11146
11147 }
11148
11149 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11150 {
11153 }
11154
11155 else if (action_id ==
EActions.MAKE_SPECIAL)
11156 {
11157 auto debugParams = DebugSpawnParams.WithPlayer(player);
11158 OnDebugSpawnEx(debugParams);
11159 }
11160
11161 }
11162
11163
11164 return false;
11165 }
11166
11167
11168
11169
11173
11176
11177
11178
11180 {
11181 return false;
11182 }
11183
11184
11186 {
11187 return true;
11188 }
11189
11190
11192 {
11193 return true;
11194 }
11195
11196
11197
11199 {
11200 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11202 }
11203
11206 {
11207 return null;
11208 }
11209
11211 {
11212 return false;
11213 }
11214
11216 {
11217 return false;
11218 }
11219
11223
11224
11226 {
11227 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11228 return module_repairing.CanRepair(this, item_repair_kit);
11229 }
11230
11231
11232 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11233 {
11234 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11235 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11236 }
11237
11238
11240 {
11241
11242
11243
11244
11245
11246
11247
11248
11249 return 1;
11250 }
11251
11252
11253
11255 {
11257 }
11258
11259
11260
11262 {
11264 }
11265
11266
11275 {
11276 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11277
11278 if (player)
11279 {
11280 player.MessageStatus(text);
11281 }
11282 }
11283
11284
11293 {
11294 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11295
11296 if (player)
11297 {
11298 player.MessageAction(text);
11299 }
11300 }
11301
11302
11311 {
11312 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11313
11314 if (player)
11315 {
11316 player.MessageFriendly(text);
11317 }
11318 }
11319
11320
11329 {
11330 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11331
11332 if (player)
11333 {
11334 player.MessageImportant(text);
11335 }
11336 }
11337
11339 {
11340 return true;
11341 }
11342
11343
11344 override bool KindOf(
string tag)
11345 {
11346 bool found = false;
11347 string item_name = this.
GetType();
11350
11351 int array_size = item_tag_array.Count();
11352 for (int i = 0; i < array_size; i++)
11353 {
11354 if (item_tag_array.Get(i) == tag)
11355 {
11356 found = true;
11357 break;
11358 }
11359 }
11360 return found;
11361 }
11362
11363
11365 {
11366
11367 super.OnRPC(sender, rpc_type,ctx);
11368
11369
11370 switch (rpc_type)
11371 {
11372 #ifndef SERVER
11373 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11374 Param2<bool, string> p = new Param2<bool, string>(false, "");
11375
11377 return;
11378
11379 bool play = p.param1;
11380 string soundSet = p.param2;
11381
11382 if (play)
11383 {
11385 {
11387 {
11389 }
11390 }
11391 else
11392 {
11394 }
11395 }
11396 else
11397 {
11399 }
11400
11401 break;
11402 #endif
11403
11404 }
11405
11407 {
11409 }
11410 }
11411
11412
11413
11414
11416 {
11417 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11418 return plugin.GetID(
name);
11419 }
11420
11422 {
11423 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11424 return plugin.GetName(id);
11425 }
11426
11429 {
11430
11431
11432 int varFlags;
11433 if (!ctx.
Read(varFlags))
11434 return;
11435
11436 if (varFlags & ItemVariableFlags.FLOAT)
11437 {
11439 }
11440 }
11441
11443 {
11444
11445 super.SerializeNumericalVars(floats_out);
11446
11447
11448
11450 {
11452 }
11453
11455 {
11457 }
11458
11460 {
11462 }
11463
11465 {
11470 }
11471
11473 {
11475 }
11476 }
11477
11479 {
11480
11481 super.DeSerializeNumericalVars(floats);
11482
11483
11484 int index = 0;
11485 int mask = Math.Round(floats.Get(index));
11486
11487 index++;
11488
11490 {
11492 {
11494 }
11495 else
11496 {
11497 float quantity = floats.Get(index);
11498 SetQuantity(quantity,
true,
false,
false,
false);
11499 }
11500 index++;
11501 }
11502
11504 {
11505 float wet = floats.Get(index);
11507 index++;
11508 }
11509
11511 {
11512 int liquidtype = Math.Round(floats.Get(index));
11514 index++;
11515 }
11516
11518 {
11520 index++;
11522 index++;
11524 index++;
11526 index++;
11527 }
11528
11530 {
11531 int cleanness = Math.Round(floats.Get(index));
11533 index++;
11534 }
11535 }
11536
11538 {
11539 super.WriteVarsToCTX(ctx);
11540
11541
11543 {
11545 }
11546
11548 {
11550 }
11551
11553 {
11555 }
11556
11558 {
11559 int r,g,b,a;
11565 }
11566
11568 {
11570 }
11571 }
11572
11574 {
11575 if (!super.ReadVarsFromCTX(ctx,version))
11576 return false;
11577
11578 int intValue;
11579 float value;
11580
11581 if (version < 140)
11582 {
11583 if (!ctx.
Read(intValue))
11584 return false;
11585
11586 m_VariablesMask = intValue;
11587 }
11588
11590 {
11591 if (!ctx.
Read(value))
11592 return false;
11593
11595 {
11597 }
11598 else
11599 {
11601 }
11602 }
11603
11604 if (version < 140)
11605 {
11607 {
11608 if (!ctx.
Read(value))
11609 return false;
11610 SetTemperatureDirect(value);
11611 }
11612 }
11613
11615 {
11616 if (!ctx.
Read(value))
11617 return false;
11619 }
11620
11622 {
11623 if (!ctx.
Read(intValue))
11624 return false;
11626 }
11627
11629 {
11630 int r,g,b,a;
11632 return false;
11634 return false;
11636 return false;
11638 return false;
11639
11641 }
11642
11644 {
11645 if (!ctx.
Read(intValue))
11646 return false;
11648 }
11649
11650 if (version >= 138 && version < 140)
11651 {
11653 {
11654 if (!ctx.
Read(intValue))
11655 return false;
11656 SetFrozen(intValue);
11657 }
11658 }
11659
11660 return true;
11661 }
11662
11663
11665 {
11668 {
11670 }
11671
11672 if (!super.OnStoreLoad(ctx, version))
11673 {
11675 return false;
11676 }
11677
11678 if (version >= 114)
11679 {
11680 bool hasQuickBarIndexSaved;
11681
11682 if (!ctx.
Read(hasQuickBarIndexSaved))
11683 {
11685 return false;
11686 }
11687
11688 if (hasQuickBarIndexSaved)
11689 {
11690 int itmQBIndex;
11691
11692
11693 if (!ctx.
Read(itmQBIndex))
11694 {
11696 return false;
11697 }
11698
11699 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11700 if (itmQBIndex != -1 && parentPlayer)
11701 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11702 }
11703 }
11704 else
11705 {
11706
11707 PlayerBase player;
11708 int itemQBIndex;
11709 if (version ==
int.
MAX)
11710 {
11711 if (!ctx.
Read(itemQBIndex))
11712 {
11714 return false;
11715 }
11716 }
11717 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11718 {
11719
11720 if (!ctx.
Read(itemQBIndex))
11721 {
11723 return false;
11724 }
11725 if (itemQBIndex != -1 && player)
11726 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11727 }
11728 }
11729
11730 if (version < 140)
11731 {
11732
11733 if (!LoadVariables(ctx, version))
11734 {
11736 return false;
11737 }
11738 }
11739
11740
11742 {
11744 return false;
11745 }
11746 if (version >= 132)
11747 {
11749 if (raib)
11750 {
11752 {
11754 return false;
11755 }
11756 }
11757 }
11758
11760 return true;
11761 }
11762
11763
11764
11766 {
11767 super.OnStoreSave(ctx);
11768
11769 PlayerBase player;
11770 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11771 {
11773
11774 int itemQBIndex = -1;
11775 itemQBIndex = player.FindQuickBarEntityIndex(this);
11776 ctx.
Write(itemQBIndex);
11777 }
11778 else
11779 {
11781 }
11782
11784
11786 if (raib)
11787 {
11789 }
11790 }
11791
11792
11794 {
11795 super.AfterStoreLoad();
11796
11798 {
11800 }
11801
11803 {
11806 }
11807 }
11808
11810 {
11811 super.EEOnAfterLoad();
11812
11814 {
11816 }
11817
11820 }
11821
11823 {
11824 return false;
11825 }
11826
11827
11828
11830 {
11832 {
11833 #ifdef PLATFORM_CONSOLE
11834
11836 {
11838 if (menu)
11839 {
11841 }
11842 }
11843 #endif
11844 }
11845
11847 {
11850 }
11851
11853 {
11854 SetWeightDirty();
11856 }
11858 {
11861 }
11862
11864 {
11867 }
11869 {
11872 }
11873
11874 super.OnVariablesSynchronized();
11875 }
11876
11877
11878
11880 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11881 {
11882 if (!IsServerCheck(allow_client))
11883 return false;
11884
11886 return false;
11887
11890
11891 if (value <= (min + 0.001))
11892 value = min;
11893
11894 if (value == min)
11895 {
11896 if (destroy_config)
11897 {
11898 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11899 if (dstr)
11900 {
11902 this.Delete();
11903 return true;
11904 }
11905 }
11906 else if (destroy_forced)
11907 {
11909 this.Delete();
11910 return true;
11911 }
11912
11914 }
11915
11918
11920 {
11922
11923 if (delta)
11925 }
11926
11928
11929 return false;
11930 }
11931
11932
11934 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11935 {
11937 }
11938
11940 {
11943 }
11944
11946 {
11949 }
11950
11952 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11953 {
11954 float value_clamped = Math.Clamp(value, 0, 1);
11956 SetQuantity(result, destroy_config, destroy_forced);
11957 }
11958
11959
11962 {
11964 }
11965
11967 {
11969 }
11970
11971
11972
11973
11974
11975
11976
11977
11978
11979
11981 {
11982 int slot = -1;
11983 if (GetInventory())
11984 {
11985 InventoryLocation il = new InventoryLocation;
11986 GetInventory().GetCurrentInventoryLocation(il);
11988 }
11989
11991 }
11992
11994 {
11995 float quantity_max = 0;
11996
11998 {
11999 if (attSlotID != -1)
12000 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12001
12002 if (quantity_max <= 0)
12004 }
12005
12006 if (quantity_max <= 0)
12008
12009 return quantity_max;
12010 }
12011
12013 {
12015 }
12016
12018 {
12020 }
12021
12022
12024 {
12026 }
12027
12029 {
12031 }
12032
12034 {
12036 }
12037
12038
12040 {
12041
12042 float weightEx = GetWeightEx();
12043 float special = GetInventoryAndCargoWeight();
12044 return weightEx - special;
12045 }
12046
12047
12049 {
12051 }
12052
12054 {
12056 {
12057 #ifdef DEVELOPER
12058 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12059 {
12060 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12062 }
12063 #endif
12064
12065 return GetQuantity() * GetConfigWeightModified();
12066 }
12067 else if (HasEnergyManager())
12068 {
12069 #ifdef DEVELOPER
12070 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12071 {
12072 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12073 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12074 }
12075 #endif
12076 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12077 }
12078 else
12079 {
12080 #ifdef DEVELOPER
12081 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12082 {
12083 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12084 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12085 }
12086 #endif
12087 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12088 }
12089 }
12090
12093 {
12094 int item_count = 0;
12096
12097 if (GetInventory().GetCargo() != NULL)
12098 {
12099 item_count = GetInventory().GetCargo().GetItemCount();
12100 }
12101
12102 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12103 {
12104 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12105 if (item)
12106 item_count += item.GetNumberOfItems();
12107 }
12108 return item_count;
12109 }
12110
12113 {
12114 float weight = 0;
12115 float wetness = 1;
12116 if (include_wetness)
12119 {
12120 weight = wetness * m_ConfigWeight;
12121 }
12123 {
12124 weight = 1;
12125 }
12126 return weight;
12127 }
12128
12129
12130
12132 {
12133 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12134 {
12135 GameInventory inv = GetInventory();
12136 array<EntityAI> items = new array<EntityAI>;
12138 for (int i = 0; i < items.Count(); i++)
12139 {
12141 if (item)
12142 {
12144 }
12145 }
12146 }
12147 }
12148
12149
12150
12151
12153 {
12154 float energy = 0;
12155 if (HasEnergyManager())
12156 {
12157 energy = GetCompEM().GetEnergy();
12158 }
12159 return energy;
12160 }
12161
12162
12164 {
12165 super.OnEnergyConsumed();
12166
12168 }
12169
12171 {
12172 super.OnEnergyAdded();
12173
12175 }
12176
12177
12179 {
12180 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12181 {
12183 {
12184 float energy_0to1 = GetCompEM().GetEnergy0To1();
12186 }
12187 }
12188 }
12189
12190
12192 {
12193 return ConfigGetFloat("heatIsolation");
12194 }
12195
12197 {
12199 }
12200
12202 {
12203 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12204 if (
GetGame().ConfigIsExisting(paramPath))
12206
12207 return 0.0;
12208 }
12209
12211 {
12212 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12213 if (
GetGame().ConfigIsExisting(paramPath))
12215
12216 return 0.0;
12217 }
12218
12219 override void SetWet(
float value,
bool allow_client =
false)
12220 {
12221 if (!IsServerCheck(allow_client))
12222 return;
12223
12226
12228
12229 m_VarWet = Math.Clamp(value, min, max);
12230
12232 {
12235 }
12236 }
12237
12238 override void AddWet(
float value)
12239 {
12241 }
12242
12244 {
12246 }
12247
12249 {
12251 }
12252
12254 {
12256 }
12257
12259 {
12261 }
12262
12264 {
12266 }
12267
12268 override void OnWetChanged(
float newVal,
float oldVal)
12269 {
12272 if (newLevel != oldLevel)
12273 {
12275 }
12276 }
12277
12279 {
12280 SetWeightDirty();
12281 }
12282
12284 {
12285 return GetWetLevelInternal(
m_VarWet);
12286 }
12287
12288
12289
12291 {
12293 }
12294
12296 {
12298 }
12299
12301 {
12303 }
12304
12306 {
12308 }
12309
12310
12311
12313 {
12314 if (ConfigIsExisting("itemModelLength"))
12315 {
12316 return ConfigGetFloat("itemModelLength");
12317 }
12318 return 0;
12319 }
12320
12322 {
12323 if (ConfigIsExisting("itemAttachOffset"))
12324 {
12325 return ConfigGetFloat("itemAttachOffset");
12326 }
12327 return 0;
12328 }
12329
12330 override void SetCleanness(
int value,
bool allow_client =
false)
12331 {
12332 if (!IsServerCheck(allow_client))
12333 return;
12334
12336
12338
12341 }
12342
12344 {
12346 }
12347
12349 {
12350 return true;
12351 }
12352
12353
12354
12355
12357 {
12359 }
12360
12362 {
12364 }
12365
12366
12367
12368
12369 override void SetColor(
int r,
int g,
int b,
int a)
12370 {
12376 }
12378 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12379 {
12384 }
12385
12387 {
12389 }
12390
12393 {
12394 int r,g,b,a;
12396 r = r/255;
12397 g = g/255;
12398 b = b/255;
12399 a = a/255;
12400 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12401 }
12402
12403
12404
12405 override void SetLiquidType(
int value,
bool allow_client =
false)
12406 {
12407 if (!IsServerCheck(allow_client))
12408 return;
12409
12414 }
12415
12417 {
12418 return ConfigGetInt("varLiquidTypeInit");
12419 }
12420
12422 {
12424 }
12425
12427 {
12429 SetFrozen(false);
12430 }
12431
12434 {
12435 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12436 }
12437
12438
12441 {
12442 PlayerBase nplayer;
12443 if (PlayerBase.CastTo(nplayer, player))
12444 {
12446
12447 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12448 }
12449 }
12450
12451
12454 {
12455 PlayerBase nplayer;
12456 if (PlayerBase.CastTo(nplayer,player))
12457 {
12458
12459 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12460
12461 }
12462
12463
12464 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12465
12466
12467 if (HasEnergyManager())
12468 {
12469 GetCompEM().UpdatePlugState();
12470 }
12471 }
12472
12473
12475 {
12476 super.OnPlacementStarted(player);
12477
12479 }
12480
12481 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12482 {
12484 {
12485 m_AdminLog.OnPlacementComplete(player,
this);
12486 }
12487
12488 super.OnPlacementComplete(player, position, orientation);
12489 }
12490
12491
12492
12493
12494
12496 {
12498 {
12499 return true;
12500 }
12501 else
12502 {
12503 return false;
12504 }
12505 }
12506
12507
12509 {
12511 {
12513 }
12514 }
12515
12516
12518 {
12520 }
12521
12523 {
12525 }
12526
12527 override void InsertAgent(
int agent,
float count = 1)
12528 {
12529 if (count < 1)
12530 return;
12531
12533 }
12534
12537 {
12539 }
12540
12541
12543 {
12545 }
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
12587
12589 {
12591 return false;
12592 return true;
12593 }
12594
12596 {
12597
12599 }
12600
12601
12604 {
12605 super.CheckForRoofLimited(timeTresholdMS);
12606
12608 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12609 {
12610 m_PreviousRoofTestTime = time;
12611 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12612 }
12613 }
12614
12615
12617 {
12619 {
12620 return 0;
12621 }
12622
12623 if (GetInventory().GetAttachmentSlotsCount() != 0)
12624 {
12625 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12626 if (filter)
12627 return filter.GetProtectionLevel(type, false, system);
12628 else
12629 return 0;
12630 }
12631
12632 string subclassPath, entryName;
12633
12634 switch (type)
12635 {
12637 entryName = "biological";
12638 break;
12640 entryName = "chemical";
12641 break;
12642 default:
12643 entryName = "biological";
12644 break;
12645 }
12646
12647 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12648
12650 }
12651
12652
12653
12656 {
12657 if (!IsMagazine())
12659
12661 }
12662
12663
12664
12665
12666
12671 {
12672 return true;
12673 }
12674
12676 {
12678 }
12679
12680
12681
12682
12683
12685 {
12686 if (parent)
12687 {
12688 if (parent.IsInherited(DayZInfected))
12689 return true;
12690
12691 if (!parent.IsRuined())
12692 return true;
12693 }
12694
12695 return true;
12696 }
12697
12699 {
12700 if (!super.CanPutAsAttachment(parent))
12701 {
12702 return false;
12703 }
12704
12705 if (!IsRuined() && !parent.IsRuined())
12706 {
12707 return true;
12708 }
12709
12710 return false;
12711 }
12712
12714 {
12715
12716
12717
12718
12719 return super.CanReceiveItemIntoCargo(item);
12720 }
12721
12723 {
12724
12725
12726
12727
12728 GameInventory attachmentInv = attachment.GetInventory();
12730 {
12731 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12732 return false;
12733 }
12734
12735 InventoryLocation loc = new InventoryLocation();
12736 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12737 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12738 return false;
12739
12740 return super.CanReceiveAttachment(attachment, slotId);
12741 }
12742
12744 {
12745 if (!super.CanReleaseAttachment(attachment))
12746 return false;
12747
12748 return GetInventory().AreChildrenAccessible();
12749 }
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
12764
12765
12766
12767
12768
12769
12770
12772 {
12773 int id = muzzle_owner.GetMuzzleID();
12774 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12775
12776 if (WPOF_array)
12777 {
12778 for (int i = 0; i < WPOF_array.Count(); i++)
12779 {
12780 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12781
12782 if (WPOF)
12783 {
12784 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12785 }
12786 }
12787 }
12788 }
12789
12790
12792 {
12793 int id = muzzle_owner.GetMuzzleID();
12795
12796 if (WPOBE_array)
12797 {
12798 for (int i = 0; i < WPOBE_array.Count(); i++)
12799 {
12800 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12801
12802 if (WPOBE)
12803 {
12804 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12805 }
12806 }
12807 }
12808 }
12809
12810
12812 {
12813 int id = muzzle_owner.GetMuzzleID();
12814 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12815
12816 if (WPOOH_array)
12817 {
12818 for (int i = 0; i < WPOOH_array.Count(); i++)
12819 {
12820 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12821
12822 if (WPOOH)
12823 {
12824 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12825 }
12826 }
12827 }
12828 }
12829
12830
12832 {
12833 int id = muzzle_owner.GetMuzzleID();
12834 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12835
12836 if (WPOOH_array)
12837 {
12838 for (int i = 0; i < WPOOH_array.Count(); i++)
12839 {
12840 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12841
12842 if (WPOOH)
12843 {
12844 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12845 }
12846 }
12847 }
12848 }
12849
12850
12852 {
12853 int id = muzzle_owner.GetMuzzleID();
12854 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12855
12856 if (WPOOH_array)
12857 {
12858 for (int i = 0; i < WPOOH_array.Count(); i++)
12859 {
12860 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12861
12862 if (WPOOH)
12863 {
12864 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12865 }
12866 }
12867 }
12868 }
12869
12870
12871
12873 {
12875 {
12876 return true;
12877 }
12878
12879 return false;
12880 }
12881
12883 {
12885 {
12886 return true;
12887 }
12888
12889 return false;
12890 }
12891
12893 {
12895 {
12896 return true;
12897 }
12898
12899 return false;
12900 }
12901
12903 {
12904 return false;
12905 }
12906
12909 {
12910 return UATimeSpent.DEFAULT_DEPLOY;
12911 }
12912
12913
12914
12915
12917 {
12919 SetSynchDirty();
12920 }
12921
12923 {
12925 }
12926
12927
12929 {
12930 return false;
12931 }
12932
12935 {
12936 string att_type = "None";
12937
12938 if (ConfigIsExisting("soundAttType"))
12939 {
12940 att_type = ConfigGetString("soundAttType");
12941 }
12942
12944 }
12945
12947 {
12949 }
12950
12951
12952
12953
12954
12960
12962 {
12965
12967 }
12968
12969
12971 {
12973 return;
12974
12976
12979
12982
12983 SoundParameters params = new SoundParameters();
12987 }
12988
12989
12991 {
12993 return;
12994
12996 SetSynchDirty();
12997
13000 }
13001
13002
13004 {
13006 return;
13007
13009 SetSynchDirty();
13010
13013 }
13014
13016 {
13018 }
13019
13021 {
13023 }
13024
13027 {
13028 if (!
GetGame().IsDedicatedServer())
13029 {
13030 if (ConfigIsExisting("attachSoundSet"))
13031 {
13032 string cfg_path = "";
13033 string soundset = "";
13034 string type_name =
GetType();
13035
13038 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13039 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13040
13041 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13042 {
13043 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13044 {
13045 if (cfg_slot_array[i] == slot_type)
13046 {
13047 soundset = cfg_soundset_array[i];
13048 break;
13049 }
13050 }
13051 }
13052
13053 if (soundset != "")
13054 {
13055 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13057 }
13058 }
13059 }
13060 }
13061
13063 {
13064
13065 }
13066
13067 void OnApply(PlayerBase player);
13068
13070 {
13071 return 1.0;
13072 };
13073
13075 {
13077 }
13078
13080 {
13082 }
13083
13085
13087 {
13088 SetDynamicPhysicsLifeTime(0.01);
13090 }
13091
13093 {
13094 array<string> zone_names = new array<string>;
13095 GetDamageZones(zone_names);
13096 for (int i = 0; i < zone_names.Count(); i++)
13097 {
13098 SetHealthMax(zone_names.Get(i),"Health");
13099 }
13100 SetHealthMax("","Health");
13101 }
13102
13105 {
13106 float global_health = GetHealth01("","Health");
13107 array<string> zones = new array<string>;
13108 GetDamageZones(zones);
13109
13110 for (int i = 0; i < zones.Count(); i++)
13111 {
13112 SetHealth01(zones.Get(i),"Health",global_health);
13113 }
13114 }
13115
13118 {
13119 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13120 }
13121
13123 {
13124 if (!hasRootAsPlayer)
13125 {
13126 if (refParentIB)
13127 {
13128
13129 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13130 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13131
13132 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13133 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13134
13137 }
13138 else
13139 {
13140
13143 }
13144 }
13145 }
13146
13148 {
13150 {
13151 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13152 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13153 {
13154 float heatPermCoef = 1.0;
13156 while (ent)
13157 {
13158 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13159 ent = ent.GetHierarchyParent();
13160 }
13161
13162 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13163 }
13164 }
13165 }
13166
13168 {
13169
13170 EntityAI parent = GetHierarchyParent();
13171 if (!parent)
13172 {
13173 hasParent = false;
13174 hasRootAsPlayer = false;
13175 }
13176 else
13177 {
13178 hasParent = true;
13179 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13180 refParentIB =
ItemBase.Cast(parent);
13181 }
13182 }
13183
13184 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13185 {
13186
13187 }
13188
13190 {
13191
13192 return false;
13193 }
13194
13196 {
13197
13198
13199 return false;
13200 }
13201
13203 {
13204
13205 return false;
13206 }
13207
13210 {
13211 return !GetIsFrozen() &&
IsOpen();
13212 }
13213
13215 {
13216 bool hasParent = false, hasRootAsPlayer = false;
13218
13219 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13220 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13221
13222 if (wwtu || foodDecay)
13223 {
13227
13228 if (processWetness || processTemperature || processDecay)
13229 {
13231
13232 if (processWetness)
13233 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13234
13235 if (processTemperature)
13237
13238 if (processDecay)
13239 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13240 }
13241 }
13242 }
13243
13246 {
13248 }
13249
13251 {
13254
13255 return super.GetTemperatureFreezeThreshold();
13256 }
13257
13259 {
13262
13263 return super.GetTemperatureThawThreshold();
13264 }
13265
13267 {
13270
13271 return super.GetItemOverheatThreshold();
13272 }
13273
13275 {
13277 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13278
13279 return super.GetTemperatureFreezeTime();
13280 }
13281
13283 {
13285 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13286
13287 return super.GetTemperatureThawTime();
13288 }
13289
13294
13296 {
13297 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13298 }
13299
13301 {
13302 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13303 }
13304
13307 {
13309 }
13310
13312 {
13314 }
13315
13317 {
13319 }
13320
13323 {
13324 return null;
13325 }
13326
13329 {
13330 return false;
13331 }
13332
13334 {
13336 {
13339 if (!trg)
13340 {
13342 explosive = this;
13343 }
13344
13345 explosive.PairRemote(trg);
13347
13348 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13349 trg.SetPersistentPairID(persistentID);
13350 explosive.SetPersistentPairID(persistentID);
13351
13352 return true;
13353 }
13354 return false;
13355 }
13356
13359 {
13360 float ret = 1.0;
13363 ret *= GetHealth01();
13364
13365 return ret;
13366 }
13367
13368 #ifdef DEVELOPER
13369 override void SetDebugItem()
13370 {
13371 super.SetDebugItem();
13372 _itemBase = this;
13373 }
13374
13376 {
13377 string text = super.GetDebugText();
13378
13380 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13381
13382 return text;
13383 }
13384 #endif
13385
13387 {
13388 return true;
13389 }
13390
13392
13394
13396 {
13399 }
13400
13401
13409
13425}
13426
13428{
13430 if (entity)
13431 {
13432 bool is_item = entity.IsInherited(
ItemBase);
13433 if (is_item && full_quantity)
13434 {
13437 }
13438 }
13439 else
13440 {
13442 return NULL;
13443 }
13444 return entity;
13445}
13446
13448{
13449 if (item)
13450 {
13451 if (health > 0)
13452 item.SetHealth("", "", health);
13453
13454 if (item.CanHaveTemperature())
13455 {
13457 if (item.CanFreeze())
13458 item.SetFrozen(false);
13459 }
13460
13461 if (item.HasEnergyManager())
13462 {
13463 if (quantity >= 0)
13464 {
13465 item.GetCompEM().SetEnergy0To1(quantity);
13466 }
13467 else
13468 {
13470 }
13471 }
13472 else if (item.IsMagazine())
13473 {
13474 Magazine mag = Magazine.Cast(item);
13475 if (quantity >= 0)
13476 {
13477 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13478 }
13479 else
13480 {
13482 }
13483
13484 }
13485 else
13486 {
13487 if (quantity >= 0)
13488 {
13489 item.SetQuantityNormalized(quantity, false);
13490 }
13491 else
13492 {
13494 }
13495
13496 }
13497 }
13498}
13499
13500#ifdef DEVELOPER
13502#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.