8540{
8542 {
8543 return true;
8544 }
8545};
8546
8547
8548
8550{
8554
8556
8559
8560
8561
8562
8563
8572
8578
8583
8588
8609 protected bool m_IsResultOfSplit
8610
8612
8617
8618
8619
8621
8625
8626
8627
8629
8632
8633
8634
8640
8641
8649
8652
8653
8655
8656
8658
8659
8664
8665
8670
8671
8673
8674
8676 {
8681
8682 if (!
GetGame().IsDedicatedServer())
8683 {
8685 {
8687
8689 {
8691 }
8692 }
8693
8696 }
8697
8698 m_OldLocation = null;
8699
8701 {
8703 }
8704
8705 if (ConfigIsExisting("headSelectionsToHide"))
8706 {
8709 }
8710
8712 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8713 {
8715 }
8716
8718
8719 m_IsResultOfSplit = false;
8720
8722 }
8723
8725 {
8726 super.InitItemVariables();
8727
8733 m_Count = ConfigGetInt(
"count");
8734
8737
8742
8745
8750
8762
8766
8767
8770 if (ConfigIsExisting("canBeSplit"))
8771 {
8774 }
8775
8777 if (ConfigIsExisting("itemBehaviour"))
8779
8780
8783 RegisterNetSyncVariableInt("m_VarLiquidType");
8784 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8785
8786 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8787 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8788 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8789
8790 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8791 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8792 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8793 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8794
8795 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8796 RegisterNetSyncVariableBool("m_IsTakeable");
8797 RegisterNetSyncVariableBool("m_IsHologram");
8798
8801 {
8804 }
8805
8807
8809 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8811
8812 }
8813
8815 {
8817 }
8818
8820 {
8823 {
8828 }
8829 }
8830
8831 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8832 {
8834 {
8837 }
8838
8840 }
8841
8843 {
8849 }
8850
8852
8854 {
8856
8857 if (!action)
8858 {
8859 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8860 return;
8861 }
8862
8864 if (!ai)
8865 {
8867 return;
8868 }
8869
8871 if (!action_array)
8872 {
8873 action_array = new array<ActionBase_Basic>;
8875 }
8876 if (LogManager.IsActionLogEnable())
8877 {
8878 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8879 }
8880
8881 if (action_array.Find(action) != -1)
8882 {
8883 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8884 }
8885 else
8886 {
8887 action_array.Insert(action);
8888 }
8889 }
8890
8892 {
8894 ActionBase action = player.GetActionManager().GetAction(actionName);
8897
8898 if (action_array)
8899 {
8900 action_array.RemoveItem(action);
8901 }
8902 }
8903
8904
8905
8907 {
8908 ActionOverrideData overrideData = new ActionOverrideData();
8912
8914 if (!actionMap)
8915 {
8918 }
8919
8920 actionMap.Insert(this.
Type(), overrideData);
8921
8922 }
8923
8925
8927
8928
8930 {
8933
8936
8937 string config_to_search = "CfgVehicles";
8938 string muzzle_owner_config;
8939
8941 {
8942 if (IsInherited(Weapon))
8943 config_to_search = "CfgWeapons";
8944
8945 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8946
8947 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8948
8950
8951 if (config_OnFire_subclass_count > 0)
8952 {
8953 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8954
8955 for (int i = 0; i < config_OnFire_subclass_count; i++)
8956 {
8957 string particle_class = "";
8959 string config_OnFire_entry = config_OnFire_class + particle_class;
8960 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8961 WPOF_array.Insert(WPOF);
8962 }
8963
8964
8966 }
8967 }
8968
8970 {
8971 config_to_search = "CfgWeapons";
8972 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8973
8974 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8975
8977
8978 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8979 {
8980 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8981
8982 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8983 {
8984 string particle_class2 = "";
8986 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8987 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8988 WPOBE_array.Insert(WPOBE);
8989 }
8990
8991
8993 }
8994 }
8995 }
8996
8997
8999 {
9002
9004 {
9005 string config_to_search = "CfgVehicles";
9006
9007 if (IsInherited(Weapon))
9008 config_to_search = "CfgWeapons";
9009
9010 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9011 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9012
9013 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9014 {
9015
9017
9019 {
9021 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9023 return;
9024 }
9025
9028
9029
9030
9032 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9033
9034 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9035 {
9036 string particle_class = "";
9038 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9040
9041 if (entry_type == CT_CLASS)
9042 {
9043 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9044 WPOOH_array.Insert(WPOF);
9045 }
9046 }
9047
9048
9050 }
9051 }
9052 }
9053
9055 {
9057 }
9058
9060 {
9062 {
9064
9067
9070
9071 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9072 }
9073 }
9074
9076 {
9078 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9079
9081 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9082
9084 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9085
9087 {
9089 }
9090 }
9091
9093 {
9095 }
9096
9098 {
9101 else
9103
9105 {
9108 }
9109 else
9110 {
9113
9116 }
9117
9119 }
9120
9122 {
9124 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9125 }
9126
9128 {
9130 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9132 }
9133
9135 {
9137 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9138 }
9139
9141 {
9144
9145 OverheatingParticle OP = new OverheatingParticle();
9150
9152 }
9153
9155 {
9158
9159 return -1;
9160 }
9161
9163 {
9165 {
9168
9169 for (int i = count; i > 0; --i)
9170 {
9171 int id = i - 1;
9174
9177
9178 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9179 {
9180 if (p)
9181 {
9184 }
9185 }
9186 }
9187 }
9188 }
9189
9191 {
9193 {
9195 {
9196 int id = i - 1;
9198
9199 if (OP)
9200 {
9202
9203 if (p)
9204 {
9206 }
9207
9208 delete OP;
9209 }
9210 }
9211
9214 }
9215 }
9216
9219 {
9220 return 0.0;
9221 }
9222
9223
9225 {
9226 return 250;
9227 }
9228
9230 {
9231 return 0;
9232 }
9233
9236 {
9238 return true;
9239
9240 return false;
9241 }
9242
9245 {
9248
9250 {
9252 }
9253 else
9254 {
9255
9257 }
9258
9260 }
9261
9268 {
9269 return -1;
9270 }
9271
9272
9273
9274
9276 {
9278 {
9280 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9281
9282 if (r_index >= 0)
9283 {
9284 InventoryLocation r_il = new InventoryLocation;
9285 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9286
9287 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9290 {
9291 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9292 }
9294 {
9295 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9296 }
9297
9298 }
9299
9300 player.GetHumanInventory().ClearUserReservedLocation(this);
9301 }
9302
9305 }
9306
9307
9308
9309
9311 {
9312 return ItemBase.m_DebugActionsMask;
9313 }
9314
9316 {
9317 return ItemBase.m_DebugActionsMask & mask;
9318 }
9319
9321 {
9322 ItemBase.m_DebugActionsMask = mask;
9323 }
9324
9326 {
9327 ItemBase.m_DebugActionsMask |= mask;
9328 }
9329
9331 {
9332 ItemBase.m_DebugActionsMask &= ~mask;
9333 }
9334
9336 {
9338 {
9340 }
9341 else
9342 {
9344 }
9345 }
9346
9347
9349 {
9350 if (GetEconomyProfile())
9351 {
9352 float q_max = GetEconomyProfile().GetQuantityMax();
9353 if (q_max > 0)
9354 {
9355 float q_min = GetEconomyProfile().GetQuantityMin();
9356 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9357
9359 {
9360 ComponentEnergyManager comp = GetCompEM();
9362 {
9364 }
9365 }
9367 {
9369
9370 }
9371
9372 }
9373 }
9374 }
9375
9378 {
9379 EntityAI parent = GetHierarchyParent();
9380
9381 if (parent)
9382 {
9383 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9384 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9385 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9386 }
9387 }
9388
9391 {
9392 EntityAI parent = GetHierarchyParent();
9393
9394 if (parent)
9395 {
9396 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9397 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9398 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9399 }
9400 }
9401
9403 {
9404
9405
9406
9407
9409
9411 {
9412 if (ScriptInputUserData.CanStoreInputUserData())
9413 {
9414 ScriptInputUserData ctx = new ScriptInputUserData;
9420 ctx.
Write(use_stack_max);
9423
9425 {
9426 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9427 }
9428 }
9429 }
9430 else if (!
GetGame().IsMultiplayer())
9431 {
9433 }
9434 }
9435
9437 {
9439 }
9440
9442 {
9444 }
9445
9447 {
9449 }
9450
9452 {
9453
9454 return false;
9455 }
9456
9458 {
9459 return false;
9460 }
9461
9465 {
9466 return false;
9467 }
9468
9470 {
9471 return "";
9472 }
9473
9475
9477 {
9478 return false;
9479 }
9480
9482 {
9483 return true;
9484 }
9485
9486
9487
9489 {
9490 return true;
9491 }
9492
9494 {
9495 return true;
9496 }
9497
9499 {
9500 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9502 }
9503
9505 {
9507 }
9508
9510 {
9512 if (!is_being_placed)
9514 SetSynchDirty();
9515 }
9516
9517
9519
9521 {
9523 }
9524
9526 {
9528 }
9529
9531 {
9532 return 1;
9533 }
9534
9536 {
9537 return false;
9538 }
9539
9541 {
9543 SetSynchDirty();
9544 }
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9581 {
9582 super.OnMovedInsideCargo(container);
9583
9584 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9585 }
9586
9587 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9588 {
9589 super.EEItemLocationChanged(oldLoc,newLoc);
9590
9591 PlayerBase new_player = null;
9592 PlayerBase old_player = null;
9593
9594 if (newLoc.GetParent())
9595 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9596
9597 if (oldLoc.GetParent())
9598 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9599
9601 {
9602 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9603
9604 if (r_index >= 0)
9605 {
9606 InventoryLocation r_il = new InventoryLocation;
9607 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9608
9609 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9612 {
9613 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9614 }
9616 {
9617 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9618 }
9619
9620 }
9621 }
9622
9624 {
9625 if (new_player)
9626 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9627
9628 if (new_player == old_player)
9629 {
9630
9631 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9632 {
9634 {
9635 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9636 {
9637 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9638 }
9639 }
9640 else
9641 {
9642 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9643 }
9644 }
9645
9646 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9647 {
9648 int type = oldLoc.GetType();
9650 {
9651 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9652 }
9654 {
9655 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9656 }
9657 }
9658 if (!m_OldLocation)
9659 {
9660 m_OldLocation = new InventoryLocation;
9661 }
9662 m_OldLocation.Copy(oldLoc);
9663 }
9664 else
9665 {
9666 if (m_OldLocation)
9667 {
9668 m_OldLocation.Reset();
9669 }
9670 }
9671
9673 }
9674 else
9675 {
9676 if (new_player)
9677 {
9678 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9679 if (res_index >= 0)
9680 {
9681 InventoryLocation il = new InventoryLocation;
9682 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9684 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9687 {
9688 il.
GetParent().GetOnReleaseLock().Invoke(it);
9689 }
9691 {
9693 }
9694
9695 }
9696 }
9698 {
9699
9701 }
9702
9703 if (m_OldLocation)
9704 {
9705 m_OldLocation.Reset();
9706 }
9707 }
9708 }
9709
9710 override void EOnContact(IEntity other, Contact extra)
9711 {
9713 {
9714 int liquidType = -1;
9716 if (impactSpeed > 0.0)
9717 {
9719 #ifndef SERVER
9721 #else
9723 SetSynchDirty();
9724 #endif
9726 }
9727 }
9728
9729 #ifdef SERVER
9730 if (GetCompEM() && GetCompEM().IsPlugged())
9731 {
9732 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9733 GetCompEM().UnplugThis();
9734 }
9735 #endif
9736 }
9737
9739
9741 {
9743 }
9744
9746 {
9747
9748 }
9749
9751 {
9752 super.OnItemLocationChanged(old_owner, new_owner);
9753
9754 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9755 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9756
9757 if (!relatedPlayer && playerNew)
9758 relatedPlayer = playerNew;
9759
9760 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9761 {
9763 if (actionMgr)
9764 {
9765 ActionBase currentAction = actionMgr.GetRunningAction();
9766 if (currentAction)
9768 }
9769 }
9770
9771 Man ownerPlayerOld = null;
9772 Man ownerPlayerNew = null;
9773
9774 if (old_owner)
9775 {
9776 if (old_owner.
IsMan())
9777 {
9778 ownerPlayerOld = Man.Cast(old_owner);
9779 }
9780 else
9781 {
9782 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9783 }
9784 }
9785 else
9786 {
9788 {
9790
9791 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9792 {
9793 GetCompEM().UnplugThis();
9794 }
9795 }
9796 }
9797
9798 if (new_owner)
9799 {
9800 if (new_owner.
IsMan())
9801 {
9802 ownerPlayerNew = Man.Cast(new_owner);
9803 }
9804 else
9805 {
9806 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9807 }
9808 }
9809
9810 if (ownerPlayerOld != ownerPlayerNew)
9811 {
9812 if (ownerPlayerOld)
9813 {
9814 array<EntityAI> subItemsExit = new array<EntityAI>;
9816 for (int i = 0; i < subItemsExit.Count(); i++)
9817 {
9820 }
9821 }
9822
9823 if (ownerPlayerNew)
9824 {
9825 array<EntityAI> subItemsEnter = new array<EntityAI>;
9827 for (int j = 0; j < subItemsEnter.Count(); j++)
9828 {
9831 }
9832 }
9833 }
9834 else if (ownerPlayerNew != null)
9835 {
9836 PlayerBase nplayer;
9837 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9838 {
9839 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9841 for (int k = 0; k < subItemsUpdate.Count(); k++)
9842 {
9844 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9845 }
9846 }
9847 }
9848
9849 if (old_owner)
9850 old_owner.OnChildItemRemoved(this);
9851 if (new_owner)
9852 new_owner.OnChildItemReceived(this);
9853 }
9854
9855
9857 {
9858 super.EEDelete(parent);
9859 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9860 if (player)
9861 {
9863
9864 if (player.IsAlive())
9865 {
9866 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9867 if (r_index >= 0)
9868 {
9869 InventoryLocation r_il = new InventoryLocation;
9870 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9871
9872 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9875 {
9876 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9877 }
9879 {
9880 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9881 }
9882
9883 }
9884
9885 player.RemoveQuickBarEntityShortcut(this);
9886 }
9887 }
9888 }
9889
9891 {
9892 super.EEKilled(killer);
9893
9896 {
9897 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9898 {
9899 if (IsMagazine())
9900 {
9901 if (Magazine.Cast(this).GetAmmoCount() > 0)
9902 {
9904 }
9905 }
9906 else
9907 {
9909 }
9910 }
9911 }
9912 }
9913
9915 {
9916 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9917
9918 super.OnWasAttached(parent, slot_id);
9919
9922
9924 }
9925
9927 {
9928 super.OnWasDetached(parent, slot_id);
9929
9932 }
9933
9935 {
9936 int idx;
9939
9940 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9941 if (inventory_slots.Count() < 1)
9942 {
9943 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9944 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9945 }
9946 else
9947 {
9948 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9949 }
9950
9951 idx = inventory_slots.Find(slot);
9952 if (idx < 0)
9953 return "";
9954
9955 return attach_types.Get(idx);
9956 }
9957
9959 {
9960 int idx = -1;
9961 string slot;
9962
9965
9966 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9967 if (inventory_slots.Count() < 1)
9968 {
9969 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9970 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9971 }
9972 else
9973 {
9974 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9975 if (detach_types.Count() < 1)
9976 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9977 }
9978
9979 for (int i = 0; i < inventory_slots.Count(); i++)
9980 {
9981 slot = inventory_slots.Get(i);
9982 }
9983
9984 if (slot != "")
9985 {
9986 if (detach_types.Count() == 1)
9987 idx = 0;
9988 else
9989 idx = inventory_slots.Find(slot);
9990 }
9991 if (idx < 0)
9992 return "";
9993
9994 return detach_types.Get(idx);
9995 }
9996
9998 {
9999
10001
10002
10003 float min_time = 1;
10004 float max_time = 3;
10005 float delay = Math.RandomFloat(min_time, max_time);
10006
10007 explode_timer.Run(delay, this, "DoAmmoExplosion");
10008 }
10009
10011 {
10012 Magazine magazine = Magazine.Cast(this);
10013 int pop_sounds_count = 6;
10014 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10015
10016
10017 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10018 string sound_name = pop_sounds[ sound_idx ];
10020
10021
10022 magazine.ServerAddAmmoCount(-1);
10023
10024
10025 float min_temp_to_explode = 100;
10026
10027 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10028 {
10030 }
10031 }
10032
10033
10034 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10035 {
10036 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10037
10038 const int CHANCE_DAMAGE_CARGO = 4;
10039 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10040 const int CHANCE_DAMAGE_NOTHING = 2;
10041
10043 {
10044 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10045 int chances;
10046 int rnd;
10047
10048 if (GetInventory().GetCargo())
10049 {
10050 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10051 rnd = Math.RandomInt(0,chances);
10052
10053 if (rnd < CHANCE_DAMAGE_CARGO)
10054 {
10056 }
10057 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10058 {
10060 }
10061 }
10062 else
10063 {
10064 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10065 rnd = Math.RandomInt(0,chances);
10066
10067 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10068 {
10070 }
10071 }
10072 }
10073 }
10074
10076 {
10077 if (GetInventory().GetCargo())
10078 {
10079 int item_count = GetInventory().GetCargo().GetItemCount();
10080 if (item_count > 0)
10081 {
10082 int random_pick = Math.RandomInt(0, item_count);
10084 if (!item.IsExplosive())
10085 {
10086 item.AddHealth("","",damage);
10087 return true;
10088 }
10089 }
10090 }
10091 return false;
10092 }
10093
10095 {
10096 int attachment_count = GetInventory().AttachmentCount();
10097 if (attachment_count > 0)
10098 {
10099 int random_pick = Math.RandomInt(0, attachment_count);
10100 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10101 if (!attachment.IsExplosive())
10102 {
10103 attachment.AddHealth("","",damage);
10104 return true;
10105 }
10106 }
10107 return false;
10108 }
10109
10111 {
10113 }
10114
10116 {
10118 return GetInventory().CanRemoveEntity();
10119
10120 return false;
10121 }
10122
10124 {
10125
10127 return false;
10128
10129
10131 return false;
10132
10133
10134
10136 if (delta == 0)
10137 return false;
10138
10139
10140 return true;
10141 }
10142
10144 {
10146 {
10147 if (ScriptInputUserData.CanStoreInputUserData())
10148 {
10149 ScriptInputUserData ctx = new ScriptInputUserData;
10154 ctx.
Write(destination_entity);
10156 ctx.
Write(slot_id);
10158 }
10159 }
10160 else if (!
GetGame().IsMultiplayer())
10161 {
10163 }
10164 }
10165
10167 {
10168 float split_quantity_new;
10172 InventoryLocation loc = new InventoryLocation;
10173
10174 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10175 {
10177 split_quantity_new = stack_max;
10178 else
10180
10182 {
10183 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10184 if (new_item)
10185 {
10186 new_item.SetResultOfSplit(true);
10187 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10189 new_item.
SetQuantity(split_quantity_new,
false,
true);
10190 }
10191 }
10192 }
10193 else if (destination_entity && slot_id == -1)
10194 {
10195 if (quantity > stack_max)
10196 split_quantity_new = stack_max;
10197 else
10198 split_quantity_new = quantity;
10199
10201 {
10203 {
10206 }
10207
10208 if (new_item)
10209 {
10210 new_item.SetResultOfSplit(true);
10211 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10213 new_item.
SetQuantity(split_quantity_new,
false,
true);
10214 }
10215 }
10216 }
10217 else
10218 {
10219 if (stack_max != 0)
10220 {
10222 {
10224 }
10225
10226 if (split_quantity_new == 0)
10227 {
10228 if (!
GetGame().IsMultiplayer())
10229 player.PhysicalPredictiveDropItem(this);
10230 else
10231 player.ServerDropEntity(this);
10232 return;
10233 }
10234
10236 {
10238
10239 if (new_item)
10240 {
10241 new_item.SetResultOfSplit(true);
10242 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10245 new_item.PlaceOnSurface();
10246 }
10247 }
10248 }
10249 }
10250 }
10251
10253 {
10254 float split_quantity_new;
10258 InventoryLocation loc = new InventoryLocation;
10259
10260 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10261 {
10263 split_quantity_new = stack_max;
10264 else
10266
10268 {
10269 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10270 if (new_item)
10271 {
10272 new_item.SetResultOfSplit(true);
10273 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10275 new_item.
SetQuantity(split_quantity_new,
false,
true);
10276 }
10277 }
10278 }
10279 else if (destination_entity && slot_id == -1)
10280 {
10281 if (quantity > stack_max)
10282 split_quantity_new = stack_max;
10283 else
10284 split_quantity_new = quantity;
10285
10287 {
10289 {
10292 }
10293
10294 if (new_item)
10295 {
10296 new_item.SetResultOfSplit(true);
10297 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10299 new_item.
SetQuantity(split_quantity_new,
false,
true);
10300 }
10301 }
10302 }
10303 else
10304 {
10305 if (stack_max != 0)
10306 {
10308 {
10310 }
10311
10313 {
10315
10316 if (new_item)
10317 {
10318 new_item.SetResultOfSplit(true);
10319 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10322 new_item.PlaceOnSurface();
10323 }
10324 }
10325 }
10326 }
10327 }
10328
10330 {
10332 {
10333 if (ScriptInputUserData.CanStoreInputUserData())
10334 {
10335 ScriptInputUserData ctx = new ScriptInputUserData;
10340 dst.WriteToContext(ctx);
10342 }
10343 }
10344 else if (!
GetGame().IsMultiplayer())
10345 {
10347 }
10348 }
10349
10351 {
10353 {
10354 if (ScriptInputUserData.CanStoreInputUserData())
10355 {
10356 ScriptInputUserData ctx = new ScriptInputUserData;
10361 ctx.
Write(destination_entity);
10367 }
10368 }
10369 else if (!
GetGame().IsMultiplayer())
10370 {
10372 }
10373 }
10374
10376 {
10378 }
10379
10381 {
10383 float split_quantity_new;
10385 if (dst.IsValid())
10386 {
10387 int slot_id = dst.GetSlot();
10389
10390 if (quantity > stack_max)
10391 split_quantity_new = stack_max;
10392 else
10393 split_quantity_new = quantity;
10394
10396 {
10398
10399 if (new_item)
10400 {
10401 new_item.SetResultOfSplit(true);
10402 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10404 new_item.
SetQuantity(split_quantity_new,
false,
true);
10405 }
10406
10407 return new_item;
10408 }
10409 }
10410
10411 return null;
10412 }
10413
10415 {
10417 float split_quantity_new;
10419 if (destination_entity)
10420 {
10422 if (quantity > stackable)
10423 split_quantity_new = stackable;
10424 else
10425 split_quantity_new = quantity;
10426
10428 {
10429 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10430 if (new_item)
10431 {
10432 new_item.SetResultOfSplit(true);
10433 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10435 new_item.
SetQuantity(split_quantity_new,
false,
true);
10436 }
10437 }
10438 }
10439 }
10440
10442 {
10444 {
10445 if (ScriptInputUserData.CanStoreInputUserData())
10446 {
10447 ScriptInputUserData ctx = new ScriptInputUserData;
10452 ItemBase destination_entity =
this;
10453 ctx.
Write(destination_entity);
10457 }
10458 }
10459 else if (!
GetGame().IsMultiplayer())
10460 {
10462 }
10463 }
10464
10466 {
10468 float split_quantity_new;
10470 if (player)
10471 {
10473 if (quantity > stackable)
10474 split_quantity_new = stackable;
10475 else
10476 split_quantity_new = quantity;
10477
10479 {
10480 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10481 new_item =
ItemBase.Cast(in_hands);
10482 if (new_item)
10483 {
10484 new_item.SetResultOfSplit(true);
10485 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10487 new_item.SetQuantity(split_quantity_new, false, true);
10488 }
10489 }
10490 }
10491 }
10492
10494 {
10496 float split_quantity_new = Math.Floor(quantity * 0.5);
10497
10499 return;
10500
10502
10503 if (new_item)
10504 {
10505 if (new_item.GetQuantityMax() < split_quantity_new)
10506 {
10507 split_quantity_new = new_item.GetQuantityMax();
10508 }
10509
10510 new_item.SetResultOfSplit(true);
10511 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10512
10514 {
10517 }
10518 else
10519 {
10521 new_item.
SetQuantity(split_quantity_new,
false,
true);
10522 }
10523 }
10524 }
10525
10527 {
10529 float split_quantity_new = Math.Floor(quantity / 2);
10530
10532 return;
10533
10534 InventoryLocation invloc = new InventoryLocation;
10536
10538 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10539
10540 if (new_item)
10541 {
10542 if (new_item.GetQuantityMax() < split_quantity_new)
10543 {
10544 split_quantity_new = new_item.GetQuantityMax();
10545 }
10547 {
10550 }
10551 else if (split_quantity_new > 1)
10552 {
10554 new_item.
SetQuantity(split_quantity_new,
false,
true);
10555 }
10556 }
10557 }
10558
10561 {
10562 SetWeightDirty();
10564
10565 if (parent)
10566 parent.OnAttachmentQuantityChangedEx(this, delta);
10567
10569 {
10571 {
10573 }
10575 {
10576 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10578 }
10579 }
10580
10581 }
10582
10585 {
10586
10587 }
10588
10591 {
10593 }
10594
10596 {
10597 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10598
10600 {
10601 if (newLevel == GameConstants.STATE_RUINED)
10602 {
10604 EntityAI parent = GetHierarchyParent();
10605 if (parent && parent.IsFireplace())
10606 {
10607 CargoBase cargo = GetInventory().GetCargo();
10608 if (cargo)
10609 {
10611 {
10613 }
10614 }
10615 }
10616 }
10617
10619 {
10620
10622 return;
10623 }
10624
10625 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10626 {
10628 }
10629 }
10630 }
10631
10632
10634 {
10635 super.OnRightClick();
10636
10638 {
10640 {
10641 if (ScriptInputUserData.CanStoreInputUserData())
10642 {
10643 EntityAI root = GetHierarchyRoot();
10644 Man playerOwner = GetHierarchyRootPlayer();
10645 InventoryLocation dst = new InventoryLocation;
10646
10647
10648 if (!playerOwner && root && root == this)
10649 {
10651 }
10652 else
10653 {
10654
10655 GetInventory().GetCurrentInventoryLocation(dst);
10657 {
10660 {
10662 }
10663 else
10664 {
10666
10667
10668 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10669 {
10671 }
10672 else
10673 {
10674 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10675 }
10676 }
10677 }
10678 }
10679
10680 ScriptInputUserData ctx = new ScriptInputUserData;
10688 }
10689 }
10690 else if (!
GetGame().IsMultiplayer())
10691 {
10693 }
10694 }
10695 }
10696
10698 {
10699 if (root)
10700 {
10701 vector m4[4];
10702 root.GetTransform(m4);
10703 dst.SetGround(this, m4);
10704 }
10705 else
10706 {
10707 GetInventory().GetCurrentInventoryLocation(dst);
10708 }
10709 }
10710
10711 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10712 {
10713
10714 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10715 return false;
10716
10717 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10718 return false;
10719
10720
10722 return false;
10723
10724
10725 Magazine mag = Magazine.Cast(this);
10726 if (mag)
10727 {
10728 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10729 return false;
10730
10731 if (stack_max_limit)
10732 {
10733 Magazine other_mag = Magazine.Cast(other_item);
10734 if (other_item)
10735 {
10736 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10737 return false;
10738 }
10739
10740 }
10741 }
10742 else
10743 {
10744
10746 return false;
10747
10749 return false;
10750 }
10751
10752 PlayerBase player = null;
10753 if (CastTo(player, GetHierarchyRootPlayer()))
10754 {
10755 if (player.GetInventory().HasAttachment(this))
10756 return false;
10757
10758 if (player.IsItemsToDelete())
10759 return false;
10760 }
10761
10762 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10763 return false;
10764
10765 int slotID;
10767 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10768 return false;
10769
10770 return true;
10771 }
10772
10774 {
10776 }
10777
10779 {
10780 return m_IsResultOfSplit;
10781 }
10782
10784 {
10785 m_IsResultOfSplit = value;
10786 }
10787
10789 {
10791 }
10792
10794 {
10795 float other_item_quantity = other_item.GetQuantity();
10796 float this_free_space;
10797
10799
10801
10802 if (other_item_quantity > this_free_space)
10803 {
10804 return this_free_space;
10805 }
10806 else
10807 {
10808 return other_item_quantity;
10809 }
10810 }
10811
10813 {
10815 }
10816
10818 {
10820 return;
10821
10822 if (!IsMagazine() && other_item)
10823 {
10825 if (quantity_used != 0)
10826 {
10827 float hp1 = GetHealth01("","");
10828 float hp2 = other_item.GetHealth01("","");
10829 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10830 hpResult = hpResult / (
GetQuantity() + quantity_used);
10831
10832 hpResult *= GetMaxHealth();
10833 Math.Round(hpResult);
10834 SetHealth("", "Health", hpResult);
10835
10837 other_item.AddQuantity(-quantity_used);
10838 }
10839 }
10841 }
10842
10844 {
10845 #ifdef SERVER
10846 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10847 GetHierarchyParent().IncreaseLifetimeUp();
10848 #endif
10849 };
10850
10852 {
10853 PlayerBase p = PlayerBase.Cast(player);
10854
10855 array<int> recipesIds = p.m_Recipes;
10856 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10857 if (moduleRecipesManager)
10858 {
10859 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10860 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10861 }
10862
10863 for (int i = 0;i < recipesIds.Count(); i++)
10864 {
10865 int key = recipesIds.Get(i);
10866 string recipeName = moduleRecipesManager.GetRecipeName(key);
10868 }
10869 }
10870
10871
10872 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10873 {
10874 super.GetDebugActions(outputList);
10875
10876
10882
10883
10888
10893
10894
10898
10899
10901 {
10905 }
10906
10909
10910
10914
10916
10917 InventoryLocation loc = new InventoryLocation();
10918 GetInventory().GetCurrentInventoryLocation(loc);
10920 {
10921 if (Gizmo_IsSupported())
10924 }
10925
10927 }
10928
10929
10930
10931
10933 {
10934 super.OnAction(action_id, player, ctx);
10935
10937 {
10938 switch (action_id)
10939 {
10942 return true;
10945 return true;
10946 }
10947 }
10948
10950 {
10951 switch (action_id)
10952 {
10954 Delete();
10955 return true;
10956 }
10957 }
10958
10959 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10960 {
10961 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10962 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10963 PlayerBase p = PlayerBase.Cast(player);
10964 if (
EActions.RECIPES_RANGE_START < 1000)
10965 {
10966 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10967 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10968 }
10969 }
10970 #ifndef SERVER
10971 else if (action_id ==
EActions.WATCH_PLAYER)
10972 {
10973 PluginDeveloper.SetDeveloperItemClientEx(player);
10974 }
10975 #endif
10977 {
10978 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10979 {
10980 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10981 OnDebugButtonPressServer(id + 1);
10982 }
10983
10984 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10985 {
10986 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10988 }
10989
10990 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10991 {
10992 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10994 }
10995
10996 else if (action_id ==
EActions.ADD_QUANTITY)
10997 {
10998 if (IsMagazine())
10999 {
11000 Magazine mag = Magazine.Cast(this);
11001 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11002 }
11003 else
11004 {
11006 }
11007
11008 if (m_EM)
11009 {
11010 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11011 }
11012
11013 }
11014
11015 else if (action_id ==
EActions.REMOVE_QUANTITY)
11016 {
11017 if (IsMagazine())
11018 {
11019 Magazine mag2 = Magazine.Cast(this);
11020 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11021 }
11022 else
11023 {
11025 }
11026 if (m_EM)
11027 {
11028 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11029 }
11030
11031 }
11032
11033 else if (action_id ==
EActions.SET_QUANTITY_0)
11034 {
11036
11037 if (m_EM)
11038 {
11039 m_EM.SetEnergy(0);
11040 }
11041 }
11042
11043 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11044 {
11046
11047 if (m_EM)
11048 {
11049 m_EM.SetEnergy(m_EM.GetEnergyMax());
11050 }
11051 }
11052
11053 else if (action_id ==
EActions.ADD_HEALTH)
11054 {
11055 AddHealth("","",GetMaxHealth("","Health")/5);
11056 }
11057 else if (action_id ==
EActions.REMOVE_HEALTH)
11058 {
11059 AddHealth("","",-GetMaxHealth("","Health")/5);
11060 }
11061 else if (action_id ==
EActions.DESTROY_HEALTH)
11062 {
11063 SetHealth01("","",0);
11064 }
11065 else if (action_id ==
EActions.WATCH_ITEM)
11066 {
11068 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11069 #ifdef DEVELOPER
11070 SetDebugDeveloper_item(this);
11071 #endif
11072 }
11073
11074 else if (action_id ==
EActions.ADD_TEMPERATURE)
11075 {
11076 AddTemperature(20);
11077
11078 }
11079
11080 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11081 {
11082 AddTemperature(-20);
11083
11084 }
11085
11086 else if (action_id ==
EActions.FLIP_FROZEN)
11087 {
11088 SetFrozen(!GetIsFrozen());
11089
11090 }
11091
11092 else if (action_id ==
EActions.ADD_WETNESS)
11093 {
11095
11096 }
11097
11098 else if (action_id ==
EActions.REMOVE_WETNESS)
11099 {
11101
11102 }
11103
11104 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11105 {
11108
11109
11110 }
11111
11112 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11113 {
11116 }
11117
11118 else if (action_id ==
EActions.MAKE_SPECIAL)
11119 {
11120 auto debugParams = DebugSpawnParams.WithPlayer(player);
11121 OnDebugSpawnEx(debugParams);
11122 }
11123
11124 }
11125
11126
11127 return false;
11128 }
11129
11130
11131
11132
11136
11139
11140
11141
11143 {
11144 return false;
11145 }
11146
11147
11149 {
11150 return true;
11151 }
11152
11153
11155 {
11156 return true;
11157 }
11158
11159
11160
11162 {
11163 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11165 }
11166
11169 {
11170 return null;
11171 }
11172
11174 {
11175 return false;
11176 }
11177
11179 {
11180 return false;
11181 }
11182
11186
11187
11189 {
11190 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11191 return module_repairing.CanRepair(this, item_repair_kit);
11192 }
11193
11194
11195 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11196 {
11197 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11198 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11199 }
11200
11201
11203 {
11204
11205
11206
11207
11208
11209
11210
11211
11212 return 1;
11213 }
11214
11215
11216
11218 {
11220 }
11221
11222
11223
11225 {
11227 }
11228
11229
11238 {
11239 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11240
11241 if (player)
11242 {
11243 player.MessageStatus(text);
11244 }
11245 }
11246
11247
11256 {
11257 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11258
11259 if (player)
11260 {
11261 player.MessageAction(text);
11262 }
11263 }
11264
11265
11274 {
11275 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11276
11277 if (player)
11278 {
11279 player.MessageFriendly(text);
11280 }
11281 }
11282
11283
11292 {
11293 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11294
11295 if (player)
11296 {
11297 player.MessageImportant(text);
11298 }
11299 }
11300
11302 {
11303 return true;
11304 }
11305
11306
11307 override bool KindOf(
string tag)
11308 {
11309 bool found = false;
11310 string item_name = this.
GetType();
11313
11314 int array_size = item_tag_array.Count();
11315 for (int i = 0; i < array_size; i++)
11316 {
11317 if (item_tag_array.Get(i) == tag)
11318 {
11319 found = true;
11320 break;
11321 }
11322 }
11323 return found;
11324 }
11325
11326
11328 {
11329
11330 super.OnRPC(sender, rpc_type,ctx);
11331
11332
11333 switch (rpc_type)
11334 {
11335 #ifndef SERVER
11336 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11337 Param2<bool, string> p = new Param2<bool, string>(false, "");
11338
11340 return;
11341
11342 bool play = p.param1;
11343 string soundSet = p.param2;
11344
11345 if (play)
11346 {
11348 {
11350 {
11352 }
11353 }
11354 else
11355 {
11357 }
11358 }
11359 else
11360 {
11362 }
11363
11364 break;
11365 #endif
11366
11367 }
11368
11370 {
11372 }
11373 }
11374
11375
11376
11377
11379 {
11380 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11381 return plugin.GetID(
name);
11382 }
11383
11385 {
11386 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11387 return plugin.GetName(id);
11388 }
11389
11392 {
11393
11394
11395 int varFlags;
11396 if (!ctx.
Read(varFlags))
11397 return;
11398
11399 if (varFlags & ItemVariableFlags.FLOAT)
11400 {
11402 }
11403 }
11404
11406 {
11407
11408 super.SerializeNumericalVars(floats_out);
11409
11410
11411
11413 {
11415 }
11416
11418 {
11420 }
11421
11423 {
11425 }
11426
11428 {
11433 }
11434
11436 {
11438 }
11439 }
11440
11442 {
11443
11444 super.DeSerializeNumericalVars(floats);
11445
11446
11447 int index = 0;
11448 int mask = Math.Round(floats.Get(index));
11449
11450 index++;
11451
11453 {
11455 {
11457 }
11458 else
11459 {
11460 float quantity = floats.Get(index);
11461 SetQuantity(quantity,
true,
false,
false,
false);
11462 }
11463 index++;
11464 }
11465
11467 {
11468 float wet = floats.Get(index);
11470 index++;
11471 }
11472
11474 {
11475 int liquidtype = Math.Round(floats.Get(index));
11477 index++;
11478 }
11479
11481 {
11483 index++;
11485 index++;
11487 index++;
11489 index++;
11490 }
11491
11493 {
11494 int cleanness = Math.Round(floats.Get(index));
11496 index++;
11497 }
11498 }
11499
11501 {
11502 super.WriteVarsToCTX(ctx);
11503
11504
11506 {
11508 }
11509
11511 {
11513 }
11514
11516 {
11518 }
11519
11521 {
11522 int r,g,b,a;
11528 }
11529
11531 {
11533 }
11534 }
11535
11537 {
11538 if (!super.ReadVarsFromCTX(ctx,version))
11539 return false;
11540
11541 int intValue;
11542 float value;
11543
11544 if (version < 140)
11545 {
11546 if (!ctx.
Read(intValue))
11547 return false;
11548
11549 m_VariablesMask = intValue;
11550 }
11551
11553 {
11554 if (!ctx.
Read(value))
11555 return false;
11556
11558 {
11560 }
11561 else
11562 {
11564 }
11565 }
11566
11567 if (version < 140)
11568 {
11570 {
11571 if (!ctx.
Read(value))
11572 return false;
11573 SetTemperatureDirect(value);
11574 }
11575 }
11576
11578 {
11579 if (!ctx.
Read(value))
11580 return false;
11582 }
11583
11585 {
11586 if (!ctx.
Read(intValue))
11587 return false;
11589 }
11590
11592 {
11593 int r,g,b,a;
11595 return false;
11597 return false;
11599 return false;
11601 return false;
11602
11604 }
11605
11607 {
11608 if (!ctx.
Read(intValue))
11609 return false;
11611 }
11612
11613 if (version >= 138 && version < 140)
11614 {
11616 {
11617 if (!ctx.
Read(intValue))
11618 return false;
11619 SetFrozen(intValue);
11620 }
11621 }
11622
11623 return true;
11624 }
11625
11626
11628 {
11631 {
11633 }
11634
11635 if (!super.OnStoreLoad(ctx, version))
11636 {
11638 return false;
11639 }
11640
11641 if (version >= 114)
11642 {
11643 bool hasQuickBarIndexSaved;
11644
11645 if (!ctx.
Read(hasQuickBarIndexSaved))
11646 {
11648 return false;
11649 }
11650
11651 if (hasQuickBarIndexSaved)
11652 {
11653 int itmQBIndex;
11654
11655
11656 if (!ctx.
Read(itmQBIndex))
11657 {
11659 return false;
11660 }
11661
11662 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11663 if (itmQBIndex != -1 && parentPlayer)
11664 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11665 }
11666 }
11667 else
11668 {
11669
11670 PlayerBase player;
11671 int itemQBIndex;
11672 if (version ==
int.
MAX)
11673 {
11674 if (!ctx.
Read(itemQBIndex))
11675 {
11677 return false;
11678 }
11679 }
11680 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11681 {
11682
11683 if (!ctx.
Read(itemQBIndex))
11684 {
11686 return false;
11687 }
11688 if (itemQBIndex != -1 && player)
11689 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11690 }
11691 }
11692
11693 if (version < 140)
11694 {
11695
11696 if (!LoadVariables(ctx, version))
11697 {
11699 return false;
11700 }
11701 }
11702
11703
11705 {
11707 return false;
11708 }
11709 if (version >= 132)
11710 {
11712 if (raib)
11713 {
11715 {
11717 return false;
11718 }
11719 }
11720 }
11721
11723 return true;
11724 }
11725
11726
11727
11729 {
11730 super.OnStoreSave(ctx);
11731
11732 PlayerBase player;
11733 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11734 {
11736
11737 int itemQBIndex = -1;
11738 itemQBIndex = player.FindQuickBarEntityIndex(this);
11739 ctx.
Write(itemQBIndex);
11740 }
11741 else
11742 {
11744 }
11745
11747
11749 if (raib)
11750 {
11752 }
11753 }
11754
11755
11757 {
11758 super.AfterStoreLoad();
11759
11761 {
11763 }
11764
11766 {
11769 }
11770 }
11771
11773 {
11774 super.EEOnAfterLoad();
11775
11777 {
11779 }
11780
11783 }
11784
11786 {
11787 return false;
11788 }
11789
11790
11791
11793 {
11795 {
11796 #ifdef PLATFORM_CONSOLE
11797
11799 {
11801 if (menu)
11802 {
11804 }
11805 }
11806 #endif
11807 }
11808
11810 {
11813 }
11814
11816 {
11817 SetWeightDirty();
11819 }
11821 {
11824 }
11825
11827 {
11830 }
11832 {
11835 }
11836
11837 super.OnVariablesSynchronized();
11838 }
11839
11840
11841
11843 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11844 {
11845 if (!IsServerCheck(allow_client))
11846 return false;
11847
11849 return false;
11850
11853
11854 if (value <= (min + 0.001))
11855 value = min;
11856
11857 if (value == min)
11858 {
11859 if (destroy_config)
11860 {
11861 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11862 if (dstr)
11863 {
11865 this.Delete();
11866 return true;
11867 }
11868 }
11869 else if (destroy_forced)
11870 {
11872 this.Delete();
11873 return true;
11874 }
11875
11877 }
11878
11881
11883 {
11885
11886 if (delta)
11888 }
11889
11891
11892 return false;
11893 }
11894
11895
11897 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11898 {
11900 }
11901
11903 {
11906 }
11907
11909 {
11912 }
11913
11915 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11916 {
11917 float value_clamped = Math.Clamp(value, 0, 1);
11919 SetQuantity(result, destroy_config, destroy_forced);
11920 }
11921
11922
11925 {
11927 }
11928
11930 {
11932 }
11933
11934
11935
11936
11937
11938
11939
11940
11941
11942
11944 {
11945 int slot = -1;
11946 if (GetInventory())
11947 {
11948 InventoryLocation il = new InventoryLocation;
11949 GetInventory().GetCurrentInventoryLocation(il);
11951 }
11952
11954 }
11955
11957 {
11958 float quantity_max = 0;
11959
11961 {
11962 if (attSlotID != -1)
11963 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11964
11965 if (quantity_max <= 0)
11967 }
11968
11969 if (quantity_max <= 0)
11971
11972 return quantity_max;
11973 }
11974
11976 {
11978 }
11979
11981 {
11983 }
11984
11985
11987 {
11989 }
11990
11992 {
11994 }
11995
11997 {
11999 }
12000
12001
12003 {
12004
12005 float weightEx = GetWeightEx();
12006 float special = GetInventoryAndCargoWeight();
12007 return weightEx - special;
12008 }
12009
12010
12012 {
12014 }
12015
12017 {
12019 {
12020 #ifdef DEVELOPER
12021 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12022 {
12023 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12025 }
12026 #endif
12027
12028 return GetQuantity() * GetConfigWeightModified();
12029 }
12030 else if (HasEnergyManager())
12031 {
12032 #ifdef DEVELOPER
12033 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12034 {
12035 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12036 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12037 }
12038 #endif
12039 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12040 }
12041 else
12042 {
12043 #ifdef DEVELOPER
12044 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12045 {
12046 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12047 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12048 }
12049 #endif
12050 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12051 }
12052 }
12053
12056 {
12057 int item_count = 0;
12059
12060 if (GetInventory().GetCargo() != NULL)
12061 {
12062 item_count = GetInventory().GetCargo().GetItemCount();
12063 }
12064
12065 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12066 {
12067 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12068 if (item)
12069 item_count += item.GetNumberOfItems();
12070 }
12071 return item_count;
12072 }
12073
12076 {
12077 float weight = 0;
12078 float wetness = 1;
12079 if (include_wetness)
12082 {
12083 weight = wetness * m_ConfigWeight;
12084 }
12086 {
12087 weight = 1;
12088 }
12089 return weight;
12090 }
12091
12092
12093
12095 {
12096 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12097 {
12098 GameInventory inv = GetInventory();
12099 array<EntityAI> items = new array<EntityAI>;
12101 for (int i = 0; i < items.Count(); i++)
12102 {
12104 if (item)
12105 {
12107 }
12108 }
12109 }
12110 }
12111
12112
12113
12114
12116 {
12117 float energy = 0;
12118 if (HasEnergyManager())
12119 {
12120 energy = GetCompEM().GetEnergy();
12121 }
12122 return energy;
12123 }
12124
12125
12127 {
12128 super.OnEnergyConsumed();
12129
12131 }
12132
12134 {
12135 super.OnEnergyAdded();
12136
12138 }
12139
12140
12142 {
12143 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12144 {
12146 {
12147 float energy_0to1 = GetCompEM().GetEnergy0To1();
12149 }
12150 }
12151 }
12152
12153
12155 {
12156 return ConfigGetFloat("heatIsolation");
12157 }
12158
12160 {
12162 }
12163
12165 {
12166 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12167 if (
GetGame().ConfigIsExisting(paramPath))
12169
12170 return 0.0;
12171 }
12172
12174 {
12175 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12176 if (
GetGame().ConfigIsExisting(paramPath))
12178
12179 return 0.0;
12180 }
12181
12182 override void SetWet(
float value,
bool allow_client =
false)
12183 {
12184 if (!IsServerCheck(allow_client))
12185 return;
12186
12189
12191
12192 m_VarWet = Math.Clamp(value, min, max);
12193
12195 {
12198 }
12199 }
12200
12201 override void AddWet(
float value)
12202 {
12204 }
12205
12207 {
12209 }
12210
12212 {
12214 }
12215
12217 {
12219 }
12220
12222 {
12224 }
12225
12227 {
12229 }
12230
12231 override void OnWetChanged(
float newVal,
float oldVal)
12232 {
12235 if (newLevel != oldLevel)
12236 {
12238 }
12239 }
12240
12242 {
12243 SetWeightDirty();
12244 }
12245
12247 {
12248 return GetWetLevelInternal(
m_VarWet);
12249 }
12250
12251
12252
12254 {
12256 }
12257
12259 {
12261 }
12262
12264 {
12266 }
12267
12269 {
12271 }
12272
12273
12274
12276 {
12277 if (ConfigIsExisting("itemModelLength"))
12278 {
12279 return ConfigGetFloat("itemModelLength");
12280 }
12281 return 0;
12282 }
12283
12285 {
12286 if (ConfigIsExisting("itemAttachOffset"))
12287 {
12288 return ConfigGetFloat("itemAttachOffset");
12289 }
12290 return 0;
12291 }
12292
12293 override void SetCleanness(
int value,
bool allow_client =
false)
12294 {
12295 if (!IsServerCheck(allow_client))
12296 return;
12297
12299
12301
12304 }
12305
12307 {
12309 }
12310
12312 {
12313 return true;
12314 }
12315
12316
12317
12318
12320 {
12322 }
12323
12325 {
12327 }
12328
12329
12330
12331
12332 override void SetColor(
int r,
int g,
int b,
int a)
12333 {
12339 }
12341 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12342 {
12347 }
12348
12350 {
12352 }
12353
12356 {
12357 int r,g,b,a;
12359 r = r/255;
12360 g = g/255;
12361 b = b/255;
12362 a = a/255;
12363 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12364 }
12365
12366
12367
12368 override void SetLiquidType(
int value,
bool allow_client =
false)
12369 {
12370 if (!IsServerCheck(allow_client))
12371 return;
12372
12377 }
12378
12380 {
12381 return ConfigGetInt("varLiquidTypeInit");
12382 }
12383
12385 {
12387 }
12388
12390 {
12392 SetFrozen(false);
12393 }
12394
12397 {
12398 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12399 }
12400
12401
12404 {
12405 PlayerBase nplayer;
12406 if (PlayerBase.CastTo(nplayer, player))
12407 {
12409
12410 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12411 }
12412 }
12413
12414
12417 {
12418 PlayerBase nplayer;
12419 if (PlayerBase.CastTo(nplayer,player))
12420 {
12421
12422 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12423
12424 }
12425
12426
12427 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12428
12429
12430 if (HasEnergyManager())
12431 {
12432 GetCompEM().UpdatePlugState();
12433 }
12434 }
12435
12436
12438 {
12439 super.OnPlacementStarted(player);
12440
12442 }
12443
12444 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12445 {
12447 {
12448 m_AdminLog.OnPlacementComplete(player,
this);
12449 }
12450
12451 super.OnPlacementComplete(player, position, orientation);
12452 }
12453
12454
12455
12456
12457
12459 {
12461 {
12462 return true;
12463 }
12464 else
12465 {
12466 return false;
12467 }
12468 }
12469
12470
12472 {
12474 {
12476 }
12477 }
12478
12479
12481 {
12483 }
12484
12486 {
12488 }
12489
12490 override void InsertAgent(
int agent,
float count = 1)
12491 {
12492 if (count < 1)
12493 return;
12494
12496 }
12497
12500 {
12502 }
12503
12504
12506 {
12508 }
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12552 {
12554 return false;
12555 return true;
12556 }
12557
12559 {
12560
12562 }
12563
12564
12567 {
12568 super.CheckForRoofLimited(timeTresholdMS);
12569
12571 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12572 {
12573 m_PreviousRoofTestTime = time;
12574 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12575 }
12576 }
12577
12578
12580 {
12582 {
12583 return 0;
12584 }
12585
12586 if (GetInventory().GetAttachmentSlotsCount() != 0)
12587 {
12588 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12589 if (filter)
12590 return filter.GetProtectionLevel(type, false, system);
12591 else
12592 return 0;
12593 }
12594
12595 string subclassPath, entryName;
12596
12597 switch (type)
12598 {
12600 entryName = "biological";
12601 break;
12603 entryName = "chemical";
12604 break;
12605 default:
12606 entryName = "biological";
12607 break;
12608 }
12609
12610 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12611
12613 }
12614
12615
12616
12619 {
12620 if (!IsMagazine())
12622
12624 }
12625
12626
12627
12628
12629
12634 {
12635 return true;
12636 }
12637
12639 {
12641 }
12642
12643
12644
12645
12646
12648 {
12649 if (parent)
12650 {
12651 if (parent.IsInherited(DayZInfected))
12652 return true;
12653
12654 if (!parent.IsRuined())
12655 return true;
12656 }
12657
12658 return true;
12659 }
12660
12662 {
12663 if (!super.CanPutAsAttachment(parent))
12664 {
12665 return false;
12666 }
12667
12668 if (!IsRuined() && !parent.IsRuined())
12669 {
12670 return true;
12671 }
12672
12673 return false;
12674 }
12675
12677 {
12678
12679
12680
12681
12682 return super.CanReceiveItemIntoCargo(item);
12683 }
12684
12686 {
12687
12688
12689
12690
12691 GameInventory attachmentInv = attachment.GetInventory();
12693 {
12694 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12695 return false;
12696 }
12697
12698 InventoryLocation loc = new InventoryLocation();
12699 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12700 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12701 return false;
12702
12703 return super.CanReceiveAttachment(attachment, slotId);
12704 }
12705
12707 {
12708 if (!super.CanReleaseAttachment(attachment))
12709 return false;
12710
12711 return GetInventory().AreChildrenAccessible();
12712 }
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12735 {
12736 int id = muzzle_owner.GetMuzzleID();
12737 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12738
12739 if (WPOF_array)
12740 {
12741 for (int i = 0; i < WPOF_array.Count(); i++)
12742 {
12743 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12744
12745 if (WPOF)
12746 {
12747 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12748 }
12749 }
12750 }
12751 }
12752
12753
12755 {
12756 int id = muzzle_owner.GetMuzzleID();
12758
12759 if (WPOBE_array)
12760 {
12761 for (int i = 0; i < WPOBE_array.Count(); i++)
12762 {
12763 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12764
12765 if (WPOBE)
12766 {
12767 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12768 }
12769 }
12770 }
12771 }
12772
12773
12775 {
12776 int id = muzzle_owner.GetMuzzleID();
12777 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12778
12779 if (WPOOH_array)
12780 {
12781 for (int i = 0; i < WPOOH_array.Count(); i++)
12782 {
12783 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12784
12785 if (WPOOH)
12786 {
12787 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12788 }
12789 }
12790 }
12791 }
12792
12793
12795 {
12796 int id = muzzle_owner.GetMuzzleID();
12797 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12798
12799 if (WPOOH_array)
12800 {
12801 for (int i = 0; i < WPOOH_array.Count(); i++)
12802 {
12803 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12804
12805 if (WPOOH)
12806 {
12807 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12808 }
12809 }
12810 }
12811 }
12812
12813
12815 {
12816 int id = muzzle_owner.GetMuzzleID();
12817 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12818
12819 if (WPOOH_array)
12820 {
12821 for (int i = 0; i < WPOOH_array.Count(); i++)
12822 {
12823 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12824
12825 if (WPOOH)
12826 {
12827 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12828 }
12829 }
12830 }
12831 }
12832
12833
12834
12836 {
12838 {
12839 return true;
12840 }
12841
12842 return false;
12843 }
12844
12846 {
12848 {
12849 return true;
12850 }
12851
12852 return false;
12853 }
12854
12856 {
12858 {
12859 return true;
12860 }
12861
12862 return false;
12863 }
12864
12866 {
12867 return false;
12868 }
12869
12872 {
12873 return UATimeSpent.DEFAULT_DEPLOY;
12874 }
12875
12876
12877
12878
12880 {
12882 SetSynchDirty();
12883 }
12884
12886 {
12888 }
12889
12890
12892 {
12893 return false;
12894 }
12895
12898 {
12899 string att_type = "None";
12900
12901 if (ConfigIsExisting("soundAttType"))
12902 {
12903 att_type = ConfigGetString("soundAttType");
12904 }
12905
12907 }
12908
12910 {
12912 }
12913
12914
12915
12916
12917
12923
12925 {
12928
12930 }
12931
12932
12934 {
12936 return;
12937
12939
12942
12945
12946 SoundParameters params = new SoundParameters();
12950 }
12951
12952
12954 {
12956 return;
12957
12959 SetSynchDirty();
12960
12963 }
12964
12965
12967 {
12969 return;
12970
12972 SetSynchDirty();
12973
12976 }
12977
12979 {
12981 }
12982
12984 {
12986 }
12987
12990 {
12991 if (!
GetGame().IsDedicatedServer())
12992 {
12993 if (ConfigIsExisting("attachSoundSet"))
12994 {
12995 string cfg_path = "";
12996 string soundset = "";
12997 string type_name =
GetType();
12998
13001 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13002 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13003
13004 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13005 {
13006 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13007 {
13008 if (cfg_slot_array[i] == slot_type)
13009 {
13010 soundset = cfg_soundset_array[i];
13011 break;
13012 }
13013 }
13014 }
13015
13016 if (soundset != "")
13017 {
13018 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13020 }
13021 }
13022 }
13023 }
13024
13026 {
13027
13028 }
13029
13030 void OnApply(PlayerBase player);
13031
13033 {
13034 return 1.0;
13035 };
13036
13038 {
13040 }
13041
13043 {
13045 }
13046
13048
13050 {
13051 SetDynamicPhysicsLifeTime(0.01);
13053 }
13054
13056 {
13057 array<string> zone_names = new array<string>;
13058 GetDamageZones(zone_names);
13059 for (int i = 0; i < zone_names.Count(); i++)
13060 {
13061 SetHealthMax(zone_names.Get(i),"Health");
13062 }
13063 SetHealthMax("","Health");
13064 }
13065
13068 {
13069 float global_health = GetHealth01("","Health");
13070 array<string> zones = new array<string>;
13071 GetDamageZones(zones);
13072
13073 for (int i = 0; i < zones.Count(); i++)
13074 {
13075 SetHealth01(zones.Get(i),"Health",global_health);
13076 }
13077 }
13078
13081 {
13082 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13083 }
13084
13086 {
13087 if (!hasRootAsPlayer)
13088 {
13089 if (refParentIB)
13090 {
13091
13092 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13093 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13094
13095 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13096 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13097
13100 }
13101 else
13102 {
13103
13106 }
13107 }
13108 }
13109
13111 {
13113 {
13114 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13115 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13116 {
13117 float heatPermCoef = 1.0;
13119 while (ent)
13120 {
13121 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13122 ent = ent.GetHierarchyParent();
13123 }
13124
13125 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13126 }
13127 }
13128 }
13129
13131 {
13132
13133 EntityAI parent = GetHierarchyParent();
13134 if (!parent)
13135 {
13136 hasParent = false;
13137 hasRootAsPlayer = false;
13138 }
13139 else
13140 {
13141 hasParent = true;
13142 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13143 refParentIB =
ItemBase.Cast(parent);
13144 }
13145 }
13146
13147 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13148 {
13149
13150 }
13151
13153 {
13154
13155 return false;
13156 }
13157
13159 {
13160
13161
13162 return false;
13163 }
13164
13166 {
13167
13168 return false;
13169 }
13170
13173 {
13174 return !GetIsFrozen() &&
IsOpen();
13175 }
13176
13178 {
13179 bool hasParent = false, hasRootAsPlayer = false;
13181
13182 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13183 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13184
13185 if (wwtu || foodDecay)
13186 {
13190
13191 if (processWetness || processTemperature || processDecay)
13192 {
13194
13195 if (processWetness)
13196 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13197
13198 if (processTemperature)
13200
13201 if (processDecay)
13202 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13203 }
13204 }
13205 }
13206
13209 {
13211 }
13212
13214 {
13217
13218 return super.GetTemperatureFreezeThreshold();
13219 }
13220
13222 {
13225
13226 return super.GetTemperatureThawThreshold();
13227 }
13228
13230 {
13233
13234 return super.GetItemOverheatThreshold();
13235 }
13236
13238 {
13240 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13241
13242 return super.GetTemperatureFreezeTime();
13243 }
13244
13246 {
13248 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13249
13250 return super.GetTemperatureThawTime();
13251 }
13252
13257
13259 {
13260 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13261 }
13262
13264 {
13265 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13266 }
13267
13270 {
13272 }
13273
13275 {
13277 }
13278
13280 {
13282 }
13283
13286 {
13287 return null;
13288 }
13289
13292 {
13293 return false;
13294 }
13295
13297 {
13299 {
13302 if (!trg)
13303 {
13305 explosive = this;
13306 }
13307
13308 explosive.PairRemote(trg);
13310
13311 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13312 trg.SetPersistentPairID(persistentID);
13313 explosive.SetPersistentPairID(persistentID);
13314
13315 return true;
13316 }
13317 return false;
13318 }
13319
13322 {
13323 float ret = 1.0;
13326 ret *= GetHealth01();
13327
13328 return ret;
13329 }
13330
13331 #ifdef DEVELOPER
13332 override void SetDebugItem()
13333 {
13334 super.SetDebugItem();
13335 _itemBase = this;
13336 }
13337
13339 {
13340 string text = super.GetDebugText();
13341
13343 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13344
13345 return text;
13346 }
13347 #endif
13348
13350 {
13351 return true;
13352 }
13353
13355
13357
13359 {
13362 }
13363
13364
13372
13388}
13389
13391{
13393 if (entity)
13394 {
13395 bool is_item = entity.IsInherited(
ItemBase);
13396 if (is_item && full_quantity)
13397 {
13400 }
13401 }
13402 else
13403 {
13405 return NULL;
13406 }
13407 return entity;
13408}
13409
13411{
13412 if (item)
13413 {
13414 if (health > 0)
13415 item.SetHealth("", "", health);
13416
13417 if (item.CanHaveTemperature())
13418 {
13420 if (item.CanFreeze())
13421 item.SetFrozen(false);
13422 }
13423
13424 if (item.HasEnergyManager())
13425 {
13426 if (quantity >= 0)
13427 {
13428 item.GetCompEM().SetEnergy0To1(quantity);
13429 }
13430 else
13431 {
13433 }
13434 }
13435 else if (item.IsMagazine())
13436 {
13437 Magazine mag = Magazine.Cast(item);
13438 if (quantity >= 0)
13439 {
13440 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13441 }
13442 else
13443 {
13445 }
13446
13447 }
13448 else
13449 {
13450 if (quantity >= 0)
13451 {
13452 item.SetQuantityNormalized(quantity, false);
13453 }
13454 else
13455 {
13457 }
13458
13459 }
13460 }
13461}
13462
13463#ifdef DEVELOPER
13465#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.