9549{
9551 {
9552 return true;
9553 }
9554};
9555
9556
9557
9559{
9563
9565
9568
9569
9570
9571
9572
9581
9587
9592
9597
9618 protected bool m_IsResultOfSplit
9619
9621
9626
9627
9628
9630
9634
9635
9636
9638
9641
9642
9643
9649
9650
9658
9661
9662
9664
9665
9667
9668
9673
9674
9679
9680
9682
9683
9685 {
9690
9691 if (!
GetGame().IsDedicatedServer())
9692 {
9694 {
9696
9698 {
9700 }
9701 }
9702
9705 }
9706
9707 m_OldLocation = null;
9708
9710 {
9712 }
9713
9714 if (ConfigIsExisting("headSelectionsToHide"))
9715 {
9718 }
9719
9721 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9722 {
9724 }
9725
9727
9728 m_IsResultOfSplit = false;
9729
9731 }
9732
9734 {
9735 super.InitItemVariables();
9736
9742 m_Count = ConfigGetInt(
"count");
9743
9746
9751
9754
9759
9771
9775
9776
9779 if (ConfigIsExisting("canBeSplit"))
9780 {
9783 }
9784
9786 if (ConfigIsExisting("itemBehaviour"))
9788
9789
9792 RegisterNetSyncVariableInt("m_VarLiquidType");
9793 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9794
9795 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9796 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9797 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9798
9799 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9800 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9801 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9802 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9803
9804 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9805 RegisterNetSyncVariableBool("m_IsTakeable");
9806 RegisterNetSyncVariableBool("m_IsHologram");
9807
9810 {
9813 }
9814
9816
9818 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9820
9821 }
9822
9824 {
9826 }
9827
9829 {
9832 {
9837 }
9838 }
9839
9840 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9841 {
9843 {
9846 }
9847
9849 }
9850
9852 {
9858 }
9859
9861
9863 {
9865
9866 if (!action)
9867 {
9868 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9869 return;
9870 }
9871
9873 if (!ai)
9874 {
9876 return;
9877 }
9878
9880 if (!action_array)
9881 {
9882 action_array = new array<ActionBase_Basic>;
9884 }
9885 if (LogManager.IsActionLogEnable())
9886 {
9887 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9888 }
9889
9890 if (action_array.Find(action) != -1)
9891 {
9892 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9893 }
9894 else
9895 {
9896 action_array.Insert(action);
9897 }
9898 }
9899
9901 {
9903 ActionBase action = player.GetActionManager().GetAction(actionName);
9906
9907 if (action_array)
9908 {
9909 action_array.RemoveItem(action);
9910 }
9911 }
9912
9913
9914
9916 {
9917 ActionOverrideData overrideData = new ActionOverrideData();
9921
9923 if (!actionMap)
9924 {
9927 }
9928
9929 actionMap.Insert(this.
Type(), overrideData);
9930
9931 }
9932
9934
9936
9937
9939 {
9942
9945
9946 string config_to_search = "CfgVehicles";
9947 string muzzle_owner_config;
9948
9950 {
9951 if (IsInherited(Weapon))
9952 config_to_search = "CfgWeapons";
9953
9954 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9955
9956 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9957
9959
9960 if (config_OnFire_subclass_count > 0)
9961 {
9962 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9963
9964 for (int i = 0; i < config_OnFire_subclass_count; i++)
9965 {
9966 string particle_class = "";
9968 string config_OnFire_entry = config_OnFire_class + particle_class;
9969 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9970 WPOF_array.Insert(WPOF);
9971 }
9972
9973
9975 }
9976 }
9977
9979 {
9980 config_to_search = "CfgWeapons";
9981 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9982
9983 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9984
9986
9987 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9988 {
9989 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9990
9991 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9992 {
9993 string particle_class2 = "";
9995 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9996 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9997 WPOBE_array.Insert(WPOBE);
9998 }
9999
10000
10002 }
10003 }
10004 }
10005
10006
10008 {
10011
10013 {
10014 string config_to_search = "CfgVehicles";
10015
10016 if (IsInherited(Weapon))
10017 config_to_search = "CfgWeapons";
10018
10019 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10020 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
10021
10022 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
10023 {
10024
10026
10028 {
10030 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10032 return;
10033 }
10034
10037
10038
10039
10041 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10042
10043 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10044 {
10045 string particle_class = "";
10047 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10049
10050 if (entry_type == CT_CLASS)
10051 {
10052 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10053 WPOOH_array.Insert(WPOF);
10054 }
10055 }
10056
10057
10059 }
10060 }
10061 }
10062
10064 {
10066 }
10067
10069 {
10071 {
10073
10076
10079
10080 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10081 }
10082 }
10083
10085 {
10087 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10088
10090 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10091
10093 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10094
10096 {
10098 }
10099 }
10100
10102 {
10104 }
10105
10107 {
10110 else
10112
10114 {
10117 }
10118 else
10119 {
10122
10125 }
10126
10128 }
10129
10131 {
10133 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10134 }
10135
10137 {
10139 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10141 }
10142
10144 {
10146 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10147 }
10148
10150 {
10153
10154 OverheatingParticle OP = new OverheatingParticle();
10159
10161 }
10162
10164 {
10167
10168 return -1;
10169 }
10170
10172 {
10174 {
10177
10178 for (int i = count; i > 0; --i)
10179 {
10180 int id = i - 1;
10183
10186
10187 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10188 {
10189 if (p)
10190 {
10193 }
10194 }
10195 }
10196 }
10197 }
10198
10200 {
10202 {
10204 {
10205 int id = i - 1;
10207
10208 if (OP)
10209 {
10211
10212 if (p)
10213 {
10215 }
10216
10217 delete OP;
10218 }
10219 }
10220
10223 }
10224 }
10225
10228 {
10229 return 0.0;
10230 }
10231
10232
10234 {
10235 return 250;
10236 }
10237
10239 {
10240 return 0;
10241 }
10242
10245 {
10247 return true;
10248
10249 return false;
10250 }
10251
10254 {
10257
10259 {
10261 }
10262 else
10263 {
10264
10266 }
10267
10269 }
10270
10277 {
10278 return -1;
10279 }
10280
10281
10282
10283
10285 {
10287 {
10289 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10290
10291 if (r_index >= 0)
10292 {
10293 InventoryLocation r_il = new InventoryLocation;
10294 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10295
10296 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10299 {
10300 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10301 }
10303 {
10304 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10305 }
10306
10307 }
10308
10309 player.GetHumanInventory().ClearUserReservedLocation(this);
10310 }
10311
10314 }
10315
10316
10317
10318
10320 {
10321 return ItemBase.m_DebugActionsMask;
10322 }
10323
10325 {
10326 return ItemBase.m_DebugActionsMask & mask;
10327 }
10328
10330 {
10331 ItemBase.m_DebugActionsMask = mask;
10332 }
10333
10335 {
10336 ItemBase.m_DebugActionsMask |= mask;
10337 }
10338
10340 {
10341 ItemBase.m_DebugActionsMask &= ~mask;
10342 }
10343
10345 {
10347 {
10349 }
10350 else
10351 {
10353 }
10354 }
10355
10356
10358 {
10359 if (GetEconomyProfile())
10360 {
10361 float q_max = GetEconomyProfile().GetQuantityMax();
10362 if (q_max > 0)
10363 {
10364 float q_min = GetEconomyProfile().GetQuantityMin();
10365 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10366
10368 {
10369 ComponentEnergyManager comp = GetCompEM();
10371 {
10373 }
10374 }
10376 {
10378
10379 }
10380
10381 }
10382 }
10383 }
10384
10387 {
10388 EntityAI parent = GetHierarchyParent();
10389
10390 if (parent)
10391 {
10392 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10393 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10394 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10395 }
10396 }
10397
10400 {
10401 EntityAI parent = GetHierarchyParent();
10402
10403 if (parent)
10404 {
10405 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10406 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10407 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10408 }
10409 }
10410
10412 {
10413
10414
10415
10416
10418
10420 {
10421 if (ScriptInputUserData.CanStoreInputUserData())
10422 {
10423 ScriptInputUserData ctx = new ScriptInputUserData;
10429 ctx.
Write(use_stack_max);
10432
10434 {
10435 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10436 }
10437 }
10438 }
10439 else if (!
GetGame().IsMultiplayer())
10440 {
10442 }
10443 }
10444
10446 {
10448 }
10449
10451 {
10453 }
10454
10456 {
10458 }
10459
10461 {
10462
10463 return false;
10464 }
10465
10467 {
10468 return false;
10469 }
10470
10474 {
10475 return false;
10476 }
10477
10479 {
10480 return "";
10481 }
10482
10484
10486 {
10487 return false;
10488 }
10489
10491 {
10492 return true;
10493 }
10494
10495
10496
10498 {
10499 return true;
10500 }
10501
10503 {
10504 return true;
10505 }
10506
10508 {
10509 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10511 }
10512
10514 {
10516 }
10517
10519 {
10521 if (!is_being_placed)
10523 SetSynchDirty();
10524 }
10525
10526
10528
10530 {
10532 }
10533
10535 {
10537 }
10538
10540 {
10541 return 1;
10542 }
10543
10545 {
10546 return false;
10547 }
10548
10550 {
10552 SetSynchDirty();
10553 }
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10577
10578
10579
10580
10581
10582
10583
10584
10585
10586
10587
10588
10590 {
10591 super.OnMovedInsideCargo(container);
10592
10593 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10594 }
10595
10596 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10597 {
10598 super.EEItemLocationChanged(oldLoc,newLoc);
10599
10600 PlayerBase new_player = null;
10601 PlayerBase old_player = null;
10602
10603 if (newLoc.GetParent())
10604 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10605
10606 if (oldLoc.GetParent())
10607 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10608
10610 {
10611 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10612
10613 if (r_index >= 0)
10614 {
10615 InventoryLocation r_il = new InventoryLocation;
10616 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10617
10618 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10621 {
10622 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10623 }
10625 {
10626 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10627 }
10628
10629 }
10630 }
10631
10633 {
10634 if (new_player)
10635 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10636
10637 if (new_player == old_player)
10638 {
10639
10640 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10641 {
10643 {
10644 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10645 {
10646 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10647 }
10648 }
10649 else
10650 {
10651 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10652 }
10653 }
10654
10655 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10656 {
10657 int type = oldLoc.GetType();
10659 {
10660 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10661 }
10663 {
10664 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10665 }
10666 }
10667 if (!m_OldLocation)
10668 {
10669 m_OldLocation = new InventoryLocation;
10670 }
10671 m_OldLocation.Copy(oldLoc);
10672 }
10673 else
10674 {
10675 if (m_OldLocation)
10676 {
10677 m_OldLocation.Reset();
10678 }
10679 }
10680
10682 }
10683 else
10684 {
10685 if (new_player)
10686 {
10687 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10688 if (res_index >= 0)
10689 {
10690 InventoryLocation il = new InventoryLocation;
10691 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10693 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10696 {
10697 il.
GetParent().GetOnReleaseLock().Invoke(it);
10698 }
10700 {
10702 }
10703
10704 }
10705 }
10707 {
10708
10710 }
10711
10712 if (m_OldLocation)
10713 {
10714 m_OldLocation.Reset();
10715 }
10716 }
10717 }
10718
10719 override void EOnContact(IEntity other, Contact extra)
10720 {
10722 {
10723 int liquidType = -1;
10725 if (impactSpeed > 0.0)
10726 {
10728 #ifndef SERVER
10730 #else
10732 SetSynchDirty();
10733 #endif
10735 }
10736 }
10737
10738 #ifdef SERVER
10739 if (GetCompEM() && GetCompEM().IsPlugged())
10740 {
10741 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10742 GetCompEM().UnplugThis();
10743 }
10744 #endif
10745 }
10746
10748
10750 {
10752 }
10753
10755 {
10756
10757 }
10758
10760 {
10761 super.OnItemLocationChanged(old_owner, new_owner);
10762
10763 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10764 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10765
10766 if (!relatedPlayer && playerNew)
10767 relatedPlayer = playerNew;
10768
10769 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10770 {
10772 if (actionMgr)
10773 {
10774 ActionBase currentAction = actionMgr.GetRunningAction();
10775 if (currentAction)
10777 }
10778 }
10779
10780 Man ownerPlayerOld = null;
10781 Man ownerPlayerNew = null;
10782
10783 if (old_owner)
10784 {
10785 if (old_owner.
IsMan())
10786 {
10787 ownerPlayerOld = Man.Cast(old_owner);
10788 }
10789 else
10790 {
10791 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10792 }
10793 }
10794 else
10795 {
10797 {
10799
10800 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10801 {
10802 GetCompEM().UnplugThis();
10803 }
10804 }
10805 }
10806
10807 if (new_owner)
10808 {
10809 if (new_owner.
IsMan())
10810 {
10811 ownerPlayerNew = Man.Cast(new_owner);
10812 }
10813 else
10814 {
10815 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10816 }
10817 }
10818
10819 if (ownerPlayerOld != ownerPlayerNew)
10820 {
10821 if (ownerPlayerOld)
10822 {
10823 array<EntityAI> subItemsExit = new array<EntityAI>;
10825 for (int i = 0; i < subItemsExit.Count(); i++)
10826 {
10829 }
10830 }
10831
10832 if (ownerPlayerNew)
10833 {
10834 array<EntityAI> subItemsEnter = new array<EntityAI>;
10836 for (int j = 0; j < subItemsEnter.Count(); j++)
10837 {
10840 }
10841 }
10842 }
10843 else if (ownerPlayerNew != null)
10844 {
10845 PlayerBase nplayer;
10846 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10847 {
10848 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10850 for (int k = 0; k < subItemsUpdate.Count(); k++)
10851 {
10853 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10854 }
10855 }
10856 }
10857
10858 if (old_owner)
10859 old_owner.OnChildItemRemoved(this);
10860 if (new_owner)
10861 new_owner.OnChildItemReceived(this);
10862 }
10863
10864
10866 {
10867 super.EEDelete(parent);
10868 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10869 if (player)
10870 {
10872
10873 if (player.IsAlive())
10874 {
10875 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10876 if (r_index >= 0)
10877 {
10878 InventoryLocation r_il = new InventoryLocation;
10879 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10880
10881 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10884 {
10885 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10886 }
10888 {
10889 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10890 }
10891
10892 }
10893
10894 player.RemoveQuickBarEntityShortcut(this);
10895 }
10896 }
10897 }
10898
10900 {
10901 super.EEKilled(killer);
10902
10905 {
10906 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10907 {
10908 if (IsMagazine())
10909 {
10910 if (Magazine.Cast(this).GetAmmoCount() > 0)
10911 {
10913 }
10914 }
10915 else
10916 {
10918 }
10919 }
10920 }
10921 }
10922
10924 {
10925 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10926
10927 super.OnWasAttached(parent, slot_id);
10928
10931
10933 }
10934
10936 {
10937 super.OnWasDetached(parent, slot_id);
10938
10941 }
10942
10944 {
10945 int idx;
10948
10949 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10950 if (inventory_slots.Count() < 1)
10951 {
10952 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10953 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10954 }
10955 else
10956 {
10957 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10958 }
10959
10960 idx = inventory_slots.Find(slot);
10961 if (idx < 0)
10962 return "";
10963
10964 return attach_types.Get(idx);
10965 }
10966
10968 {
10969 int idx = -1;
10970 string slot;
10971
10974
10975 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10976 if (inventory_slots.Count() < 1)
10977 {
10978 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10979 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10980 }
10981 else
10982 {
10983 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10984 if (detach_types.Count() < 1)
10985 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10986 }
10987
10988 for (int i = 0; i < inventory_slots.Count(); i++)
10989 {
10990 slot = inventory_slots.Get(i);
10991 }
10992
10993 if (slot != "")
10994 {
10995 if (detach_types.Count() == 1)
10996 idx = 0;
10997 else
10998 idx = inventory_slots.Find(slot);
10999 }
11000 if (idx < 0)
11001 return "";
11002
11003 return detach_types.Get(idx);
11004 }
11005
11007 {
11008
11010
11011
11012 float min_time = 1;
11013 float max_time = 3;
11014 float delay = Math.RandomFloat(min_time, max_time);
11015
11016 explode_timer.Run(delay, this, "DoAmmoExplosion");
11017 }
11018
11020 {
11021 Magazine magazine = Magazine.Cast(this);
11022 int pop_sounds_count = 6;
11023 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
11024
11025
11026 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
11027 string sound_name = pop_sounds[ sound_idx ];
11029
11030
11031 magazine.ServerAddAmmoCount(-1);
11032
11033
11034 float min_temp_to_explode = 100;
11035
11036 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
11037 {
11039 }
11040 }
11041
11042
11043 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11044 {
11045 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11046
11047 const int CHANCE_DAMAGE_CARGO = 4;
11048 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11049 const int CHANCE_DAMAGE_NOTHING = 2;
11050
11052 {
11053 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11054 int chances;
11055 int rnd;
11056
11057 if (GetInventory().GetCargo())
11058 {
11059 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11060 rnd = Math.RandomInt(0,chances);
11061
11062 if (rnd < CHANCE_DAMAGE_CARGO)
11063 {
11065 }
11066 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11067 {
11069 }
11070 }
11071 else
11072 {
11073 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11074 rnd = Math.RandomInt(0,chances);
11075
11076 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11077 {
11079 }
11080 }
11081 }
11082 }
11083
11085 {
11086 if (GetInventory().GetCargo())
11087 {
11088 int item_count = GetInventory().GetCargo().GetItemCount();
11089 if (item_count > 0)
11090 {
11091 int random_pick = Math.RandomInt(0, item_count);
11093 if (!item.IsExplosive())
11094 {
11095 item.AddHealth("","",damage);
11096 return true;
11097 }
11098 }
11099 }
11100 return false;
11101 }
11102
11104 {
11105 int attachment_count = GetInventory().AttachmentCount();
11106 if (attachment_count > 0)
11107 {
11108 int random_pick = Math.RandomInt(0, attachment_count);
11109 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
11110 if (!attachment.IsExplosive())
11111 {
11112 attachment.AddHealth("","",damage);
11113 return true;
11114 }
11115 }
11116 return false;
11117 }
11118
11120 {
11122 }
11123
11125 {
11127 return GetInventory().CanRemoveEntity();
11128
11129 return false;
11130 }
11131
11133 {
11135 return;
11136
11138 {
11139 if (ScriptInputUserData.CanStoreInputUserData())
11140 {
11141 ScriptInputUserData ctx = new ScriptInputUserData;
11146 ctx.
Write(destination_entity);
11148 ctx.
Write(slot_id);
11150 }
11151 }
11152 else if (!
GetGame().IsMultiplayer())
11153 {
11155 }
11156 }
11157
11159 {
11161 return;
11162
11163 float split_quantity_new;
11167 InventoryLocation loc = new InventoryLocation;
11168
11169 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11170 {
11172 split_quantity_new = stack_max;
11173 else
11175
11176 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11177 if (new_item)
11178 {
11179 new_item.SetResultOfSplit(true);
11180 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11182 new_item.SetQuantity(split_quantity_new);
11183 }
11184 }
11185 else if (destination_entity && slot_id == -1)
11186 {
11187 if (quantity > stack_max)
11188 split_quantity_new = stack_max;
11189 else
11190 split_quantity_new = quantity;
11191
11193 {
11196 }
11197
11198 if (new_item)
11199 {
11200 new_item.SetResultOfSplit(true);
11201 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11203 new_item.SetQuantity(split_quantity_new);
11204 }
11205 }
11206 else
11207 {
11208 if (stack_max != 0)
11209 {
11211 {
11213 }
11214
11215 if (split_quantity_new == 0)
11216 {
11217 if (!
GetGame().IsMultiplayer())
11218 player.PhysicalPredictiveDropItem(this);
11219 else
11220 player.ServerDropEntity(this);
11221 return;
11222 }
11223
11225
11226 if (new_item)
11227 {
11228 new_item.SetResultOfSplit(true);
11229 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11231 new_item.SetQuantity(stack_max);
11232 new_item.PlaceOnSurface();
11233 }
11234 }
11235 }
11236 }
11237
11239 {
11241 return;
11242
11243 float split_quantity_new;
11247 InventoryLocation loc = new InventoryLocation;
11248
11249 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11250 {
11252 split_quantity_new = stack_max;
11253 else
11255
11256 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11257 if (new_item)
11258 {
11259 new_item.SetResultOfSplit(true);
11260 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11262 new_item.SetQuantity(split_quantity_new);
11263 }
11264 }
11265 else if (destination_entity && slot_id == -1)
11266 {
11267 if (quantity > stack_max)
11268 split_quantity_new = stack_max;
11269 else
11270 split_quantity_new = quantity;
11271
11273 {
11276 }
11277
11278 if (new_item)
11279 {
11280 new_item.SetResultOfSplit(true);
11281 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11283 new_item.SetQuantity(split_quantity_new);
11284 }
11285 }
11286 else
11287 {
11288 if (stack_max != 0)
11289 {
11291 {
11293 }
11294
11296
11297 if (new_item)
11298 {
11299 new_item.SetResultOfSplit(true);
11300 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11302 new_item.SetQuantity(stack_max);
11303 new_item.PlaceOnSurface();
11304 }
11305 }
11306 }
11307 }
11308
11310 {
11312 return;
11313
11315 {
11316 if (ScriptInputUserData.CanStoreInputUserData())
11317 {
11318 ScriptInputUserData ctx = new ScriptInputUserData;
11323 dst.WriteToContext(ctx);
11325 }
11326 }
11327 else if (!
GetGame().IsMultiplayer())
11328 {
11330 }
11331 }
11332
11334 {
11336 return;
11337
11339 {
11340 if (ScriptInputUserData.CanStoreInputUserData())
11341 {
11342 ScriptInputUserData ctx = new ScriptInputUserData;
11347 ctx.
Write(destination_entity);
11353 }
11354 }
11355 else if (!
GetGame().IsMultiplayer())
11356 {
11358 }
11359 }
11360
11362 {
11364 }
11365
11367 {
11369 return this;
11370
11372 float split_quantity_new;
11374 if (dst.IsValid())
11375 {
11376 int slot_id = dst.GetSlot();
11378
11379 if (quantity > stack_max)
11380 split_quantity_new = stack_max;
11381 else
11382 split_quantity_new = quantity;
11383
11385
11386 if (new_item)
11387 {
11388 new_item.SetResultOfSplit(true);
11389 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11392 }
11393
11394 return new_item;
11395 }
11396
11397 return null;
11398 }
11399
11401 {
11403 return;
11404
11406 float split_quantity_new;
11408 if (destination_entity)
11409 {
11411 if (quantity > stackable)
11412 split_quantity_new = stackable;
11413 else
11414 split_quantity_new = quantity;
11415
11416 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11417 if (new_item)
11418 {
11419 new_item.SetResultOfSplit(true);
11420 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11422 new_item.SetQuantity(split_quantity_new);
11423 }
11424 }
11425 }
11426
11428 {
11430 return;
11431
11433 {
11434 if (ScriptInputUserData.CanStoreInputUserData())
11435 {
11436 ScriptInputUserData ctx = new ScriptInputUserData;
11441 ItemBase destination_entity =
this;
11442 ctx.
Write(destination_entity);
11446 }
11447 }
11448 else if (!
GetGame().IsMultiplayer())
11449 {
11451 }
11452 }
11453
11455 {
11457 return;
11458
11460 float split_quantity_new;
11462 if (player)
11463 {
11465 if (quantity > stackable)
11466 split_quantity_new = stackable;
11467 else
11468 split_quantity_new = quantity;
11469
11470 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11471 new_item =
ItemBase.Cast(in_hands);
11472 if (new_item)
11473 {
11474 new_item.SetResultOfSplit(true);
11475 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11477 new_item.SetQuantity(split_quantity_new);
11478 }
11479 }
11480 }
11481
11483 {
11485 return;
11486
11488 float split_quantity_new = Math.Floor(quantity * 0.5);
11489
11491
11492 if (new_item)
11493 {
11494 if (new_item.GetQuantityMax() < split_quantity_new)
11495 {
11496 split_quantity_new = new_item.GetQuantityMax();
11497 }
11498
11499 new_item.SetResultOfSplit(true);
11500 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11501
11503 {
11506 }
11507 else
11508 {
11511 }
11512 }
11513 }
11514
11516 {
11518 return;
11519
11521 float split_quantity_new = Math.Floor(quantity / 2);
11522
11523 InventoryLocation invloc = new InventoryLocation;
11525
11527 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11528
11529 if (new_item)
11530 {
11531 if (new_item.GetQuantityMax() < split_quantity_new)
11532 {
11533 split_quantity_new = new_item.GetQuantityMax();
11534 }
11536 {
11539 }
11540 else
11541 {
11544 }
11545 }
11546 }
11547
11550 {
11551 SetWeightDirty();
11553
11554 if (parent)
11555 parent.OnAttachmentQuantityChangedEx(this, delta);
11556
11558 {
11560 {
11562 }
11564 {
11565 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11567 }
11568 }
11569
11570 }
11571
11574 {
11575
11576 }
11577
11580 {
11582 }
11583
11585 {
11586 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11587
11589 {
11590 if (newLevel == GameConstants.STATE_RUINED)
11591 {
11593 EntityAI parent = GetHierarchyParent();
11594 if (parent && parent.IsFireplace())
11595 {
11596 CargoBase cargo = GetInventory().GetCargo();
11597 if (cargo)
11598 {
11600 {
11602 }
11603 }
11604 }
11605 }
11606
11608 {
11609
11611 return;
11612 }
11613
11614 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11615 {
11617 }
11618 }
11619 }
11620
11621
11623 {
11624 super.OnRightClick();
11625
11627 {
11629 {
11630 if (ScriptInputUserData.CanStoreInputUserData())
11631 {
11632 vector m4[4];
11634
11635 EntityAI root = GetHierarchyRoot();
11636
11637 InventoryLocation dst = new InventoryLocation;
11639 {
11640 if (root)
11641 {
11642 root.GetTransform(m4);
11644 }
11645 else
11646 GetInventory().GetCurrentInventoryLocation(dst);
11647 }
11648 else
11649 {
11651
11652
11653 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11654 {
11655 if (root)
11656 {
11657 root.GetTransform(m4);
11659 }
11660 else
11661 GetInventory().GetCurrentInventoryLocation(dst);
11662 }
11663 else
11664 {
11665 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11666 }
11667 }
11668
11669 ScriptInputUserData ctx = new ScriptInputUserData;
11677 }
11678 }
11679 else if (!
GetGame().IsMultiplayer())
11680 {
11682 }
11683 }
11684 }
11685
11686 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11687 {
11688
11689 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11690 return false;
11691
11692 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11693 return false;
11694
11695
11697 return false;
11698
11699
11700 Magazine mag = Magazine.Cast(this);
11701 if (mag)
11702 {
11703 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11704 return false;
11705
11706 if (stack_max_limit)
11707 {
11708 Magazine other_mag = Magazine.Cast(other_item);
11709 if (other_item)
11710 {
11711 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11712 return false;
11713 }
11714
11715 }
11716 }
11717 else
11718 {
11719
11721 return false;
11722
11724 return false;
11725 }
11726
11727 PlayerBase player = null;
11728 if (CastTo(player, GetHierarchyRootPlayer()))
11729 {
11730 if (player.GetInventory().HasAttachment(this))
11731 return false;
11732
11733 if (player.IsItemsToDelete())
11734 return false;
11735 }
11736
11737 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11738 return false;
11739
11740 int slotID;
11742 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11743 return false;
11744
11745 return true;
11746 }
11747
11749 {
11751 }
11752
11754 {
11755 return m_IsResultOfSplit;
11756 }
11757
11759 {
11760 m_IsResultOfSplit = value;
11761 }
11762
11764 {
11766 }
11767
11769 {
11770 float other_item_quantity = other_item.GetQuantity();
11771 float this_free_space;
11772
11774
11776
11777 if (other_item_quantity > this_free_space)
11778 {
11779 return this_free_space;
11780 }
11781 else
11782 {
11783 return other_item_quantity;
11784 }
11785 }
11786
11788 {
11790 }
11791
11793 {
11795 return;
11796
11797 if (!IsMagazine() && other_item)
11798 {
11800 if (quantity_used != 0)
11801 {
11802 float hp1 = GetHealth01("","");
11803 float hp2 = other_item.GetHealth01("","");
11804 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11805 hpResult = hpResult / (
GetQuantity() + quantity_used);
11806
11807 hpResult *= GetMaxHealth();
11808 Math.Round(hpResult);
11809 SetHealth("", "Health", hpResult);
11810
11812 other_item.AddQuantity(-quantity_used);
11813 }
11814 }
11816 }
11817
11819 {
11820 #ifdef SERVER
11821 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11822 GetHierarchyParent().IncreaseLifetimeUp();
11823 #endif
11824 };
11825
11827 {
11828 PlayerBase p = PlayerBase.Cast(player);
11829
11830 array<int> recipesIds = p.m_Recipes;
11831 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11832 if (moduleRecipesManager)
11833 {
11834 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11835 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11836 }
11837
11838 for (int i = 0;i < recipesIds.Count(); i++)
11839 {
11840 int key = recipesIds.Get(i);
11841 string recipeName = moduleRecipesManager.GetRecipeName(key);
11843 }
11844 }
11845
11846
11847 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11848 {
11849 super.GetDebugActions(outputList);
11850
11851
11856
11857
11861
11865
11866
11869
11870
11872 {
11875 }
11876
11878
11881
11885 }
11886
11887
11888
11889
11891 {
11892 super.OnAction(action_id, player, ctx);
11893 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11894 {
11895 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11896 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11897 PlayerBase p = PlayerBase.Cast(player);
11898 if (
EActions.RECIPES_RANGE_START < 1000)
11899 {
11900 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11901 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11902 }
11903 }
11904 #ifndef SERVER
11905 else if (action_id ==
EActions.WATCH_PLAYER)
11906 {
11907 PluginDeveloper.SetDeveloperItemClientEx(player);
11908 }
11909 #endif
11911 {
11912 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11913 {
11914 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11915 OnDebugButtonPressServer(id + 1);
11916 }
11917
11918 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11919 {
11920 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11922 }
11923
11924 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11925 {
11926 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11928 }
11929
11930 else if (action_id ==
EActions.ADD_QUANTITY)
11931 {
11932 if (IsMagazine())
11933 {
11934 Magazine mag = Magazine.Cast(this);
11935 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11936 }
11937 else
11938 {
11940 }
11941
11942 if (m_EM)
11943 {
11944 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11945 }
11946
11947 }
11948
11949 else if (action_id ==
EActions.REMOVE_QUANTITY)
11950 {
11951 if (IsMagazine())
11952 {
11953 Magazine mag2 = Magazine.Cast(this);
11954 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11955 }
11956 else
11957 {
11959 }
11960 if (m_EM)
11961 {
11962 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11963 }
11964
11965 }
11966
11967 else if (action_id ==
EActions.SET_QUANTITY_0)
11968 {
11970
11971 if (m_EM)
11972 {
11973 m_EM.SetEnergy(0);
11974 }
11975 }
11976
11977 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11978 {
11980
11981 if (m_EM)
11982 {
11983 m_EM.SetEnergy(m_EM.GetEnergyMax());
11984 }
11985 }
11986
11987 else if (action_id ==
EActions.ADD_HEALTH)
11988 {
11989 AddHealth("","",GetMaxHealth("","Health")/5);
11990 }
11991 else if (action_id ==
EActions.REMOVE_HEALTH)
11992 {
11993 AddHealth("","",-GetMaxHealth("","Health")/5);
11994 }
11995 else if (action_id ==
EActions.DESTROY_HEALTH)
11996 {
11997 SetHealth01("","",0);
11998 }
11999 else if (action_id ==
EActions.WATCH_ITEM)
12000 {
12002 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12003 #ifdef DEVELOPER
12004 SetDebugDeveloper_item(this);
12005 #endif
12006 }
12007
12008 else if (action_id ==
EActions.ADD_TEMPERATURE)
12009 {
12010 AddTemperature(20);
12011
12012 }
12013
12014 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12015 {
12016 AddTemperature(-20);
12017
12018 }
12019
12020 else if (action_id ==
EActions.FLIP_FROZEN)
12021 {
12022 SetFrozen(!GetIsFrozen());
12023
12024 }
12025
12026 else if (action_id ==
EActions.ADD_WETNESS)
12027 {
12029
12030 }
12031
12032 else if (action_id ==
EActions.REMOVE_WETNESS)
12033 {
12035
12036 }
12037
12038 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12039 {
12042
12043
12044 }
12045
12046 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12047 {
12050 }
12051
12052 else if (action_id ==
EActions.MAKE_SPECIAL)
12053 {
12054 auto debugParams = DebugSpawnParams.WithPlayer(player);
12055 OnDebugSpawnEx(debugParams);
12056 }
12057
12058 else if (action_id ==
EActions.DELETE)
12059 {
12060 Delete();
12061 }
12062
12063 }
12064
12065
12066 return false;
12067 }
12068
12069
12070
12071
12075
12078
12079
12080
12082 {
12083 return false;
12084 }
12085
12086
12088 {
12089 return true;
12090 }
12091
12092
12094 {
12095 return true;
12096 }
12097
12098
12099
12101 {
12102 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12104 }
12105
12108 {
12109 return null;
12110 }
12111
12113 {
12114 return false;
12115 }
12116
12118 {
12119 return false;
12120 }
12121
12125
12126
12128 {
12129 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12130 return module_repairing.CanRepair(this, item_repair_kit);
12131 }
12132
12133
12134 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12135 {
12136 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12137 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12138 }
12139
12140
12142 {
12143
12144
12145
12146
12147
12148
12149
12150
12151 return 1;
12152 }
12153
12154
12155
12157 {
12159 }
12160
12161
12162
12164 {
12166 }
12167
12168
12177 {
12178 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12179
12180 if (player)
12181 {
12182 player.MessageStatus(text);
12183 }
12184 }
12185
12186
12195 {
12196 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12197
12198 if (player)
12199 {
12200 player.MessageAction(text);
12201 }
12202 }
12203
12204
12213 {
12214 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12215
12216 if (player)
12217 {
12218 player.MessageFriendly(text);
12219 }
12220 }
12221
12222
12231 {
12232 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12233
12234 if (player)
12235 {
12236 player.MessageImportant(text);
12237 }
12238 }
12239
12241 {
12242 return true;
12243 }
12244
12245
12246 override bool KindOf(
string tag)
12247 {
12248 bool found = false;
12249 string item_name = this.
GetType();
12252
12253 int array_size = item_tag_array.Count();
12254 for (int i = 0; i < array_size; i++)
12255 {
12256 if (item_tag_array.Get(i) == tag)
12257 {
12258 found = true;
12259 break;
12260 }
12261 }
12262 return found;
12263 }
12264
12265
12267 {
12268
12269 super.OnRPC(sender, rpc_type,ctx);
12270
12271
12272 switch (rpc_type)
12273 {
12274 #ifndef SERVER
12275 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12276 Param2<bool, string> p = new Param2<bool, string>(false, "");
12277
12279 return;
12280
12281 bool play = p.param1;
12282 string soundSet = p.param2;
12283
12284 if (play)
12285 {
12287 {
12289 {
12291 }
12292 }
12293 else
12294 {
12296 }
12297 }
12298 else
12299 {
12301 }
12302
12303 break;
12304 #endif
12305
12306 }
12307
12309 {
12311 }
12312 }
12313
12314
12315
12316
12318 {
12319 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12320 return plugin.GetID(
name);
12321 }
12322
12324 {
12325 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12326 return plugin.GetName(id);
12327 }
12328
12331 {
12332
12333
12334 int varFlags;
12335 if (!ctx.
Read(varFlags))
12336 return;
12337
12338 if (varFlags & ItemVariableFlags.FLOAT)
12339 {
12341 }
12342 }
12343
12345 {
12346
12347 super.SerializeNumericalVars(floats_out);
12348
12349
12350
12352 {
12354 }
12355
12357 {
12359 }
12360
12362 {
12364 }
12365
12367 {
12372 }
12373
12375 {
12377 }
12378 }
12379
12381 {
12382
12383 super.DeSerializeNumericalVars(floats);
12384
12385
12386 int index = 0;
12387 int mask = Math.Round(floats.Get(index));
12388
12389 index++;
12390
12392 {
12394 {
12396 }
12397 else
12398 {
12399 float quantity = floats.Get(index);
12400 SetQuantity(quantity,
true,
false,
false,
false);
12401 }
12402 index++;
12403 }
12404
12406 {
12407 float wet = floats.Get(index);
12409 index++;
12410 }
12411
12413 {
12414 int liquidtype = Math.Round(floats.Get(index));
12416 index++;
12417 }
12418
12420 {
12422 index++;
12424 index++;
12426 index++;
12428 index++;
12429 }
12430
12432 {
12433 int cleanness = Math.Round(floats.Get(index));
12435 index++;
12436 }
12437 }
12438
12440 {
12441 super.WriteVarsToCTX(ctx);
12442
12443
12445 {
12447 }
12448
12450 {
12452 }
12453
12455 {
12457 }
12458
12460 {
12461 int r,g,b,a;
12467 }
12468
12470 {
12472 }
12473 }
12474
12476 {
12477 if (!super.ReadVarsFromCTX(ctx,version))
12478 return false;
12479
12480 int intValue;
12481 float value;
12482
12483 if (version < 140)
12484 {
12485 if (!ctx.
Read(intValue))
12486 return false;
12487
12488 m_VariablesMask = intValue;
12489 }
12490
12492 {
12493 if (!ctx.
Read(value))
12494 return false;
12495
12497 {
12499 }
12500 else
12501 {
12503 }
12504 }
12505
12506 if (version < 140)
12507 {
12509 {
12510 if (!ctx.
Read(value))
12511 return false;
12512 SetTemperatureDirect(value);
12513 }
12514 }
12515
12517 {
12518 if (!ctx.
Read(value))
12519 return false;
12521 }
12522
12524 {
12525 if (!ctx.
Read(intValue))
12526 return false;
12528 }
12529
12531 {
12532 int r,g,b,a;
12534 return false;
12536 return false;
12538 return false;
12540 return false;
12541
12543 }
12544
12546 {
12547 if (!ctx.
Read(intValue))
12548 return false;
12550 }
12551
12552 if (version >= 138 && version < 140)
12553 {
12555 {
12556 if (!ctx.
Read(intValue))
12557 return false;
12558 SetFrozen(intValue);
12559 }
12560 }
12561
12562 return true;
12563 }
12564
12565
12567 {
12570 {
12572 }
12573
12574 if (!super.OnStoreLoad(ctx, version))
12575 {
12577 return false;
12578 }
12579
12580 if (version >= 114)
12581 {
12582 bool hasQuickBarIndexSaved;
12583
12584 if (!ctx.
Read(hasQuickBarIndexSaved))
12585 {
12587 return false;
12588 }
12589
12590 if (hasQuickBarIndexSaved)
12591 {
12592 int itmQBIndex;
12593
12594
12595 if (!ctx.
Read(itmQBIndex))
12596 {
12598 return false;
12599 }
12600
12601 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12602 if (itmQBIndex != -1 && parentPlayer)
12603 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12604 }
12605 }
12606 else
12607 {
12608
12609 PlayerBase player;
12610 int itemQBIndex;
12611 if (version ==
int.
MAX)
12612 {
12613 if (!ctx.
Read(itemQBIndex))
12614 {
12616 return false;
12617 }
12618 }
12619 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12620 {
12621
12622 if (!ctx.
Read(itemQBIndex))
12623 {
12625 return false;
12626 }
12627 if (itemQBIndex != -1 && player)
12628 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12629 }
12630 }
12631
12632 if (version < 140)
12633 {
12634
12635 if (!LoadVariables(ctx, version))
12636 {
12638 return false;
12639 }
12640 }
12641
12642
12644 {
12646 return false;
12647 }
12648 if (version >= 132)
12649 {
12651 if (raib)
12652 {
12654 {
12656 return false;
12657 }
12658 }
12659 }
12660
12662 return true;
12663 }
12664
12665
12666
12668 {
12669 super.OnStoreSave(ctx);
12670
12671 PlayerBase player;
12672 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12673 {
12675
12676 int itemQBIndex = -1;
12677 itemQBIndex = player.FindQuickBarEntityIndex(this);
12678 ctx.
Write(itemQBIndex);
12679 }
12680 else
12681 {
12683 }
12684
12686
12688 if (raib)
12689 {
12691 }
12692 }
12693
12694
12696 {
12697 super.AfterStoreLoad();
12698
12700 {
12702 }
12703
12705 {
12708 }
12709 }
12710
12712 {
12713 super.EEOnAfterLoad();
12714
12716 {
12718 }
12719
12722 }
12723
12725 {
12726 return false;
12727 }
12728
12729
12730
12732 {
12734 {
12735 #ifdef PLATFORM_CONSOLE
12736
12738 {
12740 if (menu)
12741 {
12743 }
12744 }
12745 #endif
12746 }
12747
12749 {
12752 }
12753
12755 {
12756 SetWeightDirty();
12758 }
12760 {
12763 }
12764
12766 {
12769 }
12771 {
12774 }
12775
12776 super.OnVariablesSynchronized();
12777 }
12778
12779
12780
12782 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12783 {
12784 if (!IsServerCheck(allow_client))
12785 return false;
12786
12788 return false;
12789
12792
12793 if (value <= (min + 0.001))
12794 value = min;
12795
12796 if (value == min)
12797 {
12798 if (destroy_config)
12799 {
12800 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12801 if (dstr)
12802 {
12804 this.Delete();
12805 return true;
12806 }
12807 }
12808 else if (destroy_forced)
12809 {
12811 this.Delete();
12812 return true;
12813 }
12814
12816 }
12817
12820
12822 {
12824
12825 if (delta)
12827 }
12828
12830
12831 return false;
12832 }
12833
12834
12836 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12837 {
12839 }
12840
12842 {
12845 }
12846
12848 {
12851 }
12852
12855 {
12856 float value_clamped = Math.Clamp(value, 0, 1);
12858 SetQuantity(result, destroy_config, destroy_forced);
12859 }
12860
12861
12864 {
12866 }
12867
12869 {
12871 }
12872
12873
12874
12875
12876
12877
12878
12879
12880
12881
12883 {
12884 int slot = -1;
12885 if (GetInventory())
12886 {
12887 InventoryLocation il = new InventoryLocation;
12888 GetInventory().GetCurrentInventoryLocation(il);
12890 }
12891
12893 }
12894
12896 {
12897 float quantity_max = 0;
12898
12900 {
12901 if (attSlotID != -1)
12902 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12903
12904 if (quantity_max <= 0)
12906 }
12907
12908 if (quantity_max <= 0)
12910
12911 return quantity_max;
12912 }
12913
12915 {
12917 }
12918
12920 {
12922 }
12923
12924
12926 {
12928 }
12929
12931 {
12933 }
12934
12936 {
12938 }
12939
12940
12942 {
12943
12944 float weightEx = GetWeightEx();
12945 float special = GetInventoryAndCargoWeight();
12946 return weightEx - special;
12947 }
12948
12949
12951 {
12953 }
12954
12956 {
12958 {
12959 #ifdef DEVELOPER
12960 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12961 {
12962 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12964 }
12965 #endif
12966
12967 return GetQuantity() * GetConfigWeightModified();
12968 }
12969 else if (HasEnergyManager())
12970 {
12971 #ifdef DEVELOPER
12972 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12973 {
12974 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12975 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12976 }
12977 #endif
12978 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12979 }
12980 else
12981 {
12982 #ifdef DEVELOPER
12983 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12984 {
12985 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12986 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12987 }
12988 #endif
12989 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12990 }
12991 }
12992
12995 {
12996 int item_count = 0;
12998
12999 if (GetInventory().GetCargo() != NULL)
13000 {
13001 item_count = GetInventory().GetCargo().GetItemCount();
13002 }
13003
13004 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
13005 {
13006 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
13007 if (item)
13008 item_count += item.GetNumberOfItems();
13009 }
13010 return item_count;
13011 }
13012
13015 {
13016 float weight = 0;
13017 float wetness = 1;
13018 if (include_wetness)
13021 {
13022 weight = wetness * m_ConfigWeight;
13023 }
13025 {
13026 weight = 1;
13027 }
13028 return weight;
13029 }
13030
13031
13032
13034 {
13035 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
13036 {
13037 GameInventory inv = GetInventory();
13038 array<EntityAI> items = new array<EntityAI>;
13040 for (int i = 0; i < items.Count(); i++)
13041 {
13043 if (item)
13044 {
13046 }
13047 }
13048 }
13049 }
13050
13051
13052
13053
13055 {
13056 float energy = 0;
13057 if (HasEnergyManager())
13058 {
13059 energy = GetCompEM().GetEnergy();
13060 }
13061 return energy;
13062 }
13063
13064
13066 {
13067 super.OnEnergyConsumed();
13068
13070 }
13071
13073 {
13074 super.OnEnergyAdded();
13075
13077 }
13078
13079
13081 {
13082 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13083 {
13085 {
13086 float energy_0to1 = GetCompEM().GetEnergy0To1();
13088 }
13089 }
13090 }
13091
13092
13094 {
13095 return ConfigGetFloat("heatIsolation");
13096 }
13097
13099 {
13101 }
13102
13104 {
13105 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13106 if (
GetGame().ConfigIsExisting(paramPath))
13108
13109 return 0.0;
13110 }
13111
13113 {
13114 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13115 if (
GetGame().ConfigIsExisting(paramPath))
13117
13118 return 0.0;
13119 }
13120
13121 override void SetWet(
float value,
bool allow_client =
false)
13122 {
13123 if (!IsServerCheck(allow_client))
13124 return;
13125
13128
13130
13131 m_VarWet = Math.Clamp(value, min, max);
13132
13134 {
13137 }
13138 }
13139
13140 override void AddWet(
float value)
13141 {
13143 }
13144
13146 {
13148 }
13149
13151 {
13153 }
13154
13156 {
13158 }
13159
13161 {
13163 }
13164
13166 {
13168 }
13169
13170 override void OnWetChanged(
float newVal,
float oldVal)
13171 {
13174 if (newLevel != oldLevel)
13175 {
13177 }
13178 }
13179
13181 {
13182 SetWeightDirty();
13183 }
13184
13186 {
13187 return GetWetLevelInternal(
m_VarWet);
13188 }
13189
13190
13191
13193 {
13195 }
13196
13198 {
13200 }
13201
13203 {
13205 }
13206
13208 {
13210 }
13211
13212
13213
13215 {
13216 if (ConfigIsExisting("itemModelLength"))
13217 {
13218 return ConfigGetFloat("itemModelLength");
13219 }
13220 return 0;
13221 }
13222
13224 {
13225 if (ConfigIsExisting("itemAttachOffset"))
13226 {
13227 return ConfigGetFloat("itemAttachOffset");
13228 }
13229 return 0;
13230 }
13231
13232 override void SetCleanness(
int value,
bool allow_client =
false)
13233 {
13234 if (!IsServerCheck(allow_client))
13235 return;
13236
13238
13240
13243 }
13244
13246 {
13248 }
13249
13251 {
13252 return true;
13253 }
13254
13255
13256
13257
13259 {
13261 }
13262
13264 {
13266 }
13267
13268
13269
13270
13271 override void SetColor(
int r,
int g,
int b,
int a)
13272 {
13278 }
13280 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13281 {
13286 }
13287
13289 {
13291 }
13292
13295 {
13296 int r,g,b,a;
13298 r = r/255;
13299 g = g/255;
13300 b = b/255;
13301 a = a/255;
13302 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13303 }
13304
13305
13306
13307 override void SetLiquidType(
int value,
bool allow_client =
false)
13308 {
13309 if (!IsServerCheck(allow_client))
13310 return;
13311
13316 }
13317
13319 {
13320 return ConfigGetInt("varLiquidTypeInit");
13321 }
13322
13324 {
13326 }
13327
13329 {
13331 SetFrozen(false);
13332 }
13333
13336 {
13337 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13338 }
13339
13340
13343 {
13344 PlayerBase nplayer;
13345 if (PlayerBase.CastTo(nplayer, player))
13346 {
13348
13349 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13350 }
13351 }
13352
13353
13356 {
13357 PlayerBase nplayer;
13358 if (PlayerBase.CastTo(nplayer,player))
13359 {
13360
13361 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13362
13363 }
13364
13365
13366 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13367
13368
13369 if (HasEnergyManager())
13370 {
13371 GetCompEM().UpdatePlugState();
13372 }
13373 }
13374
13375
13377 {
13378 super.OnPlacementStarted(player);
13379
13381 }
13382
13383 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13384 {
13386 {
13387 m_AdminLog.OnPlacementComplete(player,
this);
13388 }
13389
13390 super.OnPlacementComplete(player, position, orientation);
13391 }
13392
13393
13394
13395
13396
13398 {
13400 {
13401 return true;
13402 }
13403 else
13404 {
13405 return false;
13406 }
13407 }
13408
13409
13411 {
13413 {
13415 }
13416 }
13417
13418
13420 {
13422 }
13423
13425 {
13427 }
13428
13429 override void InsertAgent(
int agent,
float count = 1)
13430 {
13431 if (count < 1)
13432 return;
13433
13435 }
13436
13439 {
13441 }
13442
13443
13445 {
13447 }
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
13478
13479
13480
13481
13482
13483
13484
13485
13486
13487
13488
13489
13491 {
13493 return false;
13494 return true;
13495 }
13496
13498 {
13499
13501 }
13502
13503
13506 {
13507 super.CheckForRoofLimited(timeTresholdMS);
13508
13510 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13511 {
13512 m_PreviousRoofTestTime = time;
13513 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13514 }
13515 }
13516
13517
13519 {
13521 {
13522 return 0;
13523 }
13524
13525 if (GetInventory().GetAttachmentSlotsCount() != 0)
13526 {
13527 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13528 if (filter)
13529 return filter.GetProtectionLevel(type, false, system);
13530 else
13531 return 0;
13532 }
13533
13534 string subclassPath, entryName;
13535
13536 switch (type)
13537 {
13539 entryName = "biological";
13540 break;
13542 entryName = "chemical";
13543 break;
13544 default:
13545 entryName = "biological";
13546 break;
13547 }
13548
13549 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13550
13552 }
13553
13554
13555
13558 {
13559 if (!IsMagazine())
13561
13563 }
13564
13565
13566
13567
13568
13573 {
13574 return true;
13575 }
13576
13578 {
13580 }
13581
13582
13583
13584
13585
13587 {
13588 if (parent)
13589 {
13590 if (parent.IsInherited(DayZInfected))
13591 return true;
13592
13593 if (!parent.IsRuined())
13594 return true;
13595 }
13596
13597 return true;
13598 }
13599
13601 {
13602 if (!super.CanPutAsAttachment(parent))
13603 {
13604 return false;
13605 }
13606
13607 if (!IsRuined() && !parent.IsRuined())
13608 {
13609 return true;
13610 }
13611
13612 return false;
13613 }
13614
13616 {
13617
13618
13619
13620
13621 return super.CanReceiveItemIntoCargo(item);
13622 }
13623
13625 {
13626
13627
13628
13629
13630 GameInventory attachmentInv = attachment.GetInventory();
13632 {
13633 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13634 return false;
13635 }
13636
13637 InventoryLocation loc = new InventoryLocation();
13638 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13639 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13640 return false;
13641
13642 return super.CanReceiveAttachment(attachment, slotId);
13643 }
13644
13646 {
13647 if (!super.CanReleaseAttachment(attachment))
13648 return false;
13649
13650 return GetInventory().AreChildrenAccessible();
13651 }
13652
13653
13654
13655
13656
13657
13658
13659
13660
13661
13662
13663
13664
13665
13666
13667
13668
13669
13670
13671
13672
13674 {
13675 int id = muzzle_owner.GetMuzzleID();
13676 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13677
13678 if (WPOF_array)
13679 {
13680 for (int i = 0; i < WPOF_array.Count(); i++)
13681 {
13682 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13683
13684 if (WPOF)
13685 {
13686 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13687 }
13688 }
13689 }
13690 }
13691
13692
13694 {
13695 int id = muzzle_owner.GetMuzzleID();
13697
13698 if (WPOBE_array)
13699 {
13700 for (int i = 0; i < WPOBE_array.Count(); i++)
13701 {
13702 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13703
13704 if (WPOBE)
13705 {
13706 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13707 }
13708 }
13709 }
13710 }
13711
13712
13714 {
13715 int id = muzzle_owner.GetMuzzleID();
13716 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13717
13718 if (WPOOH_array)
13719 {
13720 for (int i = 0; i < WPOOH_array.Count(); i++)
13721 {
13722 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13723
13724 if (WPOOH)
13725 {
13726 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13727 }
13728 }
13729 }
13730 }
13731
13732
13734 {
13735 int id = muzzle_owner.GetMuzzleID();
13736 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13737
13738 if (WPOOH_array)
13739 {
13740 for (int i = 0; i < WPOOH_array.Count(); i++)
13741 {
13742 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13743
13744 if (WPOOH)
13745 {
13746 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13747 }
13748 }
13749 }
13750 }
13751
13752
13754 {
13755 int id = muzzle_owner.GetMuzzleID();
13756 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13757
13758 if (WPOOH_array)
13759 {
13760 for (int i = 0; i < WPOOH_array.Count(); i++)
13761 {
13762 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13763
13764 if (WPOOH)
13765 {
13766 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13767 }
13768 }
13769 }
13770 }
13771
13772
13773
13775 {
13777 {
13778 return true;
13779 }
13780
13781 return false;
13782 }
13783
13785 {
13787 {
13788 return true;
13789 }
13790
13791 return false;
13792 }
13793
13795 {
13797 {
13798 return true;
13799 }
13800
13801 return false;
13802 }
13803
13805 {
13806 return false;
13807 }
13808
13811 {
13812 return UATimeSpent.DEFAULT_DEPLOY;
13813 }
13814
13815
13816
13817
13819 {
13821 SetSynchDirty();
13822 }
13823
13825 {
13827 }
13828
13829
13831 {
13832 return false;
13833 }
13834
13837 {
13838 string att_type = "None";
13839
13840 if (ConfigIsExisting("soundAttType"))
13841 {
13842 att_type = ConfigGetString("soundAttType");
13843 }
13844
13846 }
13847
13849 {
13851 }
13852
13853
13854
13855
13856
13860
13862 {
13865
13867 }
13868
13869
13871 {
13873 return;
13874
13876
13879
13882
13883 SoundParameters params = new SoundParameters();
13887 }
13888
13889
13891 {
13893 return;
13894
13896 SetSynchDirty();
13897
13900 }
13901
13902
13904 {
13906 return;
13907
13909 SetSynchDirty();
13910
13913 }
13914
13916 {
13918 }
13919
13921 {
13923 }
13924
13927 {
13928 if (!
GetGame().IsDedicatedServer())
13929 {
13930 if (ConfigIsExisting("attachSoundSet"))
13931 {
13932 string cfg_path = "";
13933 string soundset = "";
13934 string type_name =
GetType();
13935
13938 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13939 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13940
13941 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13942 {
13943 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13944 {
13945 if (cfg_slot_array[i] == slot_type)
13946 {
13947 soundset = cfg_soundset_array[i];
13948 break;
13949 }
13950 }
13951 }
13952
13953 if (soundset != "")
13954 {
13955 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13957 }
13958 }
13959 }
13960 }
13961
13963 {
13964
13965 }
13966
13967 void OnApply(PlayerBase player);
13968
13970 {
13971 return 1.0;
13972 };
13973
13975 {
13977 }
13978
13980 {
13982 }
13983
13985
13987 {
13988 SetDynamicPhysicsLifeTime(0.01);
13990 }
13991
13993 {
13994 array<string> zone_names = new array<string>;
13995 GetDamageZones(zone_names);
13996 for (int i = 0; i < zone_names.Count(); i++)
13997 {
13998 SetHealthMax(zone_names.Get(i),"Health");
13999 }
14000 SetHealthMax("","Health");
14001 }
14002
14005 {
14006 float global_health = GetHealth01("","Health");
14007 array<string> zones = new array<string>;
14008 GetDamageZones(zones);
14009
14010 for (int i = 0; i < zones.Count(); i++)
14011 {
14012 SetHealth01(zones.Get(i),"Health",global_health);
14013 }
14014 }
14015
14018 {
14019 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14020 }
14021
14023 {
14024 if (!hasRootAsPlayer)
14025 {
14026 if (refParentIB)
14027 {
14028
14029 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14030 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14031
14032 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14033 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14034
14037 }
14038 else
14039 {
14040
14043 }
14044 }
14045 }
14046
14048 {
14050 {
14051 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14052 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
14053 {
14054 float heatPermCoef = 1.0;
14056 while (ent)
14057 {
14058 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14059 ent = ent.GetHierarchyParent();
14060 }
14061
14062 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14063 }
14064 }
14065 }
14066
14068 {
14069
14070 EntityAI parent = GetHierarchyParent();
14071 if (!parent)
14072 {
14073 hasParent = false;
14074 hasRootAsPlayer = false;
14075 }
14076 else
14077 {
14078 hasParent = true;
14079 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14080 refParentIB =
ItemBase.Cast(parent);
14081 }
14082 }
14083
14084 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14085 {
14086
14087 }
14088
14090 {
14091
14092 return false;
14093 }
14094
14096 {
14097
14098
14099 return false;
14100 }
14101
14103 {
14104
14105 return false;
14106 }
14107
14110 {
14111 return !GetIsFrozen() &&
IsOpen();
14112 }
14113
14115 {
14116 bool hasParent = false, hasRootAsPlayer = false;
14118
14119 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14120 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14121
14122 if (wwtu || foodDecay)
14123 {
14127
14128 if (processWetness || processTemperature || processDecay)
14129 {
14131
14132 if (processWetness)
14133 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14134
14135 if (processTemperature)
14137
14138 if (processDecay)
14139 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14140 }
14141 }
14142 }
14143
14146 {
14148 }
14149
14151 {
14154
14155 return super.GetTemperatureFreezeThreshold();
14156 }
14157
14159 {
14162
14163 return super.GetTemperatureThawThreshold();
14164 }
14165
14167 {
14170
14171 return super.GetItemOverheatThreshold();
14172 }
14173
14175 {
14177 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14178
14179 return super.GetTemperatureFreezeTime();
14180 }
14181
14183 {
14185 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14186
14187 return super.GetTemperatureThawTime();
14188 }
14189
14194
14196 {
14197 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14198 }
14199
14201 {
14202 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14203 }
14204
14207 {
14209 }
14210
14212 {
14214 }
14215
14217 {
14219 }
14220
14223 {
14224 return null;
14225 }
14226
14229 {
14230 return false;
14231 }
14232
14234 {
14236 {
14239 if (!trg)
14240 {
14242 explosive = this;
14243 }
14244
14245 explosive.PairRemote(trg);
14247
14248 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14249 trg.SetPersistentPairID(persistentID);
14250 explosive.SetPersistentPairID(persistentID);
14251
14252 return true;
14253 }
14254 return false;
14255 }
14256
14259 {
14260 float ret = 1.0;
14263 ret *= GetHealth01();
14264
14265 return ret;
14266 }
14267
14268 #ifdef DEVELOPER
14269 override void SetDebugItem()
14270 {
14271 super.SetDebugItem();
14272 _itemBase = this;
14273 }
14274
14276 {
14277 string text = super.GetDebugText();
14278
14280 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14281
14282 return text;
14283 }
14284 #endif
14285
14287 {
14288 return true;
14289 }
14290
14292
14294
14296 {
14299 }
14300
14301
14309
14325}
14326
14328{
14330 if (entity)
14331 {
14332 bool is_item = entity.IsInherited(
ItemBase);
14333 if (is_item && full_quantity)
14334 {
14337 }
14338 }
14339 else
14340 {
14342 return NULL;
14343 }
14344 return entity;
14345}
14346
14348{
14349 if (item)
14350 {
14351 if (health > 0)
14352 item.SetHealth("", "", health);
14353
14354 if (item.CanHaveTemperature())
14355 {
14357 if (item.CanFreeze())
14358 item.SetFrozen(false);
14359 }
14360
14361 if (item.HasEnergyManager())
14362 {
14363 if (quantity >= 0)
14364 {
14365 item.GetCompEM().SetEnergy0To1(quantity);
14366 }
14367 else
14368 {
14370 }
14371 }
14372 else if (item.IsMagazine())
14373 {
14374 Magazine mag = Magazine.Cast(item);
14375 if (quantity >= 0)
14376 {
14377 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14378 }
14379 else
14380 {
14382 }
14383
14384 }
14385 else
14386 {
14387 if (quantity >= 0)
14388 {
14389 item.SetQuantityNormalized(quantity, false);
14390 }
14391 else
14392 {
14394 }
14395
14396 }
14397 }
14398}
14399
14400#ifdef DEVELOPER
14402#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.