8550{
8552 {
8553 return true;
8554 }
8555};
8556
8557
8558
8560{
8564
8566
8569
8570
8571
8572
8573
8582
8588
8593
8598
8619 protected bool m_IsResultOfSplit
8620
8622
8627
8628
8629
8631
8635
8636
8637
8639
8642
8643
8644
8650
8651
8659
8662
8663
8665
8666
8668
8669
8674
8675
8680
8681
8683
8684
8686 {
8691
8692 if (!
GetGame().IsDedicatedServer())
8693 {
8695 {
8697
8699 {
8701 }
8702 }
8703
8706 }
8707
8708 m_OldLocation = null;
8709
8711 {
8713 }
8714
8715 if (ConfigIsExisting("headSelectionsToHide"))
8716 {
8719 }
8720
8722 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8723 {
8725 }
8726
8728
8729 m_IsResultOfSplit = false;
8730
8732 }
8733
8735 {
8736 super.InitItemVariables();
8737
8743 m_Count = ConfigGetInt(
"count");
8744
8747
8752
8755
8760
8772
8776
8777
8780 if (ConfigIsExisting("canBeSplit"))
8781 {
8784 }
8785
8787 if (ConfigIsExisting("itemBehaviour"))
8789
8790
8793 RegisterNetSyncVariableInt("m_VarLiquidType");
8794 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8795
8796 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8797 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8798 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8799
8800 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8801 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8802 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8803 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8804
8805 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8806 RegisterNetSyncVariableBool("m_IsTakeable");
8807 RegisterNetSyncVariableBool("m_IsHologram");
8808
8811 {
8814 }
8815
8817
8819 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8821
8822 }
8823
8825 {
8827 }
8828
8830 {
8833 {
8838 }
8839 }
8840
8841 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8842 {
8844 {
8847 }
8848
8850 }
8851
8853 {
8859 }
8860
8862
8864 {
8866
8867 if (!action)
8868 {
8869 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8870 return;
8871 }
8872
8874 if (!ai)
8875 {
8877 return;
8878 }
8879
8881 if (!action_array)
8882 {
8883 action_array = new array<ActionBase_Basic>;
8885 }
8886 if (LogManager.IsActionLogEnable())
8887 {
8888 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8889 }
8890
8891 if (action_array.Find(action) != -1)
8892 {
8893 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8894 }
8895 else
8896 {
8897 action_array.Insert(action);
8898 }
8899 }
8900
8902 {
8904 ActionBase action = player.GetActionManager().GetAction(actionName);
8907
8908 if (action_array)
8909 {
8910 action_array.RemoveItem(action);
8911 }
8912 }
8913
8914
8915
8917 {
8918 ActionOverrideData overrideData = new ActionOverrideData();
8922
8924 if (!actionMap)
8925 {
8928 }
8929
8930 actionMap.Insert(this.
Type(), overrideData);
8931
8932 }
8933
8935
8937
8938
8940 {
8943
8946
8947 string config_to_search = "CfgVehicles";
8948 string muzzle_owner_config;
8949
8951 {
8952 if (IsInherited(Weapon))
8953 config_to_search = "CfgWeapons";
8954
8955 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8956
8957 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8958
8960
8961 if (config_OnFire_subclass_count > 0)
8962 {
8963 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8964
8965 for (int i = 0; i < config_OnFire_subclass_count; i++)
8966 {
8967 string particle_class = "";
8969 string config_OnFire_entry = config_OnFire_class + particle_class;
8970 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8971 WPOF_array.Insert(WPOF);
8972 }
8973
8974
8976 }
8977 }
8978
8980 {
8981 config_to_search = "CfgWeapons";
8982 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8983
8984 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8985
8987
8988 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8989 {
8990 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8991
8992 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8993 {
8994 string particle_class2 = "";
8996 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8997 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8998 WPOBE_array.Insert(WPOBE);
8999 }
9000
9001
9003 }
9004 }
9005 }
9006
9007
9009 {
9012
9014 {
9015 string config_to_search = "CfgVehicles";
9016
9017 if (IsInherited(Weapon))
9018 config_to_search = "CfgWeapons";
9019
9020 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9021 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9022
9023 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9024 {
9025
9027
9029 {
9031 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9033 return;
9034 }
9035
9038
9039
9040
9042 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9043
9044 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9045 {
9046 string particle_class = "";
9048 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9050
9051 if (entry_type == CT_CLASS)
9052 {
9053 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9054 WPOOH_array.Insert(WPOF);
9055 }
9056 }
9057
9058
9060 }
9061 }
9062 }
9063
9065 {
9067 }
9068
9070 {
9072 {
9074
9077
9080
9081 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9082 }
9083 }
9084
9086 {
9088 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9089
9091 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9092
9094 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9095
9097 {
9099 }
9100 }
9101
9103 {
9105 }
9106
9108 {
9111 else
9113
9115 {
9118 }
9119 else
9120 {
9123
9126 }
9127
9129 }
9130
9132 {
9134 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9135 }
9136
9138 {
9140 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9142 }
9143
9145 {
9147 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9148 }
9149
9151 {
9154
9155 OverheatingParticle OP = new OverheatingParticle();
9160
9162 }
9163
9165 {
9168
9169 return -1;
9170 }
9171
9173 {
9175 {
9178
9179 for (int i = count; i > 0; --i)
9180 {
9181 int id = i - 1;
9184
9187
9188 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9189 {
9190 if (p)
9191 {
9194 }
9195 }
9196 }
9197 }
9198 }
9199
9201 {
9203 {
9205 {
9206 int id = i - 1;
9208
9209 if (OP)
9210 {
9212
9213 if (p)
9214 {
9216 }
9217
9218 delete OP;
9219 }
9220 }
9221
9224 }
9225 }
9226
9229 {
9230 return 0.0;
9231 }
9232
9233
9235 {
9236 return 250;
9237 }
9238
9240 {
9241 return 0;
9242 }
9243
9246 {
9248 return true;
9249
9250 return false;
9251 }
9252
9255 {
9258
9260 {
9262 }
9263 else
9264 {
9265
9267 }
9268
9270 }
9271
9278 {
9279 return -1;
9280 }
9281
9282
9283
9284
9286 {
9288 {
9290 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9291
9292 if (r_index >= 0)
9293 {
9294 InventoryLocation r_il = new InventoryLocation;
9295 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9296
9297 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9300 {
9301 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9302 }
9304 {
9305 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9306 }
9307
9308 }
9309
9310 player.GetHumanInventory().ClearUserReservedLocation(this);
9311 }
9312
9315 }
9316
9317
9318
9319
9321 {
9322 return ItemBase.m_DebugActionsMask;
9323 }
9324
9326 {
9327 return ItemBase.m_DebugActionsMask & mask;
9328 }
9329
9331 {
9332 ItemBase.m_DebugActionsMask = mask;
9333 }
9334
9336 {
9337 ItemBase.m_DebugActionsMask |= mask;
9338 }
9339
9341 {
9342 ItemBase.m_DebugActionsMask &= ~mask;
9343 }
9344
9346 {
9348 {
9350 }
9351 else
9352 {
9354 }
9355 }
9356
9357
9359 {
9360 if (GetEconomyProfile())
9361 {
9362 float q_max = GetEconomyProfile().GetQuantityMax();
9363 if (q_max > 0)
9364 {
9365 float q_min = GetEconomyProfile().GetQuantityMin();
9366 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9367
9369 {
9370 ComponentEnergyManager comp = GetCompEM();
9372 {
9374 }
9375 }
9377 {
9379
9380 }
9381
9382 }
9383 }
9384 }
9385
9388 {
9389 EntityAI parent = GetHierarchyParent();
9390
9391 if (parent)
9392 {
9393 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9394 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9395 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9396 }
9397 }
9398
9401 {
9402 EntityAI parent = GetHierarchyParent();
9403
9404 if (parent)
9405 {
9406 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9407 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9408 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9409 }
9410 }
9411
9413 {
9414
9415
9416
9417
9419
9421 {
9422 if (ScriptInputUserData.CanStoreInputUserData())
9423 {
9424 ScriptInputUserData ctx = new ScriptInputUserData;
9430 ctx.
Write(use_stack_max);
9433
9435 {
9436 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9437 }
9438 }
9439 }
9440 else if (!
GetGame().IsMultiplayer())
9441 {
9443 }
9444 }
9445
9447 {
9449 }
9450
9452 {
9454 }
9455
9457 {
9459 }
9460
9462 {
9463
9464 return false;
9465 }
9466
9468 {
9469 return false;
9470 }
9471
9475 {
9476 return false;
9477 }
9478
9480 {
9481 return "";
9482 }
9483
9485
9487 {
9488 return false;
9489 }
9490
9492 {
9493 return true;
9494 }
9495
9496
9497
9499 {
9500 return true;
9501 }
9502
9504 {
9505 return true;
9506 }
9507
9509 {
9510 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9512 }
9513
9515 {
9517 }
9518
9520 {
9522 if (!is_being_placed)
9524 SetSynchDirty();
9525 }
9526
9527
9529
9531 {
9533 }
9534
9536 {
9538 }
9539
9541 {
9542 return 1;
9543 }
9544
9546 {
9547 return false;
9548 }
9549
9551 {
9553 SetSynchDirty();
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
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9591 {
9592 super.OnMovedInsideCargo(container);
9593
9594 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9595 }
9596
9597 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9598 {
9599 super.EEItemLocationChanged(oldLoc,newLoc);
9600
9601 PlayerBase new_player = null;
9602 PlayerBase old_player = null;
9603
9604 if (newLoc.GetParent())
9605 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9606
9607 if (oldLoc.GetParent())
9608 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9609
9611 {
9612 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9613
9614 if (r_index >= 0)
9615 {
9616 InventoryLocation r_il = new InventoryLocation;
9617 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9618
9619 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9622 {
9623 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9624 }
9626 {
9627 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9628 }
9629
9630 }
9631 }
9632
9634 {
9635 if (new_player)
9636 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9637
9638 if (new_player == old_player)
9639 {
9640
9641 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9642 {
9644 {
9645 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9646 {
9647 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9648 }
9649 }
9650 else
9651 {
9652 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9653 }
9654 }
9655
9656 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9657 {
9658 int type = oldLoc.GetType();
9660 {
9661 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9662 }
9664 {
9665 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9666 }
9667 }
9668 if (!m_OldLocation)
9669 {
9670 m_OldLocation = new InventoryLocation;
9671 }
9672 m_OldLocation.Copy(oldLoc);
9673 }
9674 else
9675 {
9676 if (m_OldLocation)
9677 {
9678 m_OldLocation.Reset();
9679 }
9680 }
9681
9683 }
9684 else
9685 {
9686 if (new_player)
9687 {
9688 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9689 if (res_index >= 0)
9690 {
9691 InventoryLocation il = new InventoryLocation;
9692 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9694 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9697 {
9698 il.
GetParent().GetOnReleaseLock().Invoke(it);
9699 }
9701 {
9703 }
9704
9705 }
9706 }
9708 {
9709
9711 }
9712
9713 if (m_OldLocation)
9714 {
9715 m_OldLocation.Reset();
9716 }
9717 }
9718 }
9719
9720 override void EOnContact(IEntity other, Contact extra)
9721 {
9723 {
9724 int liquidType = -1;
9726 if (impactSpeed > 0.0)
9727 {
9729 #ifndef SERVER
9731 #else
9733 SetSynchDirty();
9734 #endif
9736 }
9737 }
9738
9739 #ifdef SERVER
9740 if (GetCompEM() && GetCompEM().IsPlugged())
9741 {
9742 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9743 GetCompEM().UnplugThis();
9744 }
9745 #endif
9746 }
9747
9749
9751 {
9753 }
9754
9756 {
9757
9758 }
9759
9761 {
9762 super.OnItemLocationChanged(old_owner, new_owner);
9763
9764 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9765 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9766
9767 if (!relatedPlayer && playerNew)
9768 relatedPlayer = playerNew;
9769
9770 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9771 {
9773 if (actionMgr)
9774 {
9775 ActionBase currentAction = actionMgr.GetRunningAction();
9776 if (currentAction)
9778 }
9779 }
9780
9781 Man ownerPlayerOld = null;
9782 Man ownerPlayerNew = null;
9783
9784 if (old_owner)
9785 {
9786 if (old_owner.
IsMan())
9787 {
9788 ownerPlayerOld = Man.Cast(old_owner);
9789 }
9790 else
9791 {
9792 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9793 }
9794 }
9795 else
9796 {
9798 {
9800
9801 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9802 {
9803 GetCompEM().UnplugThis();
9804 }
9805 }
9806 }
9807
9808 if (new_owner)
9809 {
9810 if (new_owner.
IsMan())
9811 {
9812 ownerPlayerNew = Man.Cast(new_owner);
9813 }
9814 else
9815 {
9816 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9817 }
9818 }
9819
9820 if (ownerPlayerOld != ownerPlayerNew)
9821 {
9822 if (ownerPlayerOld)
9823 {
9824 array<EntityAI> subItemsExit = new array<EntityAI>;
9826 for (int i = 0; i < subItemsExit.Count(); i++)
9827 {
9830 }
9831 }
9832
9833 if (ownerPlayerNew)
9834 {
9835 array<EntityAI> subItemsEnter = new array<EntityAI>;
9837 for (int j = 0; j < subItemsEnter.Count(); j++)
9838 {
9841 }
9842 }
9843 }
9844 else if (ownerPlayerNew != null)
9845 {
9846 PlayerBase nplayer;
9847 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9848 {
9849 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9851 for (int k = 0; k < subItemsUpdate.Count(); k++)
9852 {
9854 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9855 }
9856 }
9857 }
9858
9859 if (old_owner)
9860 old_owner.OnChildItemRemoved(this);
9861 if (new_owner)
9862 new_owner.OnChildItemReceived(this);
9863 }
9864
9865
9867 {
9868 super.EEDelete(parent);
9869 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9870 if (player)
9871 {
9873
9874 if (player.IsAlive())
9875 {
9876 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9877 if (r_index >= 0)
9878 {
9879 InventoryLocation r_il = new InventoryLocation;
9880 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9881
9882 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9885 {
9886 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9887 }
9889 {
9890 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9891 }
9892
9893 }
9894
9895 player.RemoveQuickBarEntityShortcut(this);
9896 }
9897 }
9898 }
9899
9901 {
9902 super.EEKilled(killer);
9903
9906 {
9907 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9908 {
9909 if (IsMagazine())
9910 {
9911 if (Magazine.Cast(this).GetAmmoCount() > 0)
9912 {
9914 }
9915 }
9916 else
9917 {
9919 }
9920 }
9921 }
9922 }
9923
9925 {
9926 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9927
9928 super.OnWasAttached(parent, slot_id);
9929
9932
9934 }
9935
9937 {
9938 super.OnWasDetached(parent, slot_id);
9939
9942 }
9943
9945 {
9946 int idx;
9949
9950 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9951 if (inventory_slots.Count() < 1)
9952 {
9953 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9954 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9955 }
9956 else
9957 {
9958 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9959 }
9960
9961 idx = inventory_slots.Find(slot);
9962 if (idx < 0)
9963 return "";
9964
9965 return attach_types.Get(idx);
9966 }
9967
9969 {
9970 int idx = -1;
9971 string slot;
9972
9975
9976 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9977 if (inventory_slots.Count() < 1)
9978 {
9979 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9980 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9981 }
9982 else
9983 {
9984 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9985 if (detach_types.Count() < 1)
9986 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9987 }
9988
9989 for (int i = 0; i < inventory_slots.Count(); i++)
9990 {
9991 slot = inventory_slots.Get(i);
9992 }
9993
9994 if (slot != "")
9995 {
9996 if (detach_types.Count() == 1)
9997 idx = 0;
9998 else
9999 idx = inventory_slots.Find(slot);
10000 }
10001 if (idx < 0)
10002 return "";
10003
10004 return detach_types.Get(idx);
10005 }
10006
10008 {
10009
10011
10012
10013 float min_time = 1;
10014 float max_time = 3;
10015 float delay = Math.RandomFloat(min_time, max_time);
10016
10017 explode_timer.Run(delay, this, "DoAmmoExplosion");
10018 }
10019
10021 {
10022 Magazine magazine = Magazine.Cast(this);
10023 int pop_sounds_count = 6;
10024 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10025
10026
10027 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10028 string sound_name = pop_sounds[ sound_idx ];
10030
10031
10032 magazine.ServerAddAmmoCount(-1);
10033
10034
10035 float min_temp_to_explode = 100;
10036
10037 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10038 {
10040 }
10041 }
10042
10043
10044 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10045 {
10046 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10047
10048 const int CHANCE_DAMAGE_CARGO = 4;
10049 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10050 const int CHANCE_DAMAGE_NOTHING = 2;
10051
10053 {
10054 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10055 int chances;
10056 int rnd;
10057
10058 if (GetInventory().GetCargo())
10059 {
10060 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10061 rnd = Math.RandomInt(0,chances);
10062
10063 if (rnd < CHANCE_DAMAGE_CARGO)
10064 {
10066 }
10067 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10068 {
10070 }
10071 }
10072 else
10073 {
10074 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10075 rnd = Math.RandomInt(0,chances);
10076
10077 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10078 {
10080 }
10081 }
10082 }
10083 }
10084
10086 {
10087 if (GetInventory().GetCargo())
10088 {
10089 int item_count = GetInventory().GetCargo().GetItemCount();
10090 if (item_count > 0)
10091 {
10092 int random_pick = Math.RandomInt(0, item_count);
10094 if (!item.IsExplosive())
10095 {
10096 item.AddHealth("","",damage);
10097 return true;
10098 }
10099 }
10100 }
10101 return false;
10102 }
10103
10105 {
10106 int attachment_count = GetInventory().AttachmentCount();
10107 if (attachment_count > 0)
10108 {
10109 int random_pick = Math.RandomInt(0, attachment_count);
10110 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10111 if (!attachment.IsExplosive())
10112 {
10113 attachment.AddHealth("","",damage);
10114 return true;
10115 }
10116 }
10117 return false;
10118 }
10119
10121 {
10123 }
10124
10126 {
10128 return GetInventory().CanRemoveEntity();
10129
10130 return false;
10131 }
10132
10134 {
10135
10137 return false;
10138
10139
10141 return false;
10142
10143
10144
10146 if (delta == 0)
10147 return false;
10148
10149
10150 return true;
10151 }
10152
10154 {
10156 {
10157 if (ScriptInputUserData.CanStoreInputUserData())
10158 {
10159 ScriptInputUserData ctx = new ScriptInputUserData;
10164 ctx.
Write(destination_entity);
10166 ctx.
Write(slot_id);
10168 }
10169 }
10170 else if (!
GetGame().IsMultiplayer())
10171 {
10173 }
10174 }
10175
10177 {
10178 float split_quantity_new;
10182 InventoryLocation loc = new InventoryLocation;
10183
10184 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10185 {
10187 split_quantity_new = stack_max;
10188 else
10190
10192 {
10193 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10194 if (new_item)
10195 {
10196 new_item.SetResultOfSplit(true);
10197 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10199 new_item.
SetQuantity(split_quantity_new,
false,
true);
10200 }
10201 }
10202 }
10203 else if (destination_entity && slot_id == -1)
10204 {
10205 if (quantity > stack_max)
10206 split_quantity_new = stack_max;
10207 else
10208 split_quantity_new = quantity;
10209
10211 {
10213 {
10216 }
10217
10218 if (new_item)
10219 {
10220 new_item.SetResultOfSplit(true);
10221 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10223 new_item.
SetQuantity(split_quantity_new,
false,
true);
10224 }
10225 }
10226 }
10227 else
10228 {
10229 if (stack_max != 0)
10230 {
10232 {
10234 }
10235
10236 if (split_quantity_new == 0)
10237 {
10238 if (!
GetGame().IsMultiplayer())
10239 player.PhysicalPredictiveDropItem(this);
10240 else
10241 player.ServerDropEntity(this);
10242 return;
10243 }
10244
10246 {
10248
10249 if (new_item)
10250 {
10251 new_item.SetResultOfSplit(true);
10252 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10255 new_item.PlaceOnSurface();
10256 }
10257 }
10258 }
10259 }
10260 }
10261
10263 {
10264 float split_quantity_new;
10268 InventoryLocation loc = new InventoryLocation;
10269
10270 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10271 {
10273 split_quantity_new = stack_max;
10274 else
10276
10278 {
10279 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10280 if (new_item)
10281 {
10282 new_item.SetResultOfSplit(true);
10283 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10285 new_item.
SetQuantity(split_quantity_new,
false,
true);
10286 }
10287 }
10288 }
10289 else if (destination_entity && slot_id == -1)
10290 {
10291 if (quantity > stack_max)
10292 split_quantity_new = stack_max;
10293 else
10294 split_quantity_new = quantity;
10295
10297 {
10299 {
10302 }
10303
10304 if (new_item)
10305 {
10306 new_item.SetResultOfSplit(true);
10307 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10309 new_item.
SetQuantity(split_quantity_new,
false,
true);
10310 }
10311 }
10312 }
10313 else
10314 {
10315 if (stack_max != 0)
10316 {
10318 {
10320 }
10321
10323 {
10325
10326 if (new_item)
10327 {
10328 new_item.SetResultOfSplit(true);
10329 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10332 new_item.PlaceOnSurface();
10333 }
10334 }
10335 }
10336 }
10337 }
10338
10340 {
10342 {
10343 if (ScriptInputUserData.CanStoreInputUserData())
10344 {
10345 ScriptInputUserData ctx = new ScriptInputUserData;
10350 dst.WriteToContext(ctx);
10352 }
10353 }
10354 else if (!
GetGame().IsMultiplayer())
10355 {
10357 }
10358 }
10359
10361 {
10363 {
10364 if (ScriptInputUserData.CanStoreInputUserData())
10365 {
10366 ScriptInputUserData ctx = new ScriptInputUserData;
10371 ctx.
Write(destination_entity);
10377 }
10378 }
10379 else if (!
GetGame().IsMultiplayer())
10380 {
10382 }
10383 }
10384
10386 {
10388 }
10389
10391 {
10393 float split_quantity_new;
10395 if (dst.IsValid())
10396 {
10397 int slot_id = dst.GetSlot();
10399
10400 if (quantity > stack_max)
10401 split_quantity_new = stack_max;
10402 else
10403 split_quantity_new = quantity;
10404
10406 {
10408
10409 if (new_item)
10410 {
10411 new_item.SetResultOfSplit(true);
10412 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10414 new_item.
SetQuantity(split_quantity_new,
false,
true);
10415 }
10416
10417 return new_item;
10418 }
10419 }
10420
10421 return null;
10422 }
10423
10425 {
10427 float split_quantity_new;
10429 if (destination_entity)
10430 {
10432 if (quantity > stackable)
10433 split_quantity_new = stackable;
10434 else
10435 split_quantity_new = quantity;
10436
10438 {
10439 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10440 if (new_item)
10441 {
10442 new_item.SetResultOfSplit(true);
10443 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10445 new_item.
SetQuantity(split_quantity_new,
false,
true);
10446 }
10447 }
10448 }
10449 }
10450
10452 {
10454 {
10455 if (ScriptInputUserData.CanStoreInputUserData())
10456 {
10457 ScriptInputUserData ctx = new ScriptInputUserData;
10462 ItemBase destination_entity =
this;
10463 ctx.
Write(destination_entity);
10467 }
10468 }
10469 else if (!
GetGame().IsMultiplayer())
10470 {
10472 }
10473 }
10474
10476 {
10478 float split_quantity_new;
10480 if (player)
10481 {
10483 if (quantity > stackable)
10484 split_quantity_new = stackable;
10485 else
10486 split_quantity_new = quantity;
10487
10489 {
10490 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10491 new_item =
ItemBase.Cast(in_hands);
10492 if (new_item)
10493 {
10494 new_item.SetResultOfSplit(true);
10495 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10497 new_item.SetQuantity(split_quantity_new, false, true);
10498 }
10499 }
10500 }
10501 }
10502
10504 {
10506 float split_quantity_new = Math.Floor(quantity * 0.5);
10507
10509 return;
10510
10512
10513 if (new_item)
10514 {
10515 if (new_item.GetQuantityMax() < split_quantity_new)
10516 {
10517 split_quantity_new = new_item.GetQuantityMax();
10518 }
10519
10520 new_item.SetResultOfSplit(true);
10521 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10522
10524 {
10527 }
10528 else
10529 {
10531 new_item.
SetQuantity(split_quantity_new,
false,
true);
10532 }
10533 }
10534 }
10535
10537 {
10539 float split_quantity_new = Math.Floor(quantity / 2);
10540
10542 return;
10543
10544 InventoryLocation invloc = new InventoryLocation;
10546
10548 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10549
10550 if (new_item)
10551 {
10552 if (new_item.GetQuantityMax() < split_quantity_new)
10553 {
10554 split_quantity_new = new_item.GetQuantityMax();
10555 }
10557 {
10560 }
10561 else if (split_quantity_new > 1)
10562 {
10564 new_item.
SetQuantity(split_quantity_new,
false,
true);
10565 }
10566 }
10567 }
10568
10571 {
10572 SetWeightDirty();
10574
10575 if (parent)
10576 parent.OnAttachmentQuantityChangedEx(this, delta);
10577
10579 {
10581 {
10583 }
10585 {
10586 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10588 }
10589 }
10590
10591 }
10592
10595 {
10596
10597 }
10598
10601 {
10603 }
10604
10606 {
10607 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10608
10610 {
10611 if (newLevel == GameConstants.STATE_RUINED)
10612 {
10614 EntityAI parent = GetHierarchyParent();
10615 if (parent && parent.IsFireplace())
10616 {
10617 CargoBase cargo = GetInventory().GetCargo();
10618 if (cargo)
10619 {
10621 {
10623 }
10624 }
10625 }
10626 }
10627
10629 {
10630
10632 return;
10633 }
10634
10635 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10636 {
10638 }
10639 }
10640 }
10641
10642
10644 {
10645 super.OnRightClick();
10646
10648 {
10650 {
10651 if (ScriptInputUserData.CanStoreInputUserData())
10652 {
10653 EntityAI root = GetHierarchyRoot();
10654 Man playerOwner = GetHierarchyRootPlayer();
10655 InventoryLocation dst = new InventoryLocation;
10656
10657
10658 if (!playerOwner && root && root == this)
10659 {
10661 }
10662 else
10663 {
10664
10665 GetInventory().GetCurrentInventoryLocation(dst);
10667 {
10670 {
10672 }
10673 else
10674 {
10676
10677
10678 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10679 {
10681 }
10682 else
10683 {
10684 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10685 }
10686 }
10687 }
10688 }
10689
10690 ScriptInputUserData ctx = new ScriptInputUserData;
10698 }
10699 }
10700 else if (!
GetGame().IsMultiplayer())
10701 {
10703 }
10704 }
10705 }
10706
10708 {
10709 if (root)
10710 {
10711 vector m4[4];
10712 root.GetTransform(m4);
10713 dst.SetGround(this, m4);
10714 }
10715 else
10716 {
10717 GetInventory().GetCurrentInventoryLocation(dst);
10718 }
10719 }
10720
10721 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10722 {
10723
10724 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10725 return false;
10726
10727 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10728 return false;
10729
10730
10732 return false;
10733
10734
10735 Magazine mag = Magazine.Cast(this);
10736 if (mag)
10737 {
10738 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10739 return false;
10740
10741 if (stack_max_limit)
10742 {
10743 Magazine other_mag = Magazine.Cast(other_item);
10744 if (other_item)
10745 {
10746 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10747 return false;
10748 }
10749
10750 }
10751 }
10752 else
10753 {
10754
10756 return false;
10757
10759 return false;
10760 }
10761
10762 PlayerBase player = null;
10763 if (CastTo(player, GetHierarchyRootPlayer()))
10764 {
10765 if (player.GetInventory().HasAttachment(this))
10766 return false;
10767
10768 if (player.IsItemsToDelete())
10769 return false;
10770 }
10771
10772 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10773 return false;
10774
10775 int slotID;
10777 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10778 return false;
10779
10780 return true;
10781 }
10782
10784 {
10786 }
10787
10789 {
10790 return m_IsResultOfSplit;
10791 }
10792
10794 {
10795 m_IsResultOfSplit = value;
10796 }
10797
10799 {
10801 }
10802
10804 {
10805 float other_item_quantity = other_item.GetQuantity();
10806 float this_free_space;
10807
10809
10811
10812 if (other_item_quantity > this_free_space)
10813 {
10814 return this_free_space;
10815 }
10816 else
10817 {
10818 return other_item_quantity;
10819 }
10820 }
10821
10823 {
10825 }
10826
10828 {
10830 return;
10831
10832 if (!IsMagazine() && other_item)
10833 {
10835 if (quantity_used != 0)
10836 {
10837 float hp1 = GetHealth01("","");
10838 float hp2 = other_item.GetHealth01("","");
10839 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10840 hpResult = hpResult / (
GetQuantity() + quantity_used);
10841
10842 hpResult *= GetMaxHealth();
10843 Math.Round(hpResult);
10844 SetHealth("", "Health", hpResult);
10845
10847 other_item.AddQuantity(-quantity_used);
10848 }
10849 }
10851 }
10852
10854 {
10855 #ifdef SERVER
10856 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10857 GetHierarchyParent().IncreaseLifetimeUp();
10858 #endif
10859 };
10860
10862 {
10863 PlayerBase p = PlayerBase.Cast(player);
10864
10865 array<int> recipesIds = p.m_Recipes;
10866 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10867 if (moduleRecipesManager)
10868 {
10869 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10870 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10871 }
10872
10873 for (int i = 0;i < recipesIds.Count(); i++)
10874 {
10875 int key = recipesIds.Get(i);
10876 string recipeName = moduleRecipesManager.GetRecipeName(key);
10878 }
10879 }
10880
10881
10882 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10883 {
10884 super.GetDebugActions(outputList);
10885
10886
10892
10893
10898
10903
10904
10908
10909
10911 {
10915 }
10916
10919
10920
10924
10926
10927 InventoryLocation loc = new InventoryLocation();
10928 GetInventory().GetCurrentInventoryLocation(loc);
10930 {
10931 if (Gizmo_IsSupported())
10934 }
10935
10937 }
10938
10939
10940
10941
10943 {
10944 super.OnAction(action_id, player, ctx);
10945
10947 {
10948 switch (action_id)
10949 {
10952 return true;
10955 return true;
10956 }
10957 }
10958
10960 {
10961 switch (action_id)
10962 {
10964 Delete();
10965 return true;
10966 }
10967 }
10968
10969 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10970 {
10971 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10972 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10973 PlayerBase p = PlayerBase.Cast(player);
10974 if (
EActions.RECIPES_RANGE_START < 1000)
10975 {
10976 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10977 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10978 }
10979 }
10980 #ifndef SERVER
10981 else if (action_id ==
EActions.WATCH_PLAYER)
10982 {
10983 PluginDeveloper.SetDeveloperItemClientEx(player);
10984 }
10985 #endif
10987 {
10988 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10989 {
10990 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10991 OnDebugButtonPressServer(id + 1);
10992 }
10993
10994 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10995 {
10996 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10998 }
10999
11000 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11001 {
11002 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11004 }
11005
11006 else if (action_id ==
EActions.ADD_QUANTITY)
11007 {
11008 if (IsMagazine())
11009 {
11010 Magazine mag = Magazine.Cast(this);
11011 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11012 }
11013 else
11014 {
11016 }
11017
11018 if (m_EM)
11019 {
11020 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11021 }
11022
11023 }
11024
11025 else if (action_id ==
EActions.REMOVE_QUANTITY)
11026 {
11027 if (IsMagazine())
11028 {
11029 Magazine mag2 = Magazine.Cast(this);
11030 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11031 }
11032 else
11033 {
11035 }
11036 if (m_EM)
11037 {
11038 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11039 }
11040
11041 }
11042
11043 else if (action_id ==
EActions.SET_QUANTITY_0)
11044 {
11046
11047 if (m_EM)
11048 {
11049 m_EM.SetEnergy(0);
11050 }
11051 }
11052
11053 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11054 {
11056
11057 if (m_EM)
11058 {
11059 m_EM.SetEnergy(m_EM.GetEnergyMax());
11060 }
11061 }
11062
11063 else if (action_id ==
EActions.ADD_HEALTH)
11064 {
11065 AddHealth("","",GetMaxHealth("","Health")/5);
11066 }
11067 else if (action_id ==
EActions.REMOVE_HEALTH)
11068 {
11069 AddHealth("","",-GetMaxHealth("","Health")/5);
11070 }
11071 else if (action_id ==
EActions.DESTROY_HEALTH)
11072 {
11073 SetHealth01("","",0);
11074 }
11075 else if (action_id ==
EActions.WATCH_ITEM)
11076 {
11078 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11079 #ifdef DEVELOPER
11080 SetDebugDeveloper_item(this);
11081 #endif
11082 }
11083
11084 else if (action_id ==
EActions.ADD_TEMPERATURE)
11085 {
11086 AddTemperature(20);
11087
11088 }
11089
11090 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11091 {
11092 AddTemperature(-20);
11093
11094 }
11095
11096 else if (action_id ==
EActions.FLIP_FROZEN)
11097 {
11098 SetFrozen(!GetIsFrozen());
11099
11100 }
11101
11102 else if (action_id ==
EActions.ADD_WETNESS)
11103 {
11105
11106 }
11107
11108 else if (action_id ==
EActions.REMOVE_WETNESS)
11109 {
11111
11112 }
11113
11114 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11115 {
11118
11119
11120 }
11121
11122 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11123 {
11126 }
11127
11128 else if (action_id ==
EActions.MAKE_SPECIAL)
11129 {
11130 auto debugParams = DebugSpawnParams.WithPlayer(player);
11131 OnDebugSpawnEx(debugParams);
11132 }
11133
11134 }
11135
11136
11137 return false;
11138 }
11139
11140
11141
11142
11146
11149
11150
11151
11153 {
11154 return false;
11155 }
11156
11157
11159 {
11160 return true;
11161 }
11162
11163
11165 {
11166 return true;
11167 }
11168
11169
11170
11172 {
11173 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11175 }
11176
11179 {
11180 return null;
11181 }
11182
11184 {
11185 return false;
11186 }
11187
11189 {
11190 return false;
11191 }
11192
11196
11197
11199 {
11200 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11201 return module_repairing.CanRepair(this, item_repair_kit);
11202 }
11203
11204
11205 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11206 {
11207 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11208 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11209 }
11210
11211
11213 {
11214
11215
11216
11217
11218
11219
11220
11221
11222 return 1;
11223 }
11224
11225
11226
11228 {
11230 }
11231
11232
11233
11235 {
11237 }
11238
11239
11248 {
11249 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11250
11251 if (player)
11252 {
11253 player.MessageStatus(text);
11254 }
11255 }
11256
11257
11266 {
11267 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11268
11269 if (player)
11270 {
11271 player.MessageAction(text);
11272 }
11273 }
11274
11275
11284 {
11285 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11286
11287 if (player)
11288 {
11289 player.MessageFriendly(text);
11290 }
11291 }
11292
11293
11302 {
11303 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11304
11305 if (player)
11306 {
11307 player.MessageImportant(text);
11308 }
11309 }
11310
11312 {
11313 return true;
11314 }
11315
11316
11317 override bool KindOf(
string tag)
11318 {
11319 bool found = false;
11320 string item_name = this.
GetType();
11323
11324 int array_size = item_tag_array.Count();
11325 for (int i = 0; i < array_size; i++)
11326 {
11327 if (item_tag_array.Get(i) == tag)
11328 {
11329 found = true;
11330 break;
11331 }
11332 }
11333 return found;
11334 }
11335
11336
11338 {
11339
11340 super.OnRPC(sender, rpc_type,ctx);
11341
11342
11343 switch (rpc_type)
11344 {
11345 #ifndef SERVER
11346 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11347 Param2<bool, string> p = new Param2<bool, string>(false, "");
11348
11350 return;
11351
11352 bool play = p.param1;
11353 string soundSet = p.param2;
11354
11355 if (play)
11356 {
11358 {
11360 {
11362 }
11363 }
11364 else
11365 {
11367 }
11368 }
11369 else
11370 {
11372 }
11373
11374 break;
11375 #endif
11376
11377 }
11378
11380 {
11382 }
11383 }
11384
11385
11386
11387
11389 {
11390 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11391 return plugin.GetID(
name);
11392 }
11393
11395 {
11396 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11397 return plugin.GetName(id);
11398 }
11399
11402 {
11403
11404
11405 int varFlags;
11406 if (!ctx.
Read(varFlags))
11407 return;
11408
11409 if (varFlags & ItemVariableFlags.FLOAT)
11410 {
11412 }
11413 }
11414
11416 {
11417
11418 super.SerializeNumericalVars(floats_out);
11419
11420
11421
11423 {
11425 }
11426
11428 {
11430 }
11431
11433 {
11435 }
11436
11438 {
11443 }
11444
11446 {
11448 }
11449 }
11450
11452 {
11453
11454 super.DeSerializeNumericalVars(floats);
11455
11456
11457 int index = 0;
11458 int mask = Math.Round(floats.Get(index));
11459
11460 index++;
11461
11463 {
11465 {
11467 }
11468 else
11469 {
11470 float quantity = floats.Get(index);
11471 SetQuantity(quantity,
true,
false,
false,
false);
11472 }
11473 index++;
11474 }
11475
11477 {
11478 float wet = floats.Get(index);
11480 index++;
11481 }
11482
11484 {
11485 int liquidtype = Math.Round(floats.Get(index));
11487 index++;
11488 }
11489
11491 {
11493 index++;
11495 index++;
11497 index++;
11499 index++;
11500 }
11501
11503 {
11504 int cleanness = Math.Round(floats.Get(index));
11506 index++;
11507 }
11508 }
11509
11511 {
11512 super.WriteVarsToCTX(ctx);
11513
11514
11516 {
11518 }
11519
11521 {
11523 }
11524
11526 {
11528 }
11529
11531 {
11532 int r,g,b,a;
11538 }
11539
11541 {
11543 }
11544 }
11545
11547 {
11548 if (!super.ReadVarsFromCTX(ctx,version))
11549 return false;
11550
11551 int intValue;
11552 float value;
11553
11554 if (version < 140)
11555 {
11556 if (!ctx.
Read(intValue))
11557 return false;
11558
11559 m_VariablesMask = intValue;
11560 }
11561
11563 {
11564 if (!ctx.
Read(value))
11565 return false;
11566
11568 {
11570 }
11571 else
11572 {
11574 }
11575 }
11576
11577 if (version < 140)
11578 {
11580 {
11581 if (!ctx.
Read(value))
11582 return false;
11583 SetTemperatureDirect(value);
11584 }
11585 }
11586
11588 {
11589 if (!ctx.
Read(value))
11590 return false;
11592 }
11593
11595 {
11596 if (!ctx.
Read(intValue))
11597 return false;
11599 }
11600
11602 {
11603 int r,g,b,a;
11605 return false;
11607 return false;
11609 return false;
11611 return false;
11612
11614 }
11615
11617 {
11618 if (!ctx.
Read(intValue))
11619 return false;
11621 }
11622
11623 if (version >= 138 && version < 140)
11624 {
11626 {
11627 if (!ctx.
Read(intValue))
11628 return false;
11629 SetFrozen(intValue);
11630 }
11631 }
11632
11633 return true;
11634 }
11635
11636
11638 {
11641 {
11643 }
11644
11645 if (!super.OnStoreLoad(ctx, version))
11646 {
11648 return false;
11649 }
11650
11651 if (version >= 114)
11652 {
11653 bool hasQuickBarIndexSaved;
11654
11655 if (!ctx.
Read(hasQuickBarIndexSaved))
11656 {
11658 return false;
11659 }
11660
11661 if (hasQuickBarIndexSaved)
11662 {
11663 int itmQBIndex;
11664
11665
11666 if (!ctx.
Read(itmQBIndex))
11667 {
11669 return false;
11670 }
11671
11672 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11673 if (itmQBIndex != -1 && parentPlayer)
11674 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11675 }
11676 }
11677 else
11678 {
11679
11680 PlayerBase player;
11681 int itemQBIndex;
11682 if (version ==
int.
MAX)
11683 {
11684 if (!ctx.
Read(itemQBIndex))
11685 {
11687 return false;
11688 }
11689 }
11690 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11691 {
11692
11693 if (!ctx.
Read(itemQBIndex))
11694 {
11696 return false;
11697 }
11698 if (itemQBIndex != -1 && player)
11699 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11700 }
11701 }
11702
11703 if (version < 140)
11704 {
11705
11706 if (!LoadVariables(ctx, version))
11707 {
11709 return false;
11710 }
11711 }
11712
11713
11715 {
11717 return false;
11718 }
11719 if (version >= 132)
11720 {
11722 if (raib)
11723 {
11725 {
11727 return false;
11728 }
11729 }
11730 }
11731
11733 return true;
11734 }
11735
11736
11737
11739 {
11740 super.OnStoreSave(ctx);
11741
11742 PlayerBase player;
11743 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11744 {
11746
11747 int itemQBIndex = -1;
11748 itemQBIndex = player.FindQuickBarEntityIndex(this);
11749 ctx.
Write(itemQBIndex);
11750 }
11751 else
11752 {
11754 }
11755
11757
11759 if (raib)
11760 {
11762 }
11763 }
11764
11765
11767 {
11768 super.AfterStoreLoad();
11769
11771 {
11773 }
11774
11776 {
11779 }
11780 }
11781
11783 {
11784 super.EEOnAfterLoad();
11785
11787 {
11789 }
11790
11793 }
11794
11796 {
11797 return false;
11798 }
11799
11800
11801
11803 {
11805 {
11806 #ifdef PLATFORM_CONSOLE
11807
11809 {
11811 if (menu)
11812 {
11814 }
11815 }
11816 #endif
11817 }
11818
11820 {
11823 }
11824
11826 {
11827 SetWeightDirty();
11829 }
11831 {
11834 }
11835
11837 {
11840 }
11842 {
11845 }
11846
11847 super.OnVariablesSynchronized();
11848 }
11849
11850
11851
11853 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11854 {
11855 if (!IsServerCheck(allow_client))
11856 return false;
11857
11859 return false;
11860
11863
11864 if (value <= (min + 0.001))
11865 value = min;
11866
11867 if (value == min)
11868 {
11869 if (destroy_config)
11870 {
11871 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11872 if (dstr)
11873 {
11875 this.Delete();
11876 return true;
11877 }
11878 }
11879 else if (destroy_forced)
11880 {
11882 this.Delete();
11883 return true;
11884 }
11885
11887 }
11888
11891
11893 {
11895
11896 if (delta)
11898 }
11899
11901
11902 return false;
11903 }
11904
11905
11907 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11908 {
11910 }
11911
11913 {
11916 }
11917
11919 {
11922 }
11923
11925 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11926 {
11927 float value_clamped = Math.Clamp(value, 0, 1);
11929 SetQuantity(result, destroy_config, destroy_forced);
11930 }
11931
11932
11935 {
11937 }
11938
11940 {
11942 }
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11954 {
11955 int slot = -1;
11956 if (GetInventory())
11957 {
11958 InventoryLocation il = new InventoryLocation;
11959 GetInventory().GetCurrentInventoryLocation(il);
11961 }
11962
11964 }
11965
11967 {
11968 float quantity_max = 0;
11969
11971 {
11972 if (attSlotID != -1)
11973 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11974
11975 if (quantity_max <= 0)
11977 }
11978
11979 if (quantity_max <= 0)
11981
11982 return quantity_max;
11983 }
11984
11986 {
11988 }
11989
11991 {
11993 }
11994
11995
11997 {
11999 }
12000
12002 {
12004 }
12005
12007 {
12009 }
12010
12011
12013 {
12014
12015 float weightEx = GetWeightEx();
12016 float special = GetInventoryAndCargoWeight();
12017 return weightEx - special;
12018 }
12019
12020
12022 {
12024 }
12025
12027 {
12029 {
12030 #ifdef DEVELOPER
12031 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12032 {
12033 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12035 }
12036 #endif
12037
12038 return GetQuantity() * GetConfigWeightModified();
12039 }
12040 else if (HasEnergyManager())
12041 {
12042 #ifdef DEVELOPER
12043 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12044 {
12045 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12046 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12047 }
12048 #endif
12049 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12050 }
12051 else
12052 {
12053 #ifdef DEVELOPER
12054 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12055 {
12056 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12057 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12058 }
12059 #endif
12060 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12061 }
12062 }
12063
12066 {
12067 int item_count = 0;
12069
12070 if (GetInventory().GetCargo() != NULL)
12071 {
12072 item_count = GetInventory().GetCargo().GetItemCount();
12073 }
12074
12075 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12076 {
12077 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12078 if (item)
12079 item_count += item.GetNumberOfItems();
12080 }
12081 return item_count;
12082 }
12083
12086 {
12087 float weight = 0;
12088 float wetness = 1;
12089 if (include_wetness)
12092 {
12093 weight = wetness * m_ConfigWeight;
12094 }
12096 {
12097 weight = 1;
12098 }
12099 return weight;
12100 }
12101
12102
12103
12105 {
12106 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12107 {
12108 GameInventory inv = GetInventory();
12109 array<EntityAI> items = new array<EntityAI>;
12111 for (int i = 0; i < items.Count(); i++)
12112 {
12114 if (item)
12115 {
12117 }
12118 }
12119 }
12120 }
12121
12122
12123
12124
12126 {
12127 float energy = 0;
12128 if (HasEnergyManager())
12129 {
12130 energy = GetCompEM().GetEnergy();
12131 }
12132 return energy;
12133 }
12134
12135
12137 {
12138 super.OnEnergyConsumed();
12139
12141 }
12142
12144 {
12145 super.OnEnergyAdded();
12146
12148 }
12149
12150
12152 {
12153 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12154 {
12156 {
12157 float energy_0to1 = GetCompEM().GetEnergy0To1();
12159 }
12160 }
12161 }
12162
12163
12165 {
12166 return ConfigGetFloat("heatIsolation");
12167 }
12168
12170 {
12172 }
12173
12175 {
12176 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12177 if (
GetGame().ConfigIsExisting(paramPath))
12179
12180 return 0.0;
12181 }
12182
12184 {
12185 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12186 if (
GetGame().ConfigIsExisting(paramPath))
12188
12189 return 0.0;
12190 }
12191
12192 override void SetWet(
float value,
bool allow_client =
false)
12193 {
12194 if (!IsServerCheck(allow_client))
12195 return;
12196
12199
12201
12202 m_VarWet = Math.Clamp(value, min, max);
12203
12205 {
12208 }
12209 }
12210
12211 override void AddWet(
float value)
12212 {
12214 }
12215
12217 {
12219 }
12220
12222 {
12224 }
12225
12227 {
12229 }
12230
12232 {
12234 }
12235
12237 {
12239 }
12240
12241 override void OnWetChanged(
float newVal,
float oldVal)
12242 {
12245 if (newLevel != oldLevel)
12246 {
12248 }
12249 }
12250
12252 {
12253 SetWeightDirty();
12254 }
12255
12257 {
12258 return GetWetLevelInternal(
m_VarWet);
12259 }
12260
12261
12262
12264 {
12266 }
12267
12269 {
12271 }
12272
12274 {
12276 }
12277
12279 {
12281 }
12282
12283
12284
12286 {
12287 if (ConfigIsExisting("itemModelLength"))
12288 {
12289 return ConfigGetFloat("itemModelLength");
12290 }
12291 return 0;
12292 }
12293
12295 {
12296 if (ConfigIsExisting("itemAttachOffset"))
12297 {
12298 return ConfigGetFloat("itemAttachOffset");
12299 }
12300 return 0;
12301 }
12302
12303 override void SetCleanness(
int value,
bool allow_client =
false)
12304 {
12305 if (!IsServerCheck(allow_client))
12306 return;
12307
12309
12311
12314 }
12315
12317 {
12319 }
12320
12322 {
12323 return true;
12324 }
12325
12326
12327
12328
12330 {
12332 }
12333
12335 {
12337 }
12338
12339
12340
12341
12342 override void SetColor(
int r,
int g,
int b,
int a)
12343 {
12349 }
12351 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12352 {
12357 }
12358
12360 {
12362 }
12363
12366 {
12367 int r,g,b,a;
12369 r = r/255;
12370 g = g/255;
12371 b = b/255;
12372 a = a/255;
12373 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12374 }
12375
12376
12377
12378 override void SetLiquidType(
int value,
bool allow_client =
false)
12379 {
12380 if (!IsServerCheck(allow_client))
12381 return;
12382
12387 }
12388
12390 {
12391 return ConfigGetInt("varLiquidTypeInit");
12392 }
12393
12395 {
12397 }
12398
12400 {
12402 SetFrozen(false);
12403 }
12404
12407 {
12408 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12409 }
12410
12411
12414 {
12415 PlayerBase nplayer;
12416 if (PlayerBase.CastTo(nplayer, player))
12417 {
12419
12420 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12421 }
12422 }
12423
12424
12427 {
12428 PlayerBase nplayer;
12429 if (PlayerBase.CastTo(nplayer,player))
12430 {
12431
12432 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12433
12434 }
12435
12436
12437 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12438
12439
12440 if (HasEnergyManager())
12441 {
12442 GetCompEM().UpdatePlugState();
12443 }
12444 }
12445
12446
12448 {
12449 super.OnPlacementStarted(player);
12450
12452 }
12453
12454 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12455 {
12457 {
12458 m_AdminLog.OnPlacementComplete(player,
this);
12459 }
12460
12461 super.OnPlacementComplete(player, position, orientation);
12462 }
12463
12464
12465
12466
12467
12469 {
12471 {
12472 return true;
12473 }
12474 else
12475 {
12476 return false;
12477 }
12478 }
12479
12480
12482 {
12484 {
12486 }
12487 }
12488
12489
12491 {
12493 }
12494
12496 {
12498 }
12499
12500 override void InsertAgent(
int agent,
float count = 1)
12501 {
12502 if (count < 1)
12503 return;
12504
12506 }
12507
12510 {
12512 }
12513
12514
12516 {
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
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12562 {
12564 return false;
12565 return true;
12566 }
12567
12569 {
12570
12572 }
12573
12574
12577 {
12578 super.CheckForRoofLimited(timeTresholdMS);
12579
12581 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12582 {
12583 m_PreviousRoofTestTime = time;
12584 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12585 }
12586 }
12587
12588
12590 {
12592 {
12593 return 0;
12594 }
12595
12596 if (GetInventory().GetAttachmentSlotsCount() != 0)
12597 {
12598 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12599 if (filter)
12600 return filter.GetProtectionLevel(type, false, system);
12601 else
12602 return 0;
12603 }
12604
12605 string subclassPath, entryName;
12606
12607 switch (type)
12608 {
12610 entryName = "biological";
12611 break;
12613 entryName = "chemical";
12614 break;
12615 default:
12616 entryName = "biological";
12617 break;
12618 }
12619
12620 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12621
12623 }
12624
12625
12626
12629 {
12630 if (!IsMagazine())
12632
12634 }
12635
12636
12637
12638
12639
12644 {
12645 return true;
12646 }
12647
12649 {
12651 }
12652
12653
12654
12655
12656
12658 {
12659 if (parent)
12660 {
12661 if (parent.IsInherited(DayZInfected))
12662 return true;
12663
12664 if (!parent.IsRuined())
12665 return true;
12666 }
12667
12668 return true;
12669 }
12670
12672 {
12673 if (!super.CanPutAsAttachment(parent))
12674 {
12675 return false;
12676 }
12677
12678 if (!IsRuined() && !parent.IsRuined())
12679 {
12680 return true;
12681 }
12682
12683 return false;
12684 }
12685
12687 {
12688
12689
12690
12691
12692 return super.CanReceiveItemIntoCargo(item);
12693 }
12694
12696 {
12697
12698
12699
12700
12701 GameInventory attachmentInv = attachment.GetInventory();
12703 {
12704 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12705 return false;
12706 }
12707
12708 InventoryLocation loc = new InventoryLocation();
12709 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12710 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12711 return false;
12712
12713 return super.CanReceiveAttachment(attachment, slotId);
12714 }
12715
12717 {
12718 if (!super.CanReleaseAttachment(attachment))
12719 return false;
12720
12721 return GetInventory().AreChildrenAccessible();
12722 }
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12745 {
12746 int id = muzzle_owner.GetMuzzleID();
12747 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12748
12749 if (WPOF_array)
12750 {
12751 for (int i = 0; i < WPOF_array.Count(); i++)
12752 {
12753 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12754
12755 if (WPOF)
12756 {
12757 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12758 }
12759 }
12760 }
12761 }
12762
12763
12765 {
12766 int id = muzzle_owner.GetMuzzleID();
12768
12769 if (WPOBE_array)
12770 {
12771 for (int i = 0; i < WPOBE_array.Count(); i++)
12772 {
12773 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12774
12775 if (WPOBE)
12776 {
12777 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12778 }
12779 }
12780 }
12781 }
12782
12783
12785 {
12786 int id = muzzle_owner.GetMuzzleID();
12787 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12788
12789 if (WPOOH_array)
12790 {
12791 for (int i = 0; i < WPOOH_array.Count(); i++)
12792 {
12793 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12794
12795 if (WPOOH)
12796 {
12797 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12798 }
12799 }
12800 }
12801 }
12802
12803
12805 {
12806 int id = muzzle_owner.GetMuzzleID();
12807 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12808
12809 if (WPOOH_array)
12810 {
12811 for (int i = 0; i < WPOOH_array.Count(); i++)
12812 {
12813 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12814
12815 if (WPOOH)
12816 {
12817 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12818 }
12819 }
12820 }
12821 }
12822
12823
12825 {
12826 int id = muzzle_owner.GetMuzzleID();
12827 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12828
12829 if (WPOOH_array)
12830 {
12831 for (int i = 0; i < WPOOH_array.Count(); i++)
12832 {
12833 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12834
12835 if (WPOOH)
12836 {
12837 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12838 }
12839 }
12840 }
12841 }
12842
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 {
12868 {
12869 return true;
12870 }
12871
12872 return false;
12873 }
12874
12876 {
12877 return false;
12878 }
12879
12882 {
12883 return UATimeSpent.DEFAULT_DEPLOY;
12884 }
12885
12886
12887
12888
12890 {
12892 SetSynchDirty();
12893 }
12894
12896 {
12898 }
12899
12900
12902 {
12903 return false;
12904 }
12905
12908 {
12909 string att_type = "None";
12910
12911 if (ConfigIsExisting("soundAttType"))
12912 {
12913 att_type = ConfigGetString("soundAttType");
12914 }
12915
12917 }
12918
12920 {
12922 }
12923
12924
12925
12926
12927
12933
12935 {
12938
12940 }
12941
12942
12944 {
12946 return;
12947
12949
12952
12955
12956 SoundParameters params = new SoundParameters();
12960 }
12961
12962
12964 {
12966 return;
12967
12969 SetSynchDirty();
12970
12973 }
12974
12975
12977 {
12979 return;
12980
12982 SetSynchDirty();
12983
12986 }
12987
12989 {
12991 }
12992
12994 {
12996 }
12997
13000 {
13001 if (!
GetGame().IsDedicatedServer())
13002 {
13003 if (ConfigIsExisting("attachSoundSet"))
13004 {
13005 string cfg_path = "";
13006 string soundset = "";
13007 string type_name =
GetType();
13008
13011 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13012 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13013
13014 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13015 {
13016 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13017 {
13018 if (cfg_slot_array[i] == slot_type)
13019 {
13020 soundset = cfg_soundset_array[i];
13021 break;
13022 }
13023 }
13024 }
13025
13026 if (soundset != "")
13027 {
13028 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13030 }
13031 }
13032 }
13033 }
13034
13036 {
13037
13038 }
13039
13040 void OnApply(PlayerBase player);
13041
13043 {
13044 return 1.0;
13045 };
13046
13048 {
13050 }
13051
13053 {
13055 }
13056
13058
13060 {
13061 SetDynamicPhysicsLifeTime(0.01);
13063 }
13064
13066 {
13067 array<string> zone_names = new array<string>;
13068 GetDamageZones(zone_names);
13069 for (int i = 0; i < zone_names.Count(); i++)
13070 {
13071 SetHealthMax(zone_names.Get(i),"Health");
13072 }
13073 SetHealthMax("","Health");
13074 }
13075
13078 {
13079 float global_health = GetHealth01("","Health");
13080 array<string> zones = new array<string>;
13081 GetDamageZones(zones);
13082
13083 for (int i = 0; i < zones.Count(); i++)
13084 {
13085 SetHealth01(zones.Get(i),"Health",global_health);
13086 }
13087 }
13088
13091 {
13092 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13093 }
13094
13096 {
13097 if (!hasRootAsPlayer)
13098 {
13099 if (refParentIB)
13100 {
13101
13102 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13103 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13104
13105 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13106 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13107
13110 }
13111 else
13112 {
13113
13116 }
13117 }
13118 }
13119
13121 {
13123 {
13124 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13125 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13126 {
13127 float heatPermCoef = 1.0;
13129 while (ent)
13130 {
13131 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13132 ent = ent.GetHierarchyParent();
13133 }
13134
13135 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13136 }
13137 }
13138 }
13139
13141 {
13142
13143 EntityAI parent = GetHierarchyParent();
13144 if (!parent)
13145 {
13146 hasParent = false;
13147 hasRootAsPlayer = false;
13148 }
13149 else
13150 {
13151 hasParent = true;
13152 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13153 refParentIB =
ItemBase.Cast(parent);
13154 }
13155 }
13156
13157 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13158 {
13159
13160 }
13161
13163 {
13164
13165 return false;
13166 }
13167
13169 {
13170
13171
13172 return false;
13173 }
13174
13176 {
13177
13178 return false;
13179 }
13180
13183 {
13184 return !GetIsFrozen() &&
IsOpen();
13185 }
13186
13188 {
13189 bool hasParent = false, hasRootAsPlayer = false;
13191
13192 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13193 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13194
13195 if (wwtu || foodDecay)
13196 {
13200
13201 if (processWetness || processTemperature || processDecay)
13202 {
13204
13205 if (processWetness)
13206 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13207
13208 if (processTemperature)
13210
13211 if (processDecay)
13212 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13213 }
13214 }
13215 }
13216
13219 {
13221 }
13222
13224 {
13227
13228 return super.GetTemperatureFreezeThreshold();
13229 }
13230
13232 {
13235
13236 return super.GetTemperatureThawThreshold();
13237 }
13238
13240 {
13243
13244 return super.GetItemOverheatThreshold();
13245 }
13246
13248 {
13250 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13251
13252 return super.GetTemperatureFreezeTime();
13253 }
13254
13256 {
13258 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13259
13260 return super.GetTemperatureThawTime();
13261 }
13262
13267
13269 {
13270 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13271 }
13272
13274 {
13275 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13276 }
13277
13280 {
13282 }
13283
13285 {
13287 }
13288
13290 {
13292 }
13293
13296 {
13297 return null;
13298 }
13299
13302 {
13303 return false;
13304 }
13305
13307 {
13309 {
13312 if (!trg)
13313 {
13315 explosive = this;
13316 }
13317
13318 explosive.PairRemote(trg);
13320
13321 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13322 trg.SetPersistentPairID(persistentID);
13323 explosive.SetPersistentPairID(persistentID);
13324
13325 return true;
13326 }
13327 return false;
13328 }
13329
13332 {
13333 float ret = 1.0;
13336 ret *= GetHealth01();
13337
13338 return ret;
13339 }
13340
13341 #ifdef DEVELOPER
13342 override void SetDebugItem()
13343 {
13344 super.SetDebugItem();
13345 _itemBase = this;
13346 }
13347
13349 {
13350 string text = super.GetDebugText();
13351
13353 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13354
13355 return text;
13356 }
13357 #endif
13358
13360 {
13361 return true;
13362 }
13363
13365
13367
13369 {
13372 }
13373
13374
13382
13398}
13399
13401{
13403 if (entity)
13404 {
13405 bool is_item = entity.IsInherited(
ItemBase);
13406 if (is_item && full_quantity)
13407 {
13410 }
13411 }
13412 else
13413 {
13415 return NULL;
13416 }
13417 return entity;
13418}
13419
13421{
13422 if (item)
13423 {
13424 if (health > 0)
13425 item.SetHealth("", "", health);
13426
13427 if (item.CanHaveTemperature())
13428 {
13430 if (item.CanFreeze())
13431 item.SetFrozen(false);
13432 }
13433
13434 if (item.HasEnergyManager())
13435 {
13436 if (quantity >= 0)
13437 {
13438 item.GetCompEM().SetEnergy0To1(quantity);
13439 }
13440 else
13441 {
13443 }
13444 }
13445 else if (item.IsMagazine())
13446 {
13447 Magazine mag = Magazine.Cast(item);
13448 if (quantity >= 0)
13449 {
13450 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13451 }
13452 else
13453 {
13455 }
13456
13457 }
13458 else
13459 {
13460 if (quantity >= 0)
13461 {
13462 item.SetQuantityNormalized(quantity, false);
13463 }
13464 else
13465 {
13467 }
13468
13469 }
13470 }
13471}
13472
13473#ifdef DEVELOPER
13475#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.