9514{
9516 {
9517 return true;
9518 }
9519};
9520
9521
9522
9524{
9528
9530
9533
9534
9535
9536
9537
9546
9552
9557
9562
9583 protected bool m_IsResultOfSplit
9584
9586
9591
9592
9593
9595
9599
9600
9601
9603
9606
9607
9608
9614
9615
9623
9626
9627
9629
9630
9632
9633
9638
9639
9644
9645
9647
9648
9650 {
9655
9656 if (!
GetGame().IsDedicatedServer())
9657 {
9659 {
9661
9663 {
9665 }
9666 }
9667
9670 }
9671
9672 m_OldLocation = null;
9673
9675 {
9677 }
9678
9679 if (ConfigIsExisting("headSelectionsToHide"))
9680 {
9683 }
9684
9686 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9687 {
9689 }
9690
9692
9693 m_IsResultOfSplit = false;
9694
9696 }
9697
9699 {
9700 super.InitItemVariables();
9701
9707 m_Count = ConfigGetInt(
"count");
9708
9711
9716
9719
9724
9736
9740
9741
9744 if (ConfigIsExisting("canBeSplit"))
9745 {
9748 }
9749
9751 if (ConfigIsExisting("itemBehaviour"))
9753
9754
9757 RegisterNetSyncVariableInt("m_VarLiquidType");
9758 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9759
9760 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9761 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9762 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9763
9764 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9765 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9766 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9767 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9768
9769 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9770 RegisterNetSyncVariableBool("m_IsTakeable");
9771 RegisterNetSyncVariableBool("m_IsHologram");
9772
9775 {
9778 }
9779
9781
9783 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9785
9786 }
9787
9789 {
9791 }
9792
9794 {
9797 {
9802 }
9803 }
9804
9805 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9806 {
9808 {
9811 }
9812
9814 }
9815
9817 {
9823 }
9824
9826
9828 {
9830
9831 if (!action)
9832 {
9833 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9834 return;
9835 }
9836
9838 if (!ai)
9839 {
9841 return;
9842 }
9843
9845 if (!action_array)
9846 {
9847 action_array = new array<ActionBase_Basic>;
9849 }
9850 if (LogManager.IsActionLogEnable())
9851 {
9852 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9853 }
9854
9855 if (action_array.Find(action) != -1)
9856 {
9857 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9858 }
9859 else
9860 {
9861 action_array.Insert(action);
9862 }
9863 }
9864
9866 {
9868 ActionBase action = player.GetActionManager().GetAction(actionName);
9871
9872 if (action_array)
9873 {
9874 action_array.RemoveItem(action);
9875 }
9876 }
9877
9878
9879
9881 {
9882 ActionOverrideData overrideData = new ActionOverrideData();
9886
9888 if (!actionMap)
9889 {
9892 }
9893
9894 actionMap.Insert(this.
Type(), overrideData);
9895
9896 }
9897
9899
9901
9902
9904 {
9907
9910
9911 string config_to_search = "CfgVehicles";
9912 string muzzle_owner_config;
9913
9915 {
9916 if (IsInherited(Weapon))
9917 config_to_search = "CfgWeapons";
9918
9919 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9920
9921 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9922
9924
9925 if (config_OnFire_subclass_count > 0)
9926 {
9927 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9928
9929 for (int i = 0; i < config_OnFire_subclass_count; i++)
9930 {
9931 string particle_class = "";
9933 string config_OnFire_entry = config_OnFire_class + particle_class;
9934 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9935 WPOF_array.Insert(WPOF);
9936 }
9937
9938
9940 }
9941 }
9942
9944 {
9945 config_to_search = "CfgWeapons";
9946 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9947
9948 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9949
9951
9952 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9953 {
9954 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9955
9956 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9957 {
9958 string particle_class2 = "";
9960 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9961 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9962 WPOBE_array.Insert(WPOBE);
9963 }
9964
9965
9967 }
9968 }
9969 }
9970
9971
9973 {
9976
9978 {
9979 string config_to_search = "CfgVehicles";
9980
9981 if (IsInherited(Weapon))
9982 config_to_search = "CfgWeapons";
9983
9984 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9985 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9986
9987 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9988 {
9989
9991
9993 {
9995 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9997 return;
9998 }
9999
10002
10003
10004
10006 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10007
10008 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10009 {
10010 string particle_class = "";
10012 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10014
10015 if (entry_type == CT_CLASS)
10016 {
10017 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10018 WPOOH_array.Insert(WPOF);
10019 }
10020 }
10021
10022
10024 }
10025 }
10026 }
10027
10029 {
10031 }
10032
10034 {
10036 {
10038
10041
10044
10045 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10046 }
10047 }
10048
10050 {
10052 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10053
10055 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10056
10058 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10059
10061 {
10063 }
10064 }
10065
10067 {
10069 }
10070
10072 {
10075 else
10077
10079 {
10082 }
10083 else
10084 {
10087
10090 }
10091
10093 }
10094
10096 {
10098 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10099 }
10100
10102 {
10104 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10106 }
10107
10109 {
10111 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10112 }
10113
10115 {
10118
10119 OverheatingParticle OP = new OverheatingParticle();
10124
10126 }
10127
10129 {
10132
10133 return -1;
10134 }
10135
10137 {
10139 {
10142
10143 for (int i = count; i > 0; --i)
10144 {
10145 int id = i - 1;
10148
10151
10152 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10153 {
10154 if (p)
10155 {
10158 }
10159 }
10160 }
10161 }
10162 }
10163
10165 {
10167 {
10169 {
10170 int id = i - 1;
10172
10173 if (OP)
10174 {
10176
10177 if (p)
10178 {
10180 }
10181
10182 delete OP;
10183 }
10184 }
10185
10188 }
10189 }
10190
10193 {
10194 return 0.0;
10195 }
10196
10197
10199 {
10200 return 250;
10201 }
10202
10204 {
10205 return 0;
10206 }
10207
10210 {
10212 return true;
10213
10214 return false;
10215 }
10216
10219 {
10222
10224 {
10226 }
10227 else
10228 {
10229
10231 }
10232
10234 }
10235
10242 {
10243 return -1;
10244 }
10245
10246
10247
10248
10250 {
10252 {
10254 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10255
10256 if (r_index >= 0)
10257 {
10258 InventoryLocation r_il = new InventoryLocation;
10259 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10260
10261 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10264 {
10265 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10266 }
10268 {
10269 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10270 }
10271
10272 }
10273
10274 player.GetHumanInventory().ClearUserReservedLocation(this);
10275 }
10276
10279 }
10280
10281
10282
10283
10285 {
10286 return ItemBase.m_DebugActionsMask;
10287 }
10288
10290 {
10291 return ItemBase.m_DebugActionsMask & mask;
10292 }
10293
10295 {
10296 ItemBase.m_DebugActionsMask = mask;
10297 }
10298
10300 {
10301 ItemBase.m_DebugActionsMask |= mask;
10302 }
10303
10305 {
10306 ItemBase.m_DebugActionsMask &= ~mask;
10307 }
10308
10310 {
10312 {
10314 }
10315 else
10316 {
10318 }
10319 }
10320
10321
10323 {
10324 if (GetEconomyProfile())
10325 {
10326 float q_max = GetEconomyProfile().GetQuantityMax();
10327 if (q_max > 0)
10328 {
10329 float q_min = GetEconomyProfile().GetQuantityMin();
10330 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10331
10333 {
10334 ComponentEnergyManager comp = GetCompEM();
10336 {
10338 }
10339 }
10341 {
10343
10344 }
10345
10346 }
10347 }
10348 }
10349
10352 {
10353 EntityAI parent = GetHierarchyParent();
10354
10355 if (parent)
10356 {
10357 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10358 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10359 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10360 }
10361 }
10362
10365 {
10366 EntityAI parent = GetHierarchyParent();
10367
10368 if (parent)
10369 {
10370 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10371 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10372 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10373 }
10374 }
10375
10377 {
10378
10379
10380
10381
10383
10385 {
10386 if (ScriptInputUserData.CanStoreInputUserData())
10387 {
10388 ScriptInputUserData ctx = new ScriptInputUserData;
10394 ctx.
Write(use_stack_max);
10397
10399 {
10400 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10401 }
10402 }
10403 }
10404 else if (!
GetGame().IsMultiplayer())
10405 {
10407 }
10408 }
10409
10411 {
10413 }
10414
10416 {
10418 }
10419
10421 {
10423 }
10424
10426 {
10427
10428 return false;
10429 }
10430
10432 {
10433 return false;
10434 }
10435
10439 {
10440 return false;
10441 }
10442
10444 {
10445 return "";
10446 }
10447
10449
10451 {
10452 return false;
10453 }
10454
10456 {
10457 return true;
10458 }
10459
10460
10461
10463 {
10464 return true;
10465 }
10466
10468 {
10469 return true;
10470 }
10471
10473 {
10474 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10476 }
10477
10479 {
10481 }
10482
10484 {
10486 if (!is_being_placed)
10488 SetSynchDirty();
10489 }
10490
10491
10493
10495 {
10497 }
10498
10500 {
10502 }
10503
10505 {
10506 return 1;
10507 }
10508
10510 {
10511 return false;
10512 }
10513
10515 {
10517 SetSynchDirty();
10518 }
10519
10520
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
10555 {
10556 super.OnMovedInsideCargo(container);
10557
10558 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10559 }
10560
10561 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10562 {
10563 super.EEItemLocationChanged(oldLoc,newLoc);
10564
10565 PlayerBase new_player = null;
10566 PlayerBase old_player = null;
10567
10568 if (newLoc.GetParent())
10569 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10570
10571 if (oldLoc.GetParent())
10572 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10573
10575 {
10576 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10577
10578 if (r_index >= 0)
10579 {
10580 InventoryLocation r_il = new InventoryLocation;
10581 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10582
10583 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10586 {
10587 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10588 }
10590 {
10591 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10592 }
10593
10594 }
10595 }
10596
10598 {
10599 if (new_player)
10600 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10601
10602 if (new_player == old_player)
10603 {
10604
10605 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10606 {
10608 {
10609 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10610 {
10611 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10612 }
10613 }
10614 else
10615 {
10616 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10617 }
10618 }
10619
10620 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10621 {
10622 int type = oldLoc.GetType();
10624 {
10625 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10626 }
10628 {
10629 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10630 }
10631 }
10632 if (!m_OldLocation)
10633 {
10634 m_OldLocation = new InventoryLocation;
10635 }
10636 m_OldLocation.Copy(oldLoc);
10637 }
10638 else
10639 {
10640 if (m_OldLocation)
10641 {
10642 m_OldLocation.Reset();
10643 }
10644 }
10645
10647 }
10648 else
10649 {
10650 if (new_player)
10651 {
10652 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10653 if (res_index >= 0)
10654 {
10655 InventoryLocation il = new InventoryLocation;
10656 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10658 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10661 {
10662 il.
GetParent().GetOnReleaseLock().Invoke(it);
10663 }
10665 {
10667 }
10668
10669 }
10670 }
10672 {
10673
10675 }
10676
10677 if (m_OldLocation)
10678 {
10679 m_OldLocation.Reset();
10680 }
10681 }
10682 }
10683
10684 override void EOnContact(IEntity other, Contact extra)
10685 {
10687 {
10688 int liquidType = -1;
10690 if (impactSpeed > 0.0)
10691 {
10693 #ifndef SERVER
10695 #else
10697 SetSynchDirty();
10698 #endif
10700 }
10701 }
10702
10703 #ifdef SERVER
10704 if (GetCompEM() && GetCompEM().IsPlugged())
10705 {
10706 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10707 GetCompEM().UnplugThis();
10708 }
10709 #endif
10710 }
10711
10713
10715 {
10717 }
10718
10720 {
10721
10722 }
10723
10725 {
10726 super.OnItemLocationChanged(old_owner, new_owner);
10727
10728 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10729 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10730
10731 if (!relatedPlayer && playerNew)
10732 relatedPlayer = playerNew;
10733
10734 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10735 {
10737 if (actionMgr)
10738 {
10739 ActionBase currentAction = actionMgr.GetRunningAction();
10740 if (currentAction)
10742 }
10743 }
10744
10745 Man ownerPlayerOld = null;
10746 Man ownerPlayerNew = null;
10747
10748 if (old_owner)
10749 {
10750 if (old_owner.
IsMan())
10751 {
10752 ownerPlayerOld = Man.Cast(old_owner);
10753 }
10754 else
10755 {
10756 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10757 }
10758 }
10759 else
10760 {
10762 {
10764
10765 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10766 {
10767 GetCompEM().UnplugThis();
10768 }
10769 }
10770 }
10771
10772 if (new_owner)
10773 {
10774 if (new_owner.
IsMan())
10775 {
10776 ownerPlayerNew = Man.Cast(new_owner);
10777 }
10778 else
10779 {
10780 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10781 }
10782 }
10783
10784 if (ownerPlayerOld != ownerPlayerNew)
10785 {
10786 if (ownerPlayerOld)
10787 {
10788 array<EntityAI> subItemsExit = new array<EntityAI>;
10790 for (int i = 0; i < subItemsExit.Count(); i++)
10791 {
10794 }
10795 }
10796
10797 if (ownerPlayerNew)
10798 {
10799 array<EntityAI> subItemsEnter = new array<EntityAI>;
10801 for (int j = 0; j < subItemsEnter.Count(); j++)
10802 {
10805 }
10806 }
10807 }
10808 else if (ownerPlayerNew != null)
10809 {
10810 PlayerBase nplayer;
10811 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10812 {
10813 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10815 for (int k = 0; k < subItemsUpdate.Count(); k++)
10816 {
10818 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10819 }
10820 }
10821 }
10822
10823 if (old_owner)
10824 old_owner.OnChildItemRemoved(this);
10825 if (new_owner)
10826 new_owner.OnChildItemReceived(this);
10827 }
10828
10829
10831 {
10832 super.EEDelete(parent);
10833 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10834 if (player)
10835 {
10837
10838 if (player.IsAlive())
10839 {
10840 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10841 if (r_index >= 0)
10842 {
10843 InventoryLocation r_il = new InventoryLocation;
10844 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10845
10846 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10849 {
10850 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10851 }
10853 {
10854 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10855 }
10856
10857 }
10858
10859 player.RemoveQuickBarEntityShortcut(this);
10860 }
10861 }
10862 }
10863
10865 {
10866 super.EEKilled(killer);
10867
10870 {
10871 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10872 {
10873 if (IsMagazine())
10874 {
10875 if (Magazine.Cast(this).GetAmmoCount() > 0)
10876 {
10878 }
10879 }
10880 else
10881 {
10883 }
10884 }
10885 }
10886 }
10887
10889 {
10890 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10891
10892 super.OnWasAttached(parent, slot_id);
10893
10896
10898 }
10899
10901 {
10902 super.OnWasDetached(parent, slot_id);
10903
10906 }
10907
10909 {
10910 int idx;
10913
10914 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10915 if (inventory_slots.Count() < 1)
10916 {
10917 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10918 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10919 }
10920 else
10921 {
10922 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10923 }
10924
10925 idx = inventory_slots.Find(slot);
10926 if (idx < 0)
10927 return "";
10928
10929 return attach_types.Get(idx);
10930 }
10931
10933 {
10934 int idx = -1;
10935 string slot;
10936
10939
10940 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10941 if (inventory_slots.Count() < 1)
10942 {
10943 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10944 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10945 }
10946 else
10947 {
10948 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10949 if (detach_types.Count() < 1)
10950 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10951 }
10952
10953 for (int i = 0; i < inventory_slots.Count(); i++)
10954 {
10955 slot = inventory_slots.Get(i);
10956 }
10957
10958 if (slot != "")
10959 {
10960 if (detach_types.Count() == 1)
10961 idx = 0;
10962 else
10963 idx = inventory_slots.Find(slot);
10964 }
10965 if (idx < 0)
10966 return "";
10967
10968 return detach_types.Get(idx);
10969 }
10970
10972 {
10973
10975
10976
10977 float min_time = 1;
10978 float max_time = 3;
10979 float delay = Math.RandomFloat(min_time, max_time);
10980
10981 explode_timer.Run(delay, this, "DoAmmoExplosion");
10982 }
10983
10985 {
10986 Magazine magazine = Magazine.Cast(this);
10987 int pop_sounds_count = 6;
10988 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10989
10990
10991 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10992 string sound_name = pop_sounds[ sound_idx ];
10994
10995
10996 magazine.ServerAddAmmoCount(-1);
10997
10998
10999 float min_temp_to_explode = 100;
11000
11001 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
11002 {
11004 }
11005 }
11006
11007
11008 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11009 {
11010 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11011
11012 const int CHANCE_DAMAGE_CARGO = 4;
11013 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11014 const int CHANCE_DAMAGE_NOTHING = 2;
11015
11017 {
11018 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11019 int chances;
11020 int rnd;
11021
11022 if (GetInventory().GetCargo())
11023 {
11024 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11025 rnd = Math.RandomInt(0,chances);
11026
11027 if (rnd < CHANCE_DAMAGE_CARGO)
11028 {
11030 }
11031 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11032 {
11034 }
11035 }
11036 else
11037 {
11038 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11039 rnd = Math.RandomInt(0,chances);
11040
11041 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11042 {
11044 }
11045 }
11046 }
11047 }
11048
11050 {
11051 if (GetInventory().GetCargo())
11052 {
11053 int item_count = GetInventory().GetCargo().GetItemCount();
11054 if (item_count > 0)
11055 {
11056 int random_pick = Math.RandomInt(0, item_count);
11058 if (!item.IsExplosive())
11059 {
11060 item.AddHealth("","",damage);
11061 return true;
11062 }
11063 }
11064 }
11065 return false;
11066 }
11067
11069 {
11070 int attachment_count = GetInventory().AttachmentCount();
11071 if (attachment_count > 0)
11072 {
11073 int random_pick = Math.RandomInt(0, attachment_count);
11074 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
11075 if (!attachment.IsExplosive())
11076 {
11077 attachment.AddHealth("","",damage);
11078 return true;
11079 }
11080 }
11081 return false;
11082 }
11083
11085 {
11087 }
11088
11090 {
11092 return GetInventory().CanRemoveEntity();
11093
11094 return false;
11095 }
11096
11098 {
11100 return;
11101
11103 {
11104 if (ScriptInputUserData.CanStoreInputUserData())
11105 {
11106 ScriptInputUserData ctx = new ScriptInputUserData;
11111 ctx.
Write(destination_entity);
11113 ctx.
Write(slot_id);
11115 }
11116 }
11117 else if (!
GetGame().IsMultiplayer())
11118 {
11120 }
11121 }
11122
11124 {
11126 return;
11127
11128 float split_quantity_new;
11132 InventoryLocation loc = new InventoryLocation;
11133
11134 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11135 {
11137 split_quantity_new = stack_max;
11138 else
11140
11141 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11142 if (new_item)
11143 {
11144 new_item.SetResultOfSplit(true);
11145 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11147 new_item.SetQuantity(split_quantity_new);
11148 }
11149 }
11150 else if (destination_entity && slot_id == -1)
11151 {
11152 if (quantity > stack_max)
11153 split_quantity_new = stack_max;
11154 else
11155 split_quantity_new = quantity;
11156
11158 {
11161 }
11162
11163 if (new_item)
11164 {
11165 new_item.SetResultOfSplit(true);
11166 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11168 new_item.SetQuantity(split_quantity_new);
11169 }
11170 }
11171 else
11172 {
11173 if (stack_max != 0)
11174 {
11176 {
11178 }
11179
11180 if (split_quantity_new == 0)
11181 {
11182 if (!
GetGame().IsMultiplayer())
11183 player.PhysicalPredictiveDropItem(this);
11184 else
11185 player.ServerDropEntity(this);
11186 return;
11187 }
11188
11190
11191 if (new_item)
11192 {
11193 new_item.SetResultOfSplit(true);
11194 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11196 new_item.SetQuantity(stack_max);
11197 new_item.PlaceOnSurface();
11198 }
11199 }
11200 }
11201 }
11202
11204 {
11206 return;
11207
11208 float split_quantity_new;
11212 InventoryLocation loc = new InventoryLocation;
11213
11214 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11215 {
11217 split_quantity_new = stack_max;
11218 else
11220
11221 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11222 if (new_item)
11223 {
11224 new_item.SetResultOfSplit(true);
11225 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11227 new_item.SetQuantity(split_quantity_new);
11228 }
11229 }
11230 else if (destination_entity && slot_id == -1)
11231 {
11232 if (quantity > stack_max)
11233 split_quantity_new = stack_max;
11234 else
11235 split_quantity_new = quantity;
11236
11238 {
11241 }
11242
11243 if (new_item)
11244 {
11245 new_item.SetResultOfSplit(true);
11246 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11248 new_item.SetQuantity(split_quantity_new);
11249 }
11250 }
11251 else
11252 {
11253 if (stack_max != 0)
11254 {
11256 {
11258 }
11259
11261
11262 if (new_item)
11263 {
11264 new_item.SetResultOfSplit(true);
11265 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11267 new_item.SetQuantity(stack_max);
11268 new_item.PlaceOnSurface();
11269 }
11270 }
11271 }
11272 }
11273
11275 {
11277 return;
11278
11280 {
11281 if (ScriptInputUserData.CanStoreInputUserData())
11282 {
11283 ScriptInputUserData ctx = new ScriptInputUserData;
11288 dst.WriteToContext(ctx);
11290 }
11291 }
11292 else if (!
GetGame().IsMultiplayer())
11293 {
11295 }
11296 }
11297
11299 {
11301 return;
11302
11304 {
11305 if (ScriptInputUserData.CanStoreInputUserData())
11306 {
11307 ScriptInputUserData ctx = new ScriptInputUserData;
11312 ctx.
Write(destination_entity);
11318 }
11319 }
11320 else if (!
GetGame().IsMultiplayer())
11321 {
11323 }
11324 }
11325
11327 {
11329 }
11330
11332 {
11334 return this;
11335
11337 float split_quantity_new;
11339 if (dst.IsValid())
11340 {
11341 int slot_id = dst.GetSlot();
11343
11344 if (quantity > stack_max)
11345 split_quantity_new = stack_max;
11346 else
11347 split_quantity_new = quantity;
11348
11350
11351 if (new_item)
11352 {
11353 new_item.SetResultOfSplit(true);
11354 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11357 }
11358
11359 return new_item;
11360 }
11361
11362 return null;
11363 }
11364
11366 {
11368 return;
11369
11371 float split_quantity_new;
11373 if (destination_entity)
11374 {
11376 if (quantity > stackable)
11377 split_quantity_new = stackable;
11378 else
11379 split_quantity_new = quantity;
11380
11381 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11382 if (new_item)
11383 {
11384 new_item.SetResultOfSplit(true);
11385 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11387 new_item.SetQuantity(split_quantity_new);
11388 }
11389 }
11390 }
11391
11393 {
11395 return;
11396
11398 {
11399 if (ScriptInputUserData.CanStoreInputUserData())
11400 {
11401 ScriptInputUserData ctx = new ScriptInputUserData;
11406 ItemBase destination_entity =
this;
11407 ctx.
Write(destination_entity);
11411 }
11412 }
11413 else if (!
GetGame().IsMultiplayer())
11414 {
11416 }
11417 }
11418
11420 {
11422 return;
11423
11425 float split_quantity_new;
11427 if (player)
11428 {
11430 if (quantity > stackable)
11431 split_quantity_new = stackable;
11432 else
11433 split_quantity_new = quantity;
11434
11435 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11436 new_item =
ItemBase.Cast(in_hands);
11437 if (new_item)
11438 {
11439 new_item.SetResultOfSplit(true);
11440 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11442 new_item.SetQuantity(split_quantity_new);
11443 }
11444 }
11445 }
11446
11448 {
11450 return;
11451
11453 float split_quantity_new = Math.Floor(quantity * 0.5);
11454
11456
11457 if (new_item)
11458 {
11459 if (new_item.GetQuantityMax() < split_quantity_new)
11460 {
11461 split_quantity_new = new_item.GetQuantityMax();
11462 }
11463
11464 new_item.SetResultOfSplit(true);
11465 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11466
11468 {
11471 }
11472 else
11473 {
11476 }
11477 }
11478 }
11479
11481 {
11483 return;
11484
11486 float split_quantity_new = Math.Floor(quantity / 2);
11487
11488 InventoryLocation invloc = new InventoryLocation;
11490
11492 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11493
11494 if (new_item)
11495 {
11496 if (new_item.GetQuantityMax() < split_quantity_new)
11497 {
11498 split_quantity_new = new_item.GetQuantityMax();
11499 }
11501 {
11504 }
11505 else
11506 {
11509 }
11510 }
11511 }
11512
11515 {
11516 SetWeightDirty();
11518
11519 if (parent)
11520 parent.OnAttachmentQuantityChangedEx(this, delta);
11521
11523 {
11525 {
11527 }
11529 {
11530 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11532 }
11533 }
11534
11535 }
11536
11539 {
11540
11541 }
11542
11545 {
11547 }
11548
11550 {
11551 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11552
11554 {
11555 if (newLevel == GameConstants.STATE_RUINED)
11556 {
11558 EntityAI parent = GetHierarchyParent();
11559 if (parent && parent.IsFireplace())
11560 {
11561 CargoBase cargo = GetInventory().GetCargo();
11562 if (cargo)
11563 {
11565 {
11567 }
11568 }
11569 }
11570 }
11571
11573 {
11574
11576 return;
11577 }
11578
11579 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11580 {
11582 }
11583 }
11584 }
11585
11586
11588 {
11589 super.OnRightClick();
11590
11592 {
11594 {
11595 if (ScriptInputUserData.CanStoreInputUserData())
11596 {
11597 vector m4[4];
11599
11600 EntityAI root = GetHierarchyRoot();
11601
11602 InventoryLocation dst = new InventoryLocation;
11604 {
11605 if (root)
11606 {
11607 root.GetTransform(m4);
11609 }
11610 else
11611 GetInventory().GetCurrentInventoryLocation(dst);
11612 }
11613 else
11614 {
11616
11617
11618 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11619 {
11620 if (root)
11621 {
11622 root.GetTransform(m4);
11624 }
11625 else
11626 GetInventory().GetCurrentInventoryLocation(dst);
11627 }
11628 else
11629 {
11630 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11631 }
11632 }
11633
11634 ScriptInputUserData ctx = new ScriptInputUserData;
11642 }
11643 }
11644 else if (!
GetGame().IsMultiplayer())
11645 {
11647 }
11648 }
11649 }
11650
11651 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11652 {
11653
11654 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11655 return false;
11656
11657 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11658 return false;
11659
11660
11662 return false;
11663
11664
11665 Magazine mag = Magazine.Cast(this);
11666 if (mag)
11667 {
11668 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11669 return false;
11670
11671 if (stack_max_limit)
11672 {
11673 Magazine other_mag = Magazine.Cast(other_item);
11674 if (other_item)
11675 {
11676 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11677 return false;
11678 }
11679
11680 }
11681 }
11682 else
11683 {
11684
11686 return false;
11687
11689 return false;
11690 }
11691
11692 PlayerBase player = null;
11693 if (CastTo(player, GetHierarchyRootPlayer()))
11694 {
11695 if (player.GetInventory().HasAttachment(this))
11696 return false;
11697
11698 if (player.IsItemsToDelete())
11699 return false;
11700 }
11701
11702 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11703 return false;
11704
11705 int slotID;
11707 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11708 return false;
11709
11710 return true;
11711 }
11712
11714 {
11716 }
11717
11719 {
11720 return m_IsResultOfSplit;
11721 }
11722
11724 {
11725 m_IsResultOfSplit = value;
11726 }
11727
11729 {
11731 }
11732
11734 {
11735 float other_item_quantity = other_item.GetQuantity();
11736 float this_free_space;
11737
11739
11741
11742 if (other_item_quantity > this_free_space)
11743 {
11744 return this_free_space;
11745 }
11746 else
11747 {
11748 return other_item_quantity;
11749 }
11750 }
11751
11753 {
11755 }
11756
11758 {
11760 return;
11761
11762 if (!IsMagazine() && other_item)
11763 {
11765 if (quantity_used != 0)
11766 {
11767 float hp1 = GetHealth01("","");
11768 float hp2 = other_item.GetHealth01("","");
11769 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11770 hpResult = hpResult / (
GetQuantity() + quantity_used);
11771
11772 hpResult *= GetMaxHealth();
11773 Math.Round(hpResult);
11774 SetHealth("", "Health", hpResult);
11775
11777 other_item.AddQuantity(-quantity_used);
11778 }
11779 }
11781 }
11782
11784 {
11785 #ifdef SERVER
11786 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11787 GetHierarchyParent().IncreaseLifetimeUp();
11788 #endif
11789 };
11790
11792 {
11793 PlayerBase p = PlayerBase.Cast(player);
11794
11795 array<int> recipesIds = p.m_Recipes;
11796 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11797 if (moduleRecipesManager)
11798 {
11799 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11800 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11801 }
11802
11803 for (int i = 0;i < recipesIds.Count(); i++)
11804 {
11805 int key = recipesIds.Get(i);
11806 string recipeName = moduleRecipesManager.GetRecipeName(key);
11808 }
11809 }
11810
11811
11812 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11813 {
11814 super.GetDebugActions(outputList);
11815
11816
11821
11822
11826
11830
11831
11834
11835
11837 {
11840 }
11841
11843
11846
11850 }
11851
11852
11853
11854
11856 {
11857 super.OnAction(action_id, player, ctx);
11858 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11859 {
11860 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11861 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11862 PlayerBase p = PlayerBase.Cast(player);
11863 if (
EActions.RECIPES_RANGE_START < 1000)
11864 {
11865 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11866 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11867 }
11868 }
11869 #ifndef SERVER
11870 else if (action_id ==
EActions.WATCH_PLAYER)
11871 {
11872 PluginDeveloper.SetDeveloperItemClientEx(player);
11873 }
11874 #endif
11876 {
11877 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11878 {
11879 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11880 OnDebugButtonPressServer(id + 1);
11881 }
11882
11883 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11884 {
11885 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11887 }
11888
11889 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11890 {
11891 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11893 }
11894
11895 else if (action_id ==
EActions.ADD_QUANTITY)
11896 {
11897 if (IsMagazine())
11898 {
11899 Magazine mag = Magazine.Cast(this);
11900 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11901 }
11902 else
11903 {
11905 }
11906
11907 if (m_EM)
11908 {
11909 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11910 }
11911
11912 }
11913
11914 else if (action_id ==
EActions.REMOVE_QUANTITY)
11915 {
11916 if (IsMagazine())
11917 {
11918 Magazine mag2 = Magazine.Cast(this);
11919 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11920 }
11921 else
11922 {
11924 }
11925 if (m_EM)
11926 {
11927 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11928 }
11929
11930 }
11931
11932 else if (action_id ==
EActions.SET_QUANTITY_0)
11933 {
11935
11936 if (m_EM)
11937 {
11938 m_EM.SetEnergy(0);
11939 }
11940 }
11941
11942 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11943 {
11945
11946 if (m_EM)
11947 {
11948 m_EM.SetEnergy(m_EM.GetEnergyMax());
11949 }
11950 }
11951
11952 else if (action_id ==
EActions.ADD_HEALTH)
11953 {
11954 AddHealth("","",GetMaxHealth("","Health")/5);
11955 }
11956 else if (action_id ==
EActions.REMOVE_HEALTH)
11957 {
11958 AddHealth("","",-GetMaxHealth("","Health")/5);
11959 }
11960 else if (action_id ==
EActions.DESTROY_HEALTH)
11961 {
11962 SetHealth01("","",0);
11963 }
11964 else if (action_id ==
EActions.WATCH_ITEM)
11965 {
11967 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11968 #ifdef DEVELOPER
11969 SetDebugDeveloper_item(this);
11970 #endif
11971 }
11972
11973 else if (action_id ==
EActions.ADD_TEMPERATURE)
11974 {
11975 AddTemperature(20);
11976
11977 }
11978
11979 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11980 {
11981 AddTemperature(-20);
11982
11983 }
11984
11985 else if (action_id ==
EActions.FLIP_FROZEN)
11986 {
11987 SetFrozen(!GetIsFrozen());
11988
11989 }
11990
11991 else if (action_id ==
EActions.ADD_WETNESS)
11992 {
11994
11995 }
11996
11997 else if (action_id ==
EActions.REMOVE_WETNESS)
11998 {
12000
12001 }
12002
12003 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12004 {
12007
12008
12009 }
12010
12011 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12012 {
12015 }
12016
12017 else if (action_id ==
EActions.MAKE_SPECIAL)
12018 {
12019 auto debugParams = DebugSpawnParams.WithPlayer(player);
12020 OnDebugSpawnEx(debugParams);
12021 }
12022
12023 else if (action_id ==
EActions.DELETE)
12024 {
12025 Delete();
12026 }
12027
12028 }
12029
12030
12031 return false;
12032 }
12033
12034
12035
12036
12040
12043
12044
12045
12047 {
12048 return false;
12049 }
12050
12051
12053 {
12054 return true;
12055 }
12056
12057
12059 {
12060 return true;
12061 }
12062
12063
12064
12066 {
12067 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12069 }
12070
12073 {
12074 return null;
12075 }
12076
12078 {
12079 return false;
12080 }
12081
12083 {
12084 return false;
12085 }
12086
12090
12091
12093 {
12094 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12095 return module_repairing.CanRepair(this, item_repair_kit);
12096 }
12097
12098
12099 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12100 {
12101 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12102 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12103 }
12104
12105
12107 {
12108
12109
12110
12111
12112
12113
12114
12115
12116 return 1;
12117 }
12118
12119
12120
12122 {
12124 }
12125
12126
12127
12129 {
12131 }
12132
12133
12142 {
12143 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12144
12145 if (player)
12146 {
12147 player.MessageStatus(text);
12148 }
12149 }
12150
12151
12160 {
12161 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12162
12163 if (player)
12164 {
12165 player.MessageAction(text);
12166 }
12167 }
12168
12169
12178 {
12179 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12180
12181 if (player)
12182 {
12183 player.MessageFriendly(text);
12184 }
12185 }
12186
12187
12196 {
12197 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12198
12199 if (player)
12200 {
12201 player.MessageImportant(text);
12202 }
12203 }
12204
12206 {
12207 return true;
12208 }
12209
12210
12211 override bool KindOf(
string tag)
12212 {
12213 bool found = false;
12214 string item_name = this.
GetType();
12217
12218 int array_size = item_tag_array.Count();
12219 for (int i = 0; i < array_size; i++)
12220 {
12221 if (item_tag_array.Get(i) == tag)
12222 {
12223 found = true;
12224 break;
12225 }
12226 }
12227 return found;
12228 }
12229
12230
12232 {
12233
12234 super.OnRPC(sender, rpc_type,ctx);
12235
12236
12237 switch (rpc_type)
12238 {
12239 #ifndef SERVER
12240 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12241 Param2<bool, string> p = new Param2<bool, string>(false, "");
12242
12244 return;
12245
12246 bool play = p.param1;
12247 string soundSet = p.param2;
12248
12249 if (play)
12250 {
12252 {
12254 {
12256 }
12257 }
12258 else
12259 {
12261 }
12262 }
12263 else
12264 {
12266 }
12267
12268 break;
12269 #endif
12270
12271 }
12272
12274 {
12276 }
12277 }
12278
12279
12280
12281
12283 {
12284 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12285 return plugin.GetID(
name);
12286 }
12287
12289 {
12290 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12291 return plugin.GetName(id);
12292 }
12293
12296 {
12297
12298
12299 int varFlags;
12300 if (!ctx.
Read(varFlags))
12301 return;
12302
12303 if (varFlags & ItemVariableFlags.FLOAT)
12304 {
12306 }
12307 }
12308
12310 {
12311
12312 super.SerializeNumericalVars(floats_out);
12313
12314
12315
12317 {
12319 }
12320
12322 {
12324 }
12325
12327 {
12329 }
12330
12332 {
12337 }
12338
12340 {
12342 }
12343 }
12344
12346 {
12347
12348 super.DeSerializeNumericalVars(floats);
12349
12350
12351 int index = 0;
12352 int mask = Math.Round(floats.Get(index));
12353
12354 index++;
12355
12357 {
12359 {
12361 }
12362 else
12363 {
12364 float quantity = floats.Get(index);
12365 SetQuantity(quantity,
true,
false,
false,
false);
12366 }
12367 index++;
12368 }
12369
12371 {
12372 float wet = floats.Get(index);
12374 index++;
12375 }
12376
12378 {
12379 int liquidtype = Math.Round(floats.Get(index));
12381 index++;
12382 }
12383
12385 {
12387 index++;
12389 index++;
12391 index++;
12393 index++;
12394 }
12395
12397 {
12398 int cleanness = Math.Round(floats.Get(index));
12400 index++;
12401 }
12402 }
12403
12405 {
12406 super.WriteVarsToCTX(ctx);
12407
12408
12410 {
12412 }
12413
12415 {
12417 }
12418
12420 {
12422 }
12423
12425 {
12426 int r,g,b,a;
12432 }
12433
12435 {
12437 }
12438 }
12439
12441 {
12442 if (!super.ReadVarsFromCTX(ctx,version))
12443 return false;
12444
12445 int intValue;
12446 float value;
12447
12448 if (version < 140)
12449 {
12450 if (!ctx.
Read(intValue))
12451 return false;
12452
12453 m_VariablesMask = intValue;
12454 }
12455
12457 {
12458 if (!ctx.
Read(value))
12459 return false;
12460
12462 {
12464 }
12465 else
12466 {
12468 }
12469 }
12470
12471 if (version < 140)
12472 {
12474 {
12475 if (!ctx.
Read(value))
12476 return false;
12477 SetTemperatureDirect(value);
12478 }
12479 }
12480
12482 {
12483 if (!ctx.
Read(value))
12484 return false;
12486 }
12487
12489 {
12490 if (!ctx.
Read(intValue))
12491 return false;
12493 }
12494
12496 {
12497 int r,g,b,a;
12499 return false;
12501 return false;
12503 return false;
12505 return false;
12506
12508 }
12509
12511 {
12512 if (!ctx.
Read(intValue))
12513 return false;
12515 }
12516
12517 if (version >= 138 && version < 140)
12518 {
12520 {
12521 if (!ctx.
Read(intValue))
12522 return false;
12523 SetFrozen(intValue);
12524 }
12525 }
12526
12527 return true;
12528 }
12529
12530
12532 {
12535 {
12537 }
12538
12539 if (!super.OnStoreLoad(ctx, version))
12540 {
12542 return false;
12543 }
12544
12545 if (version >= 114)
12546 {
12547 bool hasQuickBarIndexSaved;
12548
12549 if (!ctx.
Read(hasQuickBarIndexSaved))
12550 {
12552 return false;
12553 }
12554
12555 if (hasQuickBarIndexSaved)
12556 {
12557 int itmQBIndex;
12558
12559
12560 if (!ctx.
Read(itmQBIndex))
12561 {
12563 return false;
12564 }
12565
12566 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12567 if (itmQBIndex != -1 && parentPlayer)
12568 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12569 }
12570 }
12571 else
12572 {
12573
12574 PlayerBase player;
12575 int itemQBIndex;
12576 if (version ==
int.
MAX)
12577 {
12578 if (!ctx.
Read(itemQBIndex))
12579 {
12581 return false;
12582 }
12583 }
12584 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12585 {
12586
12587 if (!ctx.
Read(itemQBIndex))
12588 {
12590 return false;
12591 }
12592 if (itemQBIndex != -1 && player)
12593 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12594 }
12595 }
12596
12597 if (version < 140)
12598 {
12599
12600 if (!LoadVariables(ctx, version))
12601 {
12603 return false;
12604 }
12605 }
12606
12607
12609 {
12611 return false;
12612 }
12613 if (version >= 132)
12614 {
12616 if (raib)
12617 {
12619 {
12621 return false;
12622 }
12623 }
12624 }
12625
12627 return true;
12628 }
12629
12630
12631
12633 {
12634 super.OnStoreSave(ctx);
12635
12636 PlayerBase player;
12637 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12638 {
12640
12641 int itemQBIndex = -1;
12642 itemQBIndex = player.FindQuickBarEntityIndex(this);
12643 ctx.
Write(itemQBIndex);
12644 }
12645 else
12646 {
12648 }
12649
12651
12653 if (raib)
12654 {
12656 }
12657 }
12658
12659
12661 {
12662 super.AfterStoreLoad();
12663
12665 {
12667 }
12668
12670 {
12673 }
12674 }
12675
12677 {
12678 super.EEOnAfterLoad();
12679
12681 {
12683 }
12684
12687 }
12688
12690 {
12691 return false;
12692 }
12693
12694
12695
12697 {
12699 {
12700 #ifdef PLATFORM_CONSOLE
12701
12703 {
12705 if (menu)
12706 {
12708 }
12709 }
12710 #endif
12711 }
12712
12714 {
12717 }
12718
12720 {
12721 SetWeightDirty();
12723 }
12725 {
12728 }
12729
12731 {
12734 }
12736 {
12739 }
12740
12741 super.OnVariablesSynchronized();
12742 }
12743
12744
12745
12747 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12748 {
12749 if (!IsServerCheck(allow_client))
12750 return false;
12751
12753 return false;
12754
12757
12758 if (value <= (min + 0.001))
12759 value = min;
12760
12761 if (value == min)
12762 {
12763 if (destroy_config)
12764 {
12765 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12766 if (dstr)
12767 {
12769 this.Delete();
12770 return true;
12771 }
12772 }
12773 else if (destroy_forced)
12774 {
12776 this.Delete();
12777 return true;
12778 }
12779
12781 }
12782
12785
12787 {
12789
12790 if (delta)
12792 }
12793
12795
12796 return false;
12797 }
12798
12799
12801 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12802 {
12804 }
12805
12807 {
12810 }
12811
12813 {
12816 }
12817
12820 {
12821 float value_clamped = Math.Clamp(value, 0, 1);
12823 SetQuantity(result, destroy_config, destroy_forced);
12824 }
12825
12826
12829 {
12831 }
12832
12834 {
12836 }
12837
12838
12839
12840
12841
12842
12843
12844
12845
12846
12848 {
12849 int slot = -1;
12850 if (GetInventory())
12851 {
12852 InventoryLocation il = new InventoryLocation;
12853 GetInventory().GetCurrentInventoryLocation(il);
12855 }
12856
12858 }
12859
12861 {
12862 float quantity_max = 0;
12863
12865 {
12866 if (attSlotID != -1)
12867 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12868
12869 if (quantity_max <= 0)
12871 }
12872
12873 if (quantity_max <= 0)
12875
12876 return quantity_max;
12877 }
12878
12880 {
12882 }
12883
12885 {
12887 }
12888
12889
12891 {
12893 }
12894
12896 {
12898 }
12899
12901 {
12903 }
12904
12905
12907 {
12908
12909 float weightEx = GetWeightEx();
12910 float special = GetInventoryAndCargoWeight();
12911 return weightEx - special;
12912 }
12913
12914
12916 {
12918 }
12919
12921 {
12923 {
12924 #ifdef DEVELOPER
12925 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12926 {
12927 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12929 }
12930 #endif
12931
12932 return GetQuantity() * GetConfigWeightModified();
12933 }
12934 else if (HasEnergyManager())
12935 {
12936 #ifdef DEVELOPER
12937 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12938 {
12939 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12940 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12941 }
12942 #endif
12943 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12944 }
12945 else
12946 {
12947 #ifdef DEVELOPER
12948 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12949 {
12950 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12951 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12952 }
12953 #endif
12954 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12955 }
12956 }
12957
12960 {
12961 int item_count = 0;
12963
12964 if (GetInventory().GetCargo() != NULL)
12965 {
12966 item_count = GetInventory().GetCargo().GetItemCount();
12967 }
12968
12969 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12970 {
12971 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12972 if (item)
12973 item_count += item.GetNumberOfItems();
12974 }
12975 return item_count;
12976 }
12977
12980 {
12981 float weight = 0;
12982 float wetness = 1;
12983 if (include_wetness)
12986 {
12987 weight = wetness * m_ConfigWeight;
12988 }
12990 {
12991 weight = 1;
12992 }
12993 return weight;
12994 }
12995
12996
12997
12999 {
13000 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
13001 {
13002 GameInventory inv = GetInventory();
13003 array<EntityAI> items = new array<EntityAI>;
13005 for (int i = 0; i < items.Count(); i++)
13006 {
13008 if (item)
13009 {
13011 }
13012 }
13013 }
13014 }
13015
13016
13017
13018
13020 {
13021 float energy = 0;
13022 if (HasEnergyManager())
13023 {
13024 energy = GetCompEM().GetEnergy();
13025 }
13026 return energy;
13027 }
13028
13029
13031 {
13032 super.OnEnergyConsumed();
13033
13035 }
13036
13038 {
13039 super.OnEnergyAdded();
13040
13042 }
13043
13044
13046 {
13047 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13048 {
13050 {
13051 float energy_0to1 = GetCompEM().GetEnergy0To1();
13053 }
13054 }
13055 }
13056
13057
13059 {
13060 return ConfigGetFloat("heatIsolation");
13061 }
13062
13064 {
13066 }
13067
13069 {
13070 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13071 if (
GetGame().ConfigIsExisting(paramPath))
13073
13074 return 0.0;
13075 }
13076
13078 {
13079 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13080 if (
GetGame().ConfigIsExisting(paramPath))
13082
13083 return 0.0;
13084 }
13085
13086 override void SetWet(
float value,
bool allow_client =
false)
13087 {
13088 if (!IsServerCheck(allow_client))
13089 return;
13090
13093
13095
13096 m_VarWet = Math.Clamp(value, min, max);
13097
13099 {
13102 }
13103 }
13104
13105 override void AddWet(
float value)
13106 {
13108 }
13109
13111 {
13113 }
13114
13116 {
13118 }
13119
13121 {
13123 }
13124
13126 {
13128 }
13129
13131 {
13133 }
13134
13135 override void OnWetChanged(
float newVal,
float oldVal)
13136 {
13139 if (newLevel != oldLevel)
13140 {
13142 }
13143 }
13144
13146 {
13147 SetWeightDirty();
13148 }
13149
13151 {
13152 return GetWetLevelInternal(
m_VarWet);
13153 }
13154
13155
13156
13158 {
13160 }
13161
13163 {
13165 }
13166
13168 {
13170 }
13171
13173 {
13175 }
13176
13177
13178
13180 {
13181 if (ConfigIsExisting("itemModelLength"))
13182 {
13183 return ConfigGetFloat("itemModelLength");
13184 }
13185 return 0;
13186 }
13187
13189 {
13190 if (ConfigIsExisting("itemAttachOffset"))
13191 {
13192 return ConfigGetFloat("itemAttachOffset");
13193 }
13194 return 0;
13195 }
13196
13197 override void SetCleanness(
int value,
bool allow_client =
false)
13198 {
13199 if (!IsServerCheck(allow_client))
13200 return;
13201
13203
13205
13208 }
13209
13211 {
13213 }
13214
13216 {
13217 return true;
13218 }
13219
13220
13221
13222
13224 {
13226 }
13227
13229 {
13231 }
13232
13233
13234
13235
13236 override void SetColor(
int r,
int g,
int b,
int a)
13237 {
13243 }
13245 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13246 {
13251 }
13252
13254 {
13256 }
13257
13260 {
13261 int r,g,b,a;
13263 r = r/255;
13264 g = g/255;
13265 b = b/255;
13266 a = a/255;
13267 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13268 }
13269
13270
13271
13272 override void SetLiquidType(
int value,
bool allow_client =
false)
13273 {
13274 if (!IsServerCheck(allow_client))
13275 return;
13276
13281 }
13282
13284 {
13285 return ConfigGetInt("varLiquidTypeInit");
13286 }
13287
13289 {
13291 }
13292
13294 {
13296 SetFrozen(false);
13297 }
13298
13301 {
13302 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13303 }
13304
13305
13308 {
13309 PlayerBase nplayer;
13310 if (PlayerBase.CastTo(nplayer, player))
13311 {
13313
13314 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13315 }
13316 }
13317
13318
13321 {
13322 PlayerBase nplayer;
13323 if (PlayerBase.CastTo(nplayer,player))
13324 {
13325
13326 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13327
13328 }
13329
13330
13331 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13332
13333
13334 if (HasEnergyManager())
13335 {
13336 GetCompEM().UpdatePlugState();
13337 }
13338 }
13339
13340
13342 {
13343 super.OnPlacementStarted(player);
13344
13346 }
13347
13348 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13349 {
13351 {
13352 m_AdminLog.OnPlacementComplete(player,
this);
13353 }
13354
13355 super.OnPlacementComplete(player, position, orientation);
13356 }
13357
13358
13359
13360
13361
13363 {
13365 {
13366 return true;
13367 }
13368 else
13369 {
13370 return false;
13371 }
13372 }
13373
13374
13376 {
13378 {
13380 }
13381 }
13382
13383
13385 {
13387 }
13388
13390 {
13392 }
13393
13394 override void InsertAgent(
int agent,
float count = 1)
13395 {
13396 if (count < 1)
13397 return;
13398
13400 }
13401
13404 {
13406 }
13407
13408
13410 {
13412 }
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13456 {
13458 return false;
13459 return true;
13460 }
13461
13463 {
13464
13466 }
13467
13468
13471 {
13472 super.CheckForRoofLimited(timeTresholdMS);
13473
13475 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13476 {
13477 m_PreviousRoofTestTime = time;
13478 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13479 }
13480 }
13481
13482
13484 {
13486 {
13487 return 0;
13488 }
13489
13490 if (GetInventory().GetAttachmentSlotsCount() != 0)
13491 {
13492 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13493 if (filter)
13494 return filter.GetProtectionLevel(type, false, system);
13495 else
13496 return 0;
13497 }
13498
13499 string subclassPath, entryName;
13500
13501 switch (type)
13502 {
13504 entryName = "biological";
13505 break;
13507 entryName = "chemical";
13508 break;
13509 default:
13510 entryName = "biological";
13511 break;
13512 }
13513
13514 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13515
13517 }
13518
13519
13520
13523 {
13524 if (!IsMagazine())
13526
13528 }
13529
13530
13531
13532
13533
13538 {
13539 return true;
13540 }
13541
13543 {
13545 }
13546
13547
13548
13549
13550
13552 {
13553 if (parent)
13554 {
13555 if (parent.IsInherited(DayZInfected))
13556 return true;
13557
13558 if (!parent.IsRuined())
13559 return true;
13560 }
13561
13562 return true;
13563 }
13564
13566 {
13567 if (!super.CanPutAsAttachment(parent))
13568 {
13569 return false;
13570 }
13571
13572 if (!IsRuined() && !parent.IsRuined())
13573 {
13574 return true;
13575 }
13576
13577 return false;
13578 }
13579
13581 {
13582
13583
13584
13585
13586 return super.CanReceiveItemIntoCargo(item);
13587 }
13588
13590 {
13591
13592
13593
13594
13595 GameInventory attachmentInv = attachment.GetInventory();
13597 {
13598 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13599 return false;
13600 }
13601
13602 InventoryLocation loc = new InventoryLocation();
13603 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13604 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13605 return false;
13606
13607 return super.CanReceiveAttachment(attachment, slotId);
13608 }
13609
13611 {
13612 if (!super.CanReleaseAttachment(attachment))
13613 return false;
13614
13615 return GetInventory().AreChildrenAccessible();
13616 }
13617
13618
13619
13620
13621
13622
13623
13624
13625
13626
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13639 {
13640 int id = muzzle_owner.GetMuzzleID();
13641 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13642
13643 if (WPOF_array)
13644 {
13645 for (int i = 0; i < WPOF_array.Count(); i++)
13646 {
13647 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13648
13649 if (WPOF)
13650 {
13651 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13652 }
13653 }
13654 }
13655 }
13656
13657
13659 {
13660 int id = muzzle_owner.GetMuzzleID();
13662
13663 if (WPOBE_array)
13664 {
13665 for (int i = 0; i < WPOBE_array.Count(); i++)
13666 {
13667 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13668
13669 if (WPOBE)
13670 {
13671 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13672 }
13673 }
13674 }
13675 }
13676
13677
13679 {
13680 int id = muzzle_owner.GetMuzzleID();
13681 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13682
13683 if (WPOOH_array)
13684 {
13685 for (int i = 0; i < WPOOH_array.Count(); i++)
13686 {
13687 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13688
13689 if (WPOOH)
13690 {
13691 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13692 }
13693 }
13694 }
13695 }
13696
13697
13699 {
13700 int id = muzzle_owner.GetMuzzleID();
13701 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13702
13703 if (WPOOH_array)
13704 {
13705 for (int i = 0; i < WPOOH_array.Count(); i++)
13706 {
13707 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13708
13709 if (WPOOH)
13710 {
13711 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13712 }
13713 }
13714 }
13715 }
13716
13717
13719 {
13720 int id = muzzle_owner.GetMuzzleID();
13721 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13722
13723 if (WPOOH_array)
13724 {
13725 for (int i = 0; i < WPOOH_array.Count(); i++)
13726 {
13727 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13728
13729 if (WPOOH)
13730 {
13731 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13732 }
13733 }
13734 }
13735 }
13736
13737
13738
13740 {
13742 {
13743 return true;
13744 }
13745
13746 return false;
13747 }
13748
13750 {
13752 {
13753 return true;
13754 }
13755
13756 return false;
13757 }
13758
13760 {
13762 {
13763 return true;
13764 }
13765
13766 return false;
13767 }
13768
13770 {
13771 return false;
13772 }
13773
13776 {
13777 return UATimeSpent.DEFAULT_DEPLOY;
13778 }
13779
13780
13781
13782
13784 {
13786 SetSynchDirty();
13787 }
13788
13790 {
13792 }
13793
13794
13796 {
13797 return false;
13798 }
13799
13802 {
13803 string att_type = "None";
13804
13805 if (ConfigIsExisting("soundAttType"))
13806 {
13807 att_type = ConfigGetString("soundAttType");
13808 }
13809
13811 }
13812
13814 {
13816 }
13817
13818
13819
13820
13821
13825
13827 {
13830
13832 }
13833
13834
13836 {
13838 return;
13839
13841
13844
13847
13848 SoundParameters params = new SoundParameters();
13852 }
13853
13854
13856 {
13858 return;
13859
13861 SetSynchDirty();
13862
13865 }
13866
13867
13869 {
13871 return;
13872
13874 SetSynchDirty();
13875
13878 }
13879
13881 {
13883 }
13884
13886 {
13888 }
13889
13892 {
13893 if (!
GetGame().IsDedicatedServer())
13894 {
13895 if (ConfigIsExisting("attachSoundSet"))
13896 {
13897 string cfg_path = "";
13898 string soundset = "";
13899 string type_name =
GetType();
13900
13903 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13904 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13905
13906 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13907 {
13908 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13909 {
13910 if (cfg_slot_array[i] == slot_type)
13911 {
13912 soundset = cfg_soundset_array[i];
13913 break;
13914 }
13915 }
13916 }
13917
13918 if (soundset != "")
13919 {
13920 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13922 }
13923 }
13924 }
13925 }
13926
13928 {
13929
13930 }
13931
13932 void OnApply(PlayerBase player);
13933
13935 {
13936 return 1.0;
13937 };
13938
13940 {
13942 }
13943
13945 {
13947 }
13948
13950
13952 {
13953 SetDynamicPhysicsLifeTime(0.01);
13955 }
13956
13958 {
13959 array<string> zone_names = new array<string>;
13960 GetDamageZones(zone_names);
13961 for (int i = 0; i < zone_names.Count(); i++)
13962 {
13963 SetHealthMax(zone_names.Get(i),"Health");
13964 }
13965 SetHealthMax("","Health");
13966 }
13967
13970 {
13971 float global_health = GetHealth01("","Health");
13972 array<string> zones = new array<string>;
13973 GetDamageZones(zones);
13974
13975 for (int i = 0; i < zones.Count(); i++)
13976 {
13977 SetHealth01(zones.Get(i),"Health",global_health);
13978 }
13979 }
13980
13983 {
13984 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13985 }
13986
13988 {
13989 if (!hasRootAsPlayer)
13990 {
13991 if (refParentIB)
13992 {
13993
13994 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13995 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13996
13997 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13998 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13999
14002 }
14003 else
14004 {
14005
14008 }
14009 }
14010 }
14011
14013 {
14015 {
14016 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14017 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
14018 {
14019 float heatPermCoef = 1.0;
14021 while (ent)
14022 {
14023 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14024 ent = ent.GetHierarchyParent();
14025 }
14026
14027 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14028 }
14029 }
14030 }
14031
14033 {
14034
14035 EntityAI parent = GetHierarchyParent();
14036 if (!parent)
14037 {
14038 hasParent = false;
14039 hasRootAsPlayer = false;
14040 }
14041 else
14042 {
14043 hasParent = true;
14044 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14045 refParentIB =
ItemBase.Cast(parent);
14046 }
14047 }
14048
14049 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14050 {
14051
14052 }
14053
14055 {
14056
14057 return false;
14058 }
14059
14061 {
14062
14063
14064 return false;
14065 }
14066
14068 {
14069
14070 return false;
14071 }
14072
14075 {
14076 return !GetIsFrozen() &&
IsOpen();
14077 }
14078
14080 {
14081 bool hasParent = false, hasRootAsPlayer = false;
14083
14084 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14085 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14086
14087 if (wwtu || foodDecay)
14088 {
14092
14093 if (processWetness || processTemperature || processDecay)
14094 {
14096
14097 if (processWetness)
14098 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14099
14100 if (processTemperature)
14102
14103 if (processDecay)
14104 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14105 }
14106 }
14107 }
14108
14111 {
14113 }
14114
14116 {
14119
14120 return super.GetTemperatureFreezeThreshold();
14121 }
14122
14124 {
14127
14128 return super.GetTemperatureThawThreshold();
14129 }
14130
14132 {
14135
14136 return super.GetItemOverheatThreshold();
14137 }
14138
14140 {
14142 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14143
14144 return super.GetTemperatureFreezeTime();
14145 }
14146
14148 {
14150 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14151
14152 return super.GetTemperatureThawTime();
14153 }
14154
14159
14161 {
14162 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14163 }
14164
14166 {
14167 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14168 }
14169
14172 {
14174 }
14175
14177 {
14179 }
14180
14182 {
14184 }
14185
14188 {
14189 return null;
14190 }
14191
14194 {
14195 return false;
14196 }
14197
14199 {
14201 {
14204 if (!trg)
14205 {
14207 explosive = this;
14208 }
14209
14210 explosive.PairRemote(trg);
14212
14213 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14214 trg.SetPersistentPairID(persistentID);
14215 explosive.SetPersistentPairID(persistentID);
14216
14217 return true;
14218 }
14219 return false;
14220 }
14221
14224 {
14225 float ret = 1.0;
14228 ret *= GetHealth01();
14229
14230 return ret;
14231 }
14232
14233 #ifdef DEVELOPER
14234 override void SetDebugItem()
14235 {
14236 super.SetDebugItem();
14237 _itemBase = this;
14238 }
14239
14241 {
14242 string text = super.GetDebugText();
14243
14245 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14246
14247 return text;
14248 }
14249 #endif
14250
14252 {
14253 return true;
14254 }
14255
14257
14259
14261 {
14264 }
14265
14266
14274
14290}
14291
14293{
14295 if (entity)
14296 {
14297 bool is_item = entity.IsInherited(
ItemBase);
14298 if (is_item && full_quantity)
14299 {
14302 }
14303 }
14304 else
14305 {
14307 return NULL;
14308 }
14309 return entity;
14310}
14311
14313{
14314 if (item)
14315 {
14316 if (health > 0)
14317 item.SetHealth("", "", health);
14318
14319 if (item.CanHaveTemperature())
14320 {
14322 if (item.CanFreeze())
14323 item.SetFrozen(false);
14324 }
14325
14326 if (item.HasEnergyManager())
14327 {
14328 if (quantity >= 0)
14329 {
14330 item.GetCompEM().SetEnergy0To1(quantity);
14331 }
14332 else
14333 {
14335 }
14336 }
14337 else if (item.IsMagazine())
14338 {
14339 Magazine mag = Magazine.Cast(item);
14340 if (quantity >= 0)
14341 {
14342 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14343 }
14344 else
14345 {
14347 }
14348
14349 }
14350 else
14351 {
14352 if (quantity >= 0)
14353 {
14354 item.SetQuantityNormalized(quantity, false);
14355 }
14356 else
14357 {
14359 }
14360
14361 }
14362 }
14363}
14364
14365#ifdef DEVELOPER
14367#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.