8625{
8627 {
8628 return true;
8629 }
8630};
8631
8632
8633
8635{
8639
8641
8644
8645
8646
8647
8648
8657
8663
8668
8673
8694 protected bool m_IsResultOfSplit
8695
8697
8702
8703
8704
8706
8710
8711
8712
8714
8717
8718
8719
8725
8726
8734
8737
8738
8740
8741
8743
8744
8749
8750
8755
8756
8758
8759
8761 {
8766
8767 if (!
GetGame().IsDedicatedServer())
8768 {
8770 {
8772
8774 {
8776 }
8777 }
8778
8781 }
8782
8783 m_OldLocation = null;
8784
8786 {
8788 }
8789
8790 if (ConfigIsExisting("headSelectionsToHide"))
8791 {
8794 }
8795
8797 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8798 {
8800 }
8801
8803
8804 m_IsResultOfSplit = false;
8805
8807 }
8808
8810 {
8811 super.InitItemVariables();
8812
8818 m_Count = ConfigGetInt(
"count");
8819
8822
8827
8830
8835
8847
8851
8852
8855 if (ConfigIsExisting("canBeSplit"))
8856 {
8859 }
8860
8862 if (ConfigIsExisting("itemBehaviour"))
8864
8865
8868 RegisterNetSyncVariableInt("m_VarLiquidType");
8869 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8870
8871 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8872 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8873 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8874
8875 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8876 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8877 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8878 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8879
8880 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8881 RegisterNetSyncVariableBool("m_IsTakeable");
8882 RegisterNetSyncVariableBool("m_IsHologram");
8883
8886 {
8889 }
8890
8892
8894 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8896
8897 }
8898
8900 {
8902 }
8903
8905 {
8908 {
8913 }
8914 }
8915
8916 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8917 {
8919 {
8922 }
8923
8925 }
8926
8928 {
8934 }
8935
8937
8939 {
8941
8942 if (!action)
8943 {
8944 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8945 return;
8946 }
8947
8949 if (!ai)
8950 {
8952 return;
8953 }
8954
8956 if (!action_array)
8957 {
8958 action_array = new array<ActionBase_Basic>;
8960 }
8961 if (LogManager.IsActionLogEnable())
8962 {
8963 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8964 }
8965
8966 if (action_array.Find(action) != -1)
8967 {
8968 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8969 }
8970 else
8971 {
8972 action_array.Insert(action);
8973 }
8974 }
8975
8977 {
8979 ActionBase action = player.GetActionManager().GetAction(actionName);
8982
8983 if (action_array)
8984 {
8985 action_array.RemoveItem(action);
8986 }
8987 }
8988
8989
8990
8992 {
8993 ActionOverrideData overrideData = new ActionOverrideData();
8997
8999 if (!actionMap)
9000 {
9003 }
9004
9005 actionMap.Insert(this.
Type(), overrideData);
9006
9007 }
9008
9010
9012
9013
9015 {
9018
9021
9022 string config_to_search = "CfgVehicles";
9023 string muzzle_owner_config;
9024
9026 {
9027 if (IsInherited(Weapon))
9028 config_to_search = "CfgWeapons";
9029
9030 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9031
9032 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9033
9035
9036 if (config_OnFire_subclass_count > 0)
9037 {
9038 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9039
9040 for (int i = 0; i < config_OnFire_subclass_count; i++)
9041 {
9042 string particle_class = "";
9044 string config_OnFire_entry = config_OnFire_class + particle_class;
9045 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9046 WPOF_array.Insert(WPOF);
9047 }
9048
9049
9051 }
9052 }
9053
9055 {
9056 config_to_search = "CfgWeapons";
9057 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9058
9059 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9060
9062
9063 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9064 {
9065 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9066
9067 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9068 {
9069 string particle_class2 = "";
9071 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9072 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9073 WPOBE_array.Insert(WPOBE);
9074 }
9075
9076
9078 }
9079 }
9080 }
9081
9082
9084 {
9087
9089 {
9090 string config_to_search = "CfgVehicles";
9091
9092 if (IsInherited(Weapon))
9093 config_to_search = "CfgWeapons";
9094
9095 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9096 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9097
9098 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9099 {
9100
9102
9104 {
9106 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9108 return;
9109 }
9110
9113
9114
9115
9117 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9118
9119 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9120 {
9121 string particle_class = "";
9123 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9125
9126 if (entry_type == CT_CLASS)
9127 {
9128 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9129 WPOOH_array.Insert(WPOF);
9130 }
9131 }
9132
9133
9135 }
9136 }
9137 }
9138
9140 {
9142 }
9143
9145 {
9147 {
9149
9152
9155
9156 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9157 }
9158 }
9159
9161 {
9163 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9164
9166 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9167
9169 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9170
9172 {
9174 }
9175 }
9176
9178 {
9180 }
9181
9183 {
9186 else
9188
9190 {
9193 }
9194 else
9195 {
9198
9201 }
9202
9204 }
9205
9207 {
9209 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9210 }
9211
9213 {
9215 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9217 }
9218
9220 {
9222 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9223 }
9224
9226 {
9229
9230 OverheatingParticle OP = new OverheatingParticle();
9235
9237 }
9238
9240 {
9243
9244 return -1;
9245 }
9246
9248 {
9250 {
9253
9254 for (int i = count; i > 0; --i)
9255 {
9256 int id = i - 1;
9259
9262
9263 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9264 {
9265 if (p)
9266 {
9269 }
9270 }
9271 }
9272 }
9273 }
9274
9276 {
9278 {
9280 {
9281 int id = i - 1;
9283
9284 if (OP)
9285 {
9287
9288 if (p)
9289 {
9291 }
9292
9293 delete OP;
9294 }
9295 }
9296
9299 }
9300 }
9301
9304 {
9305 return 0.0;
9306 }
9307
9308
9310 {
9311 return 250;
9312 }
9313
9315 {
9316 return 0;
9317 }
9318
9321 {
9323 return true;
9324
9325 return false;
9326 }
9327
9330 {
9333
9335 {
9337 }
9338 else
9339 {
9340
9342 }
9343
9345 }
9346
9353 {
9354 return -1;
9355 }
9356
9357
9358
9359
9361 {
9363 {
9365 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9366
9367 if (r_index >= 0)
9368 {
9369 InventoryLocation r_il = new InventoryLocation;
9370 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9371
9372 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9375 {
9376 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9377 }
9379 {
9380 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9381 }
9382
9383 }
9384
9385 player.GetHumanInventory().ClearUserReservedLocation(this);
9386 }
9387
9390 }
9391
9392
9393
9394
9396 {
9397 return ItemBase.m_DebugActionsMask;
9398 }
9399
9401 {
9402 return ItemBase.m_DebugActionsMask & mask;
9403 }
9404
9406 {
9407 ItemBase.m_DebugActionsMask = mask;
9408 }
9409
9411 {
9412 ItemBase.m_DebugActionsMask |= mask;
9413 }
9414
9416 {
9417 ItemBase.m_DebugActionsMask &= ~mask;
9418 }
9419
9421 {
9423 {
9425 }
9426 else
9427 {
9429 }
9430 }
9431
9432
9434 {
9435 if (GetEconomyProfile())
9436 {
9437 float q_max = GetEconomyProfile().GetQuantityMax();
9438 if (q_max > 0)
9439 {
9440 float q_min = GetEconomyProfile().GetQuantityMin();
9441 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9442
9444 {
9445 ComponentEnergyManager comp = GetCompEM();
9447 {
9449 }
9450 }
9452 {
9454
9455 }
9456
9457 }
9458 }
9459 }
9460
9463 {
9464 EntityAI parent = GetHierarchyParent();
9465
9466 if (parent)
9467 {
9468 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9469 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9470 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9471 }
9472 }
9473
9476 {
9477 EntityAI parent = GetHierarchyParent();
9478
9479 if (parent)
9480 {
9481 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9482 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9483 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9484 }
9485 }
9486
9488 {
9489
9490
9491
9492
9494
9496 {
9497 if (ScriptInputUserData.CanStoreInputUserData())
9498 {
9499 ScriptInputUserData ctx = new ScriptInputUserData;
9505 ctx.
Write(use_stack_max);
9508
9510 {
9511 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9512 }
9513 }
9514 }
9515 else if (!
GetGame().IsMultiplayer())
9516 {
9518 }
9519 }
9520
9522 {
9524 }
9525
9527 {
9529 }
9530
9532 {
9534 }
9535
9537 {
9538
9539 return false;
9540 }
9541
9543 {
9544 return false;
9545 }
9546
9550 {
9551 return false;
9552 }
9553
9555 {
9556 return "";
9557 }
9558
9560
9562 {
9563 return false;
9564 }
9565
9567 {
9568 return true;
9569 }
9570
9571
9572
9574 {
9575 return true;
9576 }
9577
9579 {
9580 return true;
9581 }
9582
9584 {
9585 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9587 }
9588
9590 {
9592 }
9593
9595 {
9597 if (!is_being_placed)
9599 SetSynchDirty();
9600 }
9601
9602
9604
9606 {
9608 }
9609
9611 {
9613 }
9614
9616 {
9617 return 1;
9618 }
9619
9621 {
9622 return false;
9623 }
9624
9626 {
9628 SetSynchDirty();
9629 }
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9648
9649
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9666 {
9667 super.OnMovedInsideCargo(container);
9668
9669 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9670 }
9671
9672 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9673 {
9674 super.EEItemLocationChanged(oldLoc,newLoc);
9675
9676 PlayerBase new_player = null;
9677 PlayerBase old_player = null;
9678
9679 if (newLoc.GetParent())
9680 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9681
9682 if (oldLoc.GetParent())
9683 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9684
9686 {
9687 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9688
9689 if (r_index >= 0)
9690 {
9691 InventoryLocation r_il = new InventoryLocation;
9692 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9693
9694 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9697 {
9698 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9699 }
9701 {
9702 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9703 }
9704
9705 }
9706 }
9707
9709 {
9710 if (new_player)
9711 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9712
9713 if (new_player == old_player)
9714 {
9715
9716 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9717 {
9719 {
9720 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9721 {
9722 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9723 }
9724 }
9725 else
9726 {
9727 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9728 }
9729 }
9730
9731 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9732 {
9733 int type = oldLoc.GetType();
9735 {
9736 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9737 }
9739 {
9740 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9741 }
9742 }
9743 if (!m_OldLocation)
9744 {
9745 m_OldLocation = new InventoryLocation;
9746 }
9747 m_OldLocation.Copy(oldLoc);
9748 }
9749 else
9750 {
9751 if (m_OldLocation)
9752 {
9753 m_OldLocation.Reset();
9754 }
9755 }
9756
9758 }
9759 else
9760 {
9761 if (new_player)
9762 {
9763 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9764 if (res_index >= 0)
9765 {
9766 InventoryLocation il = new InventoryLocation;
9767 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9769 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9772 {
9773 il.
GetParent().GetOnReleaseLock().Invoke(it);
9774 }
9776 {
9778 }
9779
9780 }
9781 }
9783 {
9784
9786 }
9787
9788 if (m_OldLocation)
9789 {
9790 m_OldLocation.Reset();
9791 }
9792 }
9793 }
9794
9795 override void EOnContact(IEntity other, Contact extra)
9796 {
9798 {
9799 int liquidType = -1;
9801 if (impactSpeed > 0.0)
9802 {
9804 #ifndef SERVER
9806 #else
9808 SetSynchDirty();
9809 #endif
9811 }
9812 }
9813
9814 #ifdef SERVER
9815 if (GetCompEM() && GetCompEM().IsPlugged())
9816 {
9817 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9818 GetCompEM().UnplugThis();
9819 }
9820 #endif
9821 }
9822
9824
9826 {
9828 }
9829
9831 {
9832
9833 }
9834
9836 {
9837 super.OnItemLocationChanged(old_owner, new_owner);
9838
9839 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9840 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9841
9842 if (!relatedPlayer && playerNew)
9843 relatedPlayer = playerNew;
9844
9845 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9846 {
9848 if (actionMgr)
9849 {
9850 ActionBase currentAction = actionMgr.GetRunningAction();
9851 if (currentAction)
9853 }
9854 }
9855
9856 Man ownerPlayerOld = null;
9857 Man ownerPlayerNew = null;
9858
9859 if (old_owner)
9860 {
9861 if (old_owner.
IsMan())
9862 {
9863 ownerPlayerOld = Man.Cast(old_owner);
9864 }
9865 else
9866 {
9867 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9868 }
9869 }
9870 else
9871 {
9873 {
9875
9876 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9877 {
9878 GetCompEM().UnplugThis();
9879 }
9880 }
9881 }
9882
9883 if (new_owner)
9884 {
9885 if (new_owner.
IsMan())
9886 {
9887 ownerPlayerNew = Man.Cast(new_owner);
9888 }
9889 else
9890 {
9891 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9892 }
9893 }
9894
9895 if (ownerPlayerOld != ownerPlayerNew)
9896 {
9897 if (ownerPlayerOld)
9898 {
9899 array<EntityAI> subItemsExit = new array<EntityAI>;
9901 for (int i = 0; i < subItemsExit.Count(); i++)
9902 {
9905 }
9906 }
9907
9908 if (ownerPlayerNew)
9909 {
9910 array<EntityAI> subItemsEnter = new array<EntityAI>;
9912 for (int j = 0; j < subItemsEnter.Count(); j++)
9913 {
9916 }
9917 }
9918 }
9919 else if (ownerPlayerNew != null)
9920 {
9921 PlayerBase nplayer;
9922 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9923 {
9924 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9926 for (int k = 0; k < subItemsUpdate.Count(); k++)
9927 {
9929 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9930 }
9931 }
9932 }
9933
9934 if (old_owner)
9935 old_owner.OnChildItemRemoved(this);
9936 if (new_owner)
9937 new_owner.OnChildItemReceived(this);
9938 }
9939
9940
9942 {
9943 super.EEDelete(parent);
9944 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9945 if (player)
9946 {
9948
9949 if (player.IsAlive())
9950 {
9951 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9952 if (r_index >= 0)
9953 {
9954 InventoryLocation r_il = new InventoryLocation;
9955 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9956
9957 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9960 {
9961 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9962 }
9964 {
9965 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9966 }
9967
9968 }
9969
9970 player.RemoveQuickBarEntityShortcut(this);
9971 }
9972 }
9973 }
9974
9976 {
9977 super.EEKilled(killer);
9978
9981 {
9982 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9983 {
9984 if (IsMagazine())
9985 {
9986 if (Magazine.Cast(this).GetAmmoCount() > 0)
9987 {
9989 }
9990 }
9991 else
9992 {
9994 }
9995 }
9996 }
9997 }
9998
10000 {
10001 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10002
10003 super.OnWasAttached(parent, slot_id);
10004
10007
10009 }
10010
10012 {
10013 super.OnWasDetached(parent, slot_id);
10014
10017 }
10018
10020 {
10021 int idx;
10024
10025 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10026 if (inventory_slots.Count() < 1)
10027 {
10028 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10029 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10030 }
10031 else
10032 {
10033 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10034 }
10035
10036 idx = inventory_slots.Find(slot);
10037 if (idx < 0)
10038 return "";
10039
10040 return attach_types.Get(idx);
10041 }
10042
10044 {
10045 int idx = -1;
10046 string slot;
10047
10050
10051 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10052 if (inventory_slots.Count() < 1)
10053 {
10054 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10055 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10056 }
10057 else
10058 {
10059 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10060 if (detach_types.Count() < 1)
10061 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10062 }
10063
10064 for (int i = 0; i < inventory_slots.Count(); i++)
10065 {
10066 slot = inventory_slots.Get(i);
10067 }
10068
10069 if (slot != "")
10070 {
10071 if (detach_types.Count() == 1)
10072 idx = 0;
10073 else
10074 idx = inventory_slots.Find(slot);
10075 }
10076 if (idx < 0)
10077 return "";
10078
10079 return detach_types.Get(idx);
10080 }
10081
10083 {
10084
10086
10087
10088 float min_time = 1;
10089 float max_time = 3;
10090 float delay = Math.RandomFloat(min_time, max_time);
10091
10092 explode_timer.Run(delay, this, "DoAmmoExplosion");
10093 }
10094
10096 {
10097 Magazine magazine = Magazine.Cast(this);
10098 int pop_sounds_count = 6;
10099 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10100
10101
10102 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10103 string sound_name = pop_sounds[ sound_idx ];
10105
10106
10107 magazine.ServerAddAmmoCount(-1);
10108
10109
10110 float min_temp_to_explode = 100;
10111
10112 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10113 {
10115 }
10116 }
10117
10118
10119 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10120 {
10121 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10122
10123 const int CHANCE_DAMAGE_CARGO = 4;
10124 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10125 const int CHANCE_DAMAGE_NOTHING = 2;
10126
10128 {
10129 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10130 int chances;
10131 int rnd;
10132
10133 if (GetInventory().GetCargo())
10134 {
10135 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10136 rnd = Math.RandomInt(0,chances);
10137
10138 if (rnd < CHANCE_DAMAGE_CARGO)
10139 {
10141 }
10142 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10143 {
10145 }
10146 }
10147 else
10148 {
10149 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10150 rnd = Math.RandomInt(0,chances);
10151
10152 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10153 {
10155 }
10156 }
10157 }
10158 }
10159
10161 {
10162 if (GetInventory().GetCargo())
10163 {
10164 int item_count = GetInventory().GetCargo().GetItemCount();
10165 if (item_count > 0)
10166 {
10167 int random_pick = Math.RandomInt(0, item_count);
10169 if (!item.IsExplosive())
10170 {
10171 item.AddHealth("","",damage);
10172 return true;
10173 }
10174 }
10175 }
10176 return false;
10177 }
10178
10180 {
10181 int attachment_count = GetInventory().AttachmentCount();
10182 if (attachment_count > 0)
10183 {
10184 int random_pick = Math.RandomInt(0, attachment_count);
10185 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10186 if (!attachment.IsExplosive())
10187 {
10188 attachment.AddHealth("","",damage);
10189 return true;
10190 }
10191 }
10192 return false;
10193 }
10194
10196 {
10198 }
10199
10201 {
10203 return GetInventory().CanRemoveEntity();
10204
10205 return false;
10206 }
10207
10209 {
10211 return;
10212
10214 {
10215 if (ScriptInputUserData.CanStoreInputUserData())
10216 {
10217 ScriptInputUserData ctx = new ScriptInputUserData;
10222 ctx.
Write(destination_entity);
10224 ctx.
Write(slot_id);
10226 }
10227 }
10228 else if (!
GetGame().IsMultiplayer())
10229 {
10231 }
10232 }
10233
10235 {
10237 return;
10238
10239 float split_quantity_new;
10243 InventoryLocation loc = new InventoryLocation;
10244
10245 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10246 {
10248 split_quantity_new = stack_max;
10249 else
10251
10252 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10253 if (new_item)
10254 {
10255 new_item.SetResultOfSplit(true);
10256 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10258 new_item.SetQuantity(split_quantity_new);
10259 }
10260 }
10261 else if (destination_entity && slot_id == -1)
10262 {
10263 if (quantity > stack_max)
10264 split_quantity_new = stack_max;
10265 else
10266 split_quantity_new = quantity;
10267
10269 {
10272 }
10273
10274 if (new_item)
10275 {
10276 new_item.SetResultOfSplit(true);
10277 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10279 new_item.SetQuantity(split_quantity_new);
10280 }
10281 }
10282 else
10283 {
10284 if (stack_max != 0)
10285 {
10287 {
10289 }
10290
10291 if (split_quantity_new == 0)
10292 {
10293 if (!
GetGame().IsMultiplayer())
10294 player.PhysicalPredictiveDropItem(this);
10295 else
10296 player.ServerDropEntity(this);
10297 return;
10298 }
10299
10301
10302 if (new_item)
10303 {
10304 new_item.SetResultOfSplit(true);
10305 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10307 new_item.SetQuantity(stack_max);
10308 new_item.PlaceOnSurface();
10309 }
10310 }
10311 }
10312 }
10313
10315 {
10317 return;
10318
10319 float split_quantity_new;
10323 InventoryLocation loc = new InventoryLocation;
10324
10325 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10326 {
10328 split_quantity_new = stack_max;
10329 else
10331
10332 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10333 if (new_item)
10334 {
10335 new_item.SetResultOfSplit(true);
10336 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10338 new_item.SetQuantity(split_quantity_new);
10339 }
10340 }
10341 else if (destination_entity && slot_id == -1)
10342 {
10343 if (quantity > stack_max)
10344 split_quantity_new = stack_max;
10345 else
10346 split_quantity_new = quantity;
10347
10349 {
10352 }
10353
10354 if (new_item)
10355 {
10356 new_item.SetResultOfSplit(true);
10357 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10359 new_item.SetQuantity(split_quantity_new);
10360 }
10361 }
10362 else
10363 {
10364 if (stack_max != 0)
10365 {
10367 {
10369 }
10370
10372
10373 if (new_item)
10374 {
10375 new_item.SetResultOfSplit(true);
10376 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10378 new_item.SetQuantity(stack_max);
10379 new_item.PlaceOnSurface();
10380 }
10381 }
10382 }
10383 }
10384
10386 {
10388 return;
10389
10391 {
10392 if (ScriptInputUserData.CanStoreInputUserData())
10393 {
10394 ScriptInputUserData ctx = new ScriptInputUserData;
10399 dst.WriteToContext(ctx);
10401 }
10402 }
10403 else if (!
GetGame().IsMultiplayer())
10404 {
10406 }
10407 }
10408
10410 {
10412 return;
10413
10415 {
10416 if (ScriptInputUserData.CanStoreInputUserData())
10417 {
10418 ScriptInputUserData ctx = new ScriptInputUserData;
10423 ctx.
Write(destination_entity);
10429 }
10430 }
10431 else if (!
GetGame().IsMultiplayer())
10432 {
10434 }
10435 }
10436
10438 {
10440 }
10441
10443 {
10445 return this;
10446
10448 float split_quantity_new;
10450 if (dst.IsValid())
10451 {
10452 int slot_id = dst.GetSlot();
10454
10455 if (quantity > stack_max)
10456 split_quantity_new = stack_max;
10457 else
10458 split_quantity_new = quantity;
10459
10461
10462 if (new_item)
10463 {
10464 new_item.SetResultOfSplit(true);
10465 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10468 }
10469
10470 return new_item;
10471 }
10472
10473 return null;
10474 }
10475
10477 {
10479 return;
10480
10482 float split_quantity_new;
10484 if (destination_entity)
10485 {
10487 if (quantity > stackable)
10488 split_quantity_new = stackable;
10489 else
10490 split_quantity_new = quantity;
10491
10492 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10493 if (new_item)
10494 {
10495 new_item.SetResultOfSplit(true);
10496 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10498 new_item.SetQuantity(split_quantity_new);
10499 }
10500 }
10501 }
10502
10504 {
10506 return;
10507
10509 {
10510 if (ScriptInputUserData.CanStoreInputUserData())
10511 {
10512 ScriptInputUserData ctx = new ScriptInputUserData;
10517 ItemBase destination_entity =
this;
10518 ctx.
Write(destination_entity);
10522 }
10523 }
10524 else if (!
GetGame().IsMultiplayer())
10525 {
10527 }
10528 }
10529
10531 {
10533 return;
10534
10536 float split_quantity_new;
10538 if (player)
10539 {
10541 if (quantity > stackable)
10542 split_quantity_new = stackable;
10543 else
10544 split_quantity_new = quantity;
10545
10546 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10547 new_item =
ItemBase.Cast(in_hands);
10548 if (new_item)
10549 {
10550 new_item.SetResultOfSplit(true);
10551 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10553 new_item.SetQuantity(split_quantity_new);
10554 }
10555 }
10556 }
10557
10559 {
10561 return;
10562
10564 float split_quantity_new = Math.Floor(quantity * 0.5);
10565
10567
10568 if (new_item)
10569 {
10570 if (new_item.GetQuantityMax() < split_quantity_new)
10571 {
10572 split_quantity_new = new_item.GetQuantityMax();
10573 }
10574
10575 new_item.SetResultOfSplit(true);
10576 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10577
10579 {
10582 }
10583 else
10584 {
10587 }
10588 }
10589 }
10590
10592 {
10594 return;
10595
10597 float split_quantity_new = Math.Floor(quantity / 2);
10598
10599 InventoryLocation invloc = new InventoryLocation;
10601
10603 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10604
10605 if (new_item)
10606 {
10607 if (new_item.GetQuantityMax() < split_quantity_new)
10608 {
10609 split_quantity_new = new_item.GetQuantityMax();
10610 }
10612 {
10615 }
10616 else
10617 {
10620 }
10621 }
10622 }
10623
10626 {
10627 SetWeightDirty();
10629
10630 if (parent)
10631 parent.OnAttachmentQuantityChangedEx(this, delta);
10632
10634 {
10636 {
10638 }
10640 {
10641 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10643 }
10644 }
10645
10646 }
10647
10650 {
10651
10652 }
10653
10656 {
10658 }
10659
10661 {
10662 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10663
10665 {
10666 if (newLevel == GameConstants.STATE_RUINED)
10667 {
10669 EntityAI parent = GetHierarchyParent();
10670 if (parent && parent.IsFireplace())
10671 {
10672 CargoBase cargo = GetInventory().GetCargo();
10673 if (cargo)
10674 {
10676 {
10678 }
10679 }
10680 }
10681 }
10682
10684 {
10685
10687 return;
10688 }
10689
10690 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10691 {
10693 }
10694 }
10695 }
10696
10697
10699 {
10700 super.OnRightClick();
10701
10703 {
10705 {
10706 if (ScriptInputUserData.CanStoreInputUserData())
10707 {
10708 vector m4[4];
10710
10711 EntityAI root = GetHierarchyRoot();
10712
10713 InventoryLocation dst = new InventoryLocation;
10715 {
10716 if (root)
10717 {
10718 root.GetTransform(m4);
10720 }
10721 else
10722 GetInventory().GetCurrentInventoryLocation(dst);
10723 }
10724 else
10725 {
10727
10728
10729 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10730 {
10731 if (root)
10732 {
10733 root.GetTransform(m4);
10735 }
10736 else
10737 GetInventory().GetCurrentInventoryLocation(dst);
10738 }
10739 else
10740 {
10741 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10742 }
10743 }
10744
10745 ScriptInputUserData ctx = new ScriptInputUserData;
10753 }
10754 }
10755 else if (!
GetGame().IsMultiplayer())
10756 {
10758 }
10759 }
10760 }
10761
10762 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10763 {
10764
10765 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10766 return false;
10767
10768 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10769 return false;
10770
10771
10773 return false;
10774
10775
10776 Magazine mag = Magazine.Cast(this);
10777 if (mag)
10778 {
10779 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10780 return false;
10781
10782 if (stack_max_limit)
10783 {
10784 Magazine other_mag = Magazine.Cast(other_item);
10785 if (other_item)
10786 {
10787 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10788 return false;
10789 }
10790
10791 }
10792 }
10793 else
10794 {
10795
10797 return false;
10798
10800 return false;
10801 }
10802
10803 PlayerBase player = null;
10804 if (CastTo(player, GetHierarchyRootPlayer()))
10805 {
10806 if (player.GetInventory().HasAttachment(this))
10807 return false;
10808
10809 if (player.IsItemsToDelete())
10810 return false;
10811 }
10812
10813 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10814 return false;
10815
10816 int slotID;
10818 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10819 return false;
10820
10821 return true;
10822 }
10823
10825 {
10827 }
10828
10830 {
10831 return m_IsResultOfSplit;
10832 }
10833
10835 {
10836 m_IsResultOfSplit = value;
10837 }
10838
10840 {
10842 }
10843
10845 {
10846 float other_item_quantity = other_item.GetQuantity();
10847 float this_free_space;
10848
10850
10852
10853 if (other_item_quantity > this_free_space)
10854 {
10855 return this_free_space;
10856 }
10857 else
10858 {
10859 return other_item_quantity;
10860 }
10861 }
10862
10864 {
10866 }
10867
10869 {
10871 return;
10872
10873 if (!IsMagazine() && other_item)
10874 {
10876 if (quantity_used != 0)
10877 {
10878 float hp1 = GetHealth01("","");
10879 float hp2 = other_item.GetHealth01("","");
10880 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10881 hpResult = hpResult / (
GetQuantity() + quantity_used);
10882
10883 hpResult *= GetMaxHealth();
10884 Math.Round(hpResult);
10885 SetHealth("", "Health", hpResult);
10886
10888 other_item.AddQuantity(-quantity_used);
10889 }
10890 }
10892 }
10893
10895 {
10896 #ifdef SERVER
10897 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10898 GetHierarchyParent().IncreaseLifetimeUp();
10899 #endif
10900 };
10901
10903 {
10904 PlayerBase p = PlayerBase.Cast(player);
10905
10906 array<int> recipesIds = p.m_Recipes;
10907 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10908 if (moduleRecipesManager)
10909 {
10910 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10911 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10912 }
10913
10914 for (int i = 0;i < recipesIds.Count(); i++)
10915 {
10916 int key = recipesIds.Get(i);
10917 string recipeName = moduleRecipesManager.GetRecipeName(key);
10919 }
10920 }
10921
10922
10923 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10924 {
10925 super.GetDebugActions(outputList);
10926
10927
10932
10933
10937
10941
10942
10945
10946
10948 {
10951 }
10952
10954
10957
10961 }
10962
10963
10964
10965
10967 {
10968 super.OnAction(action_id, player, ctx);
10969 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10970 {
10971 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10972 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10973 PlayerBase p = PlayerBase.Cast(player);
10974 if (
EActions.RECIPES_RANGE_START < 1000)
10975 {
10976 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10977 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10978 }
10979 }
10980 #ifndef SERVER
10981 else if (action_id ==
EActions.WATCH_PLAYER)
10982 {
10983 PluginDeveloper.SetDeveloperItemClientEx(player);
10984 }
10985 #endif
10987 {
10988 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10989 {
10990 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10991 OnDebugButtonPressServer(id + 1);
10992 }
10993
10994 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10995 {
10996 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10998 }
10999
11000 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11001 {
11002 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11004 }
11005
11006 else if (action_id ==
EActions.ADD_QUANTITY)
11007 {
11008 if (IsMagazine())
11009 {
11010 Magazine mag = Magazine.Cast(this);
11011 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11012 }
11013 else
11014 {
11016 }
11017
11018 if (m_EM)
11019 {
11020 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11021 }
11022
11023 }
11024
11025 else if (action_id ==
EActions.REMOVE_QUANTITY)
11026 {
11027 if (IsMagazine())
11028 {
11029 Magazine mag2 = Magazine.Cast(this);
11030 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11031 }
11032 else
11033 {
11035 }
11036 if (m_EM)
11037 {
11038 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11039 }
11040
11041 }
11042
11043 else if (action_id ==
EActions.SET_QUANTITY_0)
11044 {
11046
11047 if (m_EM)
11048 {
11049 m_EM.SetEnergy(0);
11050 }
11051 }
11052
11053 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11054 {
11056
11057 if (m_EM)
11058 {
11059 m_EM.SetEnergy(m_EM.GetEnergyMax());
11060 }
11061 }
11062
11063 else if (action_id ==
EActions.ADD_HEALTH)
11064 {
11065 AddHealth("","",GetMaxHealth("","Health")/5);
11066 }
11067 else if (action_id ==
EActions.REMOVE_HEALTH)
11068 {
11069 AddHealth("","",-GetMaxHealth("","Health")/5);
11070 }
11071 else if (action_id ==
EActions.DESTROY_HEALTH)
11072 {
11073 SetHealth01("","",0);
11074 }
11075 else if (action_id ==
EActions.WATCH_ITEM)
11076 {
11078 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11079 #ifdef DEVELOPER
11080 SetDebugDeveloper_item(this);
11081 #endif
11082 }
11083
11084 else if (action_id ==
EActions.ADD_TEMPERATURE)
11085 {
11086 AddTemperature(20);
11087
11088 }
11089
11090 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11091 {
11092 AddTemperature(-20);
11093
11094 }
11095
11096 else if (action_id ==
EActions.FLIP_FROZEN)
11097 {
11098 SetFrozen(!GetIsFrozen());
11099
11100 }
11101
11102 else if (action_id ==
EActions.ADD_WETNESS)
11103 {
11105
11106 }
11107
11108 else if (action_id ==
EActions.REMOVE_WETNESS)
11109 {
11111
11112 }
11113
11114 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11115 {
11118
11119
11120 }
11121
11122 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11123 {
11126 }
11127
11128 else if (action_id ==
EActions.MAKE_SPECIAL)
11129 {
11130 auto debugParams = DebugSpawnParams.WithPlayer(player);
11131 OnDebugSpawnEx(debugParams);
11132 }
11133
11134 else if (action_id ==
EActions.DELETE)
11135 {
11136 Delete();
11137 }
11138
11139 }
11140
11141
11142 return false;
11143 }
11144
11145
11146
11147
11151
11154
11155
11156
11158 {
11159 return false;
11160 }
11161
11162
11164 {
11165 return true;
11166 }
11167
11168
11170 {
11171 return true;
11172 }
11173
11174
11175
11177 {
11178 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11180 }
11181
11184 {
11185 return null;
11186 }
11187
11189 {
11190 return false;
11191 }
11192
11194 {
11195 return false;
11196 }
11197
11201
11202
11204 {
11205 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11206 return module_repairing.CanRepair(this, item_repair_kit);
11207 }
11208
11209
11210 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11211 {
11212 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11213 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11214 }
11215
11216
11218 {
11219
11220
11221
11222
11223
11224
11225
11226
11227 return 1;
11228 }
11229
11230
11231
11233 {
11235 }
11236
11237
11238
11240 {
11242 }
11243
11244
11253 {
11254 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11255
11256 if (player)
11257 {
11258 player.MessageStatus(text);
11259 }
11260 }
11261
11262
11271 {
11272 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11273
11274 if (player)
11275 {
11276 player.MessageAction(text);
11277 }
11278 }
11279
11280
11289 {
11290 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11291
11292 if (player)
11293 {
11294 player.MessageFriendly(text);
11295 }
11296 }
11297
11298
11307 {
11308 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11309
11310 if (player)
11311 {
11312 player.MessageImportant(text);
11313 }
11314 }
11315
11317 {
11318 return true;
11319 }
11320
11321
11322 override bool KindOf(
string tag)
11323 {
11324 bool found = false;
11325 string item_name = this.
GetType();
11328
11329 int array_size = item_tag_array.Count();
11330 for (int i = 0; i < array_size; i++)
11331 {
11332 if (item_tag_array.Get(i) == tag)
11333 {
11334 found = true;
11335 break;
11336 }
11337 }
11338 return found;
11339 }
11340
11341
11343 {
11344
11345 super.OnRPC(sender, rpc_type,ctx);
11346
11347
11348 switch (rpc_type)
11349 {
11350 #ifndef SERVER
11351 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11352 Param2<bool, string> p = new Param2<bool, string>(false, "");
11353
11355 return;
11356
11357 bool play = p.param1;
11358 string soundSet = p.param2;
11359
11360 if (play)
11361 {
11363 {
11365 {
11367 }
11368 }
11369 else
11370 {
11372 }
11373 }
11374 else
11375 {
11377 }
11378
11379 break;
11380 #endif
11381
11382 }
11383
11385 {
11387 }
11388 }
11389
11390
11391
11392
11394 {
11395 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11396 return plugin.GetID(
name);
11397 }
11398
11400 {
11401 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11402 return plugin.GetName(id);
11403 }
11404
11407 {
11408
11409
11410 int varFlags;
11411 if (!ctx.
Read(varFlags))
11412 return;
11413
11414 if (varFlags & ItemVariableFlags.FLOAT)
11415 {
11417 }
11418 }
11419
11421 {
11422
11423 super.SerializeNumericalVars(floats_out);
11424
11425
11426
11428 {
11430 }
11431
11433 {
11435 }
11436
11438 {
11440 }
11441
11443 {
11448 }
11449
11451 {
11453 }
11454 }
11455
11457 {
11458
11459 super.DeSerializeNumericalVars(floats);
11460
11461
11462 int index = 0;
11463 int mask = Math.Round(floats.Get(index));
11464
11465 index++;
11466
11468 {
11470 {
11472 }
11473 else
11474 {
11475 float quantity = floats.Get(index);
11476 SetQuantity(quantity,
true,
false,
false,
false);
11477 }
11478 index++;
11479 }
11480
11482 {
11483 float wet = floats.Get(index);
11485 index++;
11486 }
11487
11489 {
11490 int liquidtype = Math.Round(floats.Get(index));
11492 index++;
11493 }
11494
11496 {
11498 index++;
11500 index++;
11502 index++;
11504 index++;
11505 }
11506
11508 {
11509 int cleanness = Math.Round(floats.Get(index));
11511 index++;
11512 }
11513 }
11514
11516 {
11517 super.WriteVarsToCTX(ctx);
11518
11519
11521 {
11523 }
11524
11526 {
11528 }
11529
11531 {
11533 }
11534
11536 {
11537 int r,g,b,a;
11543 }
11544
11546 {
11548 }
11549 }
11550
11552 {
11553 if (!super.ReadVarsFromCTX(ctx,version))
11554 return false;
11555
11556 int intValue;
11557 float value;
11558
11559 if (version < 140)
11560 {
11561 if (!ctx.
Read(intValue))
11562 return false;
11563
11564 m_VariablesMask = intValue;
11565 }
11566
11568 {
11569 if (!ctx.
Read(value))
11570 return false;
11571
11573 {
11575 }
11576 else
11577 {
11579 }
11580 }
11581
11582 if (version < 140)
11583 {
11585 {
11586 if (!ctx.
Read(value))
11587 return false;
11588 SetTemperatureDirect(value);
11589 }
11590 }
11591
11593 {
11594 if (!ctx.
Read(value))
11595 return false;
11597 }
11598
11600 {
11601 if (!ctx.
Read(intValue))
11602 return false;
11604 }
11605
11607 {
11608 int r,g,b,a;
11610 return false;
11612 return false;
11614 return false;
11616 return false;
11617
11619 }
11620
11622 {
11623 if (!ctx.
Read(intValue))
11624 return false;
11626 }
11627
11628 if (version >= 138 && version < 140)
11629 {
11631 {
11632 if (!ctx.
Read(intValue))
11633 return false;
11634 SetFrozen(intValue);
11635 }
11636 }
11637
11638 return true;
11639 }
11640
11641
11643 {
11646 {
11648 }
11649
11650 if (!super.OnStoreLoad(ctx, version))
11651 {
11653 return false;
11654 }
11655
11656 if (version >= 114)
11657 {
11658 bool hasQuickBarIndexSaved;
11659
11660 if (!ctx.
Read(hasQuickBarIndexSaved))
11661 {
11663 return false;
11664 }
11665
11666 if (hasQuickBarIndexSaved)
11667 {
11668 int itmQBIndex;
11669
11670
11671 if (!ctx.
Read(itmQBIndex))
11672 {
11674 return false;
11675 }
11676
11677 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11678 if (itmQBIndex != -1 && parentPlayer)
11679 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11680 }
11681 }
11682 else
11683 {
11684
11685 PlayerBase player;
11686 int itemQBIndex;
11687 if (version ==
int.
MAX)
11688 {
11689 if (!ctx.
Read(itemQBIndex))
11690 {
11692 return false;
11693 }
11694 }
11695 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11696 {
11697
11698 if (!ctx.
Read(itemQBIndex))
11699 {
11701 return false;
11702 }
11703 if (itemQBIndex != -1 && player)
11704 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11705 }
11706 }
11707
11708 if (version < 140)
11709 {
11710
11711 if (!LoadVariables(ctx, version))
11712 {
11714 return false;
11715 }
11716 }
11717
11718
11720 {
11722 return false;
11723 }
11724 if (version >= 132)
11725 {
11727 if (raib)
11728 {
11730 {
11732 return false;
11733 }
11734 }
11735 }
11736
11738 return true;
11739 }
11740
11741
11742
11744 {
11745 super.OnStoreSave(ctx);
11746
11747 PlayerBase player;
11748 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11749 {
11751
11752 int itemQBIndex = -1;
11753 itemQBIndex = player.FindQuickBarEntityIndex(this);
11754 ctx.
Write(itemQBIndex);
11755 }
11756 else
11757 {
11759 }
11760
11762
11764 if (raib)
11765 {
11767 }
11768 }
11769
11770
11772 {
11773 super.AfterStoreLoad();
11774
11776 {
11778 }
11779
11781 {
11784 }
11785 }
11786
11788 {
11789 super.EEOnAfterLoad();
11790
11792 {
11794 }
11795
11798 }
11799
11801 {
11802 return false;
11803 }
11804
11805
11806
11808 {
11810 {
11811 #ifdef PLATFORM_CONSOLE
11812
11814 {
11816 if (menu)
11817 {
11819 }
11820 }
11821 #endif
11822 }
11823
11825 {
11828 }
11829
11831 {
11832 SetWeightDirty();
11834 }
11836 {
11839 }
11840
11842 {
11845 }
11847 {
11850 }
11851
11852 super.OnVariablesSynchronized();
11853 }
11854
11855
11856
11858 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11859 {
11860 if (!IsServerCheck(allow_client))
11861 return false;
11862
11864 return false;
11865
11868
11869 if (value <= (min + 0.001))
11870 value = min;
11871
11872 if (value == min)
11873 {
11874 if (destroy_config)
11875 {
11876 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11877 if (dstr)
11878 {
11880 this.Delete();
11881 return true;
11882 }
11883 }
11884 else if (destroy_forced)
11885 {
11887 this.Delete();
11888 return true;
11889 }
11890
11892 }
11893
11896
11898 {
11900
11901 if (delta)
11903 }
11904
11906
11907 return false;
11908 }
11909
11910
11912 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11913 {
11915 }
11916
11918 {
11921 }
11922
11924 {
11927 }
11928
11931 {
11932 float value_clamped = Math.Clamp(value, 0, 1);
11934 SetQuantity(result, destroy_config, destroy_forced);
11935 }
11936
11937
11940 {
11942 }
11943
11945 {
11947 }
11948
11949
11950
11951
11952
11953
11954
11955
11956
11957
11959 {
11960 int slot = -1;
11961 if (GetInventory())
11962 {
11963 InventoryLocation il = new InventoryLocation;
11964 GetInventory().GetCurrentInventoryLocation(il);
11966 }
11967
11969 }
11970
11972 {
11973 float quantity_max = 0;
11974
11976 {
11977 if (attSlotID != -1)
11978 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11979
11980 if (quantity_max <= 0)
11982 }
11983
11984 if (quantity_max <= 0)
11986
11987 return quantity_max;
11988 }
11989
11991 {
11993 }
11994
11996 {
11998 }
11999
12000
12002 {
12004 }
12005
12007 {
12009 }
12010
12012 {
12014 }
12015
12016
12018 {
12019
12020 float weightEx = GetWeightEx();
12021 float special = GetInventoryAndCargoWeight();
12022 return weightEx - special;
12023 }
12024
12025
12027 {
12029 }
12030
12032 {
12034 {
12035 #ifdef DEVELOPER
12036 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12037 {
12038 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12040 }
12041 #endif
12042
12043 return GetQuantity() * GetConfigWeightModified();
12044 }
12045 else if (HasEnergyManager())
12046 {
12047 #ifdef DEVELOPER
12048 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12049 {
12050 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12051 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12052 }
12053 #endif
12054 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12055 }
12056 else
12057 {
12058 #ifdef DEVELOPER
12059 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12060 {
12061 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12062 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12063 }
12064 #endif
12065 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12066 }
12067 }
12068
12071 {
12072 int item_count = 0;
12074
12075 if (GetInventory().GetCargo() != NULL)
12076 {
12077 item_count = GetInventory().GetCargo().GetItemCount();
12078 }
12079
12080 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12081 {
12082 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12083 if (item)
12084 item_count += item.GetNumberOfItems();
12085 }
12086 return item_count;
12087 }
12088
12091 {
12092 float weight = 0;
12093 float wetness = 1;
12094 if (include_wetness)
12097 {
12098 weight = wetness * m_ConfigWeight;
12099 }
12101 {
12102 weight = 1;
12103 }
12104 return weight;
12105 }
12106
12107
12108
12110 {
12111 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12112 {
12113 GameInventory inv = GetInventory();
12114 array<EntityAI> items = new array<EntityAI>;
12116 for (int i = 0; i < items.Count(); i++)
12117 {
12119 if (item)
12120 {
12122 }
12123 }
12124 }
12125 }
12126
12127
12128
12129
12131 {
12132 float energy = 0;
12133 if (HasEnergyManager())
12134 {
12135 energy = GetCompEM().GetEnergy();
12136 }
12137 return energy;
12138 }
12139
12140
12142 {
12143 super.OnEnergyConsumed();
12144
12146 }
12147
12149 {
12150 super.OnEnergyAdded();
12151
12153 }
12154
12155
12157 {
12158 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12159 {
12161 {
12162 float energy_0to1 = GetCompEM().GetEnergy0To1();
12164 }
12165 }
12166 }
12167
12168
12170 {
12171 return ConfigGetFloat("heatIsolation");
12172 }
12173
12175 {
12177 }
12178
12180 {
12181 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12182 if (
GetGame().ConfigIsExisting(paramPath))
12184
12185 return 0.0;
12186 }
12187
12189 {
12190 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12191 if (
GetGame().ConfigIsExisting(paramPath))
12193
12194 return 0.0;
12195 }
12196
12197 override void SetWet(
float value,
bool allow_client =
false)
12198 {
12199 if (!IsServerCheck(allow_client))
12200 return;
12201
12204
12206
12207 m_VarWet = Math.Clamp(value, min, max);
12208
12210 {
12213 }
12214 }
12215
12216 override void AddWet(
float value)
12217 {
12219 }
12220
12222 {
12224 }
12225
12227 {
12229 }
12230
12232 {
12234 }
12235
12237 {
12239 }
12240
12242 {
12244 }
12245
12246 override void OnWetChanged(
float newVal,
float oldVal)
12247 {
12250 if (newLevel != oldLevel)
12251 {
12253 }
12254 }
12255
12257 {
12258 SetWeightDirty();
12259 }
12260
12262 {
12263 return GetWetLevelInternal(
m_VarWet);
12264 }
12265
12266
12267
12269 {
12271 }
12272
12274 {
12276 }
12277
12279 {
12281 }
12282
12284 {
12286 }
12287
12288
12289
12291 {
12292 if (ConfigIsExisting("itemModelLength"))
12293 {
12294 return ConfigGetFloat("itemModelLength");
12295 }
12296 return 0;
12297 }
12298
12300 {
12301 if (ConfigIsExisting("itemAttachOffset"))
12302 {
12303 return ConfigGetFloat("itemAttachOffset");
12304 }
12305 return 0;
12306 }
12307
12308 override void SetCleanness(
int value,
bool allow_client =
false)
12309 {
12310 if (!IsServerCheck(allow_client))
12311 return;
12312
12314
12316
12319 }
12320
12322 {
12324 }
12325
12327 {
12328 return true;
12329 }
12330
12331
12332
12333
12335 {
12337 }
12338
12340 {
12342 }
12343
12344
12345
12346
12347 override void SetColor(
int r,
int g,
int b,
int a)
12348 {
12354 }
12356 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12357 {
12362 }
12363
12365 {
12367 }
12368
12371 {
12372 int r,g,b,a;
12374 r = r/255;
12375 g = g/255;
12376 b = b/255;
12377 a = a/255;
12378 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12379 }
12380
12381
12382
12383 override void SetLiquidType(
int value,
bool allow_client =
false)
12384 {
12385 if (!IsServerCheck(allow_client))
12386 return;
12387
12392 }
12393
12395 {
12396 return ConfigGetInt("varLiquidTypeInit");
12397 }
12398
12400 {
12402 }
12403
12405 {
12407 SetFrozen(false);
12408 }
12409
12412 {
12413 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12414 }
12415
12416
12419 {
12420 PlayerBase nplayer;
12421 if (PlayerBase.CastTo(nplayer, player))
12422 {
12424
12425 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12426 }
12427 }
12428
12429
12432 {
12433 PlayerBase nplayer;
12434 if (PlayerBase.CastTo(nplayer,player))
12435 {
12436
12437 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12438
12439 }
12440
12441
12442 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12443
12444
12445 if (HasEnergyManager())
12446 {
12447 GetCompEM().UpdatePlugState();
12448 }
12449 }
12450
12451
12453 {
12454 super.OnPlacementStarted(player);
12455
12457 }
12458
12459 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12460 {
12462 {
12463 m_AdminLog.OnPlacementComplete(player,
this);
12464 }
12465
12466 super.OnPlacementComplete(player, position, orientation);
12467 }
12468
12469
12470
12471
12472
12474 {
12476 {
12477 return true;
12478 }
12479 else
12480 {
12481 return false;
12482 }
12483 }
12484
12485
12487 {
12489 {
12491 }
12492 }
12493
12494
12496 {
12498 }
12499
12501 {
12503 }
12504
12505 override void InsertAgent(
int agent,
float count = 1)
12506 {
12507 if (count < 1)
12508 return;
12509
12511 }
12512
12515 {
12517 }
12518
12519
12521 {
12523 }
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12567 {
12569 return false;
12570 return true;
12571 }
12572
12574 {
12575
12577 }
12578
12579
12582 {
12583 super.CheckForRoofLimited(timeTresholdMS);
12584
12586 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12587 {
12588 m_PreviousRoofTestTime = time;
12589 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12590 }
12591 }
12592
12593
12595 {
12597 {
12598 return 0;
12599 }
12600
12601 if (GetInventory().GetAttachmentSlotsCount() != 0)
12602 {
12603 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12604 if (filter)
12605 return filter.GetProtectionLevel(type, false, system);
12606 else
12607 return 0;
12608 }
12609
12610 string subclassPath, entryName;
12611
12612 switch (type)
12613 {
12615 entryName = "biological";
12616 break;
12618 entryName = "chemical";
12619 break;
12620 default:
12621 entryName = "biological";
12622 break;
12623 }
12624
12625 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12626
12628 }
12629
12630
12631
12634 {
12635 if (!IsMagazine())
12637
12639 }
12640
12641
12642
12643
12644
12649 {
12650 return true;
12651 }
12652
12654 {
12656 }
12657
12658
12659
12660
12661
12663 {
12664 if (parent)
12665 {
12666 if (parent.IsInherited(DayZInfected))
12667 return true;
12668
12669 if (!parent.IsRuined())
12670 return true;
12671 }
12672
12673 return true;
12674 }
12675
12677 {
12678 if (!super.CanPutAsAttachment(parent))
12679 {
12680 return false;
12681 }
12682
12683 if (!IsRuined() && !parent.IsRuined())
12684 {
12685 return true;
12686 }
12687
12688 return false;
12689 }
12690
12692 {
12693
12694
12695
12696
12697 return super.CanReceiveItemIntoCargo(item);
12698 }
12699
12701 {
12702
12703
12704
12705
12706 GameInventory attachmentInv = attachment.GetInventory();
12708 {
12709 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12710 return false;
12711 }
12712
12713 InventoryLocation loc = new InventoryLocation();
12714 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12715 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12716 return false;
12717
12718 return super.CanReceiveAttachment(attachment, slotId);
12719 }
12720
12722 {
12723 if (!super.CanReleaseAttachment(attachment))
12724 return false;
12725
12726 return GetInventory().AreChildrenAccessible();
12727 }
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12750 {
12751 int id = muzzle_owner.GetMuzzleID();
12752 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12753
12754 if (WPOF_array)
12755 {
12756 for (int i = 0; i < WPOF_array.Count(); i++)
12757 {
12758 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12759
12760 if (WPOF)
12761 {
12762 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12763 }
12764 }
12765 }
12766 }
12767
12768
12770 {
12771 int id = muzzle_owner.GetMuzzleID();
12773
12774 if (WPOBE_array)
12775 {
12776 for (int i = 0; i < WPOBE_array.Count(); i++)
12777 {
12778 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12779
12780 if (WPOBE)
12781 {
12782 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12783 }
12784 }
12785 }
12786 }
12787
12788
12790 {
12791 int id = muzzle_owner.GetMuzzleID();
12792 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12793
12794 if (WPOOH_array)
12795 {
12796 for (int i = 0; i < WPOOH_array.Count(); i++)
12797 {
12798 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12799
12800 if (WPOOH)
12801 {
12802 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12803 }
12804 }
12805 }
12806 }
12807
12808
12810 {
12811 int id = muzzle_owner.GetMuzzleID();
12812 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12813
12814 if (WPOOH_array)
12815 {
12816 for (int i = 0; i < WPOOH_array.Count(); i++)
12817 {
12818 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12819
12820 if (WPOOH)
12821 {
12822 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12823 }
12824 }
12825 }
12826 }
12827
12828
12830 {
12831 int id = muzzle_owner.GetMuzzleID();
12832 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12833
12834 if (WPOOH_array)
12835 {
12836 for (int i = 0; i < WPOOH_array.Count(); i++)
12837 {
12838 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12839
12840 if (WPOOH)
12841 {
12842 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12843 }
12844 }
12845 }
12846 }
12847
12848
12849
12851 {
12853 {
12854 return true;
12855 }
12856
12857 return false;
12858 }
12859
12861 {
12863 {
12864 return true;
12865 }
12866
12867 return false;
12868 }
12869
12871 {
12873 {
12874 return true;
12875 }
12876
12877 return false;
12878 }
12879
12881 {
12882 return false;
12883 }
12884
12887 {
12888 return UATimeSpent.DEFAULT_DEPLOY;
12889 }
12890
12891
12892
12893
12895 {
12897 SetSynchDirty();
12898 }
12899
12901 {
12903 }
12904
12905
12907 {
12908 return false;
12909 }
12910
12913 {
12914 string att_type = "None";
12915
12916 if (ConfigIsExisting("soundAttType"))
12917 {
12918 att_type = ConfigGetString("soundAttType");
12919 }
12920
12922 }
12923
12925 {
12927 }
12928
12929
12930
12931
12932
12936
12938 {
12941
12943 }
12944
12945
12947 {
12949 return;
12950
12952
12955
12958
12959 SoundParameters params = new SoundParameters();
12963 }
12964
12965
12967 {
12969 return;
12970
12972 SetSynchDirty();
12973
12976 }
12977
12978
12980 {
12982 return;
12983
12985 SetSynchDirty();
12986
12989 }
12990
12992 {
12994 }
12995
12997 {
12999 }
13000
13003 {
13004 if (!
GetGame().IsDedicatedServer())
13005 {
13006 if (ConfigIsExisting("attachSoundSet"))
13007 {
13008 string cfg_path = "";
13009 string soundset = "";
13010 string type_name =
GetType();
13011
13014 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13015 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13016
13017 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13018 {
13019 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13020 {
13021 if (cfg_slot_array[i] == slot_type)
13022 {
13023 soundset = cfg_soundset_array[i];
13024 break;
13025 }
13026 }
13027 }
13028
13029 if (soundset != "")
13030 {
13031 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13033 }
13034 }
13035 }
13036 }
13037
13039 {
13040
13041 }
13042
13043 void OnApply(PlayerBase player);
13044
13046 {
13047 return 1.0;
13048 };
13049
13051 {
13053 }
13054
13056 {
13058 }
13059
13061
13063 {
13064 SetDynamicPhysicsLifeTime(0.01);
13066 }
13067
13069 {
13070 array<string> zone_names = new array<string>;
13071 GetDamageZones(zone_names);
13072 for (int i = 0; i < zone_names.Count(); i++)
13073 {
13074 SetHealthMax(zone_names.Get(i),"Health");
13075 }
13076 SetHealthMax("","Health");
13077 }
13078
13081 {
13082 float global_health = GetHealth01("","Health");
13083 array<string> zones = new array<string>;
13084 GetDamageZones(zones);
13085
13086 for (int i = 0; i < zones.Count(); i++)
13087 {
13088 SetHealth01(zones.Get(i),"Health",global_health);
13089 }
13090 }
13091
13094 {
13095 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13096 }
13097
13099 {
13100 if (!hasRootAsPlayer)
13101 {
13102 if (refParentIB)
13103 {
13104
13105 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13106 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13107
13108 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13109 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13110
13113 }
13114 else
13115 {
13116
13119 }
13120 }
13121 }
13122
13124 {
13126 {
13127 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13128 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13129 {
13130 float heatPermCoef = 1.0;
13132 while (ent)
13133 {
13134 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13135 ent = ent.GetHierarchyParent();
13136 }
13137
13138 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13139 }
13140 }
13141 }
13142
13144 {
13145
13146 EntityAI parent = GetHierarchyParent();
13147 if (!parent)
13148 {
13149 hasParent = false;
13150 hasRootAsPlayer = false;
13151 }
13152 else
13153 {
13154 hasParent = true;
13155 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13156 refParentIB =
ItemBase.Cast(parent);
13157 }
13158 }
13159
13160 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13161 {
13162
13163 }
13164
13166 {
13167
13168 return false;
13169 }
13170
13172 {
13173
13174
13175 return false;
13176 }
13177
13179 {
13180
13181 return false;
13182 }
13183
13186 {
13187 return !GetIsFrozen() &&
IsOpen();
13188 }
13189
13191 {
13192 bool hasParent = false, hasRootAsPlayer = false;
13194
13195 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13196 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13197
13198 if (wwtu || foodDecay)
13199 {
13203
13204 if (processWetness || processTemperature || processDecay)
13205 {
13207
13208 if (processWetness)
13209 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13210
13211 if (processTemperature)
13213
13214 if (processDecay)
13215 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13216 }
13217 }
13218 }
13219
13222 {
13224 }
13225
13227 {
13230
13231 return super.GetTemperatureFreezeThreshold();
13232 }
13233
13235 {
13238
13239 return super.GetTemperatureThawThreshold();
13240 }
13241
13243 {
13246
13247 return super.GetItemOverheatThreshold();
13248 }
13249
13251 {
13253 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13254
13255 return super.GetTemperatureFreezeTime();
13256 }
13257
13259 {
13261 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13262
13263 return super.GetTemperatureThawTime();
13264 }
13265
13270
13272 {
13273 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13274 }
13275
13277 {
13278 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13279 }
13280
13283 {
13285 }
13286
13288 {
13290 }
13291
13293 {
13295 }
13296
13299 {
13300 return null;
13301 }
13302
13305 {
13306 return false;
13307 }
13308
13310 {
13312 {
13315 if (!trg)
13316 {
13318 explosive = this;
13319 }
13320
13321 explosive.PairRemote(trg);
13323
13324 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13325 trg.SetPersistentPairID(persistentID);
13326 explosive.SetPersistentPairID(persistentID);
13327
13328 return true;
13329 }
13330 return false;
13331 }
13332
13335 {
13336 float ret = 1.0;
13339 ret *= GetHealth01();
13340
13341 return ret;
13342 }
13343
13344 #ifdef DEVELOPER
13345 override void SetDebugItem()
13346 {
13347 super.SetDebugItem();
13348 _itemBase = this;
13349 }
13350
13352 {
13353 string text = super.GetDebugText();
13354
13356 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13357
13358 return text;
13359 }
13360 #endif
13361
13363 {
13364 return true;
13365 }
13366
13368
13370
13372 {
13375 }
13376
13377
13385
13401}
13402
13404{
13406 if (entity)
13407 {
13408 bool is_item = entity.IsInherited(
ItemBase);
13409 if (is_item && full_quantity)
13410 {
13413 }
13414 }
13415 else
13416 {
13418 return NULL;
13419 }
13420 return entity;
13421}
13422
13424{
13425 if (item)
13426 {
13427 if (health > 0)
13428 item.SetHealth("", "", health);
13429
13430 if (item.CanHaveTemperature())
13431 {
13433 if (item.CanFreeze())
13434 item.SetFrozen(false);
13435 }
13436
13437 if (item.HasEnergyManager())
13438 {
13439 if (quantity >= 0)
13440 {
13441 item.GetCompEM().SetEnergy0To1(quantity);
13442 }
13443 else
13444 {
13446 }
13447 }
13448 else if (item.IsMagazine())
13449 {
13450 Magazine mag = Magazine.Cast(item);
13451 if (quantity >= 0)
13452 {
13453 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13454 }
13455 else
13456 {
13458 }
13459
13460 }
13461 else
13462 {
13463 if (quantity >= 0)
13464 {
13465 item.SetQuantityNormalized(quantity, false);
13466 }
13467 else
13468 {
13470 }
13471
13472 }
13473 }
13474}
13475
13476#ifdef DEVELOPER
13478#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.