9486{
9488 {
9489 return true;
9490 }
9491};
9492
9494{
9495
9496};
9497
9498
9499
9501{
9505
9507
9510
9511
9512
9513
9514
9523
9529
9534
9539
9560 protected bool m_IsResultOfSplit
9561
9563
9568
9569
9570
9572
9576
9577
9578
9580
9583
9584
9585
9591
9592
9600
9603
9604
9606
9607
9609
9610
9615
9616
9621
9623
9624
9626
9627
9629 {
9634
9635 if (!
g_Game.IsDedicatedServer())
9636 {
9638 {
9640
9642 {
9644 }
9645 }
9646
9649 }
9650
9651 m_OldLocation = null;
9652
9654 {
9656 }
9657
9658 if (ConfigIsExisting("headSelectionsToHide"))
9659 {
9662 }
9663
9665 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9666 {
9668 }
9669
9671
9672 m_IsResultOfSplit = false;
9673
9675 }
9676
9678 {
9679 super.InitItemVariables();
9680
9686 m_Count = ConfigGetInt(
"count");
9687
9690
9695
9698
9703
9715
9719
9720
9723 if (ConfigIsExisting("canBeSplit"))
9724 {
9727 }
9728
9730 if (ConfigIsExisting("itemBehaviour"))
9732
9733
9736 RegisterNetSyncVariableInt("m_VarLiquidType");
9737 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9738
9739 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9740 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9741 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9742
9743 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9744 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9745 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9746 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9747
9748 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9749 RegisterNetSyncVariableBool("m_IsTakeable");
9750 RegisterNetSyncVariableBool("m_IsHologram");
9751
9754 {
9757 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9758 }
9759
9761
9763 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9765
9767 }
9768
9770 {
9772 }
9773
9775 {
9778 {
9783 }
9784 }
9785
9786 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9787 {
9789 {
9792 }
9793
9795 }
9796
9798 {
9804 }
9805
9807
9809 {
9811
9812 if (!action)
9813 {
9814 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9815 return;
9816 }
9817
9819 if (!ai)
9820 {
9822 return;
9823 }
9824
9826 if (!action_array)
9827 {
9828 action_array = new array<ActionBase_Basic>;
9830 }
9831 if (LogManager.IsActionLogEnable())
9832 {
9833 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9834 }
9835
9836 if (action_array.Find(action) != -1)
9837 {
9838 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9839 }
9840 else
9841 {
9842 action_array.Insert(action);
9843 }
9844 }
9845
9847 {
9848 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9849 ActionBase action = player.GetActionManager().GetAction(actionName);
9852
9853 if (action_array)
9854 {
9855 action_array.RemoveItem(action);
9856 }
9857 }
9858
9859
9860
9862 {
9863 ActionOverrideData overrideData = new ActionOverrideData();
9867
9869 if (!actionMap)
9870 {
9873 }
9874
9875 actionMap.Insert(this.
Type(), overrideData);
9876
9877 }
9878
9880
9882
9883
9885 {
9888
9891
9892 string config_to_search = "CfgVehicles";
9893 string muzzle_owner_config;
9894
9896 {
9897 if (IsInherited(Weapon))
9898 config_to_search = "CfgWeapons";
9899
9900 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9901
9902 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9903
9904 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9905
9906 if (config_OnFire_subclass_count > 0)
9907 {
9908 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9909
9910 for (int i = 0; i < config_OnFire_subclass_count; i++)
9911 {
9912 string particle_class = "";
9913 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9914 string config_OnFire_entry = config_OnFire_class + particle_class;
9915 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9916 WPOF_array.Insert(WPOF);
9917 }
9918
9919
9921 }
9922 }
9923
9925 {
9926 config_to_search = "CfgWeapons";
9927 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9928
9929 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9930
9931 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9932
9933 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9934 {
9935 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9936
9937 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9938 {
9939 string particle_class2 = "";
9940 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9941 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9942 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9943 WPOBE_array.Insert(WPOBE);
9944 }
9945
9946
9948 }
9949 }
9950 }
9951
9952
9954 {
9957
9959 {
9960 string config_to_search = "CfgVehicles";
9961
9962 if (IsInherited(Weapon))
9963 config_to_search = "CfgWeapons";
9964
9965 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9966 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9967
9968 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9969 {
9970
9972
9974 {
9976 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9978 return;
9979 }
9980
9983
9984
9985
9986 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9987 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9988
9989 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9990 {
9991 string particle_class = "";
9992 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9993 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9994 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9995
9996 if (entry_type == CT_CLASS)
9997 {
9998 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9999 WPOOH_array.Insert(WPOF);
10000 }
10001 }
10002
10003
10005 }
10006 }
10007 }
10008
10010 {
10012 }
10013
10015 {
10017 {
10019
10022
10025
10026 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10027 }
10028 }
10029
10031 {
10033 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10034
10036 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10037
10039 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10040
10042 {
10044 }
10045 }
10046
10048 {
10050 }
10051
10053 {
10056 else
10058
10060 {
10063 }
10064 else
10065 {
10068
10071 }
10072
10074 }
10075
10077 {
10079 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10080 }
10081
10083 {
10085 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10087 }
10088
10090 {
10092 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10093 }
10094
10096 {
10099
10100 OverheatingParticle OP = new OverheatingParticle();
10105
10107 }
10108
10110 {
10113
10114 return -1;
10115 }
10116
10118 {
10120 {
10123
10124 for (int i = count; i > 0; --i)
10125 {
10126 int id = i - 1;
10129
10132
10133 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10134 {
10135 if (p)
10136 {
10139 }
10140 }
10141 }
10142 }
10143 }
10144
10146 {
10148 {
10150 {
10151 int id = i - 1;
10153
10154 if (OP)
10155 {
10157
10158 if (p)
10159 {
10161 }
10162
10163 delete OP;
10164 }
10165 }
10166
10169 }
10170 }
10171
10174 {
10175 return 0.0;
10176 }
10177
10178
10180 {
10181 return 250;
10182 }
10183
10185 {
10186 return 0;
10187 }
10188
10191 {
10193 return true;
10194
10195 return false;
10196 }
10197
10200 {
10203
10205 {
10207 }
10208 else
10209 {
10210
10212 }
10213
10215 }
10216
10223 {
10224 return -1;
10225 }
10226
10227
10228
10229
10231 {
10233 {
10234 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10235 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10236
10237 if (r_index >= 0)
10238 {
10239 InventoryLocation r_il = new InventoryLocation;
10240 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10241
10242 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10245 {
10246 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10247 }
10249 {
10250 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10251 }
10252
10253 }
10254
10255 player.GetHumanInventory().ClearUserReservedLocation(this);
10256 }
10257
10260 }
10261
10262
10263
10264
10266 {
10267 return ItemBase.m_DebugActionsMask;
10268 }
10269
10271 {
10272 return ItemBase.m_DebugActionsMask & mask;
10273 }
10274
10276 {
10277 ItemBase.m_DebugActionsMask = mask;
10278 }
10279
10281 {
10282 ItemBase.m_DebugActionsMask |= mask;
10283 }
10284
10286 {
10287 ItemBase.m_DebugActionsMask &= ~mask;
10288 }
10289
10291 {
10293 {
10295 }
10296 else
10297 {
10299 }
10300 }
10301
10302
10304 {
10305 if (GetEconomyProfile())
10306 {
10307 float q_max = GetEconomyProfile().GetQuantityMax();
10308 if (q_max > 0)
10309 {
10310 float q_min = GetEconomyProfile().GetQuantityMin();
10311 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10312
10314 {
10315 ComponentEnergyManager comp = GetCompEM();
10317 {
10319 }
10320 }
10322 {
10324
10325 }
10326
10327 }
10328 }
10329 }
10330
10333 {
10334 EntityAI parent = GetHierarchyParent();
10335
10336 if (parent)
10337 {
10338 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10339 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10340 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10341 }
10342 }
10343
10346 {
10347 EntityAI parent = GetHierarchyParent();
10348
10349 if (parent)
10350 {
10351 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10352 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10353 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10354 }
10355 }
10356
10358 {
10359
10360
10361
10362
10364
10366 {
10367 if (ScriptInputUserData.CanStoreInputUserData())
10368 {
10369 ScriptInputUserData ctx = new ScriptInputUserData;
10375 ctx.
Write(use_stack_max);
10378
10380 {
10381 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10382 }
10383 }
10384 }
10385 else if (!
g_Game.IsMultiplayer())
10386 {
10388 }
10389 }
10390
10392 {
10394 }
10395
10397 {
10399 }
10400
10402 {
10404 }
10405
10407 {
10408
10409 return false;
10410 }
10411
10413 {
10414 return false;
10415 }
10416
10420 {
10421 return false;
10422 }
10423
10425 {
10426 return "";
10427 }
10428
10430
10432 {
10433 return false;
10434 }
10435
10437 {
10438 return true;
10439 }
10440
10441
10442
10444 {
10445 return true;
10446 }
10447
10449 {
10450 return true;
10451 }
10452
10454 {
10455 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10457 }
10458
10460 {
10462 }
10463
10465 {
10467 if (!is_being_placed)
10469 SetSynchDirty();
10470 }
10471
10472
10474
10476 {
10478 }
10479
10481 {
10483 }
10484
10486 {
10487 return 1;
10488 }
10489
10491 {
10492 return false;
10493 }
10494
10496 {
10498 SetSynchDirty();
10499 }
10500
10501
10502
10503
10504
10505
10506
10507
10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523
10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10536 {
10537 super.OnMovedInsideCargo(container);
10538
10539 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10540 }
10541
10542 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10543 {
10544 super.EEItemLocationChanged(oldLoc, newLoc);
10545
10546 PlayerBase newPlayer = null;
10547 PlayerBase oldPlayer = null;
10548
10549 if (newLoc.GetParent())
10550 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10551
10552 if (oldLoc.GetParent())
10553 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10554
10556 {
10557 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10558
10559 if (rIndex >= 0)
10560 {
10561 InventoryLocation rIl = new InventoryLocation;
10562 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10563
10564 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10567 {
10568 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10569 }
10571 {
10573 }
10574
10575 }
10576 }
10577
10579 {
10580 if (newPlayer)
10581 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10582
10583 if (newPlayer == oldPlayer)
10584 {
10585 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10586 {
10588 {
10589 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10590 {
10591 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10592 }
10593 }
10594 else
10595 {
10596 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10597 }
10598 }
10599
10600 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10601 {
10602 int type = oldLoc.GetType();
10604 {
10605 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10606 }
10608 {
10609 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10610 }
10611 }
10612 if (!m_OldLocation)
10613 {
10614 m_OldLocation = new InventoryLocation;
10615 }
10616 m_OldLocation.Copy(oldLoc);
10617 }
10618 else
10619 {
10620 if (m_OldLocation)
10621 {
10622 m_OldLocation.Reset();
10623 }
10624 }
10625
10626 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10627 }
10628 else
10629 {
10630 if (newPlayer)
10631 {
10632 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10633 if (resIndex >= 0)
10634 {
10635 InventoryLocation il = new InventoryLocation;
10636 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10638 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10641 {
10642 il.
GetParent().GetOnReleaseLock().Invoke(it);
10643 }
10645 {
10647 }
10648
10649 }
10650 }
10652 {
10653
10655 }
10656
10657 if (m_OldLocation)
10658 {
10659 m_OldLocation.Reset();
10660 }
10661 }
10662
10664 {
10665 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10666 }
10667
10669 {
10670 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10671 }
10672 }
10673
10674 override void EOnContact(IEntity other, Contact extra)
10675 {
10677 {
10678 int liquidType = -1;
10680 if (impactSpeed > 0.0)
10681 {
10683 #ifndef SERVER
10685 #else
10687 SetSynchDirty();
10688 #endif
10690 }
10691 }
10692
10693 #ifdef SERVER
10694 if (GetCompEM() && GetCompEM().IsPlugged())
10695 {
10696 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10697 GetCompEM().UnplugThis();
10698 }
10699 #endif
10700 }
10701
10703
10705 {
10707 }
10708
10710 {
10711
10712 }
10713
10715 {
10716 super.OnItemLocationChanged(old_owner, new_owner);
10717
10718 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10719 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10720
10721 if (!relatedPlayer && playerNew)
10722 relatedPlayer = playerNew;
10723
10724 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10725 {
10727 if (actionMgr)
10728 {
10729 ActionBase currentAction = actionMgr.GetRunningAction();
10730 if (currentAction)
10732 }
10733 }
10734
10735 Man ownerPlayerOld = null;
10736 Man ownerPlayerNew = null;
10737
10738 if (old_owner)
10739 {
10740 if (old_owner.
IsMan())
10741 {
10742 ownerPlayerOld = Man.Cast(old_owner);
10743 }
10744 else
10745 {
10746 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10747 }
10748 }
10749 else
10750 {
10752 {
10754
10755 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10756 {
10757 GetCompEM().UnplugThis();
10758 }
10759 }
10760 }
10761
10762 if (new_owner)
10763 {
10764 if (new_owner.
IsMan())
10765 {
10766 ownerPlayerNew = Man.Cast(new_owner);
10767 }
10768 else
10769 {
10770 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10771 }
10772 }
10773
10774 if (ownerPlayerOld != ownerPlayerNew)
10775 {
10776 if (ownerPlayerOld)
10777 {
10778 array<EntityAI> subItemsExit = new array<EntityAI>;
10780 for (int i = 0; i < subItemsExit.Count(); i++)
10781 {
10784 }
10785 }
10786
10787 if (ownerPlayerNew)
10788 {
10789 array<EntityAI> subItemsEnter = new array<EntityAI>;
10791 for (int j = 0; j < subItemsEnter.Count(); j++)
10792 {
10795 }
10796 }
10797 }
10798 else if (ownerPlayerNew != null)
10799 {
10800 PlayerBase nplayer;
10801 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10802 {
10803 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10805 for (int k = 0; k < subItemsUpdate.Count(); k++)
10806 {
10808 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10809 }
10810 }
10811 }
10812
10813 if (old_owner)
10814 old_owner.OnChildItemRemoved(this);
10815 if (new_owner)
10816 new_owner.OnChildItemReceived(this);
10817 }
10818
10819
10821 {
10822 super.EEDelete(parent);
10823 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10824 if (player)
10825 {
10827
10828 if (player.IsAlive())
10829 {
10830 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10831 if (r_index >= 0)
10832 {
10833 InventoryLocation r_il = new InventoryLocation;
10834 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10835
10836 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10839 {
10840 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10841 }
10843 {
10844 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10845 }
10846
10847 }
10848
10849 player.RemoveQuickBarEntityShortcut(this);
10850 }
10851 }
10852 }
10853
10855 {
10856 super.EEKilled(killer);
10857
10860 {
10861 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10862 {
10863 if (IsMagazine())
10864 {
10865 if (Magazine.Cast(this).GetAmmoCount() > 0)
10866 {
10868 }
10869 }
10870 else
10871 {
10873 }
10874 }
10875 }
10876 }
10877
10879 {
10880 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10881
10882 super.OnWasAttached(parent, slot_id);
10883
10886
10889 }
10890
10892 {
10893 super.OnWasDetached(parent, slot_id);
10894
10897
10900 }
10901
10903 {
10904 int idx;
10907
10908 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10909 if (inventory_slots.Count() < 1)
10910 {
10911 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10912 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10913 }
10914 else
10915 {
10916 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10917 }
10918
10919 idx = inventory_slots.Find(slot);
10920 if (idx < 0)
10921 return "";
10922
10923 return attach_types.Get(idx);
10924 }
10925
10927 {
10928 int idx = -1;
10929 string slot;
10930
10933
10934 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10935 if (inventory_slots.Count() < 1)
10936 {
10937 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10938 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10939 }
10940 else
10941 {
10942 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10943 if (detach_types.Count() < 1)
10944 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10945 }
10946
10947 for (int i = 0; i < inventory_slots.Count(); i++)
10948 {
10949 slot = inventory_slots.Get(i);
10950 }
10951
10952 if (slot != "")
10953 {
10954 if (detach_types.Count() == 1)
10955 idx = 0;
10956 else
10957 idx = inventory_slots.Find(slot);
10958 }
10959 if (idx < 0)
10960 return "";
10961
10962 return detach_types.Get(idx);
10963 }
10964
10966 {
10967
10969
10970
10971 float min_time = 1;
10972 float max_time = 3;
10973 float delay = Math.RandomFloat(min_time, max_time);
10974
10975 explode_timer.Run(delay, this, "DoAmmoExplosion");
10976 }
10977
10979 {
10980 Magazine magazine = Magazine.Cast(this);
10981 int pop_sounds_count = 6;
10982 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10983
10984
10985 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10986 string sound_name = pop_sounds[ sound_idx ];
10987 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10988
10989
10990 magazine.ServerAddAmmoCount(-1);
10991
10992
10993 float min_temp_to_explode = 100;
10994
10995 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10996 {
10998 }
10999 }
11000
11001
11002 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
11003 {
11004 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
11005
11006 const int CHANCE_DAMAGE_CARGO = 4;
11007 const int CHANCE_DAMAGE_ATTACHMENT = 1;
11008 const int CHANCE_DAMAGE_NOTHING = 2;
11009
11011 {
11012 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
11013 int chances;
11014 int rnd;
11015
11016 if (GetInventory().GetCargo())
11017 {
11018 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11019 rnd = Math.RandomInt(0,chances);
11020
11021 if (rnd < CHANCE_DAMAGE_CARGO)
11022 {
11024 }
11025 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
11026 {
11028 }
11029 }
11030 else
11031 {
11032 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
11033 rnd = Math.RandomInt(0,chances);
11034
11035 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
11036 {
11038 }
11039 }
11040 }
11041 }
11042
11044 {
11045 CargoBase cargo = GetInventory().GetCargo();
11046 if (cargo)
11047 {
11049 if (item_count > 0)
11050 {
11051 int random_pick = Math.RandomInt(0, item_count);
11053 if (!item.IsExplosive())
11054 {
11055 item.AddHealth("","",damage);
11056 return true;
11057 }
11058 }
11059 }
11060 return false;
11061 }
11062
11064 {
11065 GameInventory inventory = GetInventory();
11067 if (attachment_count > 0)
11068 {
11069 int random_pick = Math.RandomInt(0, attachment_count);
11071 if (!attachment.IsExplosive())
11072 {
11073 attachment.AddHealth("","",damage);
11074 return true;
11075 }
11076 }
11077 return false;
11078 }
11079
11081 {
11083 }
11084
11086 {
11088 return GetInventory().CanRemoveEntity();
11089
11090 return false;
11091 }
11092
11094 {
11095
11097 return false;
11098
11099
11101 return false;
11102
11103
11104
11106 if (delta == 0)
11107 return false;
11108
11109
11110 return true;
11111 }
11112
11114 {
11116 {
11117 if (ScriptInputUserData.CanStoreInputUserData())
11118 {
11119 ScriptInputUserData ctx = new ScriptInputUserData;
11124 ctx.
Write(destination_entity);
11126 ctx.
Write(slot_id);
11128 }
11129 }
11130 else if (!
g_Game.IsMultiplayer())
11131 {
11133 }
11134 }
11135
11137 {
11138 float split_quantity_new;
11142 InventoryLocation loc = new InventoryLocation;
11143
11144 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11145 {
11147 split_quantity_new = stack_max;
11148 else
11150
11152 {
11153 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11154 if (new_item)
11155 {
11156 new_item.SetResultOfSplit(true);
11157 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11159 new_item.
SetQuantity(split_quantity_new,
false,
true);
11160 }
11161 }
11162 }
11163 else if (destination_entity && slot_id == -1)
11164 {
11165 if (quantity > stack_max)
11166 split_quantity_new = stack_max;
11167 else
11168 split_quantity_new = quantity;
11169
11171 {
11172 GameInventory destinationInventory = destination_entity.GetInventory();
11174 {
11177 }
11178
11179 if (new_item)
11180 {
11181 new_item.SetResultOfSplit(true);
11182 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11184 new_item.
SetQuantity(split_quantity_new,
false,
true);
11185 }
11186 }
11187 }
11188 else
11189 {
11190 if (stack_max != 0)
11191 {
11193 {
11195 }
11196
11197 if (split_quantity_new == 0)
11198 {
11199 if (!
g_Game.IsMultiplayer())
11200 player.PhysicalPredictiveDropItem(this);
11201 else
11202 player.ServerDropEntity(this);
11203 return;
11204 }
11205
11207 {
11209
11210 if (new_item)
11211 {
11212 new_item.SetResultOfSplit(true);
11213 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11216 new_item.PlaceOnSurface();
11217 }
11218 }
11219 }
11220 }
11221 }
11222
11224 {
11225 float split_quantity_new;
11229 InventoryLocation loc = new InventoryLocation;
11230
11231 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11232 {
11234 split_quantity_new = stack_max;
11235 else
11237
11239 {
11240 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11241 if (new_item)
11242 {
11243 new_item.SetResultOfSplit(true);
11244 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11246 new_item.
SetQuantity(split_quantity_new,
false,
true);
11247 }
11248 }
11249 }
11250 else if (destination_entity && slot_id == -1)
11251 {
11252 if (quantity > stack_max)
11253 split_quantity_new = stack_max;
11254 else
11255 split_quantity_new = quantity;
11256
11258 {
11259 GameInventory destinationInventory = destination_entity.GetInventory();
11261 {
11264 }
11265
11266 if (new_item)
11267 {
11268 new_item.SetResultOfSplit(true);
11269 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11271 new_item.
SetQuantity(split_quantity_new,
false,
true);
11272 }
11273 }
11274 }
11275 else
11276 {
11277 if (stack_max != 0)
11278 {
11280 {
11282 }
11283
11285 {
11287
11288 if (new_item)
11289 {
11290 new_item.SetResultOfSplit(true);
11291 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11294 new_item.PlaceOnSurface();
11295 }
11296 }
11297 }
11298 }
11299 }
11300
11302 {
11304 {
11305 if (ScriptInputUserData.CanStoreInputUserData())
11306 {
11307 ScriptInputUserData ctx = new ScriptInputUserData;
11312 dst.WriteToContext(ctx);
11314 }
11315 }
11316 else if (!
g_Game.IsMultiplayer())
11317 {
11319 }
11320 }
11321
11323 {
11325 {
11326 if (ScriptInputUserData.CanStoreInputUserData())
11327 {
11328 ScriptInputUserData ctx = new ScriptInputUserData;
11333 ctx.
Write(destination_entity);
11339 }
11340 }
11341 else if (!
g_Game.IsMultiplayer())
11342 {
11344 }
11345 }
11346
11348 {
11350 }
11351
11353 {
11355 float split_quantity_new;
11357 if (dst.IsValid())
11358 {
11359 int slot_id = dst.GetSlot();
11361
11362 if (quantity > stack_max)
11363 split_quantity_new = stack_max;
11364 else
11365 split_quantity_new = quantity;
11366
11368 {
11370
11371 if (new_item)
11372 {
11373 new_item.SetResultOfSplit(true);
11374 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11376 new_item.
SetQuantity(split_quantity_new,
false,
true);
11377 }
11378
11379 return new_item;
11380 }
11381 }
11382
11383 return null;
11384 }
11385
11387 {
11389 float split_quantity_new;
11391 if (destination_entity)
11392 {
11394 if (quantity > stackable)
11395 split_quantity_new = stackable;
11396 else
11397 split_quantity_new = quantity;
11398
11400 {
11401 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11402 if (new_item)
11403 {
11404 new_item.SetResultOfSplit(true);
11405 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11407 new_item.
SetQuantity(split_quantity_new,
false,
true);
11408 }
11409 }
11410 }
11411 }
11412
11414 {
11416 {
11417 if (ScriptInputUserData.CanStoreInputUserData())
11418 {
11419 ScriptInputUserData ctx = new ScriptInputUserData;
11424 ItemBase destination_entity =
this;
11425 ctx.
Write(destination_entity);
11429 }
11430 }
11431 else if (!
g_Game.IsMultiplayer())
11432 {
11434 }
11435 }
11436
11438 {
11440 float split_quantity_new;
11442 if (player)
11443 {
11445 if (quantity > stackable)
11446 split_quantity_new = stackable;
11447 else
11448 split_quantity_new = quantity;
11449
11451 {
11452 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11453 new_item =
ItemBase.Cast(in_hands);
11454 if (new_item)
11455 {
11456 new_item.SetResultOfSplit(true);
11457 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11459 new_item.SetQuantity(split_quantity_new, false, true);
11460 }
11461 }
11462 }
11463 }
11464
11466 {
11468 float split_quantity_new = Math.Floor(quantity * 0.5);
11469
11471 return;
11472
11474
11475 if (new_item)
11476 {
11477 if (new_item.GetQuantityMax() < split_quantity_new)
11478 {
11479 split_quantity_new = new_item.GetQuantityMax();
11480 }
11481
11482 new_item.SetResultOfSplit(true);
11483 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11484
11486 {
11489 }
11490 else
11491 {
11493 new_item.
SetQuantity(split_quantity_new,
false,
true);
11494 }
11495 }
11496 }
11497
11499 {
11501 float split_quantity_new = Math.Floor(quantity / 2);
11502
11504 return;
11505
11506 InventoryLocation invloc = new InventoryLocation;
11508
11510 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11511
11512 if (new_item)
11513 {
11514 if (new_item.GetQuantityMax() < split_quantity_new)
11515 {
11516 split_quantity_new = new_item.GetQuantityMax();
11517 }
11519 {
11522 }
11523 else if (split_quantity_new > 1)
11524 {
11526 new_item.
SetQuantity(split_quantity_new,
false,
true);
11527 }
11528 }
11529 }
11530
11533 {
11534 SetWeightDirty();
11536
11537 if (parent)
11538 parent.OnAttachmentQuantityChangedEx(this, delta);
11539
11541 {
11543 {
11545 }
11547 {
11548 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11550 }
11551 }
11552 }
11553
11556 {
11557
11558 }
11559
11562 {
11564 }
11565
11567 {
11568 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11569
11571 {
11572 if (newLevel == GameConstants.STATE_RUINED)
11573 {
11575 EntityAI parent = GetHierarchyParent();
11576 if (parent && parent.IsFireplace())
11577 {
11578 CargoBase cargo = GetInventory().GetCargo();
11579 if (cargo)
11580 {
11582 {
11584 }
11585 }
11586 }
11587 }
11588
11590 {
11591
11593 return;
11594 }
11595
11596 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11597 {
11599 }
11600 }
11601 }
11602
11603
11605 {
11606 super.OnRightClick();
11607
11609 {
11611 {
11612 if (ScriptInputUserData.CanStoreInputUserData())
11613 {
11614 EntityAI root = GetHierarchyRoot();
11615 Man playerOwner = GetHierarchyRootPlayer();
11616 InventoryLocation dst = new InventoryLocation;
11617
11618
11619 if (!playerOwner && root && root == this)
11620 {
11622 }
11623 else
11624 {
11625
11626 GetInventory().GetCurrentInventoryLocation(dst);
11628 {
11629 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11631 {
11633 }
11634 else
11635 {
11637
11638
11639 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11640 {
11642 }
11643 else
11644 {
11645 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11646 }
11647 }
11648 }
11649 }
11650
11651 ScriptInputUserData ctx = new ScriptInputUserData;
11659 }
11660 }
11661 else if (!
g_Game.IsMultiplayer())
11662 {
11664 }
11665 }
11666 }
11667
11669 {
11670 if (root)
11671 {
11672 vector m4[4];
11673 root.GetTransform(m4);
11674 dst.SetGround(this, m4);
11675 }
11676 else
11677 {
11678 GetInventory().GetCurrentInventoryLocation(dst);
11679 }
11680 }
11681
11682 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11683 {
11684
11685 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11686 return false;
11687
11688 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11689 return false;
11690
11691
11693 return false;
11694
11695
11696 Magazine mag = Magazine.Cast(this);
11697 if (mag)
11698 {
11699 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11700 return false;
11701
11702 if (stack_max_limit)
11703 {
11704 Magazine other_mag = Magazine.Cast(other_item);
11705 if (other_item)
11706 {
11707 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11708 return false;
11709 }
11710
11711 }
11712 }
11713 else
11714 {
11715
11717 return false;
11718
11720 return false;
11721 }
11722
11723 PlayerBase player = null;
11724 if (CastTo(player, GetHierarchyRootPlayer()))
11725 {
11726 if (player.GetInventory().HasAttachment(this))
11727 return false;
11728
11729 if (player.IsItemsToDelete())
11730 return false;
11731 }
11732
11733 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11734 return false;
11735
11736 int slotID;
11738 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11739 return false;
11740
11741 return true;
11742 }
11743
11745 {
11747 }
11748
11750 {
11751 return m_IsResultOfSplit;
11752 }
11753
11755 {
11756 m_IsResultOfSplit = value;
11757 }
11758
11760 {
11762 }
11763
11765 {
11766 float other_item_quantity = other_item.GetQuantity();
11767 float this_free_space;
11768
11770
11772
11773 if (other_item_quantity > this_free_space)
11774 {
11775 return this_free_space;
11776 }
11777 else
11778 {
11779 return other_item_quantity;
11780 }
11781 }
11782
11784 {
11786 }
11787
11789 {
11791 return;
11792
11793 if (!IsMagazine() && other_item)
11794 {
11796 if (quantity_used != 0)
11797 {
11798 float hp1 = GetHealth01("","");
11799 float hp2 = other_item.GetHealth01("","");
11800 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11801 hpResult = hpResult / (
GetQuantity() + quantity_used);
11802
11803 hpResult *= GetMaxHealth();
11804 Math.Round(hpResult);
11805 SetHealth("", "Health", hpResult);
11806
11808 other_item.AddQuantity(-quantity_used);
11809 }
11810 }
11812 }
11813
11815 {
11816 #ifdef SERVER
11817 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11818 GetHierarchyParent().IncreaseLifetimeUp();
11819 #endif
11820 };
11821
11823 {
11824 PlayerBase p = PlayerBase.Cast(player);
11825
11826 array<int> recipesIds = p.m_Recipes;
11827 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11828 if (moduleRecipesManager)
11829 {
11830 EntityAI itemInHands = player.GetEntityInHands();
11831 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11832 }
11833
11834 for (int i = 0;i < recipesIds.Count(); i++)
11835 {
11836 int key = recipesIds.Get(i);
11837 string recipeName = moduleRecipesManager.GetRecipeName(key);
11839 }
11840 }
11841
11842
11843 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11844 {
11845 super.GetDebugActions(outputList);
11846
11847
11853
11854
11859
11864
11865
11869
11870
11872 {
11876 }
11877
11880
11881
11885
11887
11888 InventoryLocation loc = new InventoryLocation();
11889 GetInventory().GetCurrentInventoryLocation(loc);
11891 {
11892 if (Gizmo_IsSupported())
11895 }
11896
11898 }
11899
11900
11901
11902
11904 {
11905 super.OnAction(action_id, player, ctx);
11906
11908 {
11909 switch (action_id)
11910 {
11914 return true;
11918 return true;
11919 }
11920 }
11921
11923 {
11924 switch (action_id)
11925 {
11927 Delete();
11928 return true;
11929 }
11930 }
11931
11932 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11933 {
11934 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11935 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11936 PlayerBase p = PlayerBase.Cast(player);
11937 if (
EActions.RECIPES_RANGE_START < 1000)
11938 {
11939 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11940 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11941 }
11942 }
11943 #ifndef SERVER
11944 else if (action_id ==
EActions.WATCH_PLAYER)
11945 {
11946 PluginDeveloper.SetDeveloperItemClientEx(player);
11947 }
11948 #endif
11950 {
11951 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11952 {
11953 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11954 OnDebugButtonPressServer(id + 1);
11955 }
11956
11957 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11958 {
11959 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11961 }
11962
11963 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11964 {
11965 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11967 }
11968
11969 else if (action_id ==
EActions.ADD_QUANTITY)
11970 {
11971 if (IsMagazine())
11972 {
11973 Magazine mag = Magazine.Cast(this);
11974 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11975 }
11976 else
11977 {
11979 }
11980
11981 if (m_EM)
11982 {
11983 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11984 }
11985
11986 }
11987
11988 else if (action_id ==
EActions.REMOVE_QUANTITY)
11989 {
11990 if (IsMagazine())
11991 {
11992 Magazine mag2 = Magazine.Cast(this);
11993 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11994 }
11995 else
11996 {
11998 }
11999 if (m_EM)
12000 {
12001 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
12002 }
12003
12004 }
12005
12006 else if (action_id ==
EActions.SET_QUANTITY_0)
12007 {
12009
12010 if (m_EM)
12011 {
12012 m_EM.SetEnergy(0);
12013 }
12014 }
12015
12016 else if (action_id ==
EActions.SET_MAX_QUANTITY)
12017 {
12019
12020 if (m_EM)
12021 {
12022 m_EM.SetEnergy(m_EM.GetEnergyMax());
12023 }
12024 }
12025
12026 else if (action_id ==
EActions.ADD_HEALTH)
12027 {
12028 AddHealth("","",GetMaxHealth("","Health")/5);
12029 }
12030 else if (action_id ==
EActions.REMOVE_HEALTH)
12031 {
12032 AddHealth("","",-GetMaxHealth("","Health")/5);
12033 }
12034 else if (action_id ==
EActions.DESTROY_HEALTH)
12035 {
12036 SetHealth01("","",0);
12037 }
12038 else if (action_id ==
EActions.WATCH_ITEM)
12039 {
12041 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
12042 #ifdef DEVELOPER
12043 SetDebugDeveloper_item(this);
12044 #endif
12045 }
12046
12047 else if (action_id ==
EActions.ADD_TEMPERATURE)
12048 {
12049 AddTemperature(20);
12050
12051 }
12052
12053 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
12054 {
12055 AddTemperature(-20);
12056
12057 }
12058
12059 else if (action_id ==
EActions.FLIP_FROZEN)
12060 {
12061 SetFrozen(!GetIsFrozen());
12062
12063 }
12064
12065 else if (action_id ==
EActions.ADD_WETNESS)
12066 {
12068
12069 }
12070
12071 else if (action_id ==
EActions.REMOVE_WETNESS)
12072 {
12074
12075 }
12076
12077 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12078 {
12081
12082
12083 }
12084
12085 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12086 {
12089 }
12090
12091 else if (action_id ==
EActions.MAKE_SPECIAL)
12092 {
12093 auto debugParams = DebugSpawnParams.WithPlayer(player);
12094 OnDebugSpawnEx(debugParams);
12095 }
12096
12097 }
12098
12099
12100 return false;
12101 }
12102
12103
12104
12105
12109
12112
12113
12114
12116 {
12117 return false;
12118 }
12119
12120
12122 {
12123 return true;
12124 }
12125
12126
12128 {
12129 return true;
12130 }
12131
12132
12133
12135 {
12136 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12137 return g_Game.ConfigIsExisting(config_path);
12138 }
12139
12142 {
12143 return null;
12144 }
12145
12147 {
12148 return false;
12149 }
12150
12152 {
12153 return false;
12154 }
12155
12159
12160
12162 {
12163 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12164 return module_repairing.CanRepair(this, item_repair_kit);
12165 }
12166
12167
12168 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12169 {
12170 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12171 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12172 }
12173
12174
12176 {
12177
12178
12179
12180
12181
12182
12183
12184
12185 return 1;
12186 }
12187
12188
12189
12191 {
12193 }
12194
12195
12196
12198 {
12200 }
12201
12202
12211 {
12212 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12213
12214 if (player)
12215 {
12216 player.MessageStatus(text);
12217 }
12218 }
12219
12220
12229 {
12230 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12231
12232 if (player)
12233 {
12234 player.MessageAction(text);
12235 }
12236 }
12237
12238
12247 {
12248 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12249
12250 if (player)
12251 {
12252 player.MessageFriendly(text);
12253 }
12254 }
12255
12256
12265 {
12266 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12267
12268 if (player)
12269 {
12270 player.MessageImportant(text);
12271 }
12272 }
12273
12275 {
12276 return true;
12277 }
12278
12279
12280 override bool KindOf(
string tag)
12281 {
12282 bool found = false;
12283 string item_name = this.
GetType();
12285 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12286
12287 int array_size = item_tag_array.Count();
12288 for (int i = 0; i < array_size; i++)
12289 {
12290 if (item_tag_array.Get(i) == tag)
12291 {
12292 found = true;
12293 break;
12294 }
12295 }
12296 return found;
12297 }
12298
12299
12301 {
12302
12303 super.OnRPC(sender, rpc_type,ctx);
12304
12305
12306 switch (rpc_type)
12307 {
12308 #ifndef SERVER
12309 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12310 Param2<bool, string> p = new Param2<bool, string>(false, "");
12311
12313 return;
12314
12315 bool play = p.param1;
12316 string soundSet = p.param2;
12317
12318 if (play)
12319 {
12321 {
12323 {
12325 }
12326 }
12327 else
12328 {
12330 }
12331 }
12332 else
12333 {
12335 }
12336
12337 break;
12338 #endif
12339
12340 }
12341
12343 {
12345 }
12346 }
12347
12348
12349
12350
12352 {
12353 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12354 return plugin.GetID(
name);
12355 }
12356
12358 {
12359 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12360 return plugin.GetName(id);
12361 }
12362
12365 {
12366
12367
12368 int varFlags;
12369 if (!ctx.
Read(varFlags))
12370 return;
12371
12372 if (varFlags & ItemVariableFlags.FLOAT)
12373 {
12375 }
12376 }
12377
12379 {
12380
12381 super.SerializeNumericalVars(floats_out);
12382
12383
12384
12386 {
12388 }
12389
12391 {
12393 }
12394
12396 {
12398 }
12399
12401 {
12406 }
12407
12409 {
12411 }
12412 }
12413
12415 {
12416
12417 super.DeSerializeNumericalVars(floats);
12418
12419
12420 int index = 0;
12421 int mask = Math.Round(floats.Get(index));
12422
12423 index++;
12424
12426 {
12428 {
12430 }
12431 else
12432 {
12433 float quantity = floats.Get(index);
12434 SetQuantity(quantity,
true,
false,
false,
false);
12435 }
12436 index++;
12437 }
12438
12440 {
12441 float wet = floats.Get(index);
12443 index++;
12444 }
12445
12447 {
12448 int liquidtype = Math.Round(floats.Get(index));
12450 index++;
12451 }
12452
12454 {
12456 index++;
12458 index++;
12460 index++;
12462 index++;
12463 }
12464
12466 {
12467 int cleanness = Math.Round(floats.Get(index));
12469 index++;
12470 }
12471 }
12472
12474 {
12475 super.WriteVarsToCTX(ctx);
12476
12477
12479 {
12481 }
12482
12484 {
12486 }
12487
12489 {
12491 }
12492
12494 {
12495 int r,g,b,a;
12501 }
12502
12504 {
12506 }
12507 }
12508
12510 {
12511 if (!super.ReadVarsFromCTX(ctx,version))
12512 return false;
12513
12514 int intValue;
12515 float value;
12516
12517 if (version < 140)
12518 {
12519 if (!ctx.
Read(intValue))
12520 return false;
12521
12522 m_VariablesMask = intValue;
12523 }
12524
12526 {
12527 if (!ctx.
Read(value))
12528 return false;
12529
12531 {
12533 }
12534 else
12535 {
12537 }
12538 }
12539
12540 if (version < 140)
12541 {
12543 {
12544 if (!ctx.
Read(value))
12545 return false;
12546 SetTemperatureDirect(value);
12547 }
12548 }
12549
12551 {
12552 if (!ctx.
Read(value))
12553 return false;
12555 }
12556
12558 {
12559 if (!ctx.
Read(intValue))
12560 return false;
12562 }
12563
12565 {
12566 int r,g,b,a;
12568 return false;
12570 return false;
12572 return false;
12574 return false;
12575
12577 }
12578
12580 {
12581 if (!ctx.
Read(intValue))
12582 return false;
12584 }
12585
12586 if (version >= 138 && version < 140)
12587 {
12589 {
12590 if (!ctx.
Read(intValue))
12591 return false;
12592 SetFrozen(intValue);
12593 }
12594 }
12595
12596 return true;
12597 }
12598
12599
12601 {
12604 {
12606 }
12607
12608 if (!super.OnStoreLoad(ctx, version))
12609 {
12611 return false;
12612 }
12613
12614 if (version >= 114)
12615 {
12616 bool hasQuickBarIndexSaved;
12617
12618 if (!ctx.
Read(hasQuickBarIndexSaved))
12619 {
12621 return false;
12622 }
12623
12624 if (hasQuickBarIndexSaved)
12625 {
12626 int itmQBIndex;
12627
12628
12629 if (!ctx.
Read(itmQBIndex))
12630 {
12632 return false;
12633 }
12634
12635 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12636 if (itmQBIndex != -1 && parentPlayer)
12637 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12638 }
12639 }
12640 else
12641 {
12642
12643 PlayerBase player;
12644 int itemQBIndex;
12645 if (version ==
int.
MAX)
12646 {
12647 if (!ctx.
Read(itemQBIndex))
12648 {
12650 return false;
12651 }
12652 }
12653 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12654 {
12655
12656 if (!ctx.
Read(itemQBIndex))
12657 {
12659 return false;
12660 }
12661 if (itemQBIndex != -1 && player)
12662 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12663 }
12664 }
12665
12666 if (version < 140)
12667 {
12668
12669 if (!LoadVariables(ctx, version))
12670 {
12672 return false;
12673 }
12674 }
12675
12676
12678 {
12680 return false;
12681 }
12682 if (version >= 132)
12683 {
12685 if (raib)
12686 {
12688 {
12690 return false;
12691 }
12692 }
12693 }
12694
12696 return true;
12697 }
12698
12699
12700
12702 {
12703 super.OnStoreSave(ctx);
12704
12705 PlayerBase player;
12706 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12707 {
12709
12710 int itemQBIndex = -1;
12711 itemQBIndex = player.FindQuickBarEntityIndex(this);
12712 ctx.
Write(itemQBIndex);
12713 }
12714 else
12715 {
12717 }
12718
12720
12722 if (raib)
12723 {
12725 }
12726 }
12727
12728
12730 {
12731 super.AfterStoreLoad();
12732
12734 {
12736 }
12737
12739 {
12742 }
12743 }
12744
12746 {
12747 super.EEOnAfterLoad();
12748
12750 {
12752 }
12753
12756 }
12757
12759 {
12760 return false;
12761 }
12762
12763
12764
12766 {
12768 {
12769 #ifdef PLATFORM_CONSOLE
12770
12772 {
12774 if (menu)
12775 {
12777 }
12778 }
12779 #endif
12780 }
12781
12783 {
12786 }
12787
12789 {
12790 SetWeightDirty();
12792 }
12794 {
12797 }
12798
12800 {
12803
12806 }
12808 {
12812 }
12813
12814 super.OnVariablesSynchronized();
12815 }
12816
12817
12818
12820 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12821 {
12822 if (!IsServerCheck(allow_client))
12823 return false;
12824
12826 return false;
12827
12830
12831 if (value <= (min + 0.001))
12832 value = min;
12833
12834 if (value == min)
12835 {
12836 if (destroy_config)
12837 {
12838 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12839 if (dstr)
12840 {
12842 this.Delete();
12843 return true;
12844 }
12845 }
12846 else if (destroy_forced)
12847 {
12849 this.Delete();
12850 return true;
12851 }
12852
12854 }
12855
12858
12860 {
12861 EntityAI parent = GetHierarchyRoot();
12862 InventoryLocation iLoc = new InventoryLocation();
12863 GetInventory().GetCurrentInventoryLocation(iLoc);
12865 {
12866 int iLocSlot = iLoc.
GetSlot();
12868 {
12870 }
12872 {
12874 }
12875 }
12876 }
12877
12879 {
12881
12882 if (delta)
12884 }
12885
12887
12888 return false;
12889 }
12890
12891
12893 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12894 {
12896 }
12897
12899 {
12902 }
12903
12905 {
12908 }
12909
12911 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12912 {
12913 float value_clamped = Math.Clamp(value, 0, 1);
12915 SetQuantity(result, destroy_config, destroy_forced);
12916 }
12917
12918
12921 {
12923 }
12924
12926 {
12928 }
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12940 {
12941 int slot = -1;
12942 GameInventory inventory = GetInventory();
12943 if (inventory)
12944 {
12945 InventoryLocation il = new InventoryLocation;
12948 }
12949
12951 }
12952
12954 {
12955 float quantity_max = 0;
12956
12958 {
12959 if (attSlotID != -1)
12960 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12961
12962 if (quantity_max <= 0)
12964 }
12965
12966 if (quantity_max <= 0)
12968
12969 return quantity_max;
12970 }
12971
12973 {
12975 }
12976
12978 {
12980 }
12981
12982
12984 {
12986 }
12987
12989 {
12991 }
12992
12994 {
12996 }
12997
12998
13000 {
13001
13002 float weightEx = GetWeightEx();
13003 float special = GetInventoryAndCargoWeight();
13004 return weightEx - special;
13005 }
13006
13007
13009 {
13011 }
13012
13014 {
13016 {
13017 #ifdef DEVELOPER
13018 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13019 {
13020 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
13022 }
13023 #endif
13024
13025 return GetQuantity() * GetConfigWeightModified();
13026 }
13027 else if (HasEnergyManager())
13028 {
13029 #ifdef DEVELOPER
13030 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13031 {
13032 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
13033 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
13034 }
13035 #endif
13036 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
13037 }
13038 else
13039 {
13040 #ifdef DEVELOPER
13041 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
13042 {
13043 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
13044 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
13045 }
13046 #endif
13047 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
13048 }
13049 }
13050
13053 {
13054 int item_count = 0;
13056
13057 GameInventory inventory = GetInventory();
13058 CargoBase cargo = inventory.
GetCargo();
13059 if (cargo != NULL)
13060 {
13062 }
13063
13065 for (int i = 0; i < nAttachments; ++i)
13066 {
13068 if (item)
13069 item_count += item.GetNumberOfItems();
13070 }
13071 return item_count;
13072 }
13073
13076 {
13077 float weight = 0;
13078 float wetness = 1;
13079 if (include_wetness)
13082 {
13083 weight = wetness * m_ConfigWeight;
13084 }
13086 {
13087 weight = 1;
13088 }
13089 return weight;
13090 }
13091
13092
13093
13095 {
13096 GameInventory inventory = GetInventory();
13097 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
13098 {
13099 array<EntityAI> items = new array<EntityAI>;
13101 for (int i = 0; i < items.Count(); ++i)
13102 {
13104 if (item)
13105 {
13106 g_Game.ObjectDelete(item);
13107 }
13108 }
13109 }
13110 }
13111
13112
13113
13114
13116 {
13117 float energy = 0;
13118 if (HasEnergyManager())
13119 {
13120 energy = GetCompEM().GetEnergy();
13121 }
13122 return energy;
13123 }
13124
13125
13127 {
13128 super.OnEnergyConsumed();
13129
13131 }
13132
13134 {
13135 super.OnEnergyAdded();
13136
13138 }
13139
13140
13142 {
13143 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13144 {
13146 {
13147 float energy_0to1 = GetCompEM().GetEnergy0To1();
13149 }
13150 }
13151 }
13152
13153
13155 {
13156 return ConfigGetFloat("heatIsolation");
13157 }
13158
13160 {
13162 }
13163
13165 {
13166 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13167 if (
g_Game.ConfigIsExisting(paramPath))
13168 return g_Game.ConfigGetFloat(paramPath);
13169
13170 return 0.0;
13171 }
13172
13174 {
13175 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13176 if (
g_Game.ConfigIsExisting(paramPath))
13177 return g_Game.ConfigGetFloat(paramPath);
13178
13179 return 0.0;
13180 }
13181
13182 override void SetWet(
float value,
bool allow_client =
false)
13183 {
13184 if (!IsServerCheck(allow_client))
13185 return;
13186
13189
13191
13192 m_VarWet = Math.Clamp(value, min, max);
13193
13195 {
13198 }
13199 }
13200
13201 override void AddWet(
float value)
13202 {
13204 }
13205
13207 {
13209 }
13210
13212 {
13214 }
13215
13217 {
13219 }
13220
13222 {
13224 }
13225
13227 {
13229 }
13230
13231 override void OnWetChanged(
float newVal,
float oldVal)
13232 {
13235 if (newLevel != oldLevel)
13236 {
13238 }
13239 }
13240
13242 {
13243 SetWeightDirty();
13244 }
13245
13247 {
13248 return GetWetLevelInternal(
m_VarWet);
13249 }
13250
13251
13252
13254 {
13256 }
13257
13259 {
13261 }
13262
13264 {
13266 }
13267
13269 {
13271 }
13272
13273
13274
13276 {
13277 if (ConfigIsExisting("itemModelLength"))
13278 {
13279 return ConfigGetFloat("itemModelLength");
13280 }
13281 return 0;
13282 }
13283
13285 {
13286 if (ConfigIsExisting("itemAttachOffset"))
13287 {
13288 return ConfigGetFloat("itemAttachOffset");
13289 }
13290 return 0;
13291 }
13292
13293 override void SetCleanness(
int value,
bool allow_client =
false)
13294 {
13295 if (!IsServerCheck(allow_client))
13296 return;
13297
13299
13301
13304 }
13305
13307 {
13309 }
13310
13312 {
13313 return true;
13314 }
13315
13316
13317
13318
13320 {
13322 }
13323
13325 {
13327 }
13328
13329
13330
13331
13332 override void SetColor(
int r,
int g,
int b,
int a)
13333 {
13339 }
13341 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13342 {
13347 }
13348
13350 {
13352 }
13353
13356 {
13357 int r,g,b,a;
13359 r = r/255;
13360 g = g/255;
13361 b = b/255;
13362 a = a/255;
13363 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13364 }
13365
13366
13367
13368 override void SetLiquidType(
int value,
bool allow_client =
false)
13369 {
13370 if (!IsServerCheck(allow_client))
13371 return;
13372
13377 }
13378
13380 {
13381 return ConfigGetInt("varLiquidTypeInit");
13382 }
13383
13385 {
13387 }
13388
13390 {
13392 SetFrozen(false);
13393 }
13394
13397 {
13398 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13399 }
13400
13401
13404 {
13405 PlayerBase nplayer;
13406 if (PlayerBase.CastTo(nplayer, player))
13407 {
13409 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13410 }
13411 }
13412
13413
13416 {
13417 PlayerBase nplayer;
13418 if (PlayerBase.CastTo(nplayer,player))
13419 {
13420 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13421 }
13422
13423 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13424
13425 if (HasEnergyManager())
13426 {
13427 GetCompEM().UpdatePlugState();
13428 }
13429 }
13430
13431
13433 {
13434 super.OnPlacementStarted(player);
13435
13437 }
13438
13439 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13440 {
13442 {
13443 m_AdminLog.OnPlacementComplete(player,
this);
13444 }
13445
13446 super.OnPlacementComplete(player, position, orientation);
13447 }
13448
13449
13450
13451
13452
13454 {
13456 {
13457 return true;
13458 }
13459 else
13460 {
13461 return false;
13462 }
13463 }
13464
13465
13467 {
13469 {
13471 }
13472 }
13473
13474
13476 {
13478 }
13479
13481 {
13483 }
13484
13485 override void InsertAgent(
int agent,
float count = 1)
13486 {
13487 if (count < 1)
13488 return;
13489
13491 }
13492
13495 {
13497 }
13498
13499
13501 {
13503 }
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13547 {
13549 return false;
13550 return true;
13551 }
13552
13554 {
13555
13557 }
13558
13559
13562 {
13563 super.CheckForRoofLimited(timeTresholdMS);
13564
13565 float time =
g_Game.GetTime();
13566 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13567 {
13568 m_PreviousRoofTestTime = time;
13569 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13570 }
13571 }
13572
13573
13575 {
13577 {
13578 return 0;
13579 }
13580
13581 if (GetInventory().GetAttachmentSlotsCount() != 0)
13582 {
13583 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13584 if (filter)
13585 return filter.GetProtectionLevel(type, false, system);
13586 else
13587 return 0;
13588 }
13589
13590 string subclassPath, entryName;
13591
13592 switch (type)
13593 {
13595 entryName = "biological";
13596 break;
13598 entryName = "chemical";
13599 break;
13600 default:
13601 entryName = "biological";
13602 break;
13603 }
13604
13605 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13606
13607 return g_Game.ConfigGetFloat(subclassPath + entryName);
13608 }
13609
13610
13611
13614 {
13615 if (!IsMagazine())
13617
13619 }
13620
13621
13622
13623
13624
13629 {
13630 return true;
13631 }
13632
13634 {
13636 }
13637
13638
13639
13640
13641
13643 {
13644 if (parent)
13645 {
13646 if (parent.IsInherited(DayZInfected))
13647 return true;
13648
13649 if (!parent.IsRuined())
13650 return true;
13651 }
13652
13653 return true;
13654 }
13655
13657 {
13658 if (!super.CanPutAsAttachment(parent))
13659 {
13660 return false;
13661 }
13662
13663 if (!IsRuined() && !parent.IsRuined())
13664 {
13665 return true;
13666 }
13667
13668 return false;
13669 }
13670
13672 {
13673
13674
13675
13676
13677 return super.CanReceiveItemIntoCargo(item);
13678 }
13679
13681 {
13682
13683
13684
13685
13686 GameInventory attachmentInv = attachment.GetInventory();
13688 {
13689 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13690 return false;
13691 }
13692
13693 InventoryLocation loc = new InventoryLocation();
13694 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13695 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13696 return false;
13697
13698 return super.CanReceiveAttachment(attachment, slotId);
13699 }
13700
13702 {
13703 if (!super.CanReleaseAttachment(attachment))
13704 return false;
13705
13706 return GetInventory().AreChildrenAccessible();
13707 }
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13730 {
13731 int id = muzzle_owner.GetMuzzleID();
13732 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13733
13734 if (WPOF_array)
13735 {
13736 for (int i = 0; i < WPOF_array.Count(); i++)
13737 {
13738 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13739
13740 if (WPOF)
13741 {
13742 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13743 }
13744 }
13745 }
13746 }
13747
13748
13750 {
13751 int id = muzzle_owner.GetMuzzleID();
13753
13754 if (WPOBE_array)
13755 {
13756 for (int i = 0; i < WPOBE_array.Count(); i++)
13757 {
13758 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13759
13760 if (WPOBE)
13761 {
13762 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13763 }
13764 }
13765 }
13766 }
13767
13768
13770 {
13771 int id = muzzle_owner.GetMuzzleID();
13772 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13773
13774 if (WPOOH_array)
13775 {
13776 for (int i = 0; i < WPOOH_array.Count(); i++)
13777 {
13778 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13779
13780 if (WPOOH)
13781 {
13782 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13783 }
13784 }
13785 }
13786 }
13787
13788
13790 {
13791 int id = muzzle_owner.GetMuzzleID();
13792 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13793
13794 if (WPOOH_array)
13795 {
13796 for (int i = 0; i < WPOOH_array.Count(); i++)
13797 {
13798 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13799
13800 if (WPOOH)
13801 {
13802 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13803 }
13804 }
13805 }
13806 }
13807
13808
13810 {
13811 int id = muzzle_owner.GetMuzzleID();
13812 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13813
13814 if (WPOOH_array)
13815 {
13816 for (int i = 0; i < WPOOH_array.Count(); i++)
13817 {
13818 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13819
13820 if (WPOOH)
13821 {
13822 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13823 }
13824 }
13825 }
13826 }
13827
13828
13829
13831 {
13833 {
13834 return true;
13835 }
13836
13837 return false;
13838 }
13839
13841 {
13843 {
13844 return true;
13845 }
13846
13847 return false;
13848 }
13849
13851 {
13853 {
13854 return true;
13855 }
13856
13857 return false;
13858 }
13859
13861 {
13862 return false;
13863 }
13864
13867 {
13868 return UATimeSpent.DEFAULT_DEPLOY;
13869 }
13870
13871
13872
13873
13875 {
13877 SetSynchDirty();
13878 }
13879
13881 {
13883 }
13884
13885
13887 {
13888 return false;
13889 }
13890
13893 {
13894 string att_type = "None";
13895
13896 if (ConfigIsExisting("soundAttType"))
13897 {
13898 att_type = ConfigGetString("soundAttType");
13899 }
13900
13902 }
13903
13905 {
13907 }
13908
13909
13910
13911
13912
13918
13920 {
13923
13925 }
13926
13927
13929 {
13931 return;
13932
13934
13937
13940
13941 SoundParameters params = new SoundParameters();
13945 }
13946
13947
13949 {
13951 {
13954
13955 SetSynchDirty();
13956
13959 }
13960 }
13961
13963 {
13965 }
13966
13967
13969 {
13971 return;
13972
13974 SetSynchDirty();
13975
13978 }
13979
13981 {
13984 }
13985
13987 {
13989 }
13990
13991 void OnApply(PlayerBase player);
13992
13994 {
13995 return 1.0;
13996 };
13997
13999 {
14001 }
14002
14004 {
14006 }
14007
14009
14011 {
14012 SetDynamicPhysicsLifeTime(0.01);
14014 }
14015
14017 {
14018 array<string> zone_names = new array<string>;
14019 GetDamageZones(zone_names);
14020 for (int i = 0; i < zone_names.Count(); i++)
14021 {
14022 SetHealthMax(zone_names.Get(i),"Health");
14023 }
14024 SetHealthMax("","Health");
14025 }
14026
14029 {
14030 float global_health = GetHealth01("","Health");
14031 array<string> zones = new array<string>;
14032 GetDamageZones(zones);
14033
14034 for (int i = 0; i < zones.Count(); i++)
14035 {
14036 SetHealth01(zones.Get(i),"Health",global_health);
14037 }
14038 }
14039
14042 {
14043 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
14044 }
14045
14047 {
14048 if (!hasRootAsPlayer)
14049 {
14050 if (refParentIB)
14051 {
14052
14053 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
14054 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
14055
14056 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
14057 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
14058
14061 }
14062 else
14063 {
14064
14067 }
14068 }
14069 }
14070
14072 {
14074 {
14075 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14076 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14077 {
14078 float heatPermCoef = 1.0;
14080 while (ent)
14081 {
14082 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14083 ent = ent.GetHierarchyParent();
14084 }
14085
14086 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14087 }
14088 }
14089 }
14090
14092 {
14093
14094 EntityAI parent = GetHierarchyParent();
14095 if (!parent)
14096 {
14097 hasParent = false;
14098 hasRootAsPlayer = false;
14099 }
14100 else
14101 {
14102 hasParent = true;
14103 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14104 refParentIB =
ItemBase.Cast(parent);
14105 }
14106 }
14107
14108 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14109 {
14110
14111 }
14112
14114 {
14115
14116 return false;
14117 }
14118
14120 {
14121
14122
14123 return false;
14124 }
14125
14127 {
14128
14129 return false;
14130 }
14131
14134 {
14135 return !GetIsFrozen() &&
IsOpen();
14136 }
14137
14139 {
14140 bool hasParent = false, hasRootAsPlayer = false;
14142
14143 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14144 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14145
14146 if (wwtu || foodDecay)
14147 {
14151
14152 if (processWetness || processTemperature || processDecay)
14153 {
14155
14156 if (processWetness)
14157 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14158
14159 if (processTemperature)
14161
14162 if (processDecay)
14163 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14164 }
14165 }
14166 }
14167
14170 {
14172 }
14173
14175 {
14178
14179 return super.GetTemperatureFreezeThreshold();
14180 }
14181
14183 {
14186
14187 return super.GetTemperatureThawThreshold();
14188 }
14189
14191 {
14194
14195 return super.GetItemOverheatThreshold();
14196 }
14197
14199 {
14201 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14202
14203 return super.GetTemperatureFreezeTime();
14204 }
14205
14207 {
14209 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14210
14211 return super.GetTemperatureThawTime();
14212 }
14213
14218
14220 {
14221 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14222 }
14223
14225 {
14226 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14227 }
14228
14231 {
14233 }
14234
14236 {
14238 }
14239
14241 {
14243 }
14244
14247 {
14248 return null;
14249 }
14250
14253 {
14254 return false;
14255 }
14256
14258 {
14260 {
14263 if (!trg)
14264 {
14266 explosive = this;
14267 }
14268
14269 explosive.PairRemote(trg);
14271
14272 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14273 trg.SetPersistentPairID(persistentID);
14274 explosive.SetPersistentPairID(persistentID);
14275
14276 return true;
14277 }
14278 return false;
14279 }
14280
14283 {
14284 float ret = 1.0;
14287 ret *= GetHealth01();
14288
14289 return ret;
14290 }
14291
14292 #ifdef DEVELOPER
14293 override void SetDebugItem()
14294 {
14295 super.SetDebugItem();
14296 _itemBase = this;
14297 }
14298
14300 {
14301 string text = super.GetDebugText();
14302
14304 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14305
14306 return text;
14307 }
14308 #endif
14309
14311 {
14312 return true;
14313 }
14314
14316
14318
14320 {
14323 }
14324
14325
14333
14349
14350 [
Obsolete(
"Use ItemSoundHandler instead")]
14353 {
14354 if (!
g_Game.IsDedicatedServer())
14355 {
14356 if (ConfigIsExisting("attachSoundSet"))
14357 {
14358 string cfg_path = "";
14359 string soundset = "";
14360 string type_name =
GetType();
14361
14364 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14365 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14366
14367 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14368 {
14369 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14370 {
14371 if (cfg_slot_array[i] == slot_type)
14372 {
14373 soundset = cfg_soundset_array[i];
14374 break;
14375 }
14376 }
14377 }
14378
14379 if (soundset != "")
14380 {
14381 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14383 }
14384 }
14385 }
14386 }
14387
14389}
14390
14392{
14394 if (entity)
14395 {
14396 bool is_item = entity.IsInherited(
ItemBase);
14397 if (is_item && full_quantity)
14398 {
14401 }
14402 }
14403 else
14404 {
14406 return NULL;
14407 }
14408 return entity;
14409}
14410
14412{
14413 if (item)
14414 {
14415 if (health > 0)
14416 item.SetHealth("", "", health);
14417
14418 if (item.CanHaveTemperature())
14419 {
14421 if (item.CanFreeze())
14422 item.SetFrozen(false);
14423 }
14424
14425 if (item.HasEnergyManager())
14426 {
14427 if (quantity >= 0)
14428 {
14429 item.GetCompEM().SetEnergy0To1(quantity);
14430 }
14431 else
14432 {
14434 }
14435 }
14436 else if (item.IsMagazine())
14437 {
14438 Magazine mag = Magazine.Cast(item);
14439 if (quantity >= 0)
14440 {
14441 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14442 }
14443 else
14444 {
14446 }
14447
14448 }
14449 else
14450 {
14451 if (quantity >= 0)
14452 {
14453 item.SetQuantityNormalized(quantity, false);
14454 }
14455 else
14456 {
14458 }
14459
14460 }
14461 }
14462}
14463
14464#ifdef DEVELOPER
14466#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.