9528{
9530 {
9531 return true;
9532 }
9533};
9534
9536{
9537
9538};
9539
9540
9541
9543{
9547
9549
9552
9553
9554
9555
9556
9565
9571
9576
9581
9602 protected bool m_IsResultOfSplit
9603
9605
9610
9611
9612
9614
9618
9619
9620
9622
9625
9626
9627
9633
9634
9642
9645
9646
9648
9649
9651
9652
9657
9658
9663
9665
9666
9668
9669
9671 {
9676
9677 if (!
g_Game.IsDedicatedServer())
9678 {
9680 {
9682
9684 {
9686 }
9687 }
9688
9691 }
9692
9693 m_OldLocation = null;
9694
9696 {
9698 }
9699
9700 if (ConfigIsExisting("headSelectionsToHide"))
9701 {
9704 }
9705
9707 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9708 {
9710 }
9711
9713
9714 m_IsResultOfSplit = false;
9715
9717 }
9718
9720 {
9721 super.InitItemVariables();
9722
9728 m_Count = ConfigGetInt(
"count");
9729
9732
9737
9740
9745
9757
9761
9762
9765 if (ConfigIsExisting("canBeSplit"))
9766 {
9769 }
9770
9772 if (ConfigIsExisting("itemBehaviour"))
9774
9775
9778 RegisterNetSyncVariableInt("m_VarLiquidType");
9779 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9780
9781 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9782 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9783 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9784
9785 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9786 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9787 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9788 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9789
9790 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9791 RegisterNetSyncVariableBool("m_IsTakeable");
9792 RegisterNetSyncVariableBool("m_IsHologram");
9793
9796 {
9799 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9800 }
9801
9803
9805 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9807
9809 }
9810
9812 {
9814 }
9815
9817 {
9820 {
9825 }
9826 }
9827
9828 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9829 {
9831 {
9834 }
9835
9837 }
9838
9840 {
9846 }
9847
9849
9851 {
9853
9854 if (!action)
9855 {
9856 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9857 return;
9858 }
9859
9861 if (!ai)
9862 {
9864 return;
9865 }
9866
9868 if (!action_array)
9869 {
9870 action_array = new array<ActionBase_Basic>;
9872 }
9873 if (LogManager.IsActionLogEnable())
9874 {
9875 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9876 }
9877
9878 if (action_array.Find(action) != -1)
9879 {
9880 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9881 }
9882 else
9883 {
9884 action_array.Insert(action);
9885 }
9886 }
9887
9889 {
9890 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9891 ActionBase action = player.GetActionManager().GetAction(actionName);
9894
9895 if (action_array)
9896 {
9897 action_array.RemoveItem(action);
9898 }
9899 }
9900
9901
9902
9904 {
9905 ActionOverrideData overrideData = new ActionOverrideData();
9909
9911 if (!actionMap)
9912 {
9915 }
9916
9917 actionMap.Insert(this.
Type(), overrideData);
9918
9919 }
9920
9922
9924
9925
9927 {
9930
9933
9934 string config_to_search = "CfgVehicles";
9935 string muzzle_owner_config;
9936
9938 {
9939 if (IsInherited(Weapon))
9940 config_to_search = "CfgWeapons";
9941
9942 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9943
9944 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9945
9946 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9947
9948 if (config_OnFire_subclass_count > 0)
9949 {
9950 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9951
9952 for (int i = 0; i < config_OnFire_subclass_count; i++)
9953 {
9954 string particle_class = "";
9955 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9956 string config_OnFire_entry = config_OnFire_class + particle_class;
9957 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9958 WPOF_array.Insert(WPOF);
9959 }
9960
9961
9963 }
9964 }
9965
9967 {
9968 config_to_search = "CfgWeapons";
9969 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9970
9971 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9972
9973 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9974
9975 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9976 {
9977 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9978
9979 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9980 {
9981 string particle_class2 = "";
9982 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9983 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9984 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9985 WPOBE_array.Insert(WPOBE);
9986 }
9987
9988
9990 }
9991 }
9992 }
9993
9994
9996 {
9999
10001 {
10002 string config_to_search = "CfgVehicles";
10003
10004 if (IsInherited(Weapon))
10005 config_to_search = "CfgWeapons";
10006
10007 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
10008 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
10009
10010 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
10011 {
10012
10014
10016 {
10018 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
10020 return;
10021 }
10022
10025
10026
10027
10028 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
10029 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
10030
10031 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
10032 {
10033 string particle_class = "";
10034 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
10035 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
10036 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
10037
10038 if (entry_type == CT_CLASS)
10039 {
10040 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
10041 WPOOH_array.Insert(WPOF);
10042 }
10043 }
10044
10045
10047 }
10048 }
10049 }
10050
10052 {
10054 }
10055
10057 {
10059 {
10061
10064
10067
10068 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10069 }
10070 }
10071
10073 {
10075 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10076
10078 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10079
10081 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10082
10084 {
10086 }
10087 }
10088
10090 {
10092 }
10093
10095 {
10098 else
10100
10102 {
10105 }
10106 else
10107 {
10110
10113 }
10114
10116 }
10117
10119 {
10121 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10122 }
10123
10125 {
10127 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10129 }
10130
10132 {
10134 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10135 }
10136
10138 {
10141
10142 OverheatingParticle OP = new OverheatingParticle();
10147
10149 }
10150
10152 {
10155
10156 return -1;
10157 }
10158
10160 {
10162 {
10165
10166 for (int i = count; i > 0; --i)
10167 {
10168 int id = i - 1;
10171
10174
10175 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10176 {
10177 if (p)
10178 {
10181 }
10182 }
10183 }
10184 }
10185 }
10186
10188 {
10190 {
10192 {
10193 int id = i - 1;
10195
10196 if (OP)
10197 {
10199
10200 if (p)
10201 {
10203 }
10204
10205 delete OP;
10206 }
10207 }
10208
10211 }
10212 }
10213
10216 {
10217 return 0.0;
10218 }
10219
10220
10222 {
10223 return 250;
10224 }
10225
10227 {
10228 return 0;
10229 }
10230
10233 {
10235 return true;
10236
10237 return false;
10238 }
10239
10242 {
10245
10247 {
10249 }
10250 else
10251 {
10252
10254 }
10255
10257 }
10258
10265 {
10266 return -1;
10267 }
10268
10269
10270
10271
10273 {
10275 {
10276 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10277 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10278
10279 if (r_index >= 0)
10280 {
10281 InventoryLocation r_il = new InventoryLocation;
10282 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10283
10284 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10287 {
10288 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10289 }
10291 {
10292 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10293 }
10294
10295 }
10296
10297 player.GetHumanInventory().ClearUserReservedLocation(this);
10298 }
10299
10302 }
10303
10304
10305
10306
10308 {
10309 return ItemBase.m_DebugActionsMask;
10310 }
10311
10313 {
10314 return ItemBase.m_DebugActionsMask & mask;
10315 }
10316
10318 {
10319 ItemBase.m_DebugActionsMask = mask;
10320 }
10321
10323 {
10324 ItemBase.m_DebugActionsMask |= mask;
10325 }
10326
10328 {
10329 ItemBase.m_DebugActionsMask &= ~mask;
10330 }
10331
10333 {
10335 {
10337 }
10338 else
10339 {
10341 }
10342 }
10343
10344
10346 {
10347 if (GetEconomyProfile())
10348 {
10349 float q_max = GetEconomyProfile().GetQuantityMax();
10350 if (q_max > 0)
10351 {
10352 float q_min = GetEconomyProfile().GetQuantityMin();
10353 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10354
10356 {
10357 ComponentEnergyManager comp = GetCompEM();
10359 {
10361 }
10362 }
10364 {
10366
10367 }
10368
10369 }
10370 }
10371 }
10372
10375 {
10376 EntityAI parent = GetHierarchyParent();
10377
10378 if (parent)
10379 {
10380 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10381 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10382 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10383 }
10384 }
10385
10388 {
10389 EntityAI parent = GetHierarchyParent();
10390
10391 if (parent)
10392 {
10393 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10394 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10395 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10396 }
10397 }
10398
10400 {
10401
10402
10403
10404
10406
10408 {
10409 if (ScriptInputUserData.CanStoreInputUserData())
10410 {
10411 ScriptInputUserData ctx = new ScriptInputUserData;
10417 ctx.
Write(use_stack_max);
10420
10422 {
10423 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10424 }
10425 }
10426 }
10427 else if (!
g_Game.IsMultiplayer())
10428 {
10430 }
10431 }
10432
10434 {
10436 }
10437
10439 {
10441 }
10442
10444 {
10446 }
10447
10449 {
10450
10451 return false;
10452 }
10453
10455 {
10456 return false;
10457 }
10458
10462 {
10463 return false;
10464 }
10465
10467 {
10468 return "";
10469 }
10470
10472
10474 {
10475 return false;
10476 }
10477
10479 {
10480 return true;
10481 }
10482
10483
10484
10486 {
10487 return true;
10488 }
10489
10491 {
10492 return true;
10493 }
10494
10496 {
10497 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10499 }
10500
10502 {
10504 }
10505
10507 {
10509 if (!is_being_placed)
10511 SetSynchDirty();
10512 }
10513
10514
10516
10518 {
10520 }
10521
10523 {
10525 }
10526
10528 {
10529 return 1;
10530 }
10531
10533 {
10534 return false;
10535 }
10536
10538 {
10540 SetSynchDirty();
10541 }
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555
10556
10557
10558
10559
10560
10561
10562
10563
10564
10565
10566
10567
10568
10569
10570
10571
10572
10573
10574
10575
10576
10578 {
10579 super.OnMovedInsideCargo(container);
10580
10581 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10582 }
10583
10584 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10585 {
10586 super.EEItemLocationChanged(oldLoc, newLoc);
10587
10588 PlayerBase newPlayer = null;
10589 PlayerBase oldPlayer = null;
10590
10591 if (newLoc.GetParent())
10592 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10593
10594 if (oldLoc.GetParent())
10595 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10596
10598 {
10599 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10600
10601 if (rIndex >= 0)
10602 {
10603 InventoryLocation rIl = new InventoryLocation;
10604 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10605
10606 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10609 {
10610 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10611 }
10613 {
10615 }
10616
10617 }
10618 }
10619
10621 {
10622 if (newPlayer)
10623 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10624
10625 if (newPlayer == oldPlayer)
10626 {
10627 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10628 {
10630 {
10631 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10632 {
10633 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10634 }
10635 }
10636 else
10637 {
10638 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10639 }
10640 }
10641
10642 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10643 {
10644 int type = oldLoc.GetType();
10646 {
10647 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10648 }
10650 {
10651 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10652 }
10653 }
10654 if (!m_OldLocation)
10655 {
10656 m_OldLocation = new InventoryLocation;
10657 }
10658 m_OldLocation.Copy(oldLoc);
10659 }
10660 else
10661 {
10662 if (m_OldLocation)
10663 {
10664 m_OldLocation.Reset();
10665 }
10666 }
10667
10668 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10669 }
10670 else
10671 {
10672 if (newPlayer)
10673 {
10674 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10675 if (resIndex >= 0)
10676 {
10677 InventoryLocation il = new InventoryLocation;
10678 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10680 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10683 {
10684 il.
GetParent().GetOnReleaseLock().Invoke(it);
10685 }
10687 {
10689 }
10690
10691 }
10692 }
10694 {
10695
10697 }
10698
10699 if (m_OldLocation)
10700 {
10701 m_OldLocation.Reset();
10702 }
10703 }
10704
10706 {
10707 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10708 }
10709
10711 {
10712 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10713 }
10714 }
10715
10716 override void EOnContact(IEntity other, Contact extra)
10717 {
10719 {
10720 int liquidType = -1;
10722 if (impactSpeed > 0.0)
10723 {
10725 #ifndef SERVER
10727 #else
10729 SetSynchDirty();
10730 #endif
10732 }
10733 }
10734
10735 #ifdef SERVER
10736 if (GetCompEM() && GetCompEM().IsPlugged())
10737 {
10738 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10739 GetCompEM().UnplugThis();
10740 }
10741 #endif
10742 }
10743
10745
10747 {
10749 }
10750
10752 {
10753
10754 }
10755
10757 {
10758 super.OnItemLocationChanged(old_owner, new_owner);
10759
10760 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10761 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10762
10763 if (!relatedPlayer && playerNew)
10764 relatedPlayer = playerNew;
10765
10766 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10767 {
10769 if (actionMgr)
10770 {
10771 ActionBase currentAction = actionMgr.GetRunningAction();
10772 if (currentAction)
10774 }
10775 }
10776
10777 Man ownerPlayerOld = null;
10778 Man ownerPlayerNew = null;
10779
10780 if (old_owner)
10781 {
10782 if (old_owner.
IsMan())
10783 {
10784 ownerPlayerOld = Man.Cast(old_owner);
10785 }
10786 else
10787 {
10788 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10789 }
10790 }
10791 else
10792 {
10794 {
10796
10797 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10798 {
10799 GetCompEM().UnplugThis();
10800 }
10801 }
10802 }
10803
10804 if (new_owner)
10805 {
10806 if (new_owner.
IsMan())
10807 {
10808 ownerPlayerNew = Man.Cast(new_owner);
10809 }
10810 else
10811 {
10812 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10813 }
10814 }
10815
10816 if (ownerPlayerOld != ownerPlayerNew)
10817 {
10818 if (ownerPlayerOld)
10819 {
10820 array<EntityAI> subItemsExit = new array<EntityAI>;
10822 for (int i = 0; i < subItemsExit.Count(); i++)
10823 {
10826 }
10827 }
10828
10829 if (ownerPlayerNew)
10830 {
10831 array<EntityAI> subItemsEnter = new array<EntityAI>;
10833 for (int j = 0; j < subItemsEnter.Count(); j++)
10834 {
10837 }
10838 }
10839 }
10840 else if (ownerPlayerNew != null)
10841 {
10842 PlayerBase nplayer;
10843 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10844 {
10845 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10847 for (int k = 0; k < subItemsUpdate.Count(); k++)
10848 {
10850 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10851 }
10852 }
10853 }
10854
10855 if (old_owner)
10856 old_owner.OnChildItemRemoved(this);
10857 if (new_owner)
10858 new_owner.OnChildItemReceived(this);
10859 }
10860
10861
10863 {
10864 super.EEDelete(parent);
10865 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10866 if (player)
10867 {
10869
10870 if (player.IsAlive())
10871 {
10872 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10873 if (r_index >= 0)
10874 {
10875 InventoryLocation r_il = new InventoryLocation;
10876 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10877
10878 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10881 {
10882 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10883 }
10885 {
10886 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10887 }
10888
10889 }
10890
10891 player.RemoveQuickBarEntityShortcut(this);
10892 }
10893 }
10894 }
10895
10897 {
10898 super.EEKilled(killer);
10899
10902 {
10903 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10904 {
10905 if (IsMagazine())
10906 {
10907 if (Magazine.Cast(this).GetAmmoCount() > 0)
10908 {
10910 }
10911 }
10912 else
10913 {
10915 }
10916 }
10917 }
10918 }
10919
10921 {
10922 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10923
10924 super.OnWasAttached(parent, slot_id);
10925
10928
10931 }
10932
10934 {
10935 super.OnWasDetached(parent, slot_id);
10936
10939
10942 }
10943
10945 {
10946 int idx;
10949
10950 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10951 if (inventory_slots.Count() < 1)
10952 {
10953 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10954 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10955 }
10956 else
10957 {
10958 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10959 }
10960
10961 idx = inventory_slots.Find(slot);
10962 if (idx < 0)
10963 return "";
10964
10965 return attach_types.Get(idx);
10966 }
10967
10969 {
10970 int idx = -1;
10971 string slot;
10972
10975
10976 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10977 if (inventory_slots.Count() < 1)
10978 {
10979 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10980 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10981 }
10982 else
10983 {
10984 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10985 if (detach_types.Count() < 1)
10986 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10987 }
10988
10989 for (int i = 0; i < inventory_slots.Count(); i++)
10990 {
10991 slot = inventory_slots.Get(i);
10992 }
10993
10994 if (slot != "")
10995 {
10996 if (detach_types.Count() == 1)
10997 idx = 0;
10998 else
10999 idx = inventory_slots.Find(slot);
11000 }
11001 if (idx < 0)
11002 return "";
11003
11004 return detach_types.Get(idx);
11005 }
11006
11008 {
11009
11011
11012
11013 float min_time = 1;
11014 float max_time = 3;
11015 float delay = Math.RandomFloat(min_time, max_time);
11016
11017 explode_timer.Run(delay, this, "DoAmmoExplosion");
11018 }
11019
11021 {
11022 Magazine magazine = Magazine.Cast(this);
11023 int pop_sounds_count = 6;
11024 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
11025
11026
11027 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
11028 string sound_name = pop_sounds[ sound_idx ];
11029 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
11030
11031
11032 magazine.ServerAddAmmoCount(-1);
11033
11034
11035 float min_temp_to_explode = 100;
11036
11037 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
11038 {
11040 }
11041 }
11042
11043
11044 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11045 {
11046 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11047
11048 const int CHANCE_DAMAGE_CARGO = 4;
11049 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11050 const int CHANCE_DAMAGE_NOTHING = 2;
11051
11053 {
11054 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11055 int chances;
11056 int rnd;
11057
11058 if (GetInventory().GetCargo())
11059 {
11060 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11061 rnd = Math.RandomInt(0,chances);
11062
11063 if (rnd < CHANCE_DAMAGE_CARGO)
11064 {
11066 }
11067 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11068 {
11070 }
11071 }
11072 else
11073 {
11074 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11075 rnd = Math.RandomInt(0,chances);
11076
11077 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11078 {
11080 }
11081 }
11082 }
11083 }
11084
11086 {
11087 CargoBase cargo = GetInventory().GetCargo();
11088 if (cargo)
11089 {
11091 if (item_count > 0)
11092 {
11093 int random_pick = Math.RandomInt(0, item_count);
11095 if (!item.IsExplosive())
11096 {
11097 item.AddHealth("","",damage);
11098 return true;
11099 }
11100 }
11101 }
11102 return false;
11103 }
11104
11106 {
11107 GameInventory inventory = GetInventory();
11109 if (attachment_count > 0)
11110 {
11111 int random_pick = Math.RandomInt(0, attachment_count);
11113 if (!attachment.IsExplosive())
11114 {
11115 attachment.AddHealth("","",damage);
11116 return true;
11117 }
11118 }
11119 return false;
11120 }
11121
11123 {
11125 }
11126
11128 {
11130 return GetInventory().CanRemoveEntity();
11131
11132 return false;
11133 }
11134
11136 {
11137
11139 return false;
11140
11141
11143 return false;
11144
11145
11146
11148 if (delta == 0)
11149 return false;
11150
11151
11152 return true;
11153 }
11154
11156 {
11158 {
11159 if (ScriptInputUserData.CanStoreInputUserData())
11160 {
11161 ScriptInputUserData ctx = new ScriptInputUserData;
11166 ctx.
Write(destination_entity);
11168 ctx.
Write(slot_id);
11170 }
11171 }
11172 else if (!
g_Game.IsMultiplayer())
11173 {
11175 }
11176 }
11177
11179 {
11180 float split_quantity_new;
11184 InventoryLocation loc = new InventoryLocation;
11185
11186 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11187 {
11189 split_quantity_new = stack_max;
11190 else
11192
11194 {
11195 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11196 if (new_item)
11197 {
11198 new_item.SetResultOfSplit(true);
11199 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11201 new_item.
SetQuantity(split_quantity_new,
false,
true);
11202 }
11203 }
11204 }
11205 else if (destination_entity && slot_id == -1)
11206 {
11207 if (quantity > stack_max)
11208 split_quantity_new = stack_max;
11209 else
11210 split_quantity_new = quantity;
11211
11213 {
11214 GameInventory destinationInventory = destination_entity.GetInventory();
11216 {
11219 }
11220
11221 if (new_item)
11222 {
11223 new_item.SetResultOfSplit(true);
11224 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11226 new_item.
SetQuantity(split_quantity_new,
false,
true);
11227 }
11228 }
11229 }
11230 else
11231 {
11232 if (stack_max != 0)
11233 {
11235 {
11237 }
11238
11239 if (split_quantity_new == 0)
11240 {
11241 if (!
g_Game.IsMultiplayer())
11242 player.PhysicalPredictiveDropItem(this);
11243 else
11244 player.ServerDropEntity(this);
11245 return;
11246 }
11247
11249 {
11251
11252 if (new_item)
11253 {
11254 new_item.SetResultOfSplit(true);
11255 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11258 new_item.PlaceOnSurface();
11259 }
11260 }
11261 }
11262 }
11263 }
11264
11266 {
11267 float split_quantity_new;
11271 InventoryLocation loc = new InventoryLocation;
11272
11273 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11274 {
11276 split_quantity_new = stack_max;
11277 else
11279
11281 {
11282 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11283 if (new_item)
11284 {
11285 new_item.SetResultOfSplit(true);
11286 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11288 new_item.
SetQuantity(split_quantity_new,
false,
true);
11289 }
11290 }
11291 }
11292 else if (destination_entity && slot_id == -1)
11293 {
11294 if (quantity > stack_max)
11295 split_quantity_new = stack_max;
11296 else
11297 split_quantity_new = quantity;
11298
11300 {
11301 GameInventory destinationInventory = destination_entity.GetInventory();
11303 {
11306 }
11307
11308 if (new_item)
11309 {
11310 new_item.SetResultOfSplit(true);
11311 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11313 new_item.
SetQuantity(split_quantity_new,
false,
true);
11314 }
11315 }
11316 }
11317 else
11318 {
11319 if (stack_max != 0)
11320 {
11322 {
11324 }
11325
11327 {
11329
11330 if (new_item)
11331 {
11332 new_item.SetResultOfSplit(true);
11333 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11336 new_item.PlaceOnSurface();
11337 }
11338 }
11339 }
11340 }
11341 }
11342
11344 {
11346 {
11347 if (ScriptInputUserData.CanStoreInputUserData())
11348 {
11349 ScriptInputUserData ctx = new ScriptInputUserData;
11354 dst.WriteToContext(ctx);
11356 }
11357 }
11358 else if (!
g_Game.IsMultiplayer())
11359 {
11361 }
11362 }
11363
11365 {
11367 {
11368 if (ScriptInputUserData.CanStoreInputUserData())
11369 {
11370 ScriptInputUserData ctx = new ScriptInputUserData;
11375 ctx.
Write(destination_entity);
11381 }
11382 }
11383 else if (!
g_Game.IsMultiplayer())
11384 {
11386 }
11387 }
11388
11390 {
11392 }
11393
11395 {
11397 float split_quantity_new;
11399 if (dst.IsValid())
11400 {
11401 int slot_id = dst.GetSlot();
11403
11404 if (quantity > stack_max)
11405 split_quantity_new = stack_max;
11406 else
11407 split_quantity_new = quantity;
11408
11410 {
11412
11413 if (new_item)
11414 {
11415 new_item.SetResultOfSplit(true);
11416 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11418 new_item.
SetQuantity(split_quantity_new,
false,
true);
11419 }
11420
11421 return new_item;
11422 }
11423 }
11424
11425 return null;
11426 }
11427
11429 {
11431 float split_quantity_new;
11433 if (destination_entity)
11434 {
11436 if (quantity > stackable)
11437 split_quantity_new = stackable;
11438 else
11439 split_quantity_new = quantity;
11440
11442 {
11443 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11444 if (new_item)
11445 {
11446 new_item.SetResultOfSplit(true);
11447 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11449 new_item.
SetQuantity(split_quantity_new,
false,
true);
11450 }
11451 }
11452 }
11453 }
11454
11456 {
11458 {
11459 if (ScriptInputUserData.CanStoreInputUserData())
11460 {
11461 ScriptInputUserData ctx = new ScriptInputUserData;
11466 ItemBase destination_entity =
this;
11467 ctx.
Write(destination_entity);
11471 }
11472 }
11473 else if (!
g_Game.IsMultiplayer())
11474 {
11476 }
11477 }
11478
11480 {
11482 float split_quantity_new;
11484 if (player)
11485 {
11487 if (quantity > stackable)
11488 split_quantity_new = stackable;
11489 else
11490 split_quantity_new = quantity;
11491
11493 {
11494 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11495 new_item =
ItemBase.Cast(in_hands);
11496 if (new_item)
11497 {
11498 new_item.SetResultOfSplit(true);
11499 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11501 new_item.SetQuantity(split_quantity_new, false, true);
11502 }
11503 }
11504 }
11505 }
11506
11508 {
11510 float split_quantity_new = Math.Floor(quantity * 0.5);
11511
11513 return;
11514
11516
11517 if (new_item)
11518 {
11519 if (new_item.GetQuantityMax() < split_quantity_new)
11520 {
11521 split_quantity_new = new_item.GetQuantityMax();
11522 }
11523
11524 new_item.SetResultOfSplit(true);
11525 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11526
11528 {
11531 }
11532 else
11533 {
11535 new_item.
SetQuantity(split_quantity_new,
false,
true);
11536 }
11537 }
11538 }
11539
11541 {
11543 float split_quantity_new = Math.Floor(quantity / 2);
11544
11546 return;
11547
11548 InventoryLocation invloc = new InventoryLocation;
11550
11552 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11553
11554 if (new_item)
11555 {
11556 if (new_item.GetQuantityMax() < split_quantity_new)
11557 {
11558 split_quantity_new = new_item.GetQuantityMax();
11559 }
11561 {
11564 }
11565 else if (split_quantity_new > 1)
11566 {
11568 new_item.
SetQuantity(split_quantity_new,
false,
true);
11569 }
11570 }
11571 }
11572
11575 {
11576 SetWeightDirty();
11578
11579 if (parent)
11580 parent.OnAttachmentQuantityChangedEx(this, delta);
11581
11583 {
11585 {
11587 }
11589 {
11590 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11592 }
11593 }
11594 }
11595
11598 {
11599
11600 }
11601
11604 {
11606 }
11607
11609 {
11610 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11611
11613 {
11614 if (newLevel == GameConstants.STATE_RUINED)
11615 {
11617 EntityAI parent = GetHierarchyParent();
11618 if (parent && parent.IsFireplace())
11619 {
11620 CargoBase cargo = GetInventory().GetCargo();
11621 if (cargo)
11622 {
11624 {
11626 }
11627 }
11628 }
11629 }
11630
11632 {
11633
11635 return;
11636 }
11637
11638 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11639 {
11641 }
11642 }
11643 }
11644
11645
11647 {
11648 super.OnRightClick();
11649
11651 {
11653 {
11654 if (ScriptInputUserData.CanStoreInputUserData())
11655 {
11656 EntityAI root = GetHierarchyRoot();
11657 Man playerOwner = GetHierarchyRootPlayer();
11658 InventoryLocation dst = new InventoryLocation;
11659
11660
11661 if (!playerOwner && root && root == this)
11662 {
11664 }
11665 else
11666 {
11667
11668 GetInventory().GetCurrentInventoryLocation(dst);
11670 {
11671 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11673 {
11675 }
11676 else
11677 {
11679
11680
11681 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11682 {
11684 }
11685 else
11686 {
11687 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11688 }
11689 }
11690 }
11691 }
11692
11693 ScriptInputUserData ctx = new ScriptInputUserData;
11701 }
11702 }
11703 else if (!
g_Game.IsMultiplayer())
11704 {
11706 }
11707 }
11708 }
11709
11711 {
11712 if (root)
11713 {
11714 vector m4[4];
11715 root.GetTransform(m4);
11716 dst.SetGround(this, m4);
11717 }
11718 else
11719 {
11720 GetInventory().GetCurrentInventoryLocation(dst);
11721 }
11722 }
11723
11724 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11725 {
11726
11727 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11728 return false;
11729
11730 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11731 return false;
11732
11733
11735 return false;
11736
11737
11738 Magazine mag = Magazine.Cast(this);
11739 if (mag)
11740 {
11741 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11742 return false;
11743
11744 if (stack_max_limit)
11745 {
11746 Magazine other_mag = Magazine.Cast(other_item);
11747 if (other_item)
11748 {
11749 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11750 return false;
11751 }
11752
11753 }
11754 }
11755 else
11756 {
11757
11759 return false;
11760
11762 return false;
11763 }
11764
11765 PlayerBase player = null;
11766 if (CastTo(player, GetHierarchyRootPlayer()))
11767 {
11768 if (player.GetInventory().HasAttachment(this))
11769 return false;
11770
11771 if (player.IsItemsToDelete())
11772 return false;
11773 }
11774
11775 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11776 return false;
11777
11778 int slotID;
11780 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11781 return false;
11782
11783 return true;
11784 }
11785
11787 {
11789 }
11790
11792 {
11793 return m_IsResultOfSplit;
11794 }
11795
11797 {
11798 m_IsResultOfSplit = value;
11799 }
11800
11802 {
11804 }
11805
11807 {
11808 float other_item_quantity = other_item.GetQuantity();
11809 float this_free_space;
11810
11812
11814
11815 if (other_item_quantity > this_free_space)
11816 {
11817 return this_free_space;
11818 }
11819 else
11820 {
11821 return other_item_quantity;
11822 }
11823 }
11824
11826 {
11828 }
11829
11831 {
11833 return;
11834
11835 if (!IsMagazine() && other_item)
11836 {
11838 if (quantity_used != 0)
11839 {
11840 float hp1 = GetHealth01("","");
11841 float hp2 = other_item.GetHealth01("","");
11842 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11843 hpResult = hpResult / (
GetQuantity() + quantity_used);
11844
11845 hpResult *= GetMaxHealth();
11846 Math.Round(hpResult);
11847 SetHealth("", "Health", hpResult);
11848
11850 other_item.AddQuantity(-quantity_used);
11851 }
11852 }
11854 }
11855
11857 {
11858 #ifdef SERVER
11859 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11860 GetHierarchyParent().IncreaseLifetimeUp();
11861 #endif
11862 };
11863
11865 {
11866 PlayerBase p = PlayerBase.Cast(player);
11867
11868 array<int> recipesIds = p.m_Recipes;
11869 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11870 if (moduleRecipesManager)
11871 {
11872 EntityAI itemInHands = player.GetEntityInHands();
11873 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11874 }
11875
11876 for (int i = 0;i < recipesIds.Count(); i++)
11877 {
11878 int key = recipesIds.Get(i);
11879 string recipeName = moduleRecipesManager.GetRecipeName(key);
11881 }
11882 }
11883
11884
11885 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11886 {
11887 super.GetDebugActions(outputList);
11888
11889
11895
11896
11901
11906
11907
11911
11912
11914 {
11918 }
11919
11922
11923
11927
11929
11930 InventoryLocation loc = new InventoryLocation();
11931 GetInventory().GetCurrentInventoryLocation(loc);
11933 {
11934 if (Gizmo_IsSupported())
11937 }
11938
11940 }
11941
11942
11943
11944
11946 {
11947 super.OnAction(action_id, player, ctx);
11948
11950 {
11951 switch (action_id)
11952 {
11956 return true;
11960 return true;
11961 }
11962 }
11963
11965 {
11966 switch (action_id)
11967 {
11969 Delete();
11970 return true;
11971 }
11972 }
11973
11974 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11975 {
11976 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11977 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11978 PlayerBase p = PlayerBase.Cast(player);
11979 if (
EActions.RECIPES_RANGE_START < 1000)
11980 {
11981 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11982 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11983 }
11984 }
11985 #ifndef SERVER
11986 else if (action_id ==
EActions.WATCH_PLAYER)
11987 {
11988 PluginDeveloper.SetDeveloperItemClientEx(player);
11989 }
11990 #endif
11992 {
11993 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11994 {
11995 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11996 OnDebugButtonPressServer(id + 1);
11997 }
11998
11999 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
12000 {
12001 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
12003 }
12004
12005 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
12006 {
12007 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
12009 }
12010
12011 else if (action_id ==
EActions.ADD_QUANTITY)
12012 {
12013 if (IsMagazine())
12014 {
12015 Magazine mag = Magazine.Cast(this);
12016 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
12017 }
12018 else
12019 {
12021 }
12022
12023 if (m_EM)
12024 {
12025 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
12026 }
12027
12028 }
12029
12030 else if (action_id ==
EActions.REMOVE_QUANTITY)
12031 {
12032 if (IsMagazine())
12033 {
12034 Magazine mag2 = Magazine.Cast(this);
12035 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
12036 }
12037 else
12038 {
12040 }
12041 if (m_EM)
12042 {
12043 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12044 }
12045
12046 }
12047
12048 else if (action_id ==
EActions.SET_QUANTITY_0)
12049 {
12051
12052 if (m_EM)
12053 {
12054 m_EM.SetEnergy(0);
12055 }
12056 }
12057
12058 else if (action_id ==
EActions.SET_MAX_QUANTITY)
12059 {
12061
12062 if (m_EM)
12063 {
12064 m_EM.SetEnergy(m_EM.GetEnergyMax());
12065 }
12066 }
12067
12068 else if (action_id ==
EActions.ADD_HEALTH)
12069 {
12070 AddHealth("","",GetMaxHealth("","Health")/5);
12071 }
12072 else if (action_id ==
EActions.REMOVE_HEALTH)
12073 {
12074 AddHealth("","",-GetMaxHealth("","Health")/5);
12075 }
12076 else if (action_id ==
EActions.DESTROY_HEALTH)
12077 {
12078 SetHealth01("","",0);
12079 }
12080 else if (action_id ==
EActions.WATCH_ITEM)
12081 {
12083 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12084 #ifdef DEVELOPER
12085 SetDebugDeveloper_item(this);
12086 #endif
12087 }
12088
12089 else if (action_id ==
EActions.ADD_TEMPERATURE)
12090 {
12091 AddTemperature(20);
12092
12093 }
12094
12095 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12096 {
12097 AddTemperature(-20);
12098
12099 }
12100
12101 else if (action_id ==
EActions.FLIP_FROZEN)
12102 {
12103 SetFrozen(!GetIsFrozen());
12104
12105 }
12106
12107 else if (action_id ==
EActions.ADD_WETNESS)
12108 {
12110
12111 }
12112
12113 else if (action_id ==
EActions.REMOVE_WETNESS)
12114 {
12116
12117 }
12118
12119 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12120 {
12123
12124
12125 }
12126
12127 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12128 {
12131 }
12132
12133 else if (action_id ==
EActions.MAKE_SPECIAL)
12134 {
12135 auto debugParams = DebugSpawnParams.WithPlayer(player);
12136 OnDebugSpawnEx(debugParams);
12137 }
12138
12139 }
12140
12141
12142 return false;
12143 }
12144
12145
12146
12147
12151
12154
12155
12156
12158 {
12159 return false;
12160 }
12161
12162
12164 {
12165 return true;
12166 }
12167
12168
12170 {
12171 return true;
12172 }
12173
12174
12175
12177 {
12178 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12179 return g_Game.ConfigIsExisting(config_path);
12180 }
12181
12184 {
12185 return null;
12186 }
12187
12189 {
12190 return false;
12191 }
12192
12194 {
12195 return false;
12196 }
12197
12201
12202
12204 {
12205 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12206 return module_repairing.CanRepair(this, item_repair_kit);
12207 }
12208
12209
12210 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12211 {
12212 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12213 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12214 }
12215
12216
12218 {
12219
12220
12221
12222
12223
12224
12225
12226
12227 return 1;
12228 }
12229
12230
12231
12233 {
12235 }
12236
12237
12238
12240 {
12242 }
12243
12244
12253 {
12254 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12255
12256 if (player)
12257 {
12258 player.MessageStatus(text);
12259 }
12260 }
12261
12262
12271 {
12272 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12273
12274 if (player)
12275 {
12276 player.MessageAction(text);
12277 }
12278 }
12279
12280
12289 {
12290 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12291
12292 if (player)
12293 {
12294 player.MessageFriendly(text);
12295 }
12296 }
12297
12298
12307 {
12308 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12309
12310 if (player)
12311 {
12312 player.MessageImportant(text);
12313 }
12314 }
12315
12317 {
12318 return true;
12319 }
12320
12321
12322 override bool KindOf(
string tag)
12323 {
12324 bool found = false;
12325 string item_name = this.
GetType();
12327 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12328
12329 int array_size = item_tag_array.Count();
12330 for (int i = 0; i < array_size; i++)
12331 {
12332 if (item_tag_array.Get(i) == tag)
12333 {
12334 found = true;
12335 break;
12336 }
12337 }
12338 return found;
12339 }
12340
12341
12343 {
12344
12345 super.OnRPC(sender, rpc_type,ctx);
12346
12347
12348 switch (rpc_type)
12349 {
12350 #ifndef SERVER
12351 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12352 Param2<bool, string> p = new Param2<bool, string>(false, "");
12353
12355 return;
12356
12357 bool play = p.param1;
12358 string soundSet = p.param2;
12359
12360 if (play)
12361 {
12363 {
12365 {
12367 }
12368 }
12369 else
12370 {
12372 }
12373 }
12374 else
12375 {
12377 }
12378
12379 break;
12380 #endif
12381
12382 }
12383
12385 {
12387 }
12388 }
12389
12390
12391
12392
12394 {
12395 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12396 return plugin.GetID(
name);
12397 }
12398
12400 {
12401 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12402 return plugin.GetName(id);
12403 }
12404
12407 {
12408
12409
12410 int varFlags;
12411 if (!ctx.
Read(varFlags))
12412 return;
12413
12414 if (varFlags & ItemVariableFlags.FLOAT)
12415 {
12417 }
12418 }
12419
12421 {
12422
12423 super.SerializeNumericalVars(floats_out);
12424
12425
12426
12428 {
12430 }
12431
12433 {
12435 }
12436
12438 {
12440 }
12441
12443 {
12448 }
12449
12451 {
12453 }
12454 }
12455
12457 {
12458
12459 super.DeSerializeNumericalVars(floats);
12460
12461
12462 int index = 0;
12463 int mask = Math.Round(floats.Get(index));
12464
12465 index++;
12466
12468 {
12470 {
12472 }
12473 else
12474 {
12475 float quantity = floats.Get(index);
12476 SetQuantity(quantity,
true,
false,
false,
false);
12477 }
12478 index++;
12479 }
12480
12482 {
12483 float wet = floats.Get(index);
12485 index++;
12486 }
12487
12489 {
12490 int liquidtype = Math.Round(floats.Get(index));
12492 index++;
12493 }
12494
12496 {
12498 index++;
12500 index++;
12502 index++;
12504 index++;
12505 }
12506
12508 {
12509 int cleanness = Math.Round(floats.Get(index));
12511 index++;
12512 }
12513 }
12514
12516 {
12517 super.WriteVarsToCTX(ctx);
12518
12519
12521 {
12523 }
12524
12526 {
12528 }
12529
12531 {
12533 }
12534
12536 {
12537 int r,g,b,a;
12543 }
12544
12546 {
12548 }
12549 }
12550
12552 {
12553 if (!super.ReadVarsFromCTX(ctx,version))
12554 return false;
12555
12556 int intValue;
12557 float value;
12558
12559 if (version < 140)
12560 {
12561 if (!ctx.
Read(intValue))
12562 return false;
12563
12564 m_VariablesMask = intValue;
12565 }
12566
12568 {
12569 if (!ctx.
Read(value))
12570 return false;
12571
12573 {
12575 }
12576 else
12577 {
12579 }
12580 }
12581
12582 if (version < 140)
12583 {
12585 {
12586 if (!ctx.
Read(value))
12587 return false;
12588 SetTemperatureDirect(value);
12589 }
12590 }
12591
12593 {
12594 if (!ctx.
Read(value))
12595 return false;
12597 }
12598
12600 {
12601 if (!ctx.
Read(intValue))
12602 return false;
12604 }
12605
12607 {
12608 int r,g,b,a;
12610 return false;
12612 return false;
12614 return false;
12616 return false;
12617
12619 }
12620
12622 {
12623 if (!ctx.
Read(intValue))
12624 return false;
12626 }
12627
12628 if (version >= 138 && version < 140)
12629 {
12631 {
12632 if (!ctx.
Read(intValue))
12633 return false;
12634 SetFrozen(intValue);
12635 }
12636 }
12637
12638 return true;
12639 }
12640
12641
12643 {
12646 {
12648 }
12649
12650 if (!super.OnStoreLoad(ctx, version))
12651 {
12653 return false;
12654 }
12655
12656 if (version >= 114)
12657 {
12658 bool hasQuickBarIndexSaved;
12659
12660 if (!ctx.
Read(hasQuickBarIndexSaved))
12661 {
12663 return false;
12664 }
12665
12666 if (hasQuickBarIndexSaved)
12667 {
12668 int itmQBIndex;
12669
12670
12671 if (!ctx.
Read(itmQBIndex))
12672 {
12674 return false;
12675 }
12676
12677 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12678 if (itmQBIndex != -1 && parentPlayer)
12679 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12680 }
12681 }
12682 else
12683 {
12684
12685 PlayerBase player;
12686 int itemQBIndex;
12687 if (version ==
int.
MAX)
12688 {
12689 if (!ctx.
Read(itemQBIndex))
12690 {
12692 return false;
12693 }
12694 }
12695 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12696 {
12697
12698 if (!ctx.
Read(itemQBIndex))
12699 {
12701 return false;
12702 }
12703 if (itemQBIndex != -1 && player)
12704 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12705 }
12706 }
12707
12708 if (version < 140)
12709 {
12710
12711 if (!LoadVariables(ctx, version))
12712 {
12714 return false;
12715 }
12716 }
12717
12718
12720 {
12722 return false;
12723 }
12724 if (version >= 132)
12725 {
12727 if (raib)
12728 {
12730 {
12732 return false;
12733 }
12734 }
12735 }
12736
12738 return true;
12739 }
12740
12741
12742
12744 {
12745 super.OnStoreSave(ctx);
12746
12747 PlayerBase player;
12748 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12749 {
12751
12752 int itemQBIndex = -1;
12753 itemQBIndex = player.FindQuickBarEntityIndex(this);
12754 ctx.
Write(itemQBIndex);
12755 }
12756 else
12757 {
12759 }
12760
12762
12764 if (raib)
12765 {
12767 }
12768 }
12769
12770
12772 {
12773 super.AfterStoreLoad();
12774
12776 {
12778 }
12779
12781 {
12784 }
12785 }
12786
12788 {
12789 super.EEOnAfterLoad();
12790
12792 {
12794 }
12795
12798 }
12799
12801 {
12802 return false;
12803 }
12804
12805
12806
12808 {
12810 {
12811 #ifdef PLATFORM_CONSOLE
12812
12814 {
12816 if (menu)
12817 {
12819 }
12820 }
12821 #endif
12822 }
12823
12825 {
12828 }
12829
12831 {
12832 SetWeightDirty();
12834 }
12836 {
12839 }
12840
12842 {
12845
12848 }
12850 {
12854 }
12855
12856 super.OnVariablesSynchronized();
12857 }
12858
12859
12860
12862 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12863 {
12864 if (!IsServerCheck(allow_client))
12865 return false;
12866
12868 return false;
12869
12872
12873 if (value <= (min + 0.001))
12874 value = min;
12875
12876 if (value == min)
12877 {
12878 if (destroy_config)
12879 {
12880 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12881 if (dstr)
12882 {
12884 this.Delete();
12885 return true;
12886 }
12887 }
12888 else if (destroy_forced)
12889 {
12891 this.Delete();
12892 return true;
12893 }
12894
12896 }
12897
12900
12902 {
12903 EntityAI parent = GetHierarchyRoot();
12904 InventoryLocation iLoc = new InventoryLocation();
12905 GetInventory().GetCurrentInventoryLocation(iLoc);
12907 {
12908 int iLocSlot = iLoc.
GetSlot();
12910 {
12912 }
12914 {
12916 }
12917 }
12918 }
12919
12921 {
12923
12924 if (delta)
12926 }
12927
12929
12930 return false;
12931 }
12932
12933
12935 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12936 {
12938 }
12939
12941 {
12944 }
12945
12947 {
12950 }
12951
12953 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12954 {
12955 float value_clamped = Math.Clamp(value, 0, 1);
12957 SetQuantity(result, destroy_config, destroy_forced);
12958 }
12959
12960
12963 {
12965 }
12966
12968 {
12970 }
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12982 {
12983 int slot = -1;
12984 GameInventory inventory = GetInventory();
12985 if (inventory)
12986 {
12987 InventoryLocation il = new InventoryLocation;
12990 }
12991
12993 }
12994
12996 {
12997 float quantity_max = 0;
12998
13000 {
13001 if (attSlotID != -1)
13002 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
13003
13004 if (quantity_max <= 0)
13006 }
13007
13008 if (quantity_max <= 0)
13010
13011 return quantity_max;
13012 }
13013
13015 {
13017 }
13018
13020 {
13022 }
13023
13024
13026 {
13028 }
13029
13031 {
13033 }
13034
13036 {
13038 }
13039
13040
13042 {
13043
13044 float weightEx = GetWeightEx();
13045 float special = GetInventoryAndCargoWeight();
13046 return weightEx - special;
13047 }
13048
13049
13051 {
13053 }
13054
13056 {
13058 {
13059 #ifdef DEVELOPER
13060 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13061 {
13062 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13064 }
13065 #endif
13066
13067 return GetQuantity() * GetConfigWeightModified();
13068 }
13069 else if (HasEnergyManager())
13070 {
13071 #ifdef DEVELOPER
13072 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13073 {
13074 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13075 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
13076 }
13077 #endif
13078 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13079 }
13080 else
13081 {
13082 #ifdef DEVELOPER
13083 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13084 {
13085 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13086 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
13087 }
13088 #endif
13089 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
13090 }
13091 }
13092
13095 {
13096 int item_count = 0;
13098
13099 GameInventory inventory = GetInventory();
13100 CargoBase cargo = inventory.
GetCargo();
13101 if (cargo != NULL)
13102 {
13104 }
13105
13107 for (int i = 0; i < nAttachments; ++i)
13108 {
13110 if (item)
13111 item_count += item.GetNumberOfItems();
13112 }
13113 return item_count;
13114 }
13115
13118 {
13119 float weight = 0;
13120 float wetness = 1;
13121 if (include_wetness)
13124 {
13125 weight = wetness * m_ConfigWeight;
13126 }
13128 {
13129 weight = 1;
13130 }
13131 return weight;
13132 }
13133
13134
13135
13137 {
13138 GameInventory inventory = GetInventory();
13139 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
13140 {
13141 array<EntityAI> items = new array<EntityAI>;
13143 for (int i = 0; i < items.Count(); ++i)
13144 {
13146 if (item)
13147 {
13148 g_Game.ObjectDelete(item);
13149 }
13150 }
13151 }
13152 }
13153
13154
13155
13156
13158 {
13159 float energy = 0;
13160 if (HasEnergyManager())
13161 {
13162 energy = GetCompEM().GetEnergy();
13163 }
13164 return energy;
13165 }
13166
13167
13169 {
13170 super.OnEnergyConsumed();
13171
13173 }
13174
13176 {
13177 super.OnEnergyAdded();
13178
13180 }
13181
13182
13184 {
13185 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13186 {
13188 {
13189 float energy_0to1 = GetCompEM().GetEnergy0To1();
13191 }
13192 }
13193 }
13194
13195
13197 {
13198 return ConfigGetFloat("heatIsolation");
13199 }
13200
13202 {
13204 }
13205
13207 {
13208 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13209 if (
g_Game.ConfigIsExisting(paramPath))
13210 return g_Game.ConfigGetFloat(paramPath);
13211
13212 return 0.0;
13213 }
13214
13216 {
13217 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13218 if (
g_Game.ConfigIsExisting(paramPath))
13219 return g_Game.ConfigGetFloat(paramPath);
13220
13221 return 0.0;
13222 }
13223
13224 override void SetWet(
float value,
bool allow_client =
false)
13225 {
13226 if (!IsServerCheck(allow_client))
13227 return;
13228
13231
13233
13234 m_VarWet = Math.Clamp(value, min, max);
13235
13237 {
13240 }
13241 }
13242
13243 override void AddWet(
float value)
13244 {
13246 }
13247
13249 {
13251 }
13252
13254 {
13256 }
13257
13259 {
13261 }
13262
13264 {
13266 }
13267
13269 {
13271 }
13272
13273 override void OnWetChanged(
float newVal,
float oldVal)
13274 {
13277 if (newLevel != oldLevel)
13278 {
13280 }
13281 }
13282
13284 {
13285 SetWeightDirty();
13286 }
13287
13289 {
13290 return GetWetLevelInternal(
m_VarWet);
13291 }
13292
13293
13294
13296 {
13298 }
13299
13301 {
13303 }
13304
13306 {
13308 }
13309
13311 {
13313 }
13314
13315
13316
13318 {
13319 if (ConfigIsExisting("itemModelLength"))
13320 {
13321 return ConfigGetFloat("itemModelLength");
13322 }
13323 return 0;
13324 }
13325
13327 {
13328 if (ConfigIsExisting("itemAttachOffset"))
13329 {
13330 return ConfigGetFloat("itemAttachOffset");
13331 }
13332 return 0;
13333 }
13334
13335 override void SetCleanness(
int value,
bool allow_client =
false)
13336 {
13337 if (!IsServerCheck(allow_client))
13338 return;
13339
13341
13343
13346 }
13347
13349 {
13351 }
13352
13354 {
13355 return true;
13356 }
13357
13358
13359
13360
13362 {
13364 }
13365
13367 {
13369 }
13370
13371
13372
13373
13374 override void SetColor(
int r,
int g,
int b,
int a)
13375 {
13381 }
13383 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13384 {
13389 }
13390
13392 {
13394 }
13395
13398 {
13399 int r,g,b,a;
13401 r = r/255;
13402 g = g/255;
13403 b = b/255;
13404 a = a/255;
13405 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13406 }
13407
13408
13409
13410 override void SetLiquidType(
int value,
bool allow_client =
false)
13411 {
13412 if (!IsServerCheck(allow_client))
13413 return;
13414
13419 }
13420
13422 {
13423 return ConfigGetInt("varLiquidTypeInit");
13424 }
13425
13427 {
13429 }
13430
13432 {
13434 SetFrozen(false);
13435 }
13436
13439 {
13440 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13441 }
13442
13443
13446 {
13447 PlayerBase nplayer;
13448 if (PlayerBase.CastTo(nplayer, player))
13449 {
13451 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13452 }
13453 }
13454
13455
13458 {
13459 PlayerBase nplayer;
13460 if (PlayerBase.CastTo(nplayer,player))
13461 {
13462 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13463 }
13464
13465 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13466
13467 if (HasEnergyManager())
13468 {
13469 GetCompEM().UpdatePlugState();
13470 }
13471 }
13472
13473
13475 {
13476 super.OnPlacementStarted(player);
13477
13479 }
13480
13481 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13482 {
13484 {
13485 m_AdminLog.OnPlacementComplete(player,
this);
13486 }
13487
13488 super.OnPlacementComplete(player, position, orientation);
13489 }
13490
13491
13492
13493
13494
13496 {
13498 {
13499 return true;
13500 }
13501 else
13502 {
13503 return false;
13504 }
13505 }
13506
13507
13509 {
13511 {
13513 }
13514 }
13515
13516
13518 {
13520 }
13521
13523 {
13525 }
13526
13527 override void InsertAgent(
int agent,
float count = 1)
13528 {
13529 if (count < 1)
13530 return;
13531
13533 }
13534
13537 {
13539 }
13540
13541
13543 {
13545 }
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
13562
13563
13564
13565
13566
13567
13568
13569
13570
13571
13572
13573
13574
13575
13576
13577
13578
13579
13580
13581
13582
13583
13584
13585
13586
13587
13589 {
13591 return false;
13592 return true;
13593 }
13594
13596 {
13597
13599 }
13600
13601
13604 {
13605 super.CheckForRoofLimited(timeTresholdMS);
13606
13607 float time =
g_Game.GetTime();
13608 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13609 {
13610 m_PreviousRoofTestTime = time;
13611 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13612 }
13613 }
13614
13615
13617 {
13619 {
13620 return 0;
13621 }
13622
13623 if (GetInventory().GetAttachmentSlotsCount() != 0)
13624 {
13625 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13626 if (filter)
13627 return filter.GetProtectionLevel(type, false, system);
13628 else
13629 return 0;
13630 }
13631
13632 string subclassPath, entryName;
13633
13634 switch (type)
13635 {
13637 entryName = "biological";
13638 break;
13640 entryName = "chemical";
13641 break;
13642 default:
13643 entryName = "biological";
13644 break;
13645 }
13646
13647 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13648
13649 return g_Game.ConfigGetFloat(subclassPath + entryName);
13650 }
13651
13652
13653
13656 {
13657 if (!IsMagazine())
13659
13661 }
13662
13663
13664
13665
13666
13671 {
13672 return true;
13673 }
13674
13676 {
13678 }
13679
13680
13681
13682
13683
13685 {
13686 if (parent)
13687 {
13688 if (parent.IsInherited(DayZInfected))
13689 return true;
13690
13691 if (!parent.IsRuined())
13692 return true;
13693 }
13694
13695 return true;
13696 }
13697
13699 {
13700 if (!super.CanPutAsAttachment(parent))
13701 {
13702 return false;
13703 }
13704
13705 if (!IsRuined() && !parent.IsRuined())
13706 {
13707 return true;
13708 }
13709
13710 return false;
13711 }
13712
13714 {
13715
13716
13717
13718
13719 return super.CanReceiveItemIntoCargo(item);
13720 }
13721
13723 {
13724
13725
13726
13727
13728 GameInventory attachmentInv = attachment.GetInventory();
13730 {
13731 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13732 return false;
13733 }
13734
13735 InventoryLocation loc = new InventoryLocation();
13736 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13737 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13738 return false;
13739
13740 return super.CanReceiveAttachment(attachment, slotId);
13741 }
13742
13744 {
13745 if (!super.CanReleaseAttachment(attachment))
13746 return false;
13747
13748 return GetInventory().AreChildrenAccessible();
13749 }
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13772 {
13773 int id = muzzle_owner.GetMuzzleID();
13774 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13775
13776 if (WPOF_array)
13777 {
13778 for (int i = 0; i < WPOF_array.Count(); i++)
13779 {
13780 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13781
13782 if (WPOF)
13783 {
13784 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13785 }
13786 }
13787 }
13788 }
13789
13790
13792 {
13793 int id = muzzle_owner.GetMuzzleID();
13795
13796 if (WPOBE_array)
13797 {
13798 for (int i = 0; i < WPOBE_array.Count(); i++)
13799 {
13800 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13801
13802 if (WPOBE)
13803 {
13804 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13805 }
13806 }
13807 }
13808 }
13809
13810
13812 {
13813 int id = muzzle_owner.GetMuzzleID();
13814 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13815
13816 if (WPOOH_array)
13817 {
13818 for (int i = 0; i < WPOOH_array.Count(); i++)
13819 {
13820 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13821
13822 if (WPOOH)
13823 {
13824 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13825 }
13826 }
13827 }
13828 }
13829
13830
13832 {
13833 int id = muzzle_owner.GetMuzzleID();
13834 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13835
13836 if (WPOOH_array)
13837 {
13838 for (int i = 0; i < WPOOH_array.Count(); i++)
13839 {
13840 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13841
13842 if (WPOOH)
13843 {
13844 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13845 }
13846 }
13847 }
13848 }
13849
13850
13852 {
13853 int id = muzzle_owner.GetMuzzleID();
13854 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13855
13856 if (WPOOH_array)
13857 {
13858 for (int i = 0; i < WPOOH_array.Count(); i++)
13859 {
13860 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13861
13862 if (WPOOH)
13863 {
13864 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13865 }
13866 }
13867 }
13868 }
13869
13870
13871
13873 {
13875 {
13876 return true;
13877 }
13878
13879 return false;
13880 }
13881
13883 {
13885 {
13886 return true;
13887 }
13888
13889 return false;
13890 }
13891
13893 {
13895 {
13896 return true;
13897 }
13898
13899 return false;
13900 }
13901
13903 {
13904 return false;
13905 }
13906
13909 {
13910 return UATimeSpent.DEFAULT_DEPLOY;
13911 }
13912
13913
13914
13915
13917 {
13919 SetSynchDirty();
13920 }
13921
13923 {
13925 }
13926
13927
13929 {
13930 return false;
13931 }
13932
13935 {
13936 string att_type = "None";
13937
13938 if (ConfigIsExisting("soundAttType"))
13939 {
13940 att_type = ConfigGetString("soundAttType");
13941 }
13942
13944 }
13945
13947 {
13949 }
13950
13951
13952
13953
13954
13960
13962 {
13965
13967 }
13968
13969
13971 {
13973 return;
13974
13976
13979
13982
13983 SoundParameters params = new SoundParameters();
13987 }
13988
13989
13991 {
13993 {
13996
13997 SetSynchDirty();
13998
14001 }
14002 }
14003
14005 {
14007 }
14008
14009
14011 {
14013 return;
14014
14016 SetSynchDirty();
14017
14020 }
14021
14023 {
14026 }
14027
14029 {
14031 }
14032
14033 void OnApply(PlayerBase player);
14034
14036 {
14037 return 1.0;
14038 };
14039
14041 {
14043 }
14044
14046 {
14048 }
14049
14051
14053 {
14054 SetDynamicPhysicsLifeTime(0.01);
14056 }
14057
14059 {
14060 array<string> zone_names = new array<string>;
14061 GetDamageZones(zone_names);
14062 for (int i = 0; i < zone_names.Count(); i++)
14063 {
14064 SetHealthMax(zone_names.Get(i),"Health");
14065 }
14066 SetHealthMax("","Health");
14067 }
14068
14071 {
14072 float global_health = GetHealth01("","Health");
14073 array<string> zones = new array<string>;
14074 GetDamageZones(zones);
14075
14076 for (int i = 0; i < zones.Count(); i++)
14077 {
14078 SetHealth01(zones.Get(i),"Health",global_health);
14079 }
14080 }
14081
14084 {
14085 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14086 }
14087
14089 {
14090 if (!hasRootAsPlayer)
14091 {
14092 if (refParentIB)
14093 {
14094
14095 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14096 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14097
14098 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14099 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14100
14103 }
14104 else
14105 {
14106
14109 }
14110 }
14111 }
14112
14114 {
14116 {
14117 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14118 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14119 {
14120 float heatPermCoef = 1.0;
14122 while (ent)
14123 {
14124 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14125 ent = ent.GetHierarchyParent();
14126 }
14127
14128 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14129 }
14130 }
14131 }
14132
14134 {
14135
14136 EntityAI parent = GetHierarchyParent();
14137 if (!parent)
14138 {
14139 hasParent = false;
14140 hasRootAsPlayer = false;
14141 }
14142 else
14143 {
14144 hasParent = true;
14145 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14146 refParentIB =
ItemBase.Cast(parent);
14147 }
14148 }
14149
14150 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14151 {
14152
14153 }
14154
14156 {
14157
14158 return false;
14159 }
14160
14162 {
14163
14164
14165 return false;
14166 }
14167
14169 {
14170
14171 return false;
14172 }
14173
14176 {
14177 return !GetIsFrozen() &&
IsOpen();
14178 }
14179
14181 {
14182 bool hasParent = false, hasRootAsPlayer = false;
14184
14185 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14186 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14187
14188 if (wwtu || foodDecay)
14189 {
14193
14194 if (processWetness || processTemperature || processDecay)
14195 {
14197
14198 if (processWetness)
14199 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14200
14201 if (processTemperature)
14203
14204 if (processDecay)
14205 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14206 }
14207 }
14208 }
14209
14212 {
14214 }
14215
14217 {
14220
14221 return super.GetTemperatureFreezeThreshold();
14222 }
14223
14225 {
14228
14229 return super.GetTemperatureThawThreshold();
14230 }
14231
14233 {
14236
14237 return super.GetItemOverheatThreshold();
14238 }
14239
14241 {
14243 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14244
14245 return super.GetTemperatureFreezeTime();
14246 }
14247
14249 {
14251 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14252
14253 return super.GetTemperatureThawTime();
14254 }
14255
14260
14262 {
14263 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14264 }
14265
14267 {
14268 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14269 }
14270
14273 {
14275 }
14276
14278 {
14280 }
14281
14283 {
14285 }
14286
14289 {
14290 return null;
14291 }
14292
14295 {
14296 return false;
14297 }
14298
14300 {
14302 {
14305 if (!trg)
14306 {
14308 explosive = this;
14309 }
14310
14311 explosive.PairRemote(trg);
14313
14314 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14315 trg.SetPersistentPairID(persistentID);
14316 explosive.SetPersistentPairID(persistentID);
14317
14318 return true;
14319 }
14320 return false;
14321 }
14322
14325 {
14326 float ret = 1.0;
14329 ret *= GetHealth01();
14330
14331 return ret;
14332 }
14333
14334 #ifdef DEVELOPER
14335 override void SetDebugItem()
14336 {
14337 super.SetDebugItem();
14338 _itemBase = this;
14339 }
14340
14342 {
14343 string text = super.GetDebugText();
14344
14346 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14347
14348 return text;
14349 }
14350 #endif
14351
14353 {
14354 return true;
14355 }
14356
14358
14360
14362 {
14365 }
14366
14367
14375
14391
14392 [
Obsolete(
"Use ItemSoundHandler instead")]
14395 {
14396 if (!
g_Game.IsDedicatedServer())
14397 {
14398 if (ConfigIsExisting("attachSoundSet"))
14399 {
14400 string cfg_path = "";
14401 string soundset = "";
14402 string type_name =
GetType();
14403
14406 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14407 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14408
14409 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14410 {
14411 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14412 {
14413 if (cfg_slot_array[i] == slot_type)
14414 {
14415 soundset = cfg_soundset_array[i];
14416 break;
14417 }
14418 }
14419 }
14420
14421 if (soundset != "")
14422 {
14423 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14425 }
14426 }
14427 }
14428 }
14429
14431}
14432
14434{
14436 if (entity)
14437 {
14438 bool is_item = entity.IsInherited(
ItemBase);
14439 if (is_item && full_quantity)
14440 {
14443 }
14444 }
14445 else
14446 {
14448 return NULL;
14449 }
14450 return entity;
14451}
14452
14454{
14455 if (item)
14456 {
14457 if (health > 0)
14458 item.SetHealth("", "", health);
14459
14460 if (item.CanHaveTemperature())
14461 {
14463 if (item.CanFreeze())
14464 item.SetFrozen(false);
14465 }
14466
14467 if (item.HasEnergyManager())
14468 {
14469 if (quantity >= 0)
14470 {
14471 item.GetCompEM().SetEnergy0To1(quantity);
14472 }
14473 else
14474 {
14476 }
14477 }
14478 else if (item.IsMagazine())
14479 {
14480 Magazine mag = Magazine.Cast(item);
14481 if (quantity >= 0)
14482 {
14483 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14484 }
14485 else
14486 {
14488 }
14489
14490 }
14491 else
14492 {
14493 if (quantity >= 0)
14494 {
14495 item.SetQuantityNormalized(quantity, false);
14496 }
14497 else
14498 {
14500 }
14501
14502 }
14503 }
14504}
14505
14506#ifdef DEVELOPER
14508#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
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)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.