8633{
8635 {
8636 return true;
8637 }
8638};
8639
8640
8641
8643{
8647
8649
8652
8653
8654
8655
8656
8665
8671
8676
8681
8702 protected bool m_IsResultOfSplit
8703
8705
8710
8711
8712
8714
8718
8719
8720
8722
8725
8726
8727
8733
8734
8742
8745
8746
8748
8749
8751
8752
8757
8758
8763
8764
8766
8767
8769 {
8774
8775 if (!
GetGame().IsDedicatedServer())
8776 {
8778 {
8780
8782 {
8784 }
8785 }
8786
8789 }
8790
8791 m_OldLocation = null;
8792
8794 {
8796 }
8797
8798 if (ConfigIsExisting("headSelectionsToHide"))
8799 {
8802 }
8803
8805 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8806 {
8808 }
8809
8811
8812 m_IsResultOfSplit = false;
8813
8815 }
8816
8818 {
8819 super.InitItemVariables();
8820
8826 m_Count = ConfigGetInt(
"count");
8827
8830
8835
8838
8843
8855
8859
8860
8863 if (ConfigIsExisting("canBeSplit"))
8864 {
8867 }
8868
8870 if (ConfigIsExisting("itemBehaviour"))
8872
8873
8876 RegisterNetSyncVariableInt("m_VarLiquidType");
8877 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8878
8879 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8880 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8881 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8882
8883 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8884 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8885 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8886 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8887
8888 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8889 RegisterNetSyncVariableBool("m_IsTakeable");
8890 RegisterNetSyncVariableBool("m_IsHologram");
8891
8894 {
8897 }
8898
8900
8902 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8904
8905 }
8906
8908 {
8910 }
8911
8913 {
8916 {
8921 }
8922 }
8923
8924 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8925 {
8927 {
8930 }
8931
8933 }
8934
8936 {
8942 }
8943
8945
8947 {
8949
8950 if (!action)
8951 {
8952 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8953 return;
8954 }
8955
8957 if (!ai)
8958 {
8960 return;
8961 }
8962
8964 if (!action_array)
8965 {
8966 action_array = new array<ActionBase_Basic>;
8968 }
8969 if (LogManager.IsActionLogEnable())
8970 {
8971 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8972 }
8973
8974 if (action_array.Find(action) != -1)
8975 {
8976 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8977 }
8978 else
8979 {
8980 action_array.Insert(action);
8981 }
8982 }
8983
8985 {
8987 ActionBase action = player.GetActionManager().GetAction(actionName);
8990
8991 if (action_array)
8992 {
8993 action_array.RemoveItem(action);
8994 }
8995 }
8996
8997
8998
9000 {
9001 ActionOverrideData overrideData = new ActionOverrideData();
9005
9007 if (!actionMap)
9008 {
9011 }
9012
9013 actionMap.Insert(this.
Type(), overrideData);
9014
9015 }
9016
9018
9020
9021
9023 {
9026
9029
9030 string config_to_search = "CfgVehicles";
9031 string muzzle_owner_config;
9032
9034 {
9035 if (IsInherited(Weapon))
9036 config_to_search = "CfgWeapons";
9037
9038 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9039
9040 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9041
9043
9044 if (config_OnFire_subclass_count > 0)
9045 {
9046 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9047
9048 for (int i = 0; i < config_OnFire_subclass_count; i++)
9049 {
9050 string particle_class = "";
9052 string config_OnFire_entry = config_OnFire_class + particle_class;
9053 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9054 WPOF_array.Insert(WPOF);
9055 }
9056
9057
9059 }
9060 }
9061
9063 {
9064 config_to_search = "CfgWeapons";
9065 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9066
9067 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9068
9070
9071 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9072 {
9073 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9074
9075 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9076 {
9077 string particle_class2 = "";
9079 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9080 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9081 WPOBE_array.Insert(WPOBE);
9082 }
9083
9084
9086 }
9087 }
9088 }
9089
9090
9092 {
9095
9097 {
9098 string config_to_search = "CfgVehicles";
9099
9100 if (IsInherited(Weapon))
9101 config_to_search = "CfgWeapons";
9102
9103 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9104 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9105
9106 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9107 {
9108
9110
9112 {
9114 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9116 return;
9117 }
9118
9121
9122
9123
9125 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9126
9127 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9128 {
9129 string particle_class = "";
9131 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9133
9134 if (entry_type == CT_CLASS)
9135 {
9136 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9137 WPOOH_array.Insert(WPOF);
9138 }
9139 }
9140
9141
9143 }
9144 }
9145 }
9146
9148 {
9150 }
9151
9153 {
9155 {
9157
9160
9163
9164 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9165 }
9166 }
9167
9169 {
9171 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9172
9174 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9175
9177 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9178
9180 {
9182 }
9183 }
9184
9186 {
9188 }
9189
9191 {
9194 else
9196
9198 {
9201 }
9202 else
9203 {
9206
9209 }
9210
9212 }
9213
9215 {
9217 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9218 }
9219
9221 {
9223 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9225 }
9226
9228 {
9230 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9231 }
9232
9234 {
9237
9238 OverheatingParticle OP = new OverheatingParticle();
9243
9245 }
9246
9248 {
9251
9252 return -1;
9253 }
9254
9256 {
9258 {
9261
9262 for (int i = count; i > 0; --i)
9263 {
9264 int id = i - 1;
9267
9270
9271 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9272 {
9273 if (p)
9274 {
9277 }
9278 }
9279 }
9280 }
9281 }
9282
9284 {
9286 {
9288 {
9289 int id = i - 1;
9291
9292 if (OP)
9293 {
9295
9296 if (p)
9297 {
9299 }
9300
9301 delete OP;
9302 }
9303 }
9304
9307 }
9308 }
9309
9312 {
9313 return 0.0;
9314 }
9315
9316
9318 {
9319 return 250;
9320 }
9321
9323 {
9324 return 0;
9325 }
9326
9329 {
9331 return true;
9332
9333 return false;
9334 }
9335
9338 {
9341
9343 {
9345 }
9346 else
9347 {
9348
9350 }
9351
9353 }
9354
9361 {
9362 return -1;
9363 }
9364
9365
9366
9367
9369 {
9371 {
9373 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9374
9375 if (r_index >= 0)
9376 {
9377 InventoryLocation r_il = new InventoryLocation;
9378 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9379
9380 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9383 {
9384 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9385 }
9387 {
9388 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9389 }
9390
9391 }
9392
9393 player.GetHumanInventory().ClearUserReservedLocation(this);
9394 }
9395
9398 }
9399
9400
9401
9402
9404 {
9405 return ItemBase.m_DebugActionsMask;
9406 }
9407
9409 {
9410 return ItemBase.m_DebugActionsMask & mask;
9411 }
9412
9414 {
9415 ItemBase.m_DebugActionsMask = mask;
9416 }
9417
9419 {
9420 ItemBase.m_DebugActionsMask |= mask;
9421 }
9422
9424 {
9425 ItemBase.m_DebugActionsMask &= ~mask;
9426 }
9427
9429 {
9431 {
9433 }
9434 else
9435 {
9437 }
9438 }
9439
9440
9442 {
9443 if (GetEconomyProfile())
9444 {
9445 float q_max = GetEconomyProfile().GetQuantityMax();
9446 if (q_max > 0)
9447 {
9448 float q_min = GetEconomyProfile().GetQuantityMin();
9449 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9450
9452 {
9453 ComponentEnergyManager comp = GetCompEM();
9455 {
9457 }
9458 }
9460 {
9462
9463 }
9464
9465 }
9466 }
9467 }
9468
9471 {
9472 EntityAI parent = GetHierarchyParent();
9473
9474 if (parent)
9475 {
9476 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9477 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9478 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9479 }
9480 }
9481
9484 {
9485 EntityAI parent = GetHierarchyParent();
9486
9487 if (parent)
9488 {
9489 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9490 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9491 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9492 }
9493 }
9494
9496 {
9497
9498
9499
9500
9502
9504 {
9505 if (ScriptInputUserData.CanStoreInputUserData())
9506 {
9507 ScriptInputUserData ctx = new ScriptInputUserData;
9513 ctx.
Write(use_stack_max);
9516
9518 {
9519 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9520 }
9521 }
9522 }
9523 else if (!
GetGame().IsMultiplayer())
9524 {
9526 }
9527 }
9528
9530 {
9532 }
9533
9535 {
9537 }
9538
9540 {
9542 }
9543
9545 {
9546
9547 return false;
9548 }
9549
9551 {
9552 return false;
9553 }
9554
9558 {
9559 return false;
9560 }
9561
9563 {
9564 return "";
9565 }
9566
9568
9570 {
9571 return false;
9572 }
9573
9575 {
9576 return true;
9577 }
9578
9579
9580
9582 {
9583 return true;
9584 }
9585
9587 {
9588 return true;
9589 }
9590
9592 {
9593 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9595 }
9596
9598 {
9600 }
9601
9603 {
9605 if (!is_being_placed)
9607 SetSynchDirty();
9608 }
9609
9610
9612
9614 {
9616 }
9617
9619 {
9621 }
9622
9624 {
9625 return 1;
9626 }
9627
9629 {
9630 return false;
9631 }
9632
9634 {
9636 SetSynchDirty();
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
9665
9666
9667
9668
9669
9670
9671
9672
9674 {
9675 super.OnMovedInsideCargo(container);
9676
9677 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9678 }
9679
9680 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9681 {
9682 super.EEItemLocationChanged(oldLoc,newLoc);
9683
9684 PlayerBase new_player = null;
9685 PlayerBase old_player = null;
9686
9687 if (newLoc.GetParent())
9688 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9689
9690 if (oldLoc.GetParent())
9691 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9692
9694 {
9695 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9696
9697 if (r_index >= 0)
9698 {
9699 InventoryLocation r_il = new InventoryLocation;
9700 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9701
9702 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9705 {
9706 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9707 }
9709 {
9710 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9711 }
9712
9713 }
9714 }
9715
9717 {
9718 if (new_player)
9719 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9720
9721 if (new_player == old_player)
9722 {
9723
9724 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9725 {
9727 {
9728 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9729 {
9730 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9731 }
9732 }
9733 else
9734 {
9735 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9736 }
9737 }
9738
9739 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9740 {
9741 int type = oldLoc.GetType();
9743 {
9744 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9745 }
9747 {
9748 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9749 }
9750 }
9751 if (!m_OldLocation)
9752 {
9753 m_OldLocation = new InventoryLocation;
9754 }
9755 m_OldLocation.Copy(oldLoc);
9756 }
9757 else
9758 {
9759 if (m_OldLocation)
9760 {
9761 m_OldLocation.Reset();
9762 }
9763 }
9764
9766 }
9767 else
9768 {
9769 if (new_player)
9770 {
9771 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9772 if (res_index >= 0)
9773 {
9774 InventoryLocation il = new InventoryLocation;
9775 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9777 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9780 {
9781 il.
GetParent().GetOnReleaseLock().Invoke(it);
9782 }
9784 {
9786 }
9787
9788 }
9789 }
9791 {
9792
9794 }
9795
9796 if (m_OldLocation)
9797 {
9798 m_OldLocation.Reset();
9799 }
9800 }
9801 }
9802
9803 override void EOnContact(IEntity other, Contact extra)
9804 {
9806 {
9807 int liquidType = -1;
9809 if (impactSpeed > 0.0)
9810 {
9812 #ifndef SERVER
9814 #else
9816 SetSynchDirty();
9817 #endif
9819 }
9820 }
9821
9822 #ifdef SERVER
9823 if (GetCompEM() && GetCompEM().IsPlugged())
9824 {
9825 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9826 GetCompEM().UnplugThis();
9827 }
9828 #endif
9829 }
9830
9832
9834 {
9836 }
9837
9839 {
9840
9841 }
9842
9844 {
9845 super.OnItemLocationChanged(old_owner, new_owner);
9846
9847 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9848 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9849
9850 if (!relatedPlayer && playerNew)
9851 relatedPlayer = playerNew;
9852
9853 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9854 {
9856 if (actionMgr)
9857 {
9858 ActionBase currentAction = actionMgr.GetRunningAction();
9859 if (currentAction)
9861 }
9862 }
9863
9864 Man ownerPlayerOld = null;
9865 Man ownerPlayerNew = null;
9866
9867 if (old_owner)
9868 {
9869 if (old_owner.
IsMan())
9870 {
9871 ownerPlayerOld = Man.Cast(old_owner);
9872 }
9873 else
9874 {
9875 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9876 }
9877 }
9878 else
9879 {
9881 {
9883
9884 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9885 {
9886 GetCompEM().UnplugThis();
9887 }
9888 }
9889 }
9890
9891 if (new_owner)
9892 {
9893 if (new_owner.
IsMan())
9894 {
9895 ownerPlayerNew = Man.Cast(new_owner);
9896 }
9897 else
9898 {
9899 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9900 }
9901 }
9902
9903 if (ownerPlayerOld != ownerPlayerNew)
9904 {
9905 if (ownerPlayerOld)
9906 {
9907 array<EntityAI> subItemsExit = new array<EntityAI>;
9909 for (int i = 0; i < subItemsExit.Count(); i++)
9910 {
9913 }
9914 }
9915
9916 if (ownerPlayerNew)
9917 {
9918 array<EntityAI> subItemsEnter = new array<EntityAI>;
9920 for (int j = 0; j < subItemsEnter.Count(); j++)
9921 {
9924 }
9925 }
9926 }
9927 else if (ownerPlayerNew != null)
9928 {
9929 PlayerBase nplayer;
9930 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9931 {
9932 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9934 for (int k = 0; k < subItemsUpdate.Count(); k++)
9935 {
9937 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9938 }
9939 }
9940 }
9941
9942 if (old_owner)
9943 old_owner.OnChildItemRemoved(this);
9944 if (new_owner)
9945 new_owner.OnChildItemReceived(this);
9946 }
9947
9948
9950 {
9951 super.EEDelete(parent);
9952 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9953 if (player)
9954 {
9956
9957 if (player.IsAlive())
9958 {
9959 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9960 if (r_index >= 0)
9961 {
9962 InventoryLocation r_il = new InventoryLocation;
9963 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9964
9965 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9968 {
9969 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9970 }
9972 {
9973 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9974 }
9975
9976 }
9977
9978 player.RemoveQuickBarEntityShortcut(this);
9979 }
9980 }
9981 }
9982
9984 {
9985 super.EEKilled(killer);
9986
9989 {
9990 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9991 {
9992 if (IsMagazine())
9993 {
9994 if (Magazine.Cast(this).GetAmmoCount() > 0)
9995 {
9997 }
9998 }
9999 else
10000 {
10002 }
10003 }
10004 }
10005 }
10006
10008 {
10009 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10010
10011 super.OnWasAttached(parent, slot_id);
10012
10015
10017 }
10018
10020 {
10021 super.OnWasDetached(parent, slot_id);
10022
10025 }
10026
10028 {
10029 int idx;
10032
10033 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10034 if (inventory_slots.Count() < 1)
10035 {
10036 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10037 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10038 }
10039 else
10040 {
10041 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10042 }
10043
10044 idx = inventory_slots.Find(slot);
10045 if (idx < 0)
10046 return "";
10047
10048 return attach_types.Get(idx);
10049 }
10050
10052 {
10053 int idx = -1;
10054 string slot;
10055
10058
10059 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10060 if (inventory_slots.Count() < 1)
10061 {
10062 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10063 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10064 }
10065 else
10066 {
10067 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10068 if (detach_types.Count() < 1)
10069 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10070 }
10071
10072 for (int i = 0; i < inventory_slots.Count(); i++)
10073 {
10074 slot = inventory_slots.Get(i);
10075 }
10076
10077 if (slot != "")
10078 {
10079 if (detach_types.Count() == 1)
10080 idx = 0;
10081 else
10082 idx = inventory_slots.Find(slot);
10083 }
10084 if (idx < 0)
10085 return "";
10086
10087 return detach_types.Get(idx);
10088 }
10089
10091 {
10092
10094
10095
10096 float min_time = 1;
10097 float max_time = 3;
10098 float delay = Math.RandomFloat(min_time, max_time);
10099
10100 explode_timer.Run(delay, this, "DoAmmoExplosion");
10101 }
10102
10104 {
10105 Magazine magazine = Magazine.Cast(this);
10106 int pop_sounds_count = 6;
10107 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10108
10109
10110 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10111 string sound_name = pop_sounds[ sound_idx ];
10113
10114
10115 magazine.ServerAddAmmoCount(-1);
10116
10117
10118 float min_temp_to_explode = 100;
10119
10120 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10121 {
10123 }
10124 }
10125
10126
10127 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10128 {
10129 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10130
10131 const int CHANCE_DAMAGE_CARGO = 4;
10132 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10133 const int CHANCE_DAMAGE_NOTHING = 2;
10134
10136 {
10137 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10138 int chances;
10139 int rnd;
10140
10141 if (GetInventory().GetCargo())
10142 {
10143 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10144 rnd = Math.RandomInt(0,chances);
10145
10146 if (rnd < CHANCE_DAMAGE_CARGO)
10147 {
10149 }
10150 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10151 {
10153 }
10154 }
10155 else
10156 {
10157 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10158 rnd = Math.RandomInt(0,chances);
10159
10160 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10161 {
10163 }
10164 }
10165 }
10166 }
10167
10169 {
10170 if (GetInventory().GetCargo())
10171 {
10172 int item_count = GetInventory().GetCargo().GetItemCount();
10173 if (item_count > 0)
10174 {
10175 int random_pick = Math.RandomInt(0, item_count);
10177 if (!item.IsExplosive())
10178 {
10179 item.AddHealth("","",damage);
10180 return true;
10181 }
10182 }
10183 }
10184 return false;
10185 }
10186
10188 {
10189 int attachment_count = GetInventory().AttachmentCount();
10190 if (attachment_count > 0)
10191 {
10192 int random_pick = Math.RandomInt(0, attachment_count);
10193 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10194 if (!attachment.IsExplosive())
10195 {
10196 attachment.AddHealth("","",damage);
10197 return true;
10198 }
10199 }
10200 return false;
10201 }
10202
10204 {
10206 }
10207
10209 {
10211 return GetInventory().CanRemoveEntity();
10212
10213 return false;
10214 }
10215
10217 {
10218
10220 return false;
10221
10222
10224 return false;
10225
10226
10227
10229 if (delta == 0)
10230 return false;
10231
10232
10233 return true;
10234 }
10235
10237 {
10239 {
10240 if (ScriptInputUserData.CanStoreInputUserData())
10241 {
10242 ScriptInputUserData ctx = new ScriptInputUserData;
10247 ctx.
Write(destination_entity);
10249 ctx.
Write(slot_id);
10251 }
10252 }
10253 else if (!
GetGame().IsMultiplayer())
10254 {
10256 }
10257 }
10258
10260 {
10261 float split_quantity_new;
10265 InventoryLocation loc = new InventoryLocation;
10266
10267 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10268 {
10270 split_quantity_new = stack_max;
10271 else
10273
10275 {
10276 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10277 if (new_item)
10278 {
10279 new_item.SetResultOfSplit(true);
10280 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10282 new_item.
SetQuantity(split_quantity_new,
false,
true);
10283 }
10284 }
10285 }
10286 else if (destination_entity && slot_id == -1)
10287 {
10288 if (quantity > stack_max)
10289 split_quantity_new = stack_max;
10290 else
10291 split_quantity_new = quantity;
10292
10294 {
10296 {
10299 }
10300
10301 if (new_item)
10302 {
10303 new_item.SetResultOfSplit(true);
10304 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10306 new_item.
SetQuantity(split_quantity_new,
false,
true);
10307 }
10308 }
10309 }
10310 else
10311 {
10312 if (stack_max != 0)
10313 {
10315 {
10317 }
10318
10319 if (split_quantity_new == 0)
10320 {
10321 if (!
GetGame().IsMultiplayer())
10322 player.PhysicalPredictiveDropItem(this);
10323 else
10324 player.ServerDropEntity(this);
10325 return;
10326 }
10327
10329 {
10331
10332 if (new_item)
10333 {
10334 new_item.SetResultOfSplit(true);
10335 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10338 new_item.PlaceOnSurface();
10339 }
10340 }
10341 }
10342 }
10343 }
10344
10346 {
10347 float split_quantity_new;
10351 InventoryLocation loc = new InventoryLocation;
10352
10353 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10354 {
10356 split_quantity_new = stack_max;
10357 else
10359
10361 {
10362 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10363 if (new_item)
10364 {
10365 new_item.SetResultOfSplit(true);
10366 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10368 new_item.
SetQuantity(split_quantity_new,
false,
true);
10369 }
10370 }
10371 }
10372 else if (destination_entity && slot_id == -1)
10373 {
10374 if (quantity > stack_max)
10375 split_quantity_new = stack_max;
10376 else
10377 split_quantity_new = quantity;
10378
10380 {
10382 {
10385 }
10386
10387 if (new_item)
10388 {
10389 new_item.SetResultOfSplit(true);
10390 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10392 new_item.
SetQuantity(split_quantity_new,
false,
true);
10393 }
10394 }
10395 }
10396 else
10397 {
10398 if (stack_max != 0)
10399 {
10401 {
10403 }
10404
10406 {
10408
10409 if (new_item)
10410 {
10411 new_item.SetResultOfSplit(true);
10412 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10415 new_item.PlaceOnSurface();
10416 }
10417 }
10418 }
10419 }
10420 }
10421
10423 {
10425 {
10426 if (ScriptInputUserData.CanStoreInputUserData())
10427 {
10428 ScriptInputUserData ctx = new ScriptInputUserData;
10433 dst.WriteToContext(ctx);
10435 }
10436 }
10437 else if (!
GetGame().IsMultiplayer())
10438 {
10440 }
10441 }
10442
10444 {
10446 {
10447 if (ScriptInputUserData.CanStoreInputUserData())
10448 {
10449 ScriptInputUserData ctx = new ScriptInputUserData;
10454 ctx.
Write(destination_entity);
10460 }
10461 }
10462 else if (!
GetGame().IsMultiplayer())
10463 {
10465 }
10466 }
10467
10469 {
10471 }
10472
10474 {
10476 float split_quantity_new;
10478 if (dst.IsValid())
10479 {
10480 int slot_id = dst.GetSlot();
10482
10483 if (quantity > stack_max)
10484 split_quantity_new = stack_max;
10485 else
10486 split_quantity_new = quantity;
10487
10489 {
10491
10492 if (new_item)
10493 {
10494 new_item.SetResultOfSplit(true);
10495 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10497 new_item.
SetQuantity(split_quantity_new,
false,
true);
10498 }
10499
10500 return new_item;
10501 }
10502 }
10503
10504 return null;
10505 }
10506
10508 {
10510 float split_quantity_new;
10512 if (destination_entity)
10513 {
10515 if (quantity > stackable)
10516 split_quantity_new = stackable;
10517 else
10518 split_quantity_new = quantity;
10519
10521 {
10522 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10523 if (new_item)
10524 {
10525 new_item.SetResultOfSplit(true);
10526 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10528 new_item.
SetQuantity(split_quantity_new,
false,
true);
10529 }
10530 }
10531 }
10532 }
10533
10535 {
10537 {
10538 if (ScriptInputUserData.CanStoreInputUserData())
10539 {
10540 ScriptInputUserData ctx = new ScriptInputUserData;
10545 ItemBase destination_entity =
this;
10546 ctx.
Write(destination_entity);
10550 }
10551 }
10552 else if (!
GetGame().IsMultiplayer())
10553 {
10555 }
10556 }
10557
10559 {
10561 float split_quantity_new;
10563 if (player)
10564 {
10566 if (quantity > stackable)
10567 split_quantity_new = stackable;
10568 else
10569 split_quantity_new = quantity;
10570
10572 {
10573 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10574 new_item =
ItemBase.Cast(in_hands);
10575 if (new_item)
10576 {
10577 new_item.SetResultOfSplit(true);
10578 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10580 new_item.SetQuantity(split_quantity_new, false, true);
10581 }
10582 }
10583 }
10584 }
10585
10587 {
10589 float split_quantity_new = Math.Floor(quantity * 0.5);
10590
10592 return;
10593
10595
10596 if (new_item)
10597 {
10598 if (new_item.GetQuantityMax() < split_quantity_new)
10599 {
10600 split_quantity_new = new_item.GetQuantityMax();
10601 }
10602
10603 new_item.SetResultOfSplit(true);
10604 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10605
10607 {
10610 }
10611 else
10612 {
10614 new_item.
SetQuantity(split_quantity_new,
false,
true);
10615 }
10616 }
10617 }
10618
10620 {
10622 float split_quantity_new = Math.Floor(quantity / 2);
10623
10625 return;
10626
10627 InventoryLocation invloc = new InventoryLocation;
10629
10631 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10632
10633 if (new_item)
10634 {
10635 if (new_item.GetQuantityMax() < split_quantity_new)
10636 {
10637 split_quantity_new = new_item.GetQuantityMax();
10638 }
10640 {
10643 }
10644 else if (split_quantity_new > 1)
10645 {
10647 new_item.
SetQuantity(split_quantity_new,
false,
true);
10648 }
10649 }
10650 }
10651
10654 {
10655 SetWeightDirty();
10657
10658 if (parent)
10659 parent.OnAttachmentQuantityChangedEx(this, delta);
10660
10662 {
10664 {
10666 }
10668 {
10669 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10671 }
10672 }
10673
10674 }
10675
10678 {
10679
10680 }
10681
10684 {
10686 }
10687
10689 {
10690 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10691
10693 {
10694 if (newLevel == GameConstants.STATE_RUINED)
10695 {
10697 EntityAI parent = GetHierarchyParent();
10698 if (parent && parent.IsFireplace())
10699 {
10700 CargoBase cargo = GetInventory().GetCargo();
10701 if (cargo)
10702 {
10704 {
10706 }
10707 }
10708 }
10709 }
10710
10712 {
10713
10715 return;
10716 }
10717
10718 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10719 {
10721 }
10722 }
10723 }
10724
10725
10727 {
10728 super.OnRightClick();
10729
10731 {
10733 {
10734 if (ScriptInputUserData.CanStoreInputUserData())
10735 {
10736 EntityAI root = GetHierarchyRoot();
10737 Man playerOwner = GetHierarchyRootPlayer();
10738 InventoryLocation dst = new InventoryLocation;
10739
10740
10741 if (!playerOwner && root && root == this)
10742 {
10744 }
10745 else
10746 {
10747
10748 GetInventory().GetCurrentInventoryLocation(dst);
10750 {
10753 {
10755 }
10756 else
10757 {
10759
10760
10761 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10762 {
10764 }
10765 else
10766 {
10767 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10768 }
10769 }
10770 }
10771 }
10772
10773 ScriptInputUserData ctx = new ScriptInputUserData;
10781 }
10782 }
10783 else if (!
GetGame().IsMultiplayer())
10784 {
10786 }
10787 }
10788 }
10789
10791 {
10792 if (root)
10793 {
10794 vector m4[4];
10795 root.GetTransform(m4);
10796 dst.SetGround(this, m4);
10797 }
10798 else
10799 {
10800 GetInventory().GetCurrentInventoryLocation(dst);
10801 }
10802 }
10803
10804 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10805 {
10806
10807 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10808 return false;
10809
10810 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10811 return false;
10812
10813
10815 return false;
10816
10817
10818 Magazine mag = Magazine.Cast(this);
10819 if (mag)
10820 {
10821 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10822 return false;
10823
10824 if (stack_max_limit)
10825 {
10826 Magazine other_mag = Magazine.Cast(other_item);
10827 if (other_item)
10828 {
10829 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10830 return false;
10831 }
10832
10833 }
10834 }
10835 else
10836 {
10837
10839 return false;
10840
10842 return false;
10843 }
10844
10845 PlayerBase player = null;
10846 if (CastTo(player, GetHierarchyRootPlayer()))
10847 {
10848 if (player.GetInventory().HasAttachment(this))
10849 return false;
10850
10851 if (player.IsItemsToDelete())
10852 return false;
10853 }
10854
10855 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10856 return false;
10857
10858 int slotID;
10860 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10861 return false;
10862
10863 return true;
10864 }
10865
10867 {
10869 }
10870
10872 {
10873 return m_IsResultOfSplit;
10874 }
10875
10877 {
10878 m_IsResultOfSplit = value;
10879 }
10880
10882 {
10884 }
10885
10887 {
10888 float other_item_quantity = other_item.GetQuantity();
10889 float this_free_space;
10890
10892
10894
10895 if (other_item_quantity > this_free_space)
10896 {
10897 return this_free_space;
10898 }
10899 else
10900 {
10901 return other_item_quantity;
10902 }
10903 }
10904
10906 {
10908 }
10909
10911 {
10913 return;
10914
10915 if (!IsMagazine() && other_item)
10916 {
10918 if (quantity_used != 0)
10919 {
10920 float hp1 = GetHealth01("","");
10921 float hp2 = other_item.GetHealth01("","");
10922 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10923 hpResult = hpResult / (
GetQuantity() + quantity_used);
10924
10925 hpResult *= GetMaxHealth();
10926 Math.Round(hpResult);
10927 SetHealth("", "Health", hpResult);
10928
10930 other_item.AddQuantity(-quantity_used);
10931 }
10932 }
10934 }
10935
10937 {
10938 #ifdef SERVER
10939 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10940 GetHierarchyParent().IncreaseLifetimeUp();
10941 #endif
10942 };
10943
10945 {
10946 PlayerBase p = PlayerBase.Cast(player);
10947
10948 array<int> recipesIds = p.m_Recipes;
10949 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10950 if (moduleRecipesManager)
10951 {
10952 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10953 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10954 }
10955
10956 for (int i = 0;i < recipesIds.Count(); i++)
10957 {
10958 int key = recipesIds.Get(i);
10959 string recipeName = moduleRecipesManager.GetRecipeName(key);
10961 }
10962 }
10963
10964
10965 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10966 {
10967 super.GetDebugActions(outputList);
10968
10969
10975
10976
10981
10986
10987
10991
10992
10994 {
10998 }
10999
11002
11003
11007
11009
11010 InventoryLocation loc = new InventoryLocation();
11011 GetInventory().GetCurrentInventoryLocation(loc);
11013 {
11014 if (Gizmo_IsSupported())
11017 }
11018
11020 }
11021
11022
11023
11024
11026 {
11027 super.OnAction(action_id, player, ctx);
11028
11030 {
11031 switch (action_id)
11032 {
11035 return true;
11038 return true;
11039 }
11040 }
11041
11043 {
11044 switch (action_id)
11045 {
11047 Delete();
11048 return true;
11049 }
11050 }
11051
11052 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11053 {
11054 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11055 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11056 PlayerBase p = PlayerBase.Cast(player);
11057 if (
EActions.RECIPES_RANGE_START < 1000)
11058 {
11059 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11060 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11061 }
11062 }
11063 #ifndef SERVER
11064 else if (action_id ==
EActions.WATCH_PLAYER)
11065 {
11066 PluginDeveloper.SetDeveloperItemClientEx(player);
11067 }
11068 #endif
11070 {
11071 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11072 {
11073 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11074 OnDebugButtonPressServer(id + 1);
11075 }
11076
11077 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11078 {
11079 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11081 }
11082
11083 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11084 {
11085 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11087 }
11088
11089 else if (action_id ==
EActions.ADD_QUANTITY)
11090 {
11091 if (IsMagazine())
11092 {
11093 Magazine mag = Magazine.Cast(this);
11094 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11095 }
11096 else
11097 {
11099 }
11100
11101 if (m_EM)
11102 {
11103 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11104 }
11105
11106 }
11107
11108 else if (action_id ==
EActions.REMOVE_QUANTITY)
11109 {
11110 if (IsMagazine())
11111 {
11112 Magazine mag2 = Magazine.Cast(this);
11113 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11114 }
11115 else
11116 {
11118 }
11119 if (m_EM)
11120 {
11121 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11122 }
11123
11124 }
11125
11126 else if (action_id ==
EActions.SET_QUANTITY_0)
11127 {
11129
11130 if (m_EM)
11131 {
11132 m_EM.SetEnergy(0);
11133 }
11134 }
11135
11136 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11137 {
11139
11140 if (m_EM)
11141 {
11142 m_EM.SetEnergy(m_EM.GetEnergyMax());
11143 }
11144 }
11145
11146 else if (action_id ==
EActions.ADD_HEALTH)
11147 {
11148 AddHealth("","",GetMaxHealth("","Health")/5);
11149 }
11150 else if (action_id ==
EActions.REMOVE_HEALTH)
11151 {
11152 AddHealth("","",-GetMaxHealth("","Health")/5);
11153 }
11154 else if (action_id ==
EActions.DESTROY_HEALTH)
11155 {
11156 SetHealth01("","",0);
11157 }
11158 else if (action_id ==
EActions.WATCH_ITEM)
11159 {
11161 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11162 #ifdef DEVELOPER
11163 SetDebugDeveloper_item(this);
11164 #endif
11165 }
11166
11167 else if (action_id ==
EActions.ADD_TEMPERATURE)
11168 {
11169 AddTemperature(20);
11170
11171 }
11172
11173 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11174 {
11175 AddTemperature(-20);
11176
11177 }
11178
11179 else if (action_id ==
EActions.FLIP_FROZEN)
11180 {
11181 SetFrozen(!GetIsFrozen());
11182
11183 }
11184
11185 else if (action_id ==
EActions.ADD_WETNESS)
11186 {
11188
11189 }
11190
11191 else if (action_id ==
EActions.REMOVE_WETNESS)
11192 {
11194
11195 }
11196
11197 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11198 {
11201
11202
11203 }
11204
11205 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11206 {
11209 }
11210
11211 else if (action_id ==
EActions.MAKE_SPECIAL)
11212 {
11213 auto debugParams = DebugSpawnParams.WithPlayer(player);
11214 OnDebugSpawnEx(debugParams);
11215 }
11216
11217 }
11218
11219
11220 return false;
11221 }
11222
11223
11224
11225
11229
11232
11233
11234
11236 {
11237 return false;
11238 }
11239
11240
11242 {
11243 return true;
11244 }
11245
11246
11248 {
11249 return true;
11250 }
11251
11252
11253
11255 {
11256 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11258 }
11259
11262 {
11263 return null;
11264 }
11265
11267 {
11268 return false;
11269 }
11270
11272 {
11273 return false;
11274 }
11275
11279
11280
11282 {
11283 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11284 return module_repairing.CanRepair(this, item_repair_kit);
11285 }
11286
11287
11288 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11289 {
11290 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11291 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11292 }
11293
11294
11296 {
11297
11298
11299
11300
11301
11302
11303
11304
11305 return 1;
11306 }
11307
11308
11309
11311 {
11313 }
11314
11315
11316
11318 {
11320 }
11321
11322
11331 {
11332 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11333
11334 if (player)
11335 {
11336 player.MessageStatus(text);
11337 }
11338 }
11339
11340
11349 {
11350 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11351
11352 if (player)
11353 {
11354 player.MessageAction(text);
11355 }
11356 }
11357
11358
11367 {
11368 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11369
11370 if (player)
11371 {
11372 player.MessageFriendly(text);
11373 }
11374 }
11375
11376
11385 {
11386 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11387
11388 if (player)
11389 {
11390 player.MessageImportant(text);
11391 }
11392 }
11393
11395 {
11396 return true;
11397 }
11398
11399
11400 override bool KindOf(
string tag)
11401 {
11402 bool found = false;
11403 string item_name = this.
GetType();
11406
11407 int array_size = item_tag_array.Count();
11408 for (int i = 0; i < array_size; i++)
11409 {
11410 if (item_tag_array.Get(i) == tag)
11411 {
11412 found = true;
11413 break;
11414 }
11415 }
11416 return found;
11417 }
11418
11419
11421 {
11422
11423 super.OnRPC(sender, rpc_type,ctx);
11424
11425
11426 switch (rpc_type)
11427 {
11428 #ifndef SERVER
11429 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11430 Param2<bool, string> p = new Param2<bool, string>(false, "");
11431
11433 return;
11434
11435 bool play = p.param1;
11436 string soundSet = p.param2;
11437
11438 if (play)
11439 {
11441 {
11443 {
11445 }
11446 }
11447 else
11448 {
11450 }
11451 }
11452 else
11453 {
11455 }
11456
11457 break;
11458 #endif
11459
11460 }
11461
11463 {
11465 }
11466 }
11467
11468
11469
11470
11472 {
11473 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11474 return plugin.GetID(
name);
11475 }
11476
11478 {
11479 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11480 return plugin.GetName(id);
11481 }
11482
11485 {
11486
11487
11488 int varFlags;
11489 if (!ctx.
Read(varFlags))
11490 return;
11491
11492 if (varFlags & ItemVariableFlags.FLOAT)
11493 {
11495 }
11496 }
11497
11499 {
11500
11501 super.SerializeNumericalVars(floats_out);
11502
11503
11504
11506 {
11508 }
11509
11511 {
11513 }
11514
11516 {
11518 }
11519
11521 {
11526 }
11527
11529 {
11531 }
11532 }
11533
11535 {
11536
11537 super.DeSerializeNumericalVars(floats);
11538
11539
11540 int index = 0;
11541 int mask = Math.Round(floats.Get(index));
11542
11543 index++;
11544
11546 {
11548 {
11550 }
11551 else
11552 {
11553 float quantity = floats.Get(index);
11554 SetQuantity(quantity,
true,
false,
false,
false);
11555 }
11556 index++;
11557 }
11558
11560 {
11561 float wet = floats.Get(index);
11563 index++;
11564 }
11565
11567 {
11568 int liquidtype = Math.Round(floats.Get(index));
11570 index++;
11571 }
11572
11574 {
11576 index++;
11578 index++;
11580 index++;
11582 index++;
11583 }
11584
11586 {
11587 int cleanness = Math.Round(floats.Get(index));
11589 index++;
11590 }
11591 }
11592
11594 {
11595 super.WriteVarsToCTX(ctx);
11596
11597
11599 {
11601 }
11602
11604 {
11606 }
11607
11609 {
11611 }
11612
11614 {
11615 int r,g,b,a;
11621 }
11622
11624 {
11626 }
11627 }
11628
11630 {
11631 if (!super.ReadVarsFromCTX(ctx,version))
11632 return false;
11633
11634 int intValue;
11635 float value;
11636
11637 if (version < 140)
11638 {
11639 if (!ctx.
Read(intValue))
11640 return false;
11641
11642 m_VariablesMask = intValue;
11643 }
11644
11646 {
11647 if (!ctx.
Read(value))
11648 return false;
11649
11651 {
11653 }
11654 else
11655 {
11657 }
11658 }
11659
11660 if (version < 140)
11661 {
11663 {
11664 if (!ctx.
Read(value))
11665 return false;
11666 SetTemperatureDirect(value);
11667 }
11668 }
11669
11671 {
11672 if (!ctx.
Read(value))
11673 return false;
11675 }
11676
11678 {
11679 if (!ctx.
Read(intValue))
11680 return false;
11682 }
11683
11685 {
11686 int r,g,b,a;
11688 return false;
11690 return false;
11692 return false;
11694 return false;
11695
11697 }
11698
11700 {
11701 if (!ctx.
Read(intValue))
11702 return false;
11704 }
11705
11706 if (version >= 138 && version < 140)
11707 {
11709 {
11710 if (!ctx.
Read(intValue))
11711 return false;
11712 SetFrozen(intValue);
11713 }
11714 }
11715
11716 return true;
11717 }
11718
11719
11721 {
11724 {
11726 }
11727
11728 if (!super.OnStoreLoad(ctx, version))
11729 {
11731 return false;
11732 }
11733
11734 if (version >= 114)
11735 {
11736 bool hasQuickBarIndexSaved;
11737
11738 if (!ctx.
Read(hasQuickBarIndexSaved))
11739 {
11741 return false;
11742 }
11743
11744 if (hasQuickBarIndexSaved)
11745 {
11746 int itmQBIndex;
11747
11748
11749 if (!ctx.
Read(itmQBIndex))
11750 {
11752 return false;
11753 }
11754
11755 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11756 if (itmQBIndex != -1 && parentPlayer)
11757 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11758 }
11759 }
11760 else
11761 {
11762
11763 PlayerBase player;
11764 int itemQBIndex;
11765 if (version ==
int.
MAX)
11766 {
11767 if (!ctx.
Read(itemQBIndex))
11768 {
11770 return false;
11771 }
11772 }
11773 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11774 {
11775
11776 if (!ctx.
Read(itemQBIndex))
11777 {
11779 return false;
11780 }
11781 if (itemQBIndex != -1 && player)
11782 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11783 }
11784 }
11785
11786 if (version < 140)
11787 {
11788
11789 if (!LoadVariables(ctx, version))
11790 {
11792 return false;
11793 }
11794 }
11795
11796
11798 {
11800 return false;
11801 }
11802 if (version >= 132)
11803 {
11805 if (raib)
11806 {
11808 {
11810 return false;
11811 }
11812 }
11813 }
11814
11816 return true;
11817 }
11818
11819
11820
11822 {
11823 super.OnStoreSave(ctx);
11824
11825 PlayerBase player;
11826 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11827 {
11829
11830 int itemQBIndex = -1;
11831 itemQBIndex = player.FindQuickBarEntityIndex(this);
11832 ctx.
Write(itemQBIndex);
11833 }
11834 else
11835 {
11837 }
11838
11840
11842 if (raib)
11843 {
11845 }
11846 }
11847
11848
11850 {
11851 super.AfterStoreLoad();
11852
11854 {
11856 }
11857
11859 {
11862 }
11863 }
11864
11866 {
11867 super.EEOnAfterLoad();
11868
11870 {
11872 }
11873
11876 }
11877
11879 {
11880 return false;
11881 }
11882
11883
11884
11886 {
11888 {
11889 #ifdef PLATFORM_CONSOLE
11890
11892 {
11894 if (menu)
11895 {
11897 }
11898 }
11899 #endif
11900 }
11901
11903 {
11906 }
11907
11909 {
11910 SetWeightDirty();
11912 }
11914 {
11917 }
11918
11920 {
11923 }
11925 {
11928 }
11929
11930 super.OnVariablesSynchronized();
11931 }
11932
11933
11934
11936 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11937 {
11938 if (!IsServerCheck(allow_client))
11939 return false;
11940
11942 return false;
11943
11946
11947 if (value <= (min + 0.001))
11948 value = min;
11949
11950 if (value == min)
11951 {
11952 if (destroy_config)
11953 {
11954 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11955 if (dstr)
11956 {
11958 this.Delete();
11959 return true;
11960 }
11961 }
11962 else if (destroy_forced)
11963 {
11965 this.Delete();
11966 return true;
11967 }
11968
11970 }
11971
11974
11976 {
11978
11979 if (delta)
11981 }
11982
11984
11985 return false;
11986 }
11987
11988
11990 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11991 {
11993 }
11994
11996 {
11999 }
12000
12002 {
12005 }
12006
12008 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12009 {
12010 float value_clamped = Math.Clamp(value, 0, 1);
12012 SetQuantity(result, destroy_config, destroy_forced);
12013 }
12014
12015
12018 {
12020 }
12021
12023 {
12025 }
12026
12027
12028
12029
12030
12031
12032
12033
12034
12035
12037 {
12038 int slot = -1;
12039 if (GetInventory())
12040 {
12041 InventoryLocation il = new InventoryLocation;
12042 GetInventory().GetCurrentInventoryLocation(il);
12044 }
12045
12047 }
12048
12050 {
12051 float quantity_max = 0;
12052
12054 {
12055 if (attSlotID != -1)
12056 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12057
12058 if (quantity_max <= 0)
12060 }
12061
12062 if (quantity_max <= 0)
12064
12065 return quantity_max;
12066 }
12067
12069 {
12071 }
12072
12074 {
12076 }
12077
12078
12080 {
12082 }
12083
12085 {
12087 }
12088
12090 {
12092 }
12093
12094
12096 {
12097
12098 float weightEx = GetWeightEx();
12099 float special = GetInventoryAndCargoWeight();
12100 return weightEx - special;
12101 }
12102
12103
12105 {
12107 }
12108
12110 {
12112 {
12113 #ifdef DEVELOPER
12114 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12115 {
12116 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12118 }
12119 #endif
12120
12121 return GetQuantity() * GetConfigWeightModified();
12122 }
12123 else if (HasEnergyManager())
12124 {
12125 #ifdef DEVELOPER
12126 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12127 {
12128 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12129 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12130 }
12131 #endif
12132 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12133 }
12134 else
12135 {
12136 #ifdef DEVELOPER
12137 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12138 {
12139 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12140 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12141 }
12142 #endif
12143 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12144 }
12145 }
12146
12149 {
12150 int item_count = 0;
12152
12153 if (GetInventory().GetCargo() != NULL)
12154 {
12155 item_count = GetInventory().GetCargo().GetItemCount();
12156 }
12157
12158 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12159 {
12160 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12161 if (item)
12162 item_count += item.GetNumberOfItems();
12163 }
12164 return item_count;
12165 }
12166
12169 {
12170 float weight = 0;
12171 float wetness = 1;
12172 if (include_wetness)
12175 {
12176 weight = wetness * m_ConfigWeight;
12177 }
12179 {
12180 weight = 1;
12181 }
12182 return weight;
12183 }
12184
12185
12186
12188 {
12189 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12190 {
12191 GameInventory inv = GetInventory();
12192 array<EntityAI> items = new array<EntityAI>;
12194 for (int i = 0; i < items.Count(); i++)
12195 {
12197 if (item)
12198 {
12200 }
12201 }
12202 }
12203 }
12204
12205
12206
12207
12209 {
12210 float energy = 0;
12211 if (HasEnergyManager())
12212 {
12213 energy = GetCompEM().GetEnergy();
12214 }
12215 return energy;
12216 }
12217
12218
12220 {
12221 super.OnEnergyConsumed();
12222
12224 }
12225
12227 {
12228 super.OnEnergyAdded();
12229
12231 }
12232
12233
12235 {
12236 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12237 {
12239 {
12240 float energy_0to1 = GetCompEM().GetEnergy0To1();
12242 }
12243 }
12244 }
12245
12246
12248 {
12249 return ConfigGetFloat("heatIsolation");
12250 }
12251
12253 {
12255 }
12256
12258 {
12259 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12260 if (
GetGame().ConfigIsExisting(paramPath))
12262
12263 return 0.0;
12264 }
12265
12267 {
12268 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12269 if (
GetGame().ConfigIsExisting(paramPath))
12271
12272 return 0.0;
12273 }
12274
12275 override void SetWet(
float value,
bool allow_client =
false)
12276 {
12277 if (!IsServerCheck(allow_client))
12278 return;
12279
12282
12284
12285 m_VarWet = Math.Clamp(value, min, max);
12286
12288 {
12291 }
12292 }
12293
12294 override void AddWet(
float value)
12295 {
12297 }
12298
12300 {
12302 }
12303
12305 {
12307 }
12308
12310 {
12312 }
12313
12315 {
12317 }
12318
12320 {
12322 }
12323
12324 override void OnWetChanged(
float newVal,
float oldVal)
12325 {
12328 if (newLevel != oldLevel)
12329 {
12331 }
12332 }
12333
12335 {
12336 SetWeightDirty();
12337 }
12338
12340 {
12341 return GetWetLevelInternal(
m_VarWet);
12342 }
12343
12344
12345
12347 {
12349 }
12350
12352 {
12354 }
12355
12357 {
12359 }
12360
12362 {
12364 }
12365
12366
12367
12369 {
12370 if (ConfigIsExisting("itemModelLength"))
12371 {
12372 return ConfigGetFloat("itemModelLength");
12373 }
12374 return 0;
12375 }
12376
12378 {
12379 if (ConfigIsExisting("itemAttachOffset"))
12380 {
12381 return ConfigGetFloat("itemAttachOffset");
12382 }
12383 return 0;
12384 }
12385
12386 override void SetCleanness(
int value,
bool allow_client =
false)
12387 {
12388 if (!IsServerCheck(allow_client))
12389 return;
12390
12392
12394
12397 }
12398
12400 {
12402 }
12403
12405 {
12406 return true;
12407 }
12408
12409
12410
12411
12413 {
12415 }
12416
12418 {
12420 }
12421
12422
12423
12424
12425 override void SetColor(
int r,
int g,
int b,
int a)
12426 {
12432 }
12434 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12435 {
12440 }
12441
12443 {
12445 }
12446
12449 {
12450 int r,g,b,a;
12452 r = r/255;
12453 g = g/255;
12454 b = b/255;
12455 a = a/255;
12456 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12457 }
12458
12459
12460
12461 override void SetLiquidType(
int value,
bool allow_client =
false)
12462 {
12463 if (!IsServerCheck(allow_client))
12464 return;
12465
12470 }
12471
12473 {
12474 return ConfigGetInt("varLiquidTypeInit");
12475 }
12476
12478 {
12480 }
12481
12483 {
12485 SetFrozen(false);
12486 }
12487
12490 {
12491 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12492 }
12493
12494
12497 {
12498 PlayerBase nplayer;
12499 if (PlayerBase.CastTo(nplayer, player))
12500 {
12502
12503 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12504 }
12505 }
12506
12507
12510 {
12511 PlayerBase nplayer;
12512 if (PlayerBase.CastTo(nplayer,player))
12513 {
12514
12515 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12516
12517 }
12518
12519
12520 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12521
12522
12523 if (HasEnergyManager())
12524 {
12525 GetCompEM().UpdatePlugState();
12526 }
12527 }
12528
12529
12531 {
12532 super.OnPlacementStarted(player);
12533
12535 }
12536
12537 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12538 {
12540 {
12541 m_AdminLog.OnPlacementComplete(player,
this);
12542 }
12543
12544 super.OnPlacementComplete(player, position, orientation);
12545 }
12546
12547
12548
12549
12550
12552 {
12554 {
12555 return true;
12556 }
12557 else
12558 {
12559 return false;
12560 }
12561 }
12562
12563
12565 {
12567 {
12569 }
12570 }
12571
12572
12574 {
12576 }
12577
12579 {
12581 }
12582
12583 override void InsertAgent(
int agent,
float count = 1)
12584 {
12585 if (count < 1)
12586 return;
12587
12589 }
12590
12593 {
12595 }
12596
12597
12599 {
12601 }
12602
12603
12604
12605
12606
12607
12608
12609
12610
12611
12612
12613
12614
12615
12616
12617
12618
12619
12620
12621
12622
12623
12624
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12645 {
12647 return false;
12648 return true;
12649 }
12650
12652 {
12653
12655 }
12656
12657
12660 {
12661 super.CheckForRoofLimited(timeTresholdMS);
12662
12664 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12665 {
12666 m_PreviousRoofTestTime = time;
12667 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12668 }
12669 }
12670
12671
12673 {
12675 {
12676 return 0;
12677 }
12678
12679 if (GetInventory().GetAttachmentSlotsCount() != 0)
12680 {
12681 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12682 if (filter)
12683 return filter.GetProtectionLevel(type, false, system);
12684 else
12685 return 0;
12686 }
12687
12688 string subclassPath, entryName;
12689
12690 switch (type)
12691 {
12693 entryName = "biological";
12694 break;
12696 entryName = "chemical";
12697 break;
12698 default:
12699 entryName = "biological";
12700 break;
12701 }
12702
12703 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12704
12706 }
12707
12708
12709
12712 {
12713 if (!IsMagazine())
12715
12717 }
12718
12719
12720
12721
12722
12727 {
12728 return true;
12729 }
12730
12732 {
12734 }
12735
12736
12737
12738
12739
12741 {
12742 if (parent)
12743 {
12744 if (parent.IsInherited(DayZInfected))
12745 return true;
12746
12747 if (!parent.IsRuined())
12748 return true;
12749 }
12750
12751 return true;
12752 }
12753
12755 {
12756 if (!super.CanPutAsAttachment(parent))
12757 {
12758 return false;
12759 }
12760
12761 if (!IsRuined() && !parent.IsRuined())
12762 {
12763 return true;
12764 }
12765
12766 return false;
12767 }
12768
12770 {
12771
12772
12773
12774
12775 return super.CanReceiveItemIntoCargo(item);
12776 }
12777
12779 {
12780
12781
12782
12783
12784 GameInventory attachmentInv = attachment.GetInventory();
12786 {
12787 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12788 return false;
12789 }
12790
12791 InventoryLocation loc = new InventoryLocation();
12792 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12793 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12794 return false;
12795
12796 return super.CanReceiveAttachment(attachment, slotId);
12797 }
12798
12800 {
12801 if (!super.CanReleaseAttachment(attachment))
12802 return false;
12803
12804 return GetInventory().AreChildrenAccessible();
12805 }
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12816
12817
12818
12819
12820
12821
12822
12823
12824
12825
12826
12828 {
12829 int id = muzzle_owner.GetMuzzleID();
12830 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12831
12832 if (WPOF_array)
12833 {
12834 for (int i = 0; i < WPOF_array.Count(); i++)
12835 {
12836 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12837
12838 if (WPOF)
12839 {
12840 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12841 }
12842 }
12843 }
12844 }
12845
12846
12848 {
12849 int id = muzzle_owner.GetMuzzleID();
12851
12852 if (WPOBE_array)
12853 {
12854 for (int i = 0; i < WPOBE_array.Count(); i++)
12855 {
12856 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12857
12858 if (WPOBE)
12859 {
12860 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12861 }
12862 }
12863 }
12864 }
12865
12866
12868 {
12869 int id = muzzle_owner.GetMuzzleID();
12870 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12871
12872 if (WPOOH_array)
12873 {
12874 for (int i = 0; i < WPOOH_array.Count(); i++)
12875 {
12876 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12877
12878 if (WPOOH)
12879 {
12880 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12881 }
12882 }
12883 }
12884 }
12885
12886
12888 {
12889 int id = muzzle_owner.GetMuzzleID();
12890 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12891
12892 if (WPOOH_array)
12893 {
12894 for (int i = 0; i < WPOOH_array.Count(); i++)
12895 {
12896 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12897
12898 if (WPOOH)
12899 {
12900 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12901 }
12902 }
12903 }
12904 }
12905
12906
12908 {
12909 int id = muzzle_owner.GetMuzzleID();
12910 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12911
12912 if (WPOOH_array)
12913 {
12914 for (int i = 0; i < WPOOH_array.Count(); i++)
12915 {
12916 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12917
12918 if (WPOOH)
12919 {
12920 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12921 }
12922 }
12923 }
12924 }
12925
12926
12927
12929 {
12931 {
12932 return true;
12933 }
12934
12935 return false;
12936 }
12937
12939 {
12941 {
12942 return true;
12943 }
12944
12945 return false;
12946 }
12947
12949 {
12951 {
12952 return true;
12953 }
12954
12955 return false;
12956 }
12957
12959 {
12960 return false;
12961 }
12962
12965 {
12966 return UATimeSpent.DEFAULT_DEPLOY;
12967 }
12968
12969
12970
12971
12973 {
12975 SetSynchDirty();
12976 }
12977
12979 {
12981 }
12982
12983
12985 {
12986 return false;
12987 }
12988
12991 {
12992 string att_type = "None";
12993
12994 if (ConfigIsExisting("soundAttType"))
12995 {
12996 att_type = ConfigGetString("soundAttType");
12997 }
12998
13000 }
13001
13003 {
13005 }
13006
13007
13008
13009
13010
13016
13018 {
13021
13023 }
13024
13025
13027 {
13029 return;
13030
13032
13035
13038
13039 SoundParameters params = new SoundParameters();
13043 }
13044
13045
13047 {
13049 return;
13050
13052 SetSynchDirty();
13053
13056 }
13057
13058
13060 {
13062 return;
13063
13065 SetSynchDirty();
13066
13069 }
13070
13072 {
13074 }
13075
13077 {
13079 }
13080
13083 {
13084 if (!
GetGame().IsDedicatedServer())
13085 {
13086 if (ConfigIsExisting("attachSoundSet"))
13087 {
13088 string cfg_path = "";
13089 string soundset = "";
13090 string type_name =
GetType();
13091
13094 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13095 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13096
13097 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13098 {
13099 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13100 {
13101 if (cfg_slot_array[i] == slot_type)
13102 {
13103 soundset = cfg_soundset_array[i];
13104 break;
13105 }
13106 }
13107 }
13108
13109 if (soundset != "")
13110 {
13111 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13113 }
13114 }
13115 }
13116 }
13117
13119 {
13120
13121 }
13122
13123 void OnApply(PlayerBase player);
13124
13126 {
13127 return 1.0;
13128 };
13129
13131 {
13133 }
13134
13136 {
13138 }
13139
13141
13143 {
13144 SetDynamicPhysicsLifeTime(0.01);
13146 }
13147
13149 {
13150 array<string> zone_names = new array<string>;
13151 GetDamageZones(zone_names);
13152 for (int i = 0; i < zone_names.Count(); i++)
13153 {
13154 SetHealthMax(zone_names.Get(i),"Health");
13155 }
13156 SetHealthMax("","Health");
13157 }
13158
13161 {
13162 float global_health = GetHealth01("","Health");
13163 array<string> zones = new array<string>;
13164 GetDamageZones(zones);
13165
13166 for (int i = 0; i < zones.Count(); i++)
13167 {
13168 SetHealth01(zones.Get(i),"Health",global_health);
13169 }
13170 }
13171
13174 {
13175 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13176 }
13177
13179 {
13180 if (!hasRootAsPlayer)
13181 {
13182 if (refParentIB)
13183 {
13184
13185 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13186 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13187
13188 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13189 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13190
13193 }
13194 else
13195 {
13196
13199 }
13200 }
13201 }
13202
13204 {
13206 {
13207 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13208 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13209 {
13210 float heatPermCoef = 1.0;
13212 while (ent)
13213 {
13214 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13215 ent = ent.GetHierarchyParent();
13216 }
13217
13218 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13219 }
13220 }
13221 }
13222
13224 {
13225
13226 EntityAI parent = GetHierarchyParent();
13227 if (!parent)
13228 {
13229 hasParent = false;
13230 hasRootAsPlayer = false;
13231 }
13232 else
13233 {
13234 hasParent = true;
13235 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13236 refParentIB =
ItemBase.Cast(parent);
13237 }
13238 }
13239
13240 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13241 {
13242
13243 }
13244
13246 {
13247
13248 return false;
13249 }
13250
13252 {
13253
13254
13255 return false;
13256 }
13257
13259 {
13260
13261 return false;
13262 }
13263
13266 {
13267 return !GetIsFrozen() &&
IsOpen();
13268 }
13269
13271 {
13272 bool hasParent = false, hasRootAsPlayer = false;
13274
13275 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13276 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13277
13278 if (wwtu || foodDecay)
13279 {
13283
13284 if (processWetness || processTemperature || processDecay)
13285 {
13287
13288 if (processWetness)
13289 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13290
13291 if (processTemperature)
13293
13294 if (processDecay)
13295 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13296 }
13297 }
13298 }
13299
13302 {
13304 }
13305
13307 {
13310
13311 return super.GetTemperatureFreezeThreshold();
13312 }
13313
13315 {
13318
13319 return super.GetTemperatureThawThreshold();
13320 }
13321
13323 {
13326
13327 return super.GetItemOverheatThreshold();
13328 }
13329
13331 {
13333 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13334
13335 return super.GetTemperatureFreezeTime();
13336 }
13337
13339 {
13341 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13342
13343 return super.GetTemperatureThawTime();
13344 }
13345
13350
13352 {
13353 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13354 }
13355
13357 {
13358 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13359 }
13360
13363 {
13365 }
13366
13368 {
13370 }
13371
13373 {
13375 }
13376
13379 {
13380 return null;
13381 }
13382
13385 {
13386 return false;
13387 }
13388
13390 {
13392 {
13395 if (!trg)
13396 {
13398 explosive = this;
13399 }
13400
13401 explosive.PairRemote(trg);
13403
13404 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13405 trg.SetPersistentPairID(persistentID);
13406 explosive.SetPersistentPairID(persistentID);
13407
13408 return true;
13409 }
13410 return false;
13411 }
13412
13415 {
13416 float ret = 1.0;
13419 ret *= GetHealth01();
13420
13421 return ret;
13422 }
13423
13424 #ifdef DEVELOPER
13425 override void SetDebugItem()
13426 {
13427 super.SetDebugItem();
13428 _itemBase = this;
13429 }
13430
13432 {
13433 string text = super.GetDebugText();
13434
13436 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13437
13438 return text;
13439 }
13440 #endif
13441
13443 {
13444 return true;
13445 }
13446
13448
13450
13452 {
13455 }
13456
13457
13465
13481}
13482
13484{
13486 if (entity)
13487 {
13488 bool is_item = entity.IsInherited(
ItemBase);
13489 if (is_item && full_quantity)
13490 {
13493 }
13494 }
13495 else
13496 {
13498 return NULL;
13499 }
13500 return entity;
13501}
13502
13504{
13505 if (item)
13506 {
13507 if (health > 0)
13508 item.SetHealth("", "", health);
13509
13510 if (item.CanHaveTemperature())
13511 {
13513 if (item.CanFreeze())
13514 item.SetFrozen(false);
13515 }
13516
13517 if (item.HasEnergyManager())
13518 {
13519 if (quantity >= 0)
13520 {
13521 item.GetCompEM().SetEnergy0To1(quantity);
13522 }
13523 else
13524 {
13526 }
13527 }
13528 else if (item.IsMagazine())
13529 {
13530 Magazine mag = Magazine.Cast(item);
13531 if (quantity >= 0)
13532 {
13533 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13534 }
13535 else
13536 {
13538 }
13539
13540 }
13541 else
13542 {
13543 if (quantity >= 0)
13544 {
13545 item.SetQuantityNormalized(quantity, false);
13546 }
13547 else
13548 {
13550 }
13551
13552 }
13553 }
13554}
13555
13556#ifdef DEVELOPER
13558#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.