9517{
9519 {
9520 return true;
9521 }
9522};
9523
9524
9525
9527{
9531
9533
9536
9537
9538
9539
9540
9549
9555
9560
9565
9586 protected bool m_IsResultOfSplit
9587
9589
9594
9595
9596
9598
9602
9603
9604
9606
9609
9610
9611
9617
9618
9626
9629
9630
9632
9633
9635
9636
9641
9642
9647
9648
9650
9651
9653 {
9658
9659 if (!
GetGame().IsDedicatedServer())
9660 {
9662 {
9664
9666 {
9668 }
9669 }
9670
9673 }
9674
9675 m_OldLocation = null;
9676
9678 {
9680 }
9681
9682 if (ConfigIsExisting("headSelectionsToHide"))
9683 {
9686 }
9687
9689 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9690 {
9692 }
9693
9695
9696 m_IsResultOfSplit = false;
9697
9699 }
9700
9702 {
9703 super.InitItemVariables();
9704
9710 m_Count = ConfigGetInt(
"count");
9711
9714
9719
9722
9727
9739
9743
9744
9747 if (ConfigIsExisting("canBeSplit"))
9748 {
9751 }
9752
9754 if (ConfigIsExisting("itemBehaviour"))
9756
9757
9760 RegisterNetSyncVariableInt("m_VarLiquidType");
9761 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9762
9763 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9764 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9765 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9766
9767 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9768 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9769 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9770 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9771
9772 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9773 RegisterNetSyncVariableBool("m_IsTakeable");
9774 RegisterNetSyncVariableBool("m_IsHologram");
9775
9778 {
9781 }
9782
9784
9786 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9788
9789 }
9790
9792 {
9794 }
9795
9797 {
9800 {
9805 }
9806 }
9807
9808 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9809 {
9811 {
9814 }
9815
9817 }
9818
9820 {
9826 }
9827
9829
9831 {
9833
9834 if (!action)
9835 {
9836 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9837 return;
9838 }
9839
9841 if (!ai)
9842 {
9844 return;
9845 }
9846
9848 if (!action_array)
9849 {
9850 action_array = new array<ActionBase_Basic>;
9852 }
9853 if (LogManager.IsActionLogEnable())
9854 {
9855 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9856 }
9857
9858 if (action_array.Find(action) != -1)
9859 {
9860 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9861 }
9862 else
9863 {
9864 action_array.Insert(action);
9865 }
9866 }
9867
9869 {
9871 ActionBase action = player.GetActionManager().GetAction(actionName);
9874
9875 if (action_array)
9876 {
9877 action_array.RemoveItem(action);
9878 }
9879 }
9880
9881
9882
9884 {
9885 ActionOverrideData overrideData = new ActionOverrideData();
9889
9891 if (!actionMap)
9892 {
9895 }
9896
9897 actionMap.Insert(this.
Type(), overrideData);
9898
9899 }
9900
9902
9904
9905
9907 {
9910
9913
9914 string config_to_search = "CfgVehicles";
9915 string muzzle_owner_config;
9916
9918 {
9919 if (IsInherited(Weapon))
9920 config_to_search = "CfgWeapons";
9921
9922 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9923
9924 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9925
9927
9928 if (config_OnFire_subclass_count > 0)
9929 {
9930 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9931
9932 for (int i = 0; i < config_OnFire_subclass_count; i++)
9933 {
9934 string particle_class = "";
9936 string config_OnFire_entry = config_OnFire_class + particle_class;
9937 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9938 WPOF_array.Insert(WPOF);
9939 }
9940
9941
9943 }
9944 }
9945
9947 {
9948 config_to_search = "CfgWeapons";
9949 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9950
9951 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9952
9954
9955 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9956 {
9957 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9958
9959 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9960 {
9961 string particle_class2 = "";
9963 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9964 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9965 WPOBE_array.Insert(WPOBE);
9966 }
9967
9968
9970 }
9971 }
9972 }
9973
9974
9976 {
9979
9981 {
9982 string config_to_search = "CfgVehicles";
9983
9984 if (IsInherited(Weapon))
9985 config_to_search = "CfgWeapons";
9986
9987 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9988 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9989
9990 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9991 {
9992
9994
9996 {
9998 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10000 return;
10001 }
10002
10005
10006
10007
10009 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10010
10011 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10012 {
10013 string particle_class = "";
10015 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10017
10018 if (entry_type == CT_CLASS)
10019 {
10020 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10021 WPOOH_array.Insert(WPOF);
10022 }
10023 }
10024
10025
10027 }
10028 }
10029 }
10030
10032 {
10034 }
10035
10037 {
10039 {
10041
10044
10047
10048 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10049 }
10050 }
10051
10053 {
10055 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10056
10058 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10059
10061 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10062
10064 {
10066 }
10067 }
10068
10070 {
10072 }
10073
10075 {
10078 else
10080
10082 {
10085 }
10086 else
10087 {
10090
10093 }
10094
10096 }
10097
10099 {
10101 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10102 }
10103
10105 {
10107 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10109 }
10110
10112 {
10114 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10115 }
10116
10118 {
10121
10122 OverheatingParticle OP = new OverheatingParticle();
10127
10129 }
10130
10132 {
10135
10136 return -1;
10137 }
10138
10140 {
10142 {
10145
10146 for (int i = count; i > 0; --i)
10147 {
10148 int id = i - 1;
10151
10154
10155 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10156 {
10157 if (p)
10158 {
10161 }
10162 }
10163 }
10164 }
10165 }
10166
10168 {
10170 {
10172 {
10173 int id = i - 1;
10175
10176 if (OP)
10177 {
10179
10180 if (p)
10181 {
10183 }
10184
10185 delete OP;
10186 }
10187 }
10188
10191 }
10192 }
10193
10196 {
10197 return 0.0;
10198 }
10199
10200
10202 {
10203 return 250;
10204 }
10205
10207 {
10208 return 0;
10209 }
10210
10213 {
10215 return true;
10216
10217 return false;
10218 }
10219
10222 {
10225
10227 {
10229 }
10230 else
10231 {
10232
10234 }
10235
10237 }
10238
10245 {
10246 return -1;
10247 }
10248
10249
10250
10251
10253 {
10255 {
10257 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10258
10259 if (r_index >= 0)
10260 {
10261 InventoryLocation r_il = new InventoryLocation;
10262 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10263
10264 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10267 {
10268 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10269 }
10271 {
10272 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10273 }
10274
10275 }
10276
10277 player.GetHumanInventory().ClearUserReservedLocation(this);
10278 }
10279
10282 }
10283
10284
10285
10286
10288 {
10289 return ItemBase.m_DebugActionsMask;
10290 }
10291
10293 {
10294 return ItemBase.m_DebugActionsMask & mask;
10295 }
10296
10298 {
10299 ItemBase.m_DebugActionsMask = mask;
10300 }
10301
10303 {
10304 ItemBase.m_DebugActionsMask |= mask;
10305 }
10306
10308 {
10309 ItemBase.m_DebugActionsMask &= ~mask;
10310 }
10311
10313 {
10315 {
10317 }
10318 else
10319 {
10321 }
10322 }
10323
10324
10326 {
10327 if (GetEconomyProfile())
10328 {
10329 float q_max = GetEconomyProfile().GetQuantityMax();
10330 if (q_max > 0)
10331 {
10332 float q_min = GetEconomyProfile().GetQuantityMin();
10333 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10334
10336 {
10337 ComponentEnergyManager comp = GetCompEM();
10339 {
10341 }
10342 }
10344 {
10346
10347 }
10348
10349 }
10350 }
10351 }
10352
10355 {
10356 EntityAI parent = GetHierarchyParent();
10357
10358 if (parent)
10359 {
10360 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10361 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10362 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10363 }
10364 }
10365
10368 {
10369 EntityAI parent = GetHierarchyParent();
10370
10371 if (parent)
10372 {
10373 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10374 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10375 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10376 }
10377 }
10378
10380 {
10381
10382
10383
10384
10386
10388 {
10389 if (ScriptInputUserData.CanStoreInputUserData())
10390 {
10391 ScriptInputUserData ctx = new ScriptInputUserData;
10397 ctx.
Write(use_stack_max);
10400
10402 {
10403 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10404 }
10405 }
10406 }
10407 else if (!
GetGame().IsMultiplayer())
10408 {
10410 }
10411 }
10412
10414 {
10416 }
10417
10419 {
10421 }
10422
10424 {
10426 }
10427
10429 {
10430
10431 return false;
10432 }
10433
10435 {
10436 return false;
10437 }
10438
10442 {
10443 return false;
10444 }
10445
10447 {
10448 return "";
10449 }
10450
10452
10454 {
10455 return false;
10456 }
10457
10459 {
10460 return true;
10461 }
10462
10463
10464
10466 {
10467 return true;
10468 }
10469
10471 {
10472 return true;
10473 }
10474
10476 {
10477 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10479 }
10480
10482 {
10484 }
10485
10487 {
10489 if (!is_being_placed)
10491 SetSynchDirty();
10492 }
10493
10494
10496
10498 {
10500 }
10501
10503 {
10505 }
10506
10508 {
10509 return 1;
10510 }
10511
10513 {
10514 return false;
10515 }
10516
10518 {
10520 SetSynchDirty();
10521 }
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10558 {
10559 super.OnMovedInsideCargo(container);
10560
10561 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10562 }
10563
10564 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10565 {
10566 super.EEItemLocationChanged(oldLoc,newLoc);
10567
10568 PlayerBase new_player = null;
10569 PlayerBase old_player = null;
10570
10571 if (newLoc.GetParent())
10572 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10573
10574 if (oldLoc.GetParent())
10575 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10576
10578 {
10579 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10580
10581 if (r_index >= 0)
10582 {
10583 InventoryLocation r_il = new InventoryLocation;
10584 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10585
10586 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10589 {
10590 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10591 }
10593 {
10594 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10595 }
10596
10597 }
10598 }
10599
10601 {
10602 if (new_player)
10603 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10604
10605 if (new_player == old_player)
10606 {
10607
10608 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10609 {
10611 {
10612 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10613 {
10614 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10615 }
10616 }
10617 else
10618 {
10619 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10620 }
10621 }
10622
10623 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10624 {
10625 int type = oldLoc.GetType();
10627 {
10628 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10629 }
10631 {
10632 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10633 }
10634 }
10635 if (!m_OldLocation)
10636 {
10637 m_OldLocation = new InventoryLocation;
10638 }
10639 m_OldLocation.Copy(oldLoc);
10640 }
10641 else
10642 {
10643 if (m_OldLocation)
10644 {
10645 m_OldLocation.Reset();
10646 }
10647 }
10648
10650 }
10651 else
10652 {
10653 if (new_player)
10654 {
10655 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10656 if (res_index >= 0)
10657 {
10658 InventoryLocation il = new InventoryLocation;
10659 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10661 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10664 {
10665 il.
GetParent().GetOnReleaseLock().Invoke(it);
10666 }
10668 {
10670 }
10671
10672 }
10673 }
10675 {
10676
10678 }
10679
10680 if (m_OldLocation)
10681 {
10682 m_OldLocation.Reset();
10683 }
10684 }
10685 }
10686
10687 override void EOnContact(IEntity other, Contact extra)
10688 {
10690 {
10691 int liquidType = -1;
10693 if (impactSpeed > 0.0)
10694 {
10696 #ifndef SERVER
10698 #else
10700 SetSynchDirty();
10701 #endif
10703 }
10704 }
10705
10706 #ifdef SERVER
10707 if (GetCompEM() && GetCompEM().IsPlugged())
10708 {
10709 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10710 GetCompEM().UnplugThis();
10711 }
10712 #endif
10713 }
10714
10716
10718 {
10720 }
10721
10723 {
10724
10725 }
10726
10728 {
10729 super.OnItemLocationChanged(old_owner, new_owner);
10730
10731 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10732 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10733
10734 if (!relatedPlayer && playerNew)
10735 relatedPlayer = playerNew;
10736
10737 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10738 {
10740 if (actionMgr)
10741 {
10742 ActionBase currentAction = actionMgr.GetRunningAction();
10743 if (currentAction)
10745 }
10746 }
10747
10748 Man ownerPlayerOld = null;
10749 Man ownerPlayerNew = null;
10750
10751 if (old_owner)
10752 {
10753 if (old_owner.
IsMan())
10754 {
10755 ownerPlayerOld = Man.Cast(old_owner);
10756 }
10757 else
10758 {
10759 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10760 }
10761 }
10762 else
10763 {
10765 {
10767
10768 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10769 {
10770 GetCompEM().UnplugThis();
10771 }
10772 }
10773 }
10774
10775 if (new_owner)
10776 {
10777 if (new_owner.
IsMan())
10778 {
10779 ownerPlayerNew = Man.Cast(new_owner);
10780 }
10781 else
10782 {
10783 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10784 }
10785 }
10786
10787 if (ownerPlayerOld != ownerPlayerNew)
10788 {
10789 if (ownerPlayerOld)
10790 {
10791 array<EntityAI> subItemsExit = new array<EntityAI>;
10793 for (int i = 0; i < subItemsExit.Count(); i++)
10794 {
10797 }
10798 }
10799
10800 if (ownerPlayerNew)
10801 {
10802 array<EntityAI> subItemsEnter = new array<EntityAI>;
10804 for (int j = 0; j < subItemsEnter.Count(); j++)
10805 {
10808 }
10809 }
10810 }
10811 else if (ownerPlayerNew != null)
10812 {
10813 PlayerBase nplayer;
10814 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10815 {
10816 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10818 for (int k = 0; k < subItemsUpdate.Count(); k++)
10819 {
10821 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10822 }
10823 }
10824 }
10825
10826 if (old_owner)
10827 old_owner.OnChildItemRemoved(this);
10828 if (new_owner)
10829 new_owner.OnChildItemReceived(this);
10830 }
10831
10832
10834 {
10835 super.EEDelete(parent);
10836 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10837 if (player)
10838 {
10840
10841 if (player.IsAlive())
10842 {
10843 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10844 if (r_index >= 0)
10845 {
10846 InventoryLocation r_il = new InventoryLocation;
10847 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10848
10849 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10852 {
10853 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10854 }
10856 {
10857 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10858 }
10859
10860 }
10861
10862 player.RemoveQuickBarEntityShortcut(this);
10863 }
10864 }
10865 }
10866
10868 {
10869 super.EEKilled(killer);
10870
10873 {
10874 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10875 {
10876 if (IsMagazine())
10877 {
10878 if (Magazine.Cast(this).GetAmmoCount() > 0)
10879 {
10881 }
10882 }
10883 else
10884 {
10886 }
10887 }
10888 }
10889 }
10890
10892 {
10893 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10894
10895 super.OnWasAttached(parent, slot_id);
10896
10899
10901 }
10902
10904 {
10905 super.OnWasDetached(parent, slot_id);
10906
10909 }
10910
10912 {
10913 int idx;
10916
10917 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10918 if (inventory_slots.Count() < 1)
10919 {
10920 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10921 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10922 }
10923 else
10924 {
10925 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10926 }
10927
10928 idx = inventory_slots.Find(slot);
10929 if (idx < 0)
10930 return "";
10931
10932 return attach_types.Get(idx);
10933 }
10934
10936 {
10937 int idx = -1;
10938 string slot;
10939
10942
10943 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10944 if (inventory_slots.Count() < 1)
10945 {
10946 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10947 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10948 }
10949 else
10950 {
10951 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10952 if (detach_types.Count() < 1)
10953 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10954 }
10955
10956 for (int i = 0; i < inventory_slots.Count(); i++)
10957 {
10958 slot = inventory_slots.Get(i);
10959 }
10960
10961 if (slot != "")
10962 {
10963 if (detach_types.Count() == 1)
10964 idx = 0;
10965 else
10966 idx = inventory_slots.Find(slot);
10967 }
10968 if (idx < 0)
10969 return "";
10970
10971 return detach_types.Get(idx);
10972 }
10973
10975 {
10976
10978
10979
10980 float min_time = 1;
10981 float max_time = 3;
10982 float delay = Math.RandomFloat(min_time, max_time);
10983
10984 explode_timer.Run(delay, this, "DoAmmoExplosion");
10985 }
10986
10988 {
10989 Magazine magazine = Magazine.Cast(this);
10990 int pop_sounds_count = 6;
10991 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10992
10993
10994 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10995 string sound_name = pop_sounds[ sound_idx ];
10997
10998
10999 magazine.ServerAddAmmoCount(-1);
11000
11001
11002 float min_temp_to_explode = 100;
11003
11004 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
11005 {
11007 }
11008 }
11009
11010
11011 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11012 {
11013 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11014
11015 const int CHANCE_DAMAGE_CARGO = 4;
11016 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11017 const int CHANCE_DAMAGE_NOTHING = 2;
11018
11020 {
11021 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11022 int chances;
11023 int rnd;
11024
11025 if (GetInventory().GetCargo())
11026 {
11027 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11028 rnd = Math.RandomInt(0,chances);
11029
11030 if (rnd < CHANCE_DAMAGE_CARGO)
11031 {
11033 }
11034 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11035 {
11037 }
11038 }
11039 else
11040 {
11041 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11042 rnd = Math.RandomInt(0,chances);
11043
11044 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11045 {
11047 }
11048 }
11049 }
11050 }
11051
11053 {
11054 if (GetInventory().GetCargo())
11055 {
11056 int item_count = GetInventory().GetCargo().GetItemCount();
11057 if (item_count > 0)
11058 {
11059 int random_pick = Math.RandomInt(0, item_count);
11061 if (!item.IsExplosive())
11062 {
11063 item.AddHealth("","",damage);
11064 return true;
11065 }
11066 }
11067 }
11068 return false;
11069 }
11070
11072 {
11073 int attachment_count = GetInventory().AttachmentCount();
11074 if (attachment_count > 0)
11075 {
11076 int random_pick = Math.RandomInt(0, attachment_count);
11077 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
11078 if (!attachment.IsExplosive())
11079 {
11080 attachment.AddHealth("","",damage);
11081 return true;
11082 }
11083 }
11084 return false;
11085 }
11086
11088 {
11090 }
11091
11093 {
11095 return GetInventory().CanRemoveEntity();
11096
11097 return false;
11098 }
11099
11101 {
11102
11104 return false;
11105
11106
11108 return false;
11109
11110
11111
11113 if (delta == 0)
11114 return false;
11115
11116
11117 return true;
11118 }
11119
11121 {
11123 {
11124 if (ScriptInputUserData.CanStoreInputUserData())
11125 {
11126 ScriptInputUserData ctx = new ScriptInputUserData;
11131 ctx.
Write(destination_entity);
11133 ctx.
Write(slot_id);
11135 }
11136 }
11137 else if (!
GetGame().IsMultiplayer())
11138 {
11140 }
11141 }
11142
11144 {
11145 float split_quantity_new;
11149 InventoryLocation loc = new InventoryLocation;
11150
11151 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11152 {
11154 split_quantity_new = stack_max;
11155 else
11157
11159 {
11160 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11161 if (new_item)
11162 {
11163 new_item.SetResultOfSplit(true);
11164 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11166 new_item.
SetQuantity(split_quantity_new,
false,
true);
11167 }
11168 }
11169 }
11170 else if (destination_entity && slot_id == -1)
11171 {
11172 if (quantity > stack_max)
11173 split_quantity_new = stack_max;
11174 else
11175 split_quantity_new = quantity;
11176
11178 {
11180 {
11183 }
11184
11185 if (new_item)
11186 {
11187 new_item.SetResultOfSplit(true);
11188 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11190 new_item.
SetQuantity(split_quantity_new,
false,
true);
11191 }
11192 }
11193 }
11194 else
11195 {
11196 if (stack_max != 0)
11197 {
11199 {
11201 }
11202
11203 if (split_quantity_new == 0)
11204 {
11205 if (!
GetGame().IsMultiplayer())
11206 player.PhysicalPredictiveDropItem(this);
11207 else
11208 player.ServerDropEntity(this);
11209 return;
11210 }
11211
11213 {
11215
11216 if (new_item)
11217 {
11218 new_item.SetResultOfSplit(true);
11219 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11222 new_item.PlaceOnSurface();
11223 }
11224 }
11225 }
11226 }
11227 }
11228
11230 {
11231 float split_quantity_new;
11235 InventoryLocation loc = new InventoryLocation;
11236
11237 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11238 {
11240 split_quantity_new = stack_max;
11241 else
11243
11245 {
11246 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11247 if (new_item)
11248 {
11249 new_item.SetResultOfSplit(true);
11250 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11252 new_item.
SetQuantity(split_quantity_new,
false,
true);
11253 }
11254 }
11255 }
11256 else if (destination_entity && slot_id == -1)
11257 {
11258 if (quantity > stack_max)
11259 split_quantity_new = stack_max;
11260 else
11261 split_quantity_new = quantity;
11262
11264 {
11266 {
11269 }
11270
11271 if (new_item)
11272 {
11273 new_item.SetResultOfSplit(true);
11274 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11276 new_item.
SetQuantity(split_quantity_new,
false,
true);
11277 }
11278 }
11279 }
11280 else
11281 {
11282 if (stack_max != 0)
11283 {
11285 {
11287 }
11288
11290 {
11292
11293 if (new_item)
11294 {
11295 new_item.SetResultOfSplit(true);
11296 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11299 new_item.PlaceOnSurface();
11300 }
11301 }
11302 }
11303 }
11304 }
11305
11307 {
11309 {
11310 if (ScriptInputUserData.CanStoreInputUserData())
11311 {
11312 ScriptInputUserData ctx = new ScriptInputUserData;
11317 dst.WriteToContext(ctx);
11319 }
11320 }
11321 else if (!
GetGame().IsMultiplayer())
11322 {
11324 }
11325 }
11326
11328 {
11330 {
11331 if (ScriptInputUserData.CanStoreInputUserData())
11332 {
11333 ScriptInputUserData ctx = new ScriptInputUserData;
11338 ctx.
Write(destination_entity);
11344 }
11345 }
11346 else if (!
GetGame().IsMultiplayer())
11347 {
11349 }
11350 }
11351
11353 {
11355 }
11356
11358 {
11360 float split_quantity_new;
11362 if (dst.IsValid())
11363 {
11364 int slot_id = dst.GetSlot();
11366
11367 if (quantity > stack_max)
11368 split_quantity_new = stack_max;
11369 else
11370 split_quantity_new = quantity;
11371
11373 {
11375
11376 if (new_item)
11377 {
11378 new_item.SetResultOfSplit(true);
11379 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11381 new_item.
SetQuantity(split_quantity_new,
false,
true);
11382 }
11383
11384 return new_item;
11385 }
11386 }
11387
11388 return null;
11389 }
11390
11392 {
11394 float split_quantity_new;
11396 if (destination_entity)
11397 {
11399 if (quantity > stackable)
11400 split_quantity_new = stackable;
11401 else
11402 split_quantity_new = quantity;
11403
11405 {
11406 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11407 if (new_item)
11408 {
11409 new_item.SetResultOfSplit(true);
11410 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11412 new_item.
SetQuantity(split_quantity_new,
false,
true);
11413 }
11414 }
11415 }
11416 }
11417
11419 {
11421 {
11422 if (ScriptInputUserData.CanStoreInputUserData())
11423 {
11424 ScriptInputUserData ctx = new ScriptInputUserData;
11429 ItemBase destination_entity =
this;
11430 ctx.
Write(destination_entity);
11434 }
11435 }
11436 else if (!
GetGame().IsMultiplayer())
11437 {
11439 }
11440 }
11441
11443 {
11445 float split_quantity_new;
11447 if (player)
11448 {
11450 if (quantity > stackable)
11451 split_quantity_new = stackable;
11452 else
11453 split_quantity_new = quantity;
11454
11456 {
11457 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11458 new_item =
ItemBase.Cast(in_hands);
11459 if (new_item)
11460 {
11461 new_item.SetResultOfSplit(true);
11462 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11464 new_item.SetQuantity(split_quantity_new, false, true);
11465 }
11466 }
11467 }
11468 }
11469
11471 {
11473 float split_quantity_new = Math.Floor(quantity * 0.5);
11474
11476 return;
11477
11479
11480 if (new_item)
11481 {
11482 if (new_item.GetQuantityMax() < split_quantity_new)
11483 {
11484 split_quantity_new = new_item.GetQuantityMax();
11485 }
11486
11487 new_item.SetResultOfSplit(true);
11488 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11489
11491 {
11494 }
11495 else
11496 {
11498 new_item.
SetQuantity(split_quantity_new,
false,
true);
11499 }
11500 }
11501 }
11502
11504 {
11506 float split_quantity_new = Math.Floor(quantity / 2);
11507
11509 return;
11510
11511 InventoryLocation invloc = new InventoryLocation;
11513
11515 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11516
11517 if (new_item)
11518 {
11519 if (new_item.GetQuantityMax() < split_quantity_new)
11520 {
11521 split_quantity_new = new_item.GetQuantityMax();
11522 }
11524 {
11527 }
11528 else if (split_quantity_new > 1)
11529 {
11531 new_item.
SetQuantity(split_quantity_new,
false,
true);
11532 }
11533 }
11534 }
11535
11538 {
11539 SetWeightDirty();
11541
11542 if (parent)
11543 parent.OnAttachmentQuantityChangedEx(this, delta);
11544
11546 {
11548 {
11550 }
11552 {
11553 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11555 }
11556 }
11557
11558 }
11559
11562 {
11563
11564 }
11565
11568 {
11570 }
11571
11573 {
11574 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11575
11577 {
11578 if (newLevel == GameConstants.STATE_RUINED)
11579 {
11581 EntityAI parent = GetHierarchyParent();
11582 if (parent && parent.IsFireplace())
11583 {
11584 CargoBase cargo = GetInventory().GetCargo();
11585 if (cargo)
11586 {
11588 {
11590 }
11591 }
11592 }
11593 }
11594
11596 {
11597
11599 return;
11600 }
11601
11602 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11603 {
11605 }
11606 }
11607 }
11608
11609
11611 {
11612 super.OnRightClick();
11613
11615 {
11617 {
11618 if (ScriptInputUserData.CanStoreInputUserData())
11619 {
11620 EntityAI root = GetHierarchyRoot();
11621 Man playerOwner = GetHierarchyRootPlayer();
11622 InventoryLocation dst = new InventoryLocation;
11623
11624
11625 if (!playerOwner && root && root == this)
11626 {
11628 }
11629 else
11630 {
11631
11632 GetInventory().GetCurrentInventoryLocation(dst);
11634 {
11637 {
11639 }
11640 else
11641 {
11643
11644
11645 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11646 {
11648 }
11649 else
11650 {
11651 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11652 }
11653 }
11654 }
11655 }
11656
11657 ScriptInputUserData ctx = new ScriptInputUserData;
11665 }
11666 }
11667 else if (!
GetGame().IsMultiplayer())
11668 {
11670 }
11671 }
11672 }
11673
11675 {
11676 if (root)
11677 {
11678 vector m4[4];
11679 root.GetTransform(m4);
11680 dst.SetGround(this, m4);
11681 }
11682 else
11683 {
11684 GetInventory().GetCurrentInventoryLocation(dst);
11685 }
11686 }
11687
11688 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11689 {
11690
11691 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11692 return false;
11693
11694 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11695 return false;
11696
11697
11699 return false;
11700
11701
11702 Magazine mag = Magazine.Cast(this);
11703 if (mag)
11704 {
11705 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11706 return false;
11707
11708 if (stack_max_limit)
11709 {
11710 Magazine other_mag = Magazine.Cast(other_item);
11711 if (other_item)
11712 {
11713 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11714 return false;
11715 }
11716
11717 }
11718 }
11719 else
11720 {
11721
11723 return false;
11724
11726 return false;
11727 }
11728
11729 PlayerBase player = null;
11730 if (CastTo(player, GetHierarchyRootPlayer()))
11731 {
11732 if (player.GetInventory().HasAttachment(this))
11733 return false;
11734
11735 if (player.IsItemsToDelete())
11736 return false;
11737 }
11738
11739 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11740 return false;
11741
11742 int slotID;
11744 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11745 return false;
11746
11747 return true;
11748 }
11749
11751 {
11753 }
11754
11756 {
11757 return m_IsResultOfSplit;
11758 }
11759
11761 {
11762 m_IsResultOfSplit = value;
11763 }
11764
11766 {
11768 }
11769
11771 {
11772 float other_item_quantity = other_item.GetQuantity();
11773 float this_free_space;
11774
11776
11778
11779 if (other_item_quantity > this_free_space)
11780 {
11781 return this_free_space;
11782 }
11783 else
11784 {
11785 return other_item_quantity;
11786 }
11787 }
11788
11790 {
11792 }
11793
11795 {
11797 return;
11798
11799 if (!IsMagazine() && other_item)
11800 {
11802 if (quantity_used != 0)
11803 {
11804 float hp1 = GetHealth01("","");
11805 float hp2 = other_item.GetHealth01("","");
11806 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11807 hpResult = hpResult / (
GetQuantity() + quantity_used);
11808
11809 hpResult *= GetMaxHealth();
11810 Math.Round(hpResult);
11811 SetHealth("", "Health", hpResult);
11812
11814 other_item.AddQuantity(-quantity_used);
11815 }
11816 }
11818 }
11819
11821 {
11822 #ifdef SERVER
11823 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11824 GetHierarchyParent().IncreaseLifetimeUp();
11825 #endif
11826 };
11827
11829 {
11830 PlayerBase p = PlayerBase.Cast(player);
11831
11832 array<int> recipesIds = p.m_Recipes;
11833 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11834 if (moduleRecipesManager)
11835 {
11836 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11837 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11838 }
11839
11840 for (int i = 0;i < recipesIds.Count(); i++)
11841 {
11842 int key = recipesIds.Get(i);
11843 string recipeName = moduleRecipesManager.GetRecipeName(key);
11845 }
11846 }
11847
11848
11849 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11850 {
11851 super.GetDebugActions(outputList);
11852
11853
11859
11860
11865
11870
11871
11875
11876
11878 {
11882 }
11883
11886
11887
11891
11893
11894 InventoryLocation loc = new InventoryLocation();
11895 GetInventory().GetCurrentInventoryLocation(loc);
11897 {
11898 if (Gizmo_IsSupported())
11901 }
11902
11904 }
11905
11906
11907
11908
11910 {
11911 super.OnAction(action_id, player, ctx);
11912
11914 {
11915 switch (action_id)
11916 {
11919 return true;
11922 return true;
11923 }
11924 }
11925
11927 {
11928 switch (action_id)
11929 {
11931 Delete();
11932 return true;
11933 }
11934 }
11935
11936 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11937 {
11938 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11939 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11940 PlayerBase p = PlayerBase.Cast(player);
11941 if (
EActions.RECIPES_RANGE_START < 1000)
11942 {
11943 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11944 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11945 }
11946 }
11947 #ifndef SERVER
11948 else if (action_id ==
EActions.WATCH_PLAYER)
11949 {
11950 PluginDeveloper.SetDeveloperItemClientEx(player);
11951 }
11952 #endif
11954 {
11955 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11956 {
11957 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11958 OnDebugButtonPressServer(id + 1);
11959 }
11960
11961 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11962 {
11963 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11965 }
11966
11967 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11968 {
11969 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11971 }
11972
11973 else if (action_id ==
EActions.ADD_QUANTITY)
11974 {
11975 if (IsMagazine())
11976 {
11977 Magazine mag = Magazine.Cast(this);
11978 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11979 }
11980 else
11981 {
11983 }
11984
11985 if (m_EM)
11986 {
11987 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11988 }
11989
11990 }
11991
11992 else if (action_id ==
EActions.REMOVE_QUANTITY)
11993 {
11994 if (IsMagazine())
11995 {
11996 Magazine mag2 = Magazine.Cast(this);
11997 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11998 }
11999 else
12000 {
12002 }
12003 if (m_EM)
12004 {
12005 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12006 }
12007
12008 }
12009
12010 else if (action_id ==
EActions.SET_QUANTITY_0)
12011 {
12013
12014 if (m_EM)
12015 {
12016 m_EM.SetEnergy(0);
12017 }
12018 }
12019
12020 else if (action_id ==
EActions.SET_MAX_QUANTITY)
12021 {
12023
12024 if (m_EM)
12025 {
12026 m_EM.SetEnergy(m_EM.GetEnergyMax());
12027 }
12028 }
12029
12030 else if (action_id ==
EActions.ADD_HEALTH)
12031 {
12032 AddHealth("","",GetMaxHealth("","Health")/5);
12033 }
12034 else if (action_id ==
EActions.REMOVE_HEALTH)
12035 {
12036 AddHealth("","",-GetMaxHealth("","Health")/5);
12037 }
12038 else if (action_id ==
EActions.DESTROY_HEALTH)
12039 {
12040 SetHealth01("","",0);
12041 }
12042 else if (action_id ==
EActions.WATCH_ITEM)
12043 {
12045 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12046 #ifdef DEVELOPER
12047 SetDebugDeveloper_item(this);
12048 #endif
12049 }
12050
12051 else if (action_id ==
EActions.ADD_TEMPERATURE)
12052 {
12053 AddTemperature(20);
12054
12055 }
12056
12057 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12058 {
12059 AddTemperature(-20);
12060
12061 }
12062
12063 else if (action_id ==
EActions.FLIP_FROZEN)
12064 {
12065 SetFrozen(!GetIsFrozen());
12066
12067 }
12068
12069 else if (action_id ==
EActions.ADD_WETNESS)
12070 {
12072
12073 }
12074
12075 else if (action_id ==
EActions.REMOVE_WETNESS)
12076 {
12078
12079 }
12080
12081 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12082 {
12085
12086
12087 }
12088
12089 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12090 {
12093 }
12094
12095 else if (action_id ==
EActions.MAKE_SPECIAL)
12096 {
12097 auto debugParams = DebugSpawnParams.WithPlayer(player);
12098 OnDebugSpawnEx(debugParams);
12099 }
12100
12101 }
12102
12103
12104 return false;
12105 }
12106
12107
12108
12109
12113
12116
12117
12118
12120 {
12121 return false;
12122 }
12123
12124
12126 {
12127 return true;
12128 }
12129
12130
12132 {
12133 return true;
12134 }
12135
12136
12137
12139 {
12140 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12142 }
12143
12146 {
12147 return null;
12148 }
12149
12151 {
12152 return false;
12153 }
12154
12156 {
12157 return false;
12158 }
12159
12163
12164
12166 {
12167 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12168 return module_repairing.CanRepair(this, item_repair_kit);
12169 }
12170
12171
12172 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12173 {
12174 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12175 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12176 }
12177
12178
12180 {
12181
12182
12183
12184
12185
12186
12187
12188
12189 return 1;
12190 }
12191
12192
12193
12195 {
12197 }
12198
12199
12200
12202 {
12204 }
12205
12206
12215 {
12216 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12217
12218 if (player)
12219 {
12220 player.MessageStatus(text);
12221 }
12222 }
12223
12224
12233 {
12234 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12235
12236 if (player)
12237 {
12238 player.MessageAction(text);
12239 }
12240 }
12241
12242
12251 {
12252 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12253
12254 if (player)
12255 {
12256 player.MessageFriendly(text);
12257 }
12258 }
12259
12260
12269 {
12270 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12271
12272 if (player)
12273 {
12274 player.MessageImportant(text);
12275 }
12276 }
12277
12279 {
12280 return true;
12281 }
12282
12283
12284 override bool KindOf(
string tag)
12285 {
12286 bool found = false;
12287 string item_name = this.
GetType();
12290
12291 int array_size = item_tag_array.Count();
12292 for (int i = 0; i < array_size; i++)
12293 {
12294 if (item_tag_array.Get(i) == tag)
12295 {
12296 found = true;
12297 break;
12298 }
12299 }
12300 return found;
12301 }
12302
12303
12305 {
12306
12307 super.OnRPC(sender, rpc_type,ctx);
12308
12309
12310 switch (rpc_type)
12311 {
12312 #ifndef SERVER
12313 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12314 Param2<bool, string> p = new Param2<bool, string>(false, "");
12315
12317 return;
12318
12319 bool play = p.param1;
12320 string soundSet = p.param2;
12321
12322 if (play)
12323 {
12325 {
12327 {
12329 }
12330 }
12331 else
12332 {
12334 }
12335 }
12336 else
12337 {
12339 }
12340
12341 break;
12342 #endif
12343
12344 }
12345
12347 {
12349 }
12350 }
12351
12352
12353
12354
12356 {
12357 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12358 return plugin.GetID(
name);
12359 }
12360
12362 {
12363 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12364 return plugin.GetName(id);
12365 }
12366
12369 {
12370
12371
12372 int varFlags;
12373 if (!ctx.
Read(varFlags))
12374 return;
12375
12376 if (varFlags & ItemVariableFlags.FLOAT)
12377 {
12379 }
12380 }
12381
12383 {
12384
12385 super.SerializeNumericalVars(floats_out);
12386
12387
12388
12390 {
12392 }
12393
12395 {
12397 }
12398
12400 {
12402 }
12403
12405 {
12410 }
12411
12413 {
12415 }
12416 }
12417
12419 {
12420
12421 super.DeSerializeNumericalVars(floats);
12422
12423
12424 int index = 0;
12425 int mask = Math.Round(floats.Get(index));
12426
12427 index++;
12428
12430 {
12432 {
12434 }
12435 else
12436 {
12437 float quantity = floats.Get(index);
12438 SetQuantity(quantity,
true,
false,
false,
false);
12439 }
12440 index++;
12441 }
12442
12444 {
12445 float wet = floats.Get(index);
12447 index++;
12448 }
12449
12451 {
12452 int liquidtype = Math.Round(floats.Get(index));
12454 index++;
12455 }
12456
12458 {
12460 index++;
12462 index++;
12464 index++;
12466 index++;
12467 }
12468
12470 {
12471 int cleanness = Math.Round(floats.Get(index));
12473 index++;
12474 }
12475 }
12476
12478 {
12479 super.WriteVarsToCTX(ctx);
12480
12481
12483 {
12485 }
12486
12488 {
12490 }
12491
12493 {
12495 }
12496
12498 {
12499 int r,g,b,a;
12505 }
12506
12508 {
12510 }
12511 }
12512
12514 {
12515 if (!super.ReadVarsFromCTX(ctx,version))
12516 return false;
12517
12518 int intValue;
12519 float value;
12520
12521 if (version < 140)
12522 {
12523 if (!ctx.
Read(intValue))
12524 return false;
12525
12526 m_VariablesMask = intValue;
12527 }
12528
12530 {
12531 if (!ctx.
Read(value))
12532 return false;
12533
12535 {
12537 }
12538 else
12539 {
12541 }
12542 }
12543
12544 if (version < 140)
12545 {
12547 {
12548 if (!ctx.
Read(value))
12549 return false;
12550 SetTemperatureDirect(value);
12551 }
12552 }
12553
12555 {
12556 if (!ctx.
Read(value))
12557 return false;
12559 }
12560
12562 {
12563 if (!ctx.
Read(intValue))
12564 return false;
12566 }
12567
12569 {
12570 int r,g,b,a;
12572 return false;
12574 return false;
12576 return false;
12578 return false;
12579
12581 }
12582
12584 {
12585 if (!ctx.
Read(intValue))
12586 return false;
12588 }
12589
12590 if (version >= 138 && version < 140)
12591 {
12593 {
12594 if (!ctx.
Read(intValue))
12595 return false;
12596 SetFrozen(intValue);
12597 }
12598 }
12599
12600 return true;
12601 }
12602
12603
12605 {
12608 {
12610 }
12611
12612 if (!super.OnStoreLoad(ctx, version))
12613 {
12615 return false;
12616 }
12617
12618 if (version >= 114)
12619 {
12620 bool hasQuickBarIndexSaved;
12621
12622 if (!ctx.
Read(hasQuickBarIndexSaved))
12623 {
12625 return false;
12626 }
12627
12628 if (hasQuickBarIndexSaved)
12629 {
12630 int itmQBIndex;
12631
12632
12633 if (!ctx.
Read(itmQBIndex))
12634 {
12636 return false;
12637 }
12638
12639 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12640 if (itmQBIndex != -1 && parentPlayer)
12641 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12642 }
12643 }
12644 else
12645 {
12646
12647 PlayerBase player;
12648 int itemQBIndex;
12649 if (version ==
int.
MAX)
12650 {
12651 if (!ctx.
Read(itemQBIndex))
12652 {
12654 return false;
12655 }
12656 }
12657 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12658 {
12659
12660 if (!ctx.
Read(itemQBIndex))
12661 {
12663 return false;
12664 }
12665 if (itemQBIndex != -1 && player)
12666 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12667 }
12668 }
12669
12670 if (version < 140)
12671 {
12672
12673 if (!LoadVariables(ctx, version))
12674 {
12676 return false;
12677 }
12678 }
12679
12680
12682 {
12684 return false;
12685 }
12686 if (version >= 132)
12687 {
12689 if (raib)
12690 {
12692 {
12694 return false;
12695 }
12696 }
12697 }
12698
12700 return true;
12701 }
12702
12703
12704
12706 {
12707 super.OnStoreSave(ctx);
12708
12709 PlayerBase player;
12710 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12711 {
12713
12714 int itemQBIndex = -1;
12715 itemQBIndex = player.FindQuickBarEntityIndex(this);
12716 ctx.
Write(itemQBIndex);
12717 }
12718 else
12719 {
12721 }
12722
12724
12726 if (raib)
12727 {
12729 }
12730 }
12731
12732
12734 {
12735 super.AfterStoreLoad();
12736
12738 {
12740 }
12741
12743 {
12746 }
12747 }
12748
12750 {
12751 super.EEOnAfterLoad();
12752
12754 {
12756 }
12757
12760 }
12761
12763 {
12764 return false;
12765 }
12766
12767
12768
12770 {
12772 {
12773 #ifdef PLATFORM_CONSOLE
12774
12776 {
12778 if (menu)
12779 {
12781 }
12782 }
12783 #endif
12784 }
12785
12787 {
12790 }
12791
12793 {
12794 SetWeightDirty();
12796 }
12798 {
12801 }
12802
12804 {
12807 }
12809 {
12812 }
12813
12814 super.OnVariablesSynchronized();
12815 }
12816
12817
12818
12820 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12821 {
12822 if (!IsServerCheck(allow_client))
12823 return false;
12824
12826 return false;
12827
12830
12831 if (value <= (min + 0.001))
12832 value = min;
12833
12834 if (value == min)
12835 {
12836 if (destroy_config)
12837 {
12838 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12839 if (dstr)
12840 {
12842 this.Delete();
12843 return true;
12844 }
12845 }
12846 else if (destroy_forced)
12847 {
12849 this.Delete();
12850 return true;
12851 }
12852
12854 }
12855
12858
12860 {
12862
12863 if (delta)
12865 }
12866
12868
12869 return false;
12870 }
12871
12872
12874 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12875 {
12877 }
12878
12880 {
12883 }
12884
12886 {
12889 }
12890
12892 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12893 {
12894 float value_clamped = Math.Clamp(value, 0, 1);
12896 SetQuantity(result, destroy_config, destroy_forced);
12897 }
12898
12899
12902 {
12904 }
12905
12907 {
12909 }
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12921 {
12922 int slot = -1;
12923 if (GetInventory())
12924 {
12925 InventoryLocation il = new InventoryLocation;
12926 GetInventory().GetCurrentInventoryLocation(il);
12928 }
12929
12931 }
12932
12934 {
12935 float quantity_max = 0;
12936
12938 {
12939 if (attSlotID != -1)
12940 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12941
12942 if (quantity_max <= 0)
12944 }
12945
12946 if (quantity_max <= 0)
12948
12949 return quantity_max;
12950 }
12951
12953 {
12955 }
12956
12958 {
12960 }
12961
12962
12964 {
12966 }
12967
12969 {
12971 }
12972
12974 {
12976 }
12977
12978
12980 {
12981
12982 float weightEx = GetWeightEx();
12983 float special = GetInventoryAndCargoWeight();
12984 return weightEx - special;
12985 }
12986
12987
12989 {
12991 }
12992
12994 {
12996 {
12997 #ifdef DEVELOPER
12998 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12999 {
13000 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13002 }
13003 #endif
13004
13005 return GetQuantity() * GetConfigWeightModified();
13006 }
13007 else if (HasEnergyManager())
13008 {
13009 #ifdef DEVELOPER
13010 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13011 {
13012 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13013 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
13014 }
13015 #endif
13016 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13017 }
13018 else
13019 {
13020 #ifdef DEVELOPER
13021 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13022 {
13023 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13024 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
13025 }
13026 #endif
13027 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
13028 }
13029 }
13030
13033 {
13034 int item_count = 0;
13036
13037 if (GetInventory().GetCargo() != NULL)
13038 {
13039 item_count = GetInventory().GetCargo().GetItemCount();
13040 }
13041
13042 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
13043 {
13044 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
13045 if (item)
13046 item_count += item.GetNumberOfItems();
13047 }
13048 return item_count;
13049 }
13050
13053 {
13054 float weight = 0;
13055 float wetness = 1;
13056 if (include_wetness)
13059 {
13060 weight = wetness * m_ConfigWeight;
13061 }
13063 {
13064 weight = 1;
13065 }
13066 return weight;
13067 }
13068
13069
13070
13072 {
13073 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
13074 {
13075 GameInventory inv = GetInventory();
13076 array<EntityAI> items = new array<EntityAI>;
13078 for (int i = 0; i < items.Count(); i++)
13079 {
13081 if (item)
13082 {
13084 }
13085 }
13086 }
13087 }
13088
13089
13090
13091
13093 {
13094 float energy = 0;
13095 if (HasEnergyManager())
13096 {
13097 energy = GetCompEM().GetEnergy();
13098 }
13099 return energy;
13100 }
13101
13102
13104 {
13105 super.OnEnergyConsumed();
13106
13108 }
13109
13111 {
13112 super.OnEnergyAdded();
13113
13115 }
13116
13117
13119 {
13120 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13121 {
13123 {
13124 float energy_0to1 = GetCompEM().GetEnergy0To1();
13126 }
13127 }
13128 }
13129
13130
13132 {
13133 return ConfigGetFloat("heatIsolation");
13134 }
13135
13137 {
13139 }
13140
13142 {
13143 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13144 if (
GetGame().ConfigIsExisting(paramPath))
13146
13147 return 0.0;
13148 }
13149
13151 {
13152 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13153 if (
GetGame().ConfigIsExisting(paramPath))
13155
13156 return 0.0;
13157 }
13158
13159 override void SetWet(
float value,
bool allow_client =
false)
13160 {
13161 if (!IsServerCheck(allow_client))
13162 return;
13163
13166
13168
13169 m_VarWet = Math.Clamp(value, min, max);
13170
13172 {
13175 }
13176 }
13177
13178 override void AddWet(
float value)
13179 {
13181 }
13182
13184 {
13186 }
13187
13189 {
13191 }
13192
13194 {
13196 }
13197
13199 {
13201 }
13202
13204 {
13206 }
13207
13208 override void OnWetChanged(
float newVal,
float oldVal)
13209 {
13212 if (newLevel != oldLevel)
13213 {
13215 }
13216 }
13217
13219 {
13220 SetWeightDirty();
13221 }
13222
13224 {
13225 return GetWetLevelInternal(
m_VarWet);
13226 }
13227
13228
13229
13231 {
13233 }
13234
13236 {
13238 }
13239
13241 {
13243 }
13244
13246 {
13248 }
13249
13250
13251
13253 {
13254 if (ConfigIsExisting("itemModelLength"))
13255 {
13256 return ConfigGetFloat("itemModelLength");
13257 }
13258 return 0;
13259 }
13260
13262 {
13263 if (ConfigIsExisting("itemAttachOffset"))
13264 {
13265 return ConfigGetFloat("itemAttachOffset");
13266 }
13267 return 0;
13268 }
13269
13270 override void SetCleanness(
int value,
bool allow_client =
false)
13271 {
13272 if (!IsServerCheck(allow_client))
13273 return;
13274
13276
13278
13281 }
13282
13284 {
13286 }
13287
13289 {
13290 return true;
13291 }
13292
13293
13294
13295
13297 {
13299 }
13300
13302 {
13304 }
13305
13306
13307
13308
13309 override void SetColor(
int r,
int g,
int b,
int a)
13310 {
13316 }
13318 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13319 {
13324 }
13325
13327 {
13329 }
13330
13333 {
13334 int r,g,b,a;
13336 r = r/255;
13337 g = g/255;
13338 b = b/255;
13339 a = a/255;
13340 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13341 }
13342
13343
13344
13345 override void SetLiquidType(
int value,
bool allow_client =
false)
13346 {
13347 if (!IsServerCheck(allow_client))
13348 return;
13349
13354 }
13355
13357 {
13358 return ConfigGetInt("varLiquidTypeInit");
13359 }
13360
13362 {
13364 }
13365
13367 {
13369 SetFrozen(false);
13370 }
13371
13374 {
13375 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13376 }
13377
13378
13381 {
13382 PlayerBase nplayer;
13383 if (PlayerBase.CastTo(nplayer, player))
13384 {
13386
13387 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13388 }
13389 }
13390
13391
13394 {
13395 PlayerBase nplayer;
13396 if (PlayerBase.CastTo(nplayer,player))
13397 {
13398
13399 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13400
13401 }
13402
13403
13404 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13405
13406
13407 if (HasEnergyManager())
13408 {
13409 GetCompEM().UpdatePlugState();
13410 }
13411 }
13412
13413
13415 {
13416 super.OnPlacementStarted(player);
13417
13419 }
13420
13421 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13422 {
13424 {
13425 m_AdminLog.OnPlacementComplete(player,
this);
13426 }
13427
13428 super.OnPlacementComplete(player, position, orientation);
13429 }
13430
13431
13432
13433
13434
13436 {
13438 {
13439 return true;
13440 }
13441 else
13442 {
13443 return false;
13444 }
13445 }
13446
13447
13449 {
13451 {
13453 }
13454 }
13455
13456
13458 {
13460 }
13461
13463 {
13465 }
13466
13467 override void InsertAgent(
int agent,
float count = 1)
13468 {
13469 if (count < 1)
13470 return;
13471
13473 }
13474
13477 {
13479 }
13480
13481
13483 {
13485 }
13486
13487
13488
13489
13490
13491
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13529 {
13531 return false;
13532 return true;
13533 }
13534
13536 {
13537
13539 }
13540
13541
13544 {
13545 super.CheckForRoofLimited(timeTresholdMS);
13546
13548 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13549 {
13550 m_PreviousRoofTestTime = time;
13551 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13552 }
13553 }
13554
13555
13557 {
13559 {
13560 return 0;
13561 }
13562
13563 if (GetInventory().GetAttachmentSlotsCount() != 0)
13564 {
13565 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13566 if (filter)
13567 return filter.GetProtectionLevel(type, false, system);
13568 else
13569 return 0;
13570 }
13571
13572 string subclassPath, entryName;
13573
13574 switch (type)
13575 {
13577 entryName = "biological";
13578 break;
13580 entryName = "chemical";
13581 break;
13582 default:
13583 entryName = "biological";
13584 break;
13585 }
13586
13587 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13588
13590 }
13591
13592
13593
13596 {
13597 if (!IsMagazine())
13599
13601 }
13602
13603
13604
13605
13606
13611 {
13612 return true;
13613 }
13614
13616 {
13618 }
13619
13620
13621
13622
13623
13625 {
13626 if (parent)
13627 {
13628 if (parent.IsInherited(DayZInfected))
13629 return true;
13630
13631 if (!parent.IsRuined())
13632 return true;
13633 }
13634
13635 return true;
13636 }
13637
13639 {
13640 if (!super.CanPutAsAttachment(parent))
13641 {
13642 return false;
13643 }
13644
13645 if (!IsRuined() && !parent.IsRuined())
13646 {
13647 return true;
13648 }
13649
13650 return false;
13651 }
13652
13654 {
13655
13656
13657
13658
13659 return super.CanReceiveItemIntoCargo(item);
13660 }
13661
13663 {
13664
13665
13666
13667
13668 GameInventory attachmentInv = attachment.GetInventory();
13670 {
13671 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13672 return false;
13673 }
13674
13675 InventoryLocation loc = new InventoryLocation();
13676 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13677 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13678 return false;
13679
13680 return super.CanReceiveAttachment(attachment, slotId);
13681 }
13682
13684 {
13685 if (!super.CanReleaseAttachment(attachment))
13686 return false;
13687
13688 return GetInventory().AreChildrenAccessible();
13689 }
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
13705
13706
13707
13708
13709
13710
13712 {
13713 int id = muzzle_owner.GetMuzzleID();
13714 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13715
13716 if (WPOF_array)
13717 {
13718 for (int i = 0; i < WPOF_array.Count(); i++)
13719 {
13720 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13721
13722 if (WPOF)
13723 {
13724 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13725 }
13726 }
13727 }
13728 }
13729
13730
13732 {
13733 int id = muzzle_owner.GetMuzzleID();
13735
13736 if (WPOBE_array)
13737 {
13738 for (int i = 0; i < WPOBE_array.Count(); i++)
13739 {
13740 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13741
13742 if (WPOBE)
13743 {
13744 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13745 }
13746 }
13747 }
13748 }
13749
13750
13752 {
13753 int id = muzzle_owner.GetMuzzleID();
13754 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13755
13756 if (WPOOH_array)
13757 {
13758 for (int i = 0; i < WPOOH_array.Count(); i++)
13759 {
13760 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13761
13762 if (WPOOH)
13763 {
13764 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13765 }
13766 }
13767 }
13768 }
13769
13770
13772 {
13773 int id = muzzle_owner.GetMuzzleID();
13774 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13775
13776 if (WPOOH_array)
13777 {
13778 for (int i = 0; i < WPOOH_array.Count(); i++)
13779 {
13780 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13781
13782 if (WPOOH)
13783 {
13784 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13785 }
13786 }
13787 }
13788 }
13789
13790
13792 {
13793 int id = muzzle_owner.GetMuzzleID();
13794 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13795
13796 if (WPOOH_array)
13797 {
13798 for (int i = 0; i < WPOOH_array.Count(); i++)
13799 {
13800 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13801
13802 if (WPOOH)
13803 {
13804 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13805 }
13806 }
13807 }
13808 }
13809
13810
13811
13813 {
13815 {
13816 return true;
13817 }
13818
13819 return false;
13820 }
13821
13823 {
13825 {
13826 return true;
13827 }
13828
13829 return false;
13830 }
13831
13833 {
13835 {
13836 return true;
13837 }
13838
13839 return false;
13840 }
13841
13843 {
13844 return false;
13845 }
13846
13849 {
13850 return UATimeSpent.DEFAULT_DEPLOY;
13851 }
13852
13853
13854
13855
13857 {
13859 SetSynchDirty();
13860 }
13861
13863 {
13865 }
13866
13867
13869 {
13870 return false;
13871 }
13872
13875 {
13876 string att_type = "None";
13877
13878 if (ConfigIsExisting("soundAttType"))
13879 {
13880 att_type = ConfigGetString("soundAttType");
13881 }
13882
13884 }
13885
13887 {
13889 }
13890
13891
13892
13893
13894
13900
13902 {
13905
13907 }
13908
13909
13911 {
13913 return;
13914
13916
13919
13922
13923 SoundParameters params = new SoundParameters();
13927 }
13928
13929
13931 {
13933 return;
13934
13936 SetSynchDirty();
13937
13940 }
13941
13942
13944 {
13946 return;
13947
13949 SetSynchDirty();
13950
13953 }
13954
13956 {
13958 }
13959
13961 {
13963 }
13964
13967 {
13968 if (!
GetGame().IsDedicatedServer())
13969 {
13970 if (ConfigIsExisting("attachSoundSet"))
13971 {
13972 string cfg_path = "";
13973 string soundset = "";
13974 string type_name =
GetType();
13975
13978 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13979 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13980
13981 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13982 {
13983 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13984 {
13985 if (cfg_slot_array[i] == slot_type)
13986 {
13987 soundset = cfg_soundset_array[i];
13988 break;
13989 }
13990 }
13991 }
13992
13993 if (soundset != "")
13994 {
13995 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13997 }
13998 }
13999 }
14000 }
14001
14003 {
14004
14005 }
14006
14007 void OnApply(PlayerBase player);
14008
14010 {
14011 return 1.0;
14012 };
14013
14015 {
14017 }
14018
14020 {
14022 }
14023
14025
14027 {
14028 SetDynamicPhysicsLifeTime(0.01);
14030 }
14031
14033 {
14034 array<string> zone_names = new array<string>;
14035 GetDamageZones(zone_names);
14036 for (int i = 0; i < zone_names.Count(); i++)
14037 {
14038 SetHealthMax(zone_names.Get(i),"Health");
14039 }
14040 SetHealthMax("","Health");
14041 }
14042
14045 {
14046 float global_health = GetHealth01("","Health");
14047 array<string> zones = new array<string>;
14048 GetDamageZones(zones);
14049
14050 for (int i = 0; i < zones.Count(); i++)
14051 {
14052 SetHealth01(zones.Get(i),"Health",global_health);
14053 }
14054 }
14055
14058 {
14059 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14060 }
14061
14063 {
14064 if (!hasRootAsPlayer)
14065 {
14066 if (refParentIB)
14067 {
14068
14069 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14070 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14071
14072 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14073 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14074
14077 }
14078 else
14079 {
14080
14083 }
14084 }
14085 }
14086
14088 {
14090 {
14091 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14092 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14093 {
14094 float heatPermCoef = 1.0;
14096 while (ent)
14097 {
14098 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14099 ent = ent.GetHierarchyParent();
14100 }
14101
14102 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14103 }
14104 }
14105 }
14106
14108 {
14109
14110 EntityAI parent = GetHierarchyParent();
14111 if (!parent)
14112 {
14113 hasParent = false;
14114 hasRootAsPlayer = false;
14115 }
14116 else
14117 {
14118 hasParent = true;
14119 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14120 refParentIB =
ItemBase.Cast(parent);
14121 }
14122 }
14123
14124 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14125 {
14126
14127 }
14128
14130 {
14131
14132 return false;
14133 }
14134
14136 {
14137
14138
14139 return false;
14140 }
14141
14143 {
14144
14145 return false;
14146 }
14147
14150 {
14151 return !GetIsFrozen() &&
IsOpen();
14152 }
14153
14155 {
14156 bool hasParent = false, hasRootAsPlayer = false;
14158
14159 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14160 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14161
14162 if (wwtu || foodDecay)
14163 {
14167
14168 if (processWetness || processTemperature || processDecay)
14169 {
14171
14172 if (processWetness)
14173 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14174
14175 if (processTemperature)
14177
14178 if (processDecay)
14179 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14180 }
14181 }
14182 }
14183
14186 {
14188 }
14189
14191 {
14194
14195 return super.GetTemperatureFreezeThreshold();
14196 }
14197
14199 {
14202
14203 return super.GetTemperatureThawThreshold();
14204 }
14205
14207 {
14210
14211 return super.GetItemOverheatThreshold();
14212 }
14213
14215 {
14217 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14218
14219 return super.GetTemperatureFreezeTime();
14220 }
14221
14223 {
14225 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14226
14227 return super.GetTemperatureThawTime();
14228 }
14229
14234
14236 {
14237 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14238 }
14239
14241 {
14242 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14243 }
14244
14247 {
14249 }
14250
14252 {
14254 }
14255
14257 {
14259 }
14260
14263 {
14264 return null;
14265 }
14266
14269 {
14270 return false;
14271 }
14272
14274 {
14276 {
14279 if (!trg)
14280 {
14282 explosive = this;
14283 }
14284
14285 explosive.PairRemote(trg);
14287
14288 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14289 trg.SetPersistentPairID(persistentID);
14290 explosive.SetPersistentPairID(persistentID);
14291
14292 return true;
14293 }
14294 return false;
14295 }
14296
14299 {
14300 float ret = 1.0;
14303 ret *= GetHealth01();
14304
14305 return ret;
14306 }
14307
14308 #ifdef DEVELOPER
14309 override void SetDebugItem()
14310 {
14311 super.SetDebugItem();
14312 _itemBase = this;
14313 }
14314
14316 {
14317 string text = super.GetDebugText();
14318
14320 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14321
14322 return text;
14323 }
14324 #endif
14325
14327 {
14328 return true;
14329 }
14330
14332
14334
14336 {
14339 }
14340
14341
14349
14365}
14366
14368{
14370 if (entity)
14371 {
14372 bool is_item = entity.IsInherited(
ItemBase);
14373 if (is_item && full_quantity)
14374 {
14377 }
14378 }
14379 else
14380 {
14382 return NULL;
14383 }
14384 return entity;
14385}
14386
14388{
14389 if (item)
14390 {
14391 if (health > 0)
14392 item.SetHealth("", "", health);
14393
14394 if (item.CanHaveTemperature())
14395 {
14397 if (item.CanFreeze())
14398 item.SetFrozen(false);
14399 }
14400
14401 if (item.HasEnergyManager())
14402 {
14403 if (quantity >= 0)
14404 {
14405 item.GetCompEM().SetEnergy0To1(quantity);
14406 }
14407 else
14408 {
14410 }
14411 }
14412 else if (item.IsMagazine())
14413 {
14414 Magazine mag = Magazine.Cast(item);
14415 if (quantity >= 0)
14416 {
14417 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14418 }
14419 else
14420 {
14422 }
14423
14424 }
14425 else
14426 {
14427 if (quantity >= 0)
14428 {
14429 item.SetQuantityNormalized(quantity, false);
14430 }
14431 else
14432 {
14434 }
14435
14436 }
14437 }
14438}
14439
14440#ifdef DEVELOPER
14442#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.