9383{
9385 {
9386 return true;
9387 }
9388};
9389
9391{
9392
9393};
9394
9395
9396
9398{
9402
9404
9407
9408
9409
9410
9411
9420
9426
9431
9436
9457 protected bool m_IsResultOfSplit
9458
9460
9465
9466
9467
9469
9473
9474
9475
9477
9480
9481
9482
9488
9489
9497
9500
9501
9503
9504
9506
9507
9512
9513
9518
9520
9521
9523
9524
9526 {
9531
9532 if (!
g_Game.IsDedicatedServer())
9533 {
9535 {
9537
9539 {
9541 }
9542 }
9543
9546 }
9547
9548 m_OldLocation = null;
9549
9551 {
9553 }
9554
9555 if (ConfigIsExisting("headSelectionsToHide"))
9556 {
9559 }
9560
9562 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9563 {
9565 }
9566
9568
9569 m_IsResultOfSplit = false;
9570
9572 }
9573
9575 {
9576 super.InitItemVariables();
9577
9583 m_Count = ConfigGetInt(
"count");
9584
9587
9592
9595
9600
9612
9616
9617
9620 if (ConfigIsExisting("canBeSplit"))
9621 {
9624 }
9625
9627 if (ConfigIsExisting("itemBehaviour"))
9629
9630
9633 RegisterNetSyncVariableInt("m_VarLiquidType");
9634 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9635
9636 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9637 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9638 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9639
9640 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9641 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9642 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9643 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9644
9645 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9646 RegisterNetSyncVariableBool("m_IsTakeable");
9647 RegisterNetSyncVariableBool("m_IsHologram");
9648
9651 {
9654 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9655 }
9656
9658
9660 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9662
9664 }
9665
9667 {
9669 }
9670
9672 {
9675 {
9680 }
9681 }
9682
9683 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9684 {
9686 {
9689 }
9690
9692 }
9693
9695 {
9701 }
9702
9704
9706 {
9708
9709 if (!action)
9710 {
9711 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9712 return;
9713 }
9714
9716 if (!ai)
9717 {
9719 return;
9720 }
9721
9723 if (!action_array)
9724 {
9725 action_array = new array<ActionBase_Basic>;
9727 }
9728 if (LogManager.IsActionLogEnable())
9729 {
9730 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9731 }
9732
9733 if (action_array.Find(action) != -1)
9734 {
9735 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9736 }
9737 else
9738 {
9739 action_array.Insert(action);
9740 }
9741 }
9742
9744 {
9745 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9746 ActionBase action = player.GetActionManager().GetAction(actionName);
9749
9750 if (action_array)
9751 {
9752 action_array.RemoveItem(action);
9753 }
9754 }
9755
9756
9757
9759 {
9760 ActionOverrideData overrideData = new ActionOverrideData();
9764
9766 if (!actionMap)
9767 {
9770 }
9771
9772 actionMap.Insert(this.
Type(), overrideData);
9773
9774 }
9775
9777
9779
9780
9782 {
9785
9788
9789 string config_to_search = "CfgVehicles";
9790 string muzzle_owner_config;
9791
9793 {
9794 if (IsInherited(Weapon))
9795 config_to_search = "CfgWeapons";
9796
9797 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9798
9799 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9800
9801 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9802
9803 if (config_OnFire_subclass_count > 0)
9804 {
9805 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9806
9807 for (int i = 0; i < config_OnFire_subclass_count; i++)
9808 {
9809 string particle_class = "";
9810 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9811 string config_OnFire_entry = config_OnFire_class + particle_class;
9812 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9813 WPOF_array.Insert(WPOF);
9814 }
9815
9816
9818 }
9819 }
9820
9822 {
9823 config_to_search = "CfgWeapons";
9824 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9825
9826 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9827
9828 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9829
9830 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9831 {
9832 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9833
9834 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9835 {
9836 string particle_class2 = "";
9837 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9838 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9839 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9840 WPOBE_array.Insert(WPOBE);
9841 }
9842
9843
9845 }
9846 }
9847 }
9848
9849
9851 {
9854
9856 {
9857 string config_to_search = "CfgVehicles";
9858
9859 if (IsInherited(Weapon))
9860 config_to_search = "CfgWeapons";
9861
9862 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9863 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9864
9865 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9866 {
9867
9869
9871 {
9873 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9875 return;
9876 }
9877
9880
9881
9882
9883 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9884 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9885
9886 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9887 {
9888 string particle_class = "";
9889 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9890 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9891 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9892
9893 if (entry_type == CT_CLASS)
9894 {
9895 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9896 WPOOH_array.Insert(WPOF);
9897 }
9898 }
9899
9900
9902 }
9903 }
9904 }
9905
9907 {
9909 }
9910
9912 {
9914 {
9916
9919
9922
9923 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9924 }
9925 }
9926
9928 {
9930 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9931
9933 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9934
9936 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9937
9939 {
9941 }
9942 }
9943
9945 {
9947 }
9948
9950 {
9953 else
9955
9957 {
9960 }
9961 else
9962 {
9965
9968 }
9969
9971 }
9972
9974 {
9976 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9977 }
9978
9980 {
9982 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9984 }
9985
9987 {
9989 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9990 }
9991
9993 {
9996
9997 OverheatingParticle OP = new OverheatingParticle();
10002
10004 }
10005
10007 {
10010
10011 return -1;
10012 }
10013
10015 {
10017 {
10020
10021 for (int i = count; i > 0; --i)
10022 {
10023 int id = i - 1;
10026
10029
10030 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10031 {
10032 if (p)
10033 {
10036 }
10037 }
10038 }
10039 }
10040 }
10041
10043 {
10045 {
10047 {
10048 int id = i - 1;
10050
10051 if (OP)
10052 {
10054
10055 if (p)
10056 {
10058 }
10059
10060 delete OP;
10061 }
10062 }
10063
10066 }
10067 }
10068
10071 {
10072 return 0.0;
10073 }
10074
10075
10077 {
10078 return 250;
10079 }
10080
10082 {
10083 return 0;
10084 }
10085
10088 {
10090 return true;
10091
10092 return false;
10093 }
10094
10097 {
10100
10102 {
10104 }
10105 else
10106 {
10107
10109 }
10110
10112 }
10113
10120 {
10121 return -1;
10122 }
10123
10124
10125
10126
10128 {
10130 {
10131 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10132 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10133
10134 if (r_index >= 0)
10135 {
10136 InventoryLocation r_il = new InventoryLocation;
10137 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10138
10139 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10142 {
10143 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10144 }
10146 {
10147 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10148 }
10149
10150 }
10151
10152 player.GetHumanInventory().ClearUserReservedLocation(this);
10153 }
10154
10157 }
10158
10159
10160
10161
10163 {
10164 return ItemBase.m_DebugActionsMask;
10165 }
10166
10168 {
10169 return ItemBase.m_DebugActionsMask & mask;
10170 }
10171
10173 {
10174 ItemBase.m_DebugActionsMask = mask;
10175 }
10176
10178 {
10179 ItemBase.m_DebugActionsMask |= mask;
10180 }
10181
10183 {
10184 ItemBase.m_DebugActionsMask &= ~mask;
10185 }
10186
10188 {
10190 {
10192 }
10193 else
10194 {
10196 }
10197 }
10198
10199
10201 {
10202 if (GetEconomyProfile())
10203 {
10204 float q_max = GetEconomyProfile().GetQuantityMax();
10205 if (q_max > 0)
10206 {
10207 float q_min = GetEconomyProfile().GetQuantityMin();
10208 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10209
10211 {
10212 ComponentEnergyManager comp = GetCompEM();
10214 {
10216 }
10217 }
10219 {
10221
10222 }
10223
10224 }
10225 }
10226 }
10227
10230 {
10231 EntityAI parent = GetHierarchyParent();
10232
10233 if (parent)
10234 {
10235 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10236 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10237 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10238 }
10239 }
10240
10243 {
10244 EntityAI parent = GetHierarchyParent();
10245
10246 if (parent)
10247 {
10248 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10249 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10250 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10251 }
10252 }
10253
10255 {
10256
10257
10258
10259
10261
10263 {
10264 if (ScriptInputUserData.CanStoreInputUserData())
10265 {
10266 ScriptInputUserData ctx = new ScriptInputUserData;
10272 ctx.
Write(use_stack_max);
10275
10277 {
10278 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10279 }
10280 }
10281 }
10282 else if (!
g_Game.IsMultiplayer())
10283 {
10285 }
10286 }
10287
10289 {
10291 }
10292
10294 {
10296 }
10297
10299 {
10301 }
10302
10304 {
10305
10306 return false;
10307 }
10308
10310 {
10311 return false;
10312 }
10313
10317 {
10318 return false;
10319 }
10320
10322 {
10323 return "";
10324 }
10325
10327
10329 {
10330 return false;
10331 }
10332
10334 {
10335 return true;
10336 }
10337
10338
10339
10341 {
10342 return true;
10343 }
10344
10346 {
10347 return true;
10348 }
10349
10351 {
10352 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10354 }
10355
10357 {
10359 }
10360
10362 {
10364 if (!is_being_placed)
10366 SetSynchDirty();
10367 }
10368
10369
10371
10373 {
10375 }
10376
10378 {
10380 }
10381
10383 {
10384 return 1;
10385 }
10386
10388 {
10389 return false;
10390 }
10391
10393 {
10395 SetSynchDirty();
10396 }
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10433 {
10434 super.OnMovedInsideCargo(container);
10435
10436 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10437 }
10438
10439 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10440 {
10441 super.EEItemLocationChanged(oldLoc, newLoc);
10442
10443 PlayerBase newPlayer = null;
10444 PlayerBase oldPlayer = null;
10445
10446 if (newLoc.GetParent())
10447 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10448
10449 if (oldLoc.GetParent())
10450 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10451
10453 {
10454 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10455
10456 if (rIndex >= 0)
10457 {
10458 InventoryLocation rIl = new InventoryLocation;
10459 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10460
10461 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10464 {
10465 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10466 }
10468 {
10470 }
10471
10472 }
10473 }
10474
10476 {
10477 if (newPlayer)
10478 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10479
10480 if (newPlayer == oldPlayer)
10481 {
10482 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10483 {
10485 {
10486 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10487 {
10488 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10489 }
10490 }
10491 else
10492 {
10493 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10494 }
10495 }
10496
10497 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10498 {
10499 int type = oldLoc.GetType();
10501 {
10502 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10503 }
10505 {
10506 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10507 }
10508 }
10509 if (!m_OldLocation)
10510 {
10511 m_OldLocation = new InventoryLocation;
10512 }
10513 m_OldLocation.Copy(oldLoc);
10514 }
10515 else
10516 {
10517 if (m_OldLocation)
10518 {
10519 m_OldLocation.Reset();
10520 }
10521 }
10522
10523 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10524 }
10525 else
10526 {
10527 if (newPlayer)
10528 {
10529 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10530 if (resIndex >= 0)
10531 {
10532 InventoryLocation il = new InventoryLocation;
10533 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10535 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10538 {
10539 il.
GetParent().GetOnReleaseLock().Invoke(it);
10540 }
10542 {
10544 }
10545
10546 }
10547 }
10549 {
10550
10552 }
10553
10554 if (m_OldLocation)
10555 {
10556 m_OldLocation.Reset();
10557 }
10558 }
10559
10561 {
10562 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10563 }
10564
10566 {
10567 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10568 }
10569 }
10570
10571 override void EOnContact(IEntity other, Contact extra)
10572 {
10574 {
10575 int liquidType = -1;
10577 if (impactSpeed > 0.0)
10578 {
10580 #ifndef SERVER
10582 #else
10584 SetSynchDirty();
10585 #endif
10587 }
10588 }
10589
10590 #ifdef SERVER
10591 if (GetCompEM() && GetCompEM().IsPlugged())
10592 {
10593 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10594 GetCompEM().UnplugThis();
10595 }
10596 #endif
10597 }
10598
10600
10602 {
10604 }
10605
10607 {
10608
10609 }
10610
10612 {
10613 super.OnItemLocationChanged(old_owner, new_owner);
10614
10615 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10616 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10617
10618 if (!relatedPlayer && playerNew)
10619 relatedPlayer = playerNew;
10620
10621 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10622 {
10624 if (actionMgr)
10625 {
10626 ActionBase currentAction = actionMgr.GetRunningAction();
10627 if (currentAction)
10629 }
10630 }
10631
10632 Man ownerPlayerOld = null;
10633 Man ownerPlayerNew = null;
10634
10635 if (old_owner)
10636 {
10637 if (old_owner.
IsMan())
10638 {
10639 ownerPlayerOld = Man.Cast(old_owner);
10640 }
10641 else
10642 {
10643 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10644 }
10645 }
10646 else
10647 {
10649 {
10651
10652 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10653 {
10654 GetCompEM().UnplugThis();
10655 }
10656 }
10657 }
10658
10659 if (new_owner)
10660 {
10661 if (new_owner.
IsMan())
10662 {
10663 ownerPlayerNew = Man.Cast(new_owner);
10664 }
10665 else
10666 {
10667 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10668 }
10669 }
10670
10671 if (ownerPlayerOld != ownerPlayerNew)
10672 {
10673 if (ownerPlayerOld)
10674 {
10675 array<EntityAI> subItemsExit = new array<EntityAI>;
10677 for (int i = 0; i < subItemsExit.Count(); i++)
10678 {
10681 }
10682 }
10683
10684 if (ownerPlayerNew)
10685 {
10686 array<EntityAI> subItemsEnter = new array<EntityAI>;
10688 for (int j = 0; j < subItemsEnter.Count(); j++)
10689 {
10692 }
10693 }
10694 }
10695 else if (ownerPlayerNew != null)
10696 {
10697 PlayerBase nplayer;
10698 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10699 {
10700 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10702 for (int k = 0; k < subItemsUpdate.Count(); k++)
10703 {
10705 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10706 }
10707 }
10708 }
10709
10710 if (old_owner)
10711 old_owner.OnChildItemRemoved(this);
10712 if (new_owner)
10713 new_owner.OnChildItemReceived(this);
10714 }
10715
10716
10718 {
10719 super.EEDelete(parent);
10720 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10721 if (player)
10722 {
10724
10725 if (player.IsAlive())
10726 {
10727 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10728 if (r_index >= 0)
10729 {
10730 InventoryLocation r_il = new InventoryLocation;
10731 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10732
10733 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10736 {
10737 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10738 }
10740 {
10741 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10742 }
10743
10744 }
10745
10746 player.RemoveQuickBarEntityShortcut(this);
10747 }
10748 }
10749 }
10750
10752 {
10753 super.EEKilled(killer);
10754
10757 {
10758 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10759 {
10760 if (IsMagazine())
10761 {
10762 if (Magazine.Cast(this).GetAmmoCount() > 0)
10763 {
10765 }
10766 }
10767 else
10768 {
10770 }
10771 }
10772 }
10773 }
10774
10776 {
10777 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10778
10779 super.OnWasAttached(parent, slot_id);
10780
10783
10786 }
10787
10789 {
10790 super.OnWasDetached(parent, slot_id);
10791
10794
10797 }
10798
10800 {
10801 int idx;
10804
10805 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10806 if (inventory_slots.Count() < 1)
10807 {
10808 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10809 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10810 }
10811 else
10812 {
10813 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10814 }
10815
10816 idx = inventory_slots.Find(slot);
10817 if (idx < 0)
10818 return "";
10819
10820 return attach_types.Get(idx);
10821 }
10822
10824 {
10825 int idx = -1;
10826 string slot;
10827
10830
10831 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10832 if (inventory_slots.Count() < 1)
10833 {
10834 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10835 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10836 }
10837 else
10838 {
10839 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10840 if (detach_types.Count() < 1)
10841 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10842 }
10843
10844 for (int i = 0; i < inventory_slots.Count(); i++)
10845 {
10846 slot = inventory_slots.Get(i);
10847 }
10848
10849 if (slot != "")
10850 {
10851 if (detach_types.Count() == 1)
10852 idx = 0;
10853 else
10854 idx = inventory_slots.Find(slot);
10855 }
10856 if (idx < 0)
10857 return "";
10858
10859 return detach_types.Get(idx);
10860 }
10861
10863 {
10864
10866
10867
10868 float min_time = 1;
10869 float max_time = 3;
10870 float delay = Math.RandomFloat(min_time, max_time);
10871
10872 explode_timer.Run(delay, this, "DoAmmoExplosion");
10873 }
10874
10876 {
10877 Magazine magazine = Magazine.Cast(this);
10878 int pop_sounds_count = 6;
10879 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10880
10881
10882 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10883 string sound_name = pop_sounds[ sound_idx ];
10884 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10885
10886
10887 magazine.ServerAddAmmoCount(-1);
10888
10889
10890 float min_temp_to_explode = 100;
10891
10892 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10893 {
10895 }
10896 }
10897
10898
10899 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10900 {
10901 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10902
10903 const int CHANCE_DAMAGE_CARGO = 4;
10904 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10905 const int CHANCE_DAMAGE_NOTHING = 2;
10906
10908 {
10909 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10910 int chances;
10911 int rnd;
10912
10913 if (GetInventory().GetCargo())
10914 {
10915 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10916 rnd = Math.RandomInt(0,chances);
10917
10918 if (rnd < CHANCE_DAMAGE_CARGO)
10919 {
10921 }
10922 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10923 {
10925 }
10926 }
10927 else
10928 {
10929 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10930 rnd = Math.RandomInt(0,chances);
10931
10932 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10933 {
10935 }
10936 }
10937 }
10938 }
10939
10941 {
10942 CargoBase cargo = GetInventory().GetCargo();
10943 if (cargo)
10944 {
10946 if (item_count > 0)
10947 {
10948 int random_pick = Math.RandomInt(0, item_count);
10950 if (!item.IsExplosive())
10951 {
10952 item.AddHealth("","",damage);
10953 return true;
10954 }
10955 }
10956 }
10957 return false;
10958 }
10959
10961 {
10962 GameInventory inventory = GetInventory();
10964 if (attachment_count > 0)
10965 {
10966 int random_pick = Math.RandomInt(0, attachment_count);
10968 if (!attachment.IsExplosive())
10969 {
10970 attachment.AddHealth("","",damage);
10971 return true;
10972 }
10973 }
10974 return false;
10975 }
10976
10978 {
10980 }
10981
10983 {
10985 return GetInventory().CanRemoveEntity();
10986
10987 return false;
10988 }
10989
10991 {
10992
10994 return false;
10995
10996
10998 return false;
10999
11000
11001
11003 if (delta == 0)
11004 return false;
11005
11006
11007 return true;
11008 }
11009
11011 {
11013 {
11014 if (ScriptInputUserData.CanStoreInputUserData())
11015 {
11016 ScriptInputUserData ctx = new ScriptInputUserData;
11021 ctx.
Write(destination_entity);
11023 ctx.
Write(slot_id);
11025 }
11026 }
11027 else if (!
g_Game.IsMultiplayer())
11028 {
11030 }
11031 }
11032
11034 {
11035 float split_quantity_new;
11039 InventoryLocation loc = new InventoryLocation;
11040
11041 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11042 {
11044 split_quantity_new = stack_max;
11045 else
11047
11049 {
11050 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11051 if (new_item)
11052 {
11053 new_item.SetResultOfSplit(true);
11054 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11056 new_item.
SetQuantity(split_quantity_new,
false,
true);
11057 }
11058 }
11059 }
11060 else if (destination_entity && slot_id == -1)
11061 {
11062 if (quantity > stack_max)
11063 split_quantity_new = stack_max;
11064 else
11065 split_quantity_new = quantity;
11066
11068 {
11069 GameInventory destinationInventory = destination_entity.GetInventory();
11071 {
11074 }
11075
11076 if (new_item)
11077 {
11078 new_item.SetResultOfSplit(true);
11079 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11081 new_item.
SetQuantity(split_quantity_new,
false,
true);
11082 }
11083 }
11084 }
11085 else
11086 {
11087 if (stack_max != 0)
11088 {
11090 {
11092 }
11093
11094 if (split_quantity_new == 0)
11095 {
11096 if (!
g_Game.IsMultiplayer())
11097 player.PhysicalPredictiveDropItem(this);
11098 else
11099 player.ServerDropEntity(this);
11100 return;
11101 }
11102
11104 {
11106
11107 if (new_item)
11108 {
11109 new_item.SetResultOfSplit(true);
11110 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11113 new_item.PlaceOnSurface();
11114 }
11115 }
11116 }
11117 }
11118 }
11119
11121 {
11122 float split_quantity_new;
11126 InventoryLocation loc = new InventoryLocation;
11127
11128 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11129 {
11131 split_quantity_new = stack_max;
11132 else
11134
11136 {
11137 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11138 if (new_item)
11139 {
11140 new_item.SetResultOfSplit(true);
11141 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11143 new_item.
SetQuantity(split_quantity_new,
false,
true);
11144 }
11145 }
11146 }
11147 else if (destination_entity && slot_id == -1)
11148 {
11149 if (quantity > stack_max)
11150 split_quantity_new = stack_max;
11151 else
11152 split_quantity_new = quantity;
11153
11155 {
11156 GameInventory destinationInventory = destination_entity.GetInventory();
11158 {
11161 }
11162
11163 if (new_item)
11164 {
11165 new_item.SetResultOfSplit(true);
11166 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11168 new_item.
SetQuantity(split_quantity_new,
false,
true);
11169 }
11170 }
11171 }
11172 else
11173 {
11174 if (stack_max != 0)
11175 {
11177 {
11179 }
11180
11182 {
11184
11185 if (new_item)
11186 {
11187 new_item.SetResultOfSplit(true);
11188 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11191 new_item.PlaceOnSurface();
11192 }
11193 }
11194 }
11195 }
11196 }
11197
11199 {
11201 {
11202 if (ScriptInputUserData.CanStoreInputUserData())
11203 {
11204 ScriptInputUserData ctx = new ScriptInputUserData;
11209 dst.WriteToContext(ctx);
11211 }
11212 }
11213 else if (!
g_Game.IsMultiplayer())
11214 {
11216 }
11217 }
11218
11220 {
11222 {
11223 if (ScriptInputUserData.CanStoreInputUserData())
11224 {
11225 ScriptInputUserData ctx = new ScriptInputUserData;
11230 ctx.
Write(destination_entity);
11236 }
11237 }
11238 else if (!
g_Game.IsMultiplayer())
11239 {
11241 }
11242 }
11243
11245 {
11247 }
11248
11250 {
11252 float split_quantity_new;
11254 if (dst.IsValid())
11255 {
11256 int slot_id = dst.GetSlot();
11258
11259 if (quantity > stack_max)
11260 split_quantity_new = stack_max;
11261 else
11262 split_quantity_new = quantity;
11263
11265 {
11267
11268 if (new_item)
11269 {
11270 new_item.SetResultOfSplit(true);
11271 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11273 new_item.
SetQuantity(split_quantity_new,
false,
true);
11274 }
11275
11276 return new_item;
11277 }
11278 }
11279
11280 return null;
11281 }
11282
11284 {
11286 float split_quantity_new;
11288 if (destination_entity)
11289 {
11291 if (quantity > stackable)
11292 split_quantity_new = stackable;
11293 else
11294 split_quantity_new = quantity;
11295
11297 {
11298 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11299 if (new_item)
11300 {
11301 new_item.SetResultOfSplit(true);
11302 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11304 new_item.
SetQuantity(split_quantity_new,
false,
true);
11305 }
11306 }
11307 }
11308 }
11309
11311 {
11313 {
11314 if (ScriptInputUserData.CanStoreInputUserData())
11315 {
11316 ScriptInputUserData ctx = new ScriptInputUserData;
11321 ItemBase destination_entity =
this;
11322 ctx.
Write(destination_entity);
11326 }
11327 }
11328 else if (!
g_Game.IsMultiplayer())
11329 {
11331 }
11332 }
11333
11335 {
11337 float split_quantity_new;
11339 if (player)
11340 {
11342 if (quantity > stackable)
11343 split_quantity_new = stackable;
11344 else
11345 split_quantity_new = quantity;
11346
11348 {
11349 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11350 new_item =
ItemBase.Cast(in_hands);
11351 if (new_item)
11352 {
11353 new_item.SetResultOfSplit(true);
11354 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11356 new_item.SetQuantity(split_quantity_new, false, true);
11357 }
11358 }
11359 }
11360 }
11361
11363 {
11365 float split_quantity_new = Math.Floor(quantity * 0.5);
11366
11368 return;
11369
11371
11372 if (new_item)
11373 {
11374 if (new_item.GetQuantityMax() < split_quantity_new)
11375 {
11376 split_quantity_new = new_item.GetQuantityMax();
11377 }
11378
11379 new_item.SetResultOfSplit(true);
11380 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11381
11383 {
11386 }
11387 else
11388 {
11390 new_item.
SetQuantity(split_quantity_new,
false,
true);
11391 }
11392 }
11393 }
11394
11396 {
11398 float split_quantity_new = Math.Floor(quantity / 2);
11399
11401 return;
11402
11403 InventoryLocation invloc = new InventoryLocation;
11405
11407 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11408
11409 if (new_item)
11410 {
11411 if (new_item.GetQuantityMax() < split_quantity_new)
11412 {
11413 split_quantity_new = new_item.GetQuantityMax();
11414 }
11416 {
11419 }
11420 else if (split_quantity_new > 1)
11421 {
11423 new_item.
SetQuantity(split_quantity_new,
false,
true);
11424 }
11425 }
11426 }
11427
11430 {
11431 SetWeightDirty();
11433
11434 if (parent)
11435 parent.OnAttachmentQuantityChangedEx(this, delta);
11436
11438 {
11440 {
11442 }
11444 {
11445 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11447 }
11448 }
11449 }
11450
11453 {
11454
11455 }
11456
11459 {
11461 }
11462
11464 {
11465 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11466
11468 {
11469 if (newLevel == GameConstants.STATE_RUINED)
11470 {
11472 EntityAI parent = GetHierarchyParent();
11473 if (parent && parent.IsFireplace())
11474 {
11475 CargoBase cargo = GetInventory().GetCargo();
11476 if (cargo)
11477 {
11479 {
11481 }
11482 }
11483 }
11484 }
11485
11487 {
11488
11490 return;
11491 }
11492
11493 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11494 {
11496 }
11497 }
11498 }
11499
11500
11502 {
11503 super.OnRightClick();
11504
11506 {
11508 {
11509 if (ScriptInputUserData.CanStoreInputUserData())
11510 {
11511 EntityAI root = GetHierarchyRoot();
11512 Man playerOwner = GetHierarchyRootPlayer();
11513 InventoryLocation dst = new InventoryLocation;
11514
11515
11516 if (!playerOwner && root && root == this)
11517 {
11519 }
11520 else
11521 {
11522
11523 GetInventory().GetCurrentInventoryLocation(dst);
11525 {
11526 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11528 {
11530 }
11531 else
11532 {
11534
11535
11536 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11537 {
11539 }
11540 else
11541 {
11542 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11543 }
11544 }
11545 }
11546 }
11547
11548 ScriptInputUserData ctx = new ScriptInputUserData;
11556 }
11557 }
11558 else if (!
g_Game.IsMultiplayer())
11559 {
11561 }
11562 }
11563 }
11564
11566 {
11567 if (root)
11568 {
11569 vector m4[4];
11570 root.GetTransform(m4);
11571 dst.SetGround(this, m4);
11572 }
11573 else
11574 {
11575 GetInventory().GetCurrentInventoryLocation(dst);
11576 }
11577 }
11578
11579 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11580 {
11581
11582 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11583 return false;
11584
11585 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11586 return false;
11587
11588
11590 return false;
11591
11592
11593 Magazine mag = Magazine.Cast(this);
11594 if (mag)
11595 {
11596 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11597 return false;
11598
11599 if (stack_max_limit)
11600 {
11601 Magazine other_mag = Magazine.Cast(other_item);
11602 if (other_item)
11603 {
11604 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11605 return false;
11606 }
11607
11608 }
11609 }
11610 else
11611 {
11612
11614 return false;
11615
11617 return false;
11618 }
11619
11620 PlayerBase player = null;
11621 if (CastTo(player, GetHierarchyRootPlayer()))
11622 {
11623 if (player.GetInventory().HasAttachment(this))
11624 return false;
11625
11626 if (player.IsItemsToDelete())
11627 return false;
11628 }
11629
11630 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11631 return false;
11632
11633 int slotID;
11635 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11636 return false;
11637
11638 return true;
11639 }
11640
11642 {
11644 }
11645
11647 {
11648 return m_IsResultOfSplit;
11649 }
11650
11652 {
11653 m_IsResultOfSplit = value;
11654 }
11655
11657 {
11659 }
11660
11662 {
11663 float other_item_quantity = other_item.GetQuantity();
11664 float this_free_space;
11665
11667
11669
11670 if (other_item_quantity > this_free_space)
11671 {
11672 return this_free_space;
11673 }
11674 else
11675 {
11676 return other_item_quantity;
11677 }
11678 }
11679
11681 {
11683 }
11684
11686 {
11688 return;
11689
11690 if (!IsMagazine() && other_item)
11691 {
11693 if (quantity_used != 0)
11694 {
11695 float hp1 = GetHealth01("","");
11696 float hp2 = other_item.GetHealth01("","");
11697 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11698 hpResult = hpResult / (
GetQuantity() + quantity_used);
11699
11700 hpResult *= GetMaxHealth();
11701 Math.Round(hpResult);
11702 SetHealth("", "Health", hpResult);
11703
11705 other_item.AddQuantity(-quantity_used);
11706 }
11707 }
11709 }
11710
11712 {
11713 #ifdef SERVER
11714 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11715 GetHierarchyParent().IncreaseLifetimeUp();
11716 #endif
11717 };
11718
11720 {
11721 PlayerBase p = PlayerBase.Cast(player);
11722
11723 array<int> recipesIds = p.m_Recipes;
11724 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11725 if (moduleRecipesManager)
11726 {
11727 EntityAI itemInHands = player.GetEntityInHands();
11728 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11729 }
11730
11731 for (int i = 0;i < recipesIds.Count(); i++)
11732 {
11733 int key = recipesIds.Get(i);
11734 string recipeName = moduleRecipesManager.GetRecipeName(key);
11736 }
11737 }
11738
11739
11740 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11741 {
11742 super.GetDebugActions(outputList);
11743
11744
11750
11751
11756
11761
11762
11766
11767
11769 {
11773 }
11774
11777
11778
11782
11784
11785 InventoryLocation loc = new InventoryLocation();
11786 GetInventory().GetCurrentInventoryLocation(loc);
11788 {
11789 if (Gizmo_IsSupported())
11792 }
11793
11795 }
11796
11797
11798
11799
11801 {
11802 super.OnAction(action_id, player, ctx);
11803
11805 {
11806 switch (action_id)
11807 {
11811 return true;
11815 return true;
11816 }
11817 }
11818
11820 {
11821 switch (action_id)
11822 {
11824 Delete();
11825 return true;
11826 }
11827 }
11828
11829 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11830 {
11831 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11832 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11833 PlayerBase p = PlayerBase.Cast(player);
11834 if (
EActions.RECIPES_RANGE_START < 1000)
11835 {
11836 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11837 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11838 }
11839 }
11840 #ifndef SERVER
11841 else if (action_id ==
EActions.WATCH_PLAYER)
11842 {
11843 PluginDeveloper.SetDeveloperItemClientEx(player);
11844 }
11845 #endif
11847 {
11848 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11849 {
11850 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11851 OnDebugButtonPressServer(id + 1);
11852 }
11853
11854 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11855 {
11856 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11858 }
11859
11860 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11861 {
11862 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11864 }
11865
11866 else if (action_id ==
EActions.ADD_QUANTITY)
11867 {
11868 if (IsMagazine())
11869 {
11870 Magazine mag = Magazine.Cast(this);
11871 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11872 }
11873 else
11874 {
11876 }
11877
11878 if (m_EM)
11879 {
11880 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11881 }
11882
11883 }
11884
11885 else if (action_id ==
EActions.REMOVE_QUANTITY)
11886 {
11887 if (IsMagazine())
11888 {
11889 Magazine mag2 = Magazine.Cast(this);
11890 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11891 }
11892 else
11893 {
11895 }
11896 if (m_EM)
11897 {
11898 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11899 }
11900
11901 }
11902
11903 else if (action_id ==
EActions.SET_QUANTITY_0)
11904 {
11906
11907 if (m_EM)
11908 {
11909 m_EM.SetEnergy(0);
11910 }
11911 }
11912
11913 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11914 {
11916
11917 if (m_EM)
11918 {
11919 m_EM.SetEnergy(m_EM.GetEnergyMax());
11920 }
11921 }
11922
11923 else if (action_id ==
EActions.ADD_HEALTH)
11924 {
11925 AddHealth("","",GetMaxHealth("","Health")/5);
11926 }
11927 else if (action_id ==
EActions.REMOVE_HEALTH)
11928 {
11929 AddHealth("","",-GetMaxHealth("","Health")/5);
11930 }
11931 else if (action_id ==
EActions.DESTROY_HEALTH)
11932 {
11933 SetHealth01("","",0);
11934 }
11935 else if (action_id ==
EActions.WATCH_ITEM)
11936 {
11938 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11939 #ifdef DEVELOPER
11940 SetDebugDeveloper_item(this);
11941 #endif
11942 }
11943
11944 else if (action_id ==
EActions.ADD_TEMPERATURE)
11945 {
11946 AddTemperature(20);
11947
11948 }
11949
11950 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11951 {
11952 AddTemperature(-20);
11953
11954 }
11955
11956 else if (action_id ==
EActions.FLIP_FROZEN)
11957 {
11958 SetFrozen(!GetIsFrozen());
11959
11960 }
11961
11962 else if (action_id ==
EActions.ADD_WETNESS)
11963 {
11965
11966 }
11967
11968 else if (action_id ==
EActions.REMOVE_WETNESS)
11969 {
11971
11972 }
11973
11974 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11975 {
11978
11979
11980 }
11981
11982 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11983 {
11986 }
11987
11988 else if (action_id ==
EActions.MAKE_SPECIAL)
11989 {
11990 auto debugParams = DebugSpawnParams.WithPlayer(player);
11991 OnDebugSpawnEx(debugParams);
11992 }
11993
11994 }
11995
11996
11997 return false;
11998 }
11999
12000
12001
12002
12006
12009
12010
12011
12013 {
12014 return false;
12015 }
12016
12017
12019 {
12020 return true;
12021 }
12022
12023
12025 {
12026 return true;
12027 }
12028
12029
12030
12032 {
12033 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12034 return g_Game.ConfigIsExisting(config_path);
12035 }
12036
12039 {
12040 return null;
12041 }
12042
12044 {
12045 return false;
12046 }
12047
12049 {
12050 return false;
12051 }
12052
12056
12057
12059 {
12060 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12061 return module_repairing.CanRepair(this, item_repair_kit);
12062 }
12063
12064
12065 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12066 {
12067 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12068 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12069 }
12070
12071
12073 {
12074
12075
12076
12077
12078
12079
12080
12081
12082 return 1;
12083 }
12084
12085
12086
12088 {
12090 }
12091
12092
12093
12095 {
12097 }
12098
12099
12108 {
12109 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12110
12111 if (player)
12112 {
12113 player.MessageStatus(text);
12114 }
12115 }
12116
12117
12126 {
12127 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12128
12129 if (player)
12130 {
12131 player.MessageAction(text);
12132 }
12133 }
12134
12135
12144 {
12145 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12146
12147 if (player)
12148 {
12149 player.MessageFriendly(text);
12150 }
12151 }
12152
12153
12162 {
12163 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12164
12165 if (player)
12166 {
12167 player.MessageImportant(text);
12168 }
12169 }
12170
12172 {
12173 return true;
12174 }
12175
12176
12177 override bool KindOf(
string tag)
12178 {
12179 bool found = false;
12180 string item_name = this.
GetType();
12182 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12183
12184 int array_size = item_tag_array.Count();
12185 for (int i = 0; i < array_size; i++)
12186 {
12187 if (item_tag_array.Get(i) == tag)
12188 {
12189 found = true;
12190 break;
12191 }
12192 }
12193 return found;
12194 }
12195
12196
12198 {
12199
12200 super.OnRPC(sender, rpc_type,ctx);
12201
12202
12203 switch (rpc_type)
12204 {
12205 #ifndef SERVER
12206 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12207 Param2<bool, string> p = new Param2<bool, string>(false, "");
12208
12210 return;
12211
12212 bool play = p.param1;
12213 string soundSet = p.param2;
12214
12215 if (play)
12216 {
12218 {
12220 {
12222 }
12223 }
12224 else
12225 {
12227 }
12228 }
12229 else
12230 {
12232 }
12233
12234 break;
12235 #endif
12236
12237 }
12238
12240 {
12242 }
12243 }
12244
12245
12246
12247
12249 {
12250 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12251 return plugin.GetID(
name);
12252 }
12253
12255 {
12256 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12257 return plugin.GetName(id);
12258 }
12259
12262 {
12263
12264
12265 int varFlags;
12266 if (!ctx.
Read(varFlags))
12267 return;
12268
12269 if (varFlags & ItemVariableFlags.FLOAT)
12270 {
12272 }
12273 }
12274
12276 {
12277
12278 super.SerializeNumericalVars(floats_out);
12279
12280
12281
12283 {
12285 }
12286
12288 {
12290 }
12291
12293 {
12295 }
12296
12298 {
12303 }
12304
12306 {
12308 }
12309 }
12310
12312 {
12313
12314 super.DeSerializeNumericalVars(floats);
12315
12316
12317 int index = 0;
12318 int mask = Math.Round(floats.Get(index));
12319
12320 index++;
12321
12323 {
12325 {
12327 }
12328 else
12329 {
12330 float quantity = floats.Get(index);
12331 SetQuantity(quantity,
true,
false,
false,
false);
12332 }
12333 index++;
12334 }
12335
12337 {
12338 float wet = floats.Get(index);
12340 index++;
12341 }
12342
12344 {
12345 int liquidtype = Math.Round(floats.Get(index));
12347 index++;
12348 }
12349
12351 {
12353 index++;
12355 index++;
12357 index++;
12359 index++;
12360 }
12361
12363 {
12364 int cleanness = Math.Round(floats.Get(index));
12366 index++;
12367 }
12368 }
12369
12371 {
12372 super.WriteVarsToCTX(ctx);
12373
12374
12376 {
12378 }
12379
12381 {
12383 }
12384
12386 {
12388 }
12389
12391 {
12392 int r,g,b,a;
12398 }
12399
12401 {
12403 }
12404 }
12405
12407 {
12408 if (!super.ReadVarsFromCTX(ctx,version))
12409 return false;
12410
12411 int intValue;
12412 float value;
12413
12414 if (version < 140)
12415 {
12416 if (!ctx.
Read(intValue))
12417 return false;
12418
12419 m_VariablesMask = intValue;
12420 }
12421
12423 {
12424 if (!ctx.
Read(value))
12425 return false;
12426
12428 {
12430 }
12431 else
12432 {
12434 }
12435 }
12436
12437 if (version < 140)
12438 {
12440 {
12441 if (!ctx.
Read(value))
12442 return false;
12443 SetTemperatureDirect(value);
12444 }
12445 }
12446
12448 {
12449 if (!ctx.
Read(value))
12450 return false;
12452 }
12453
12455 {
12456 if (!ctx.
Read(intValue))
12457 return false;
12459 }
12460
12462 {
12463 int r,g,b,a;
12465 return false;
12467 return false;
12469 return false;
12471 return false;
12472
12474 }
12475
12477 {
12478 if (!ctx.
Read(intValue))
12479 return false;
12481 }
12482
12483 if (version >= 138 && version < 140)
12484 {
12486 {
12487 if (!ctx.
Read(intValue))
12488 return false;
12489 SetFrozen(intValue);
12490 }
12491 }
12492
12493 return true;
12494 }
12495
12496
12498 {
12501 {
12503 }
12504
12505 if (!super.OnStoreLoad(ctx, version))
12506 {
12508 return false;
12509 }
12510
12511 if (version >= 114)
12512 {
12513 bool hasQuickBarIndexSaved;
12514
12515 if (!ctx.
Read(hasQuickBarIndexSaved))
12516 {
12518 return false;
12519 }
12520
12521 if (hasQuickBarIndexSaved)
12522 {
12523 int itmQBIndex;
12524
12525
12526 if (!ctx.
Read(itmQBIndex))
12527 {
12529 return false;
12530 }
12531
12532 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12533 if (itmQBIndex != -1 && parentPlayer)
12534 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12535 }
12536 }
12537 else
12538 {
12539
12540 PlayerBase player;
12541 int itemQBIndex;
12542 if (version ==
int.
MAX)
12543 {
12544 if (!ctx.
Read(itemQBIndex))
12545 {
12547 return false;
12548 }
12549 }
12550 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12551 {
12552
12553 if (!ctx.
Read(itemQBIndex))
12554 {
12556 return false;
12557 }
12558 if (itemQBIndex != -1 && player)
12559 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12560 }
12561 }
12562
12563 if (version < 140)
12564 {
12565
12566 if (!LoadVariables(ctx, version))
12567 {
12569 return false;
12570 }
12571 }
12572
12573
12575 {
12577 return false;
12578 }
12579 if (version >= 132)
12580 {
12582 if (raib)
12583 {
12585 {
12587 return false;
12588 }
12589 }
12590 }
12591
12593 return true;
12594 }
12595
12596
12597
12599 {
12600 super.OnStoreSave(ctx);
12601
12602 PlayerBase player;
12603 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12604 {
12606
12607 int itemQBIndex = -1;
12608 itemQBIndex = player.FindQuickBarEntityIndex(this);
12609 ctx.
Write(itemQBIndex);
12610 }
12611 else
12612 {
12614 }
12615
12617
12619 if (raib)
12620 {
12622 }
12623 }
12624
12625
12627 {
12628 super.AfterStoreLoad();
12629
12631 {
12633 }
12634
12636 {
12639 }
12640 }
12641
12643 {
12644 super.EEOnAfterLoad();
12645
12647 {
12649 }
12650
12653 }
12654
12656 {
12657 return false;
12658 }
12659
12660
12661
12663 {
12665 {
12666 #ifdef PLATFORM_CONSOLE
12667
12669 {
12671 if (menu)
12672 {
12674 }
12675 }
12676 #endif
12677 }
12678
12680 {
12683 }
12684
12686 {
12687 SetWeightDirty();
12689 }
12691 {
12694 }
12695
12697 {
12700
12703 }
12705 {
12709 }
12710
12711 super.OnVariablesSynchronized();
12712 }
12713
12714
12715
12717 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12718 {
12719 if (!IsServerCheck(allow_client))
12720 return false;
12721
12723 return false;
12724
12727
12728 if (value <= (min + 0.001))
12729 value = min;
12730
12731 if (value == min)
12732 {
12733 if (destroy_config)
12734 {
12735 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12736 if (dstr)
12737 {
12739 this.Delete();
12740 return true;
12741 }
12742 }
12743 else if (destroy_forced)
12744 {
12746 this.Delete();
12747 return true;
12748 }
12749
12751 }
12752
12755
12757 {
12758 EntityAI parent = GetHierarchyRoot();
12759 InventoryLocation iLoc = new InventoryLocation();
12760 GetInventory().GetCurrentInventoryLocation(iLoc);
12762 {
12763 int iLocSlot = iLoc.
GetSlot();
12765 {
12767 }
12769 {
12771 }
12772 }
12773 }
12774
12776 {
12778
12779 if (delta)
12781 }
12782
12784
12785 return false;
12786 }
12787
12788
12790 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12791 {
12793 }
12794
12796 {
12799 }
12800
12802 {
12805 }
12806
12808 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12809 {
12810 float value_clamped = Math.Clamp(value, 0, 1);
12812 SetQuantity(result, destroy_config, destroy_forced);
12813 }
12814
12815
12818 {
12820 }
12821
12823 {
12825 }
12826
12827
12828
12829
12830
12831
12832
12833
12834
12835
12837 {
12838 int slot = -1;
12839 GameInventory inventory = GetInventory();
12840 if (inventory)
12841 {
12842 InventoryLocation il = new InventoryLocation;
12845 }
12846
12848 }
12849
12851 {
12852 float quantity_max = 0;
12853
12855 {
12856 if (attSlotID != -1)
12857 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12858
12859 if (quantity_max <= 0)
12861 }
12862
12863 if (quantity_max <= 0)
12865
12866 return quantity_max;
12867 }
12868
12870 {
12872 }
12873
12875 {
12877 }
12878
12879
12881 {
12883 }
12884
12886 {
12888 }
12889
12891 {
12893 }
12894
12895
12897 {
12898
12899 float weightEx = GetWeightEx();
12900 float special = GetInventoryAndCargoWeight();
12901 return weightEx - special;
12902 }
12903
12904
12906 {
12908 }
12909
12911 {
12913 {
12914 #ifdef DEVELOPER
12915 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12916 {
12917 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12919 }
12920 #endif
12921
12922 return GetQuantity() * GetConfigWeightModified();
12923 }
12924 else if (HasEnergyManager())
12925 {
12926 #ifdef DEVELOPER
12927 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12928 {
12929 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12930 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12931 }
12932 #endif
12933 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12934 }
12935 else
12936 {
12937 #ifdef DEVELOPER
12938 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12939 {
12940 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12941 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12942 }
12943 #endif
12944 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12945 }
12946 }
12947
12950 {
12951 int item_count = 0;
12953
12954 GameInventory inventory = GetInventory();
12955 CargoBase cargo = inventory.
GetCargo();
12956 if (cargo != NULL)
12957 {
12959 }
12960
12962 for (int i = 0; i < nAttachments; ++i)
12963 {
12965 if (item)
12966 item_count += item.GetNumberOfItems();
12967 }
12968 return item_count;
12969 }
12970
12973 {
12974 float weight = 0;
12975 float wetness = 1;
12976 if (include_wetness)
12979 {
12980 weight = wetness * m_ConfigWeight;
12981 }
12983 {
12984 weight = 1;
12985 }
12986 return weight;
12987 }
12988
12989
12990
12992 {
12993 GameInventory inventory = GetInventory();
12994 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12995 {
12996 array<EntityAI> items = new array<EntityAI>;
12998 for (int i = 0; i < items.Count(); ++i)
12999 {
13001 if (item)
13002 {
13003 g_Game.ObjectDelete(item);
13004 }
13005 }
13006 }
13007 }
13008
13009
13010
13011
13013 {
13014 float energy = 0;
13015 if (HasEnergyManager())
13016 {
13017 energy = GetCompEM().GetEnergy();
13018 }
13019 return energy;
13020 }
13021
13022
13024 {
13025 super.OnEnergyConsumed();
13026
13028 }
13029
13031 {
13032 super.OnEnergyAdded();
13033
13035 }
13036
13037
13039 {
13040 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13041 {
13043 {
13044 float energy_0to1 = GetCompEM().GetEnergy0To1();
13046 }
13047 }
13048 }
13049
13050
13052 {
13053 return ConfigGetFloat("heatIsolation");
13054 }
13055
13057 {
13059 }
13060
13062 {
13063 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13064 if (
g_Game.ConfigIsExisting(paramPath))
13065 return g_Game.ConfigGetFloat(paramPath);
13066
13067 return 0.0;
13068 }
13069
13071 {
13072 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13073 if (
g_Game.ConfigIsExisting(paramPath))
13074 return g_Game.ConfigGetFloat(paramPath);
13075
13076 return 0.0;
13077 }
13078
13079 override void SetWet(
float value,
bool allow_client =
false)
13080 {
13081 if (!IsServerCheck(allow_client))
13082 return;
13083
13086
13088
13089 m_VarWet = Math.Clamp(value, min, max);
13090
13092 {
13095 }
13096 }
13097
13098 override void AddWet(
float value)
13099 {
13101 }
13102
13104 {
13106 }
13107
13109 {
13111 }
13112
13114 {
13116 }
13117
13119 {
13121 }
13122
13124 {
13126 }
13127
13128 override void OnWetChanged(
float newVal,
float oldVal)
13129 {
13132 if (newLevel != oldLevel)
13133 {
13135 }
13136 }
13137
13139 {
13140 SetWeightDirty();
13141 }
13142
13144 {
13145 return GetWetLevelInternal(
m_VarWet);
13146 }
13147
13148
13149
13151 {
13153 }
13154
13156 {
13158 }
13159
13161 {
13163 }
13164
13166 {
13168 }
13169
13170
13171
13173 {
13174 if (ConfigIsExisting("itemModelLength"))
13175 {
13176 return ConfigGetFloat("itemModelLength");
13177 }
13178 return 0;
13179 }
13180
13182 {
13183 if (ConfigIsExisting("itemAttachOffset"))
13184 {
13185 return ConfigGetFloat("itemAttachOffset");
13186 }
13187 return 0;
13188 }
13189
13190 override void SetCleanness(
int value,
bool allow_client =
false)
13191 {
13192 if (!IsServerCheck(allow_client))
13193 return;
13194
13196
13198
13201 }
13202
13204 {
13206 }
13207
13209 {
13210 return true;
13211 }
13212
13213
13214
13215
13217 {
13219 }
13220
13222 {
13224 }
13225
13226
13227
13228
13229 override void SetColor(
int r,
int g,
int b,
int a)
13230 {
13236 }
13238 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13239 {
13244 }
13245
13247 {
13249 }
13250
13253 {
13254 int r,g,b,a;
13256 r = r/255;
13257 g = g/255;
13258 b = b/255;
13259 a = a/255;
13260 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13261 }
13262
13263
13264
13265 override void SetLiquidType(
int value,
bool allow_client =
false)
13266 {
13267 if (!IsServerCheck(allow_client))
13268 return;
13269
13274 }
13275
13277 {
13278 return ConfigGetInt("varLiquidTypeInit");
13279 }
13280
13282 {
13284 }
13285
13287 {
13289 SetFrozen(false);
13290 }
13291
13294 {
13295 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13296 }
13297
13298
13301 {
13302 PlayerBase nplayer;
13303 if (PlayerBase.CastTo(nplayer, player))
13304 {
13306 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13307 }
13308 }
13309
13310
13313 {
13314 PlayerBase nplayer;
13315 if (PlayerBase.CastTo(nplayer,player))
13316 {
13317 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13318 }
13319
13320 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13321
13322 if (HasEnergyManager())
13323 {
13324 GetCompEM().UpdatePlugState();
13325 }
13326 }
13327
13328
13330 {
13331 super.OnPlacementStarted(player);
13332
13334 }
13335
13336 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13337 {
13339 {
13340 m_AdminLog.OnPlacementComplete(player,
this);
13341 }
13342
13343 super.OnPlacementComplete(player, position, orientation);
13344 }
13345
13346
13347
13348
13349
13351 {
13353 {
13354 return true;
13355 }
13356 else
13357 {
13358 return false;
13359 }
13360 }
13361
13362
13364 {
13366 {
13368 }
13369 }
13370
13371
13373 {
13375 }
13376
13378 {
13380 }
13381
13382 override void InsertAgent(
int agent,
float count = 1)
13383 {
13384 if (count < 1)
13385 return;
13386
13388 }
13389
13392 {
13394 }
13395
13396
13398 {
13400 }
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13444 {
13446 return false;
13447 return true;
13448 }
13449
13451 {
13452
13454 }
13455
13456
13459 {
13460 super.CheckForRoofLimited(timeTresholdMS);
13461
13462 float time =
g_Game.GetTime();
13463 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13464 {
13465 m_PreviousRoofTestTime = time;
13466 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13467 }
13468 }
13469
13470
13472 {
13474 {
13475 return 0;
13476 }
13477
13478 if (GetInventory().GetAttachmentSlotsCount() != 0)
13479 {
13480 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13481 if (filter)
13482 return filter.GetProtectionLevel(type, false, system);
13483 else
13484 return 0;
13485 }
13486
13487 string subclassPath, entryName;
13488
13489 switch (type)
13490 {
13492 entryName = "biological";
13493 break;
13495 entryName = "chemical";
13496 break;
13497 default:
13498 entryName = "biological";
13499 break;
13500 }
13501
13502 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13503
13504 return g_Game.ConfigGetFloat(subclassPath + entryName);
13505 }
13506
13507
13508
13511 {
13512 if (!IsMagazine())
13514
13516 }
13517
13518
13519
13520
13521
13526 {
13527 return true;
13528 }
13529
13531 {
13533 }
13534
13535
13536
13537
13538
13540 {
13541 if (parent)
13542 {
13543 if (parent.IsInherited(DayZInfected))
13544 return true;
13545
13546 if (!parent.IsRuined())
13547 return true;
13548 }
13549
13550 return true;
13551 }
13552
13554 {
13555 if (!super.CanPutAsAttachment(parent))
13556 {
13557 return false;
13558 }
13559
13560 if (!IsRuined() && !parent.IsRuined())
13561 {
13562 return true;
13563 }
13564
13565 return false;
13566 }
13567
13569 {
13570
13571
13572
13573
13574 return super.CanReceiveItemIntoCargo(item);
13575 }
13576
13578 {
13579
13580
13581
13582
13583 GameInventory attachmentInv = attachment.GetInventory();
13585 {
13586 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13587 return false;
13588 }
13589
13590 InventoryLocation loc = new InventoryLocation();
13591 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13592 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13593 return false;
13594
13595 return super.CanReceiveAttachment(attachment, slotId);
13596 }
13597
13599 {
13600 if (!super.CanReleaseAttachment(attachment))
13601 return false;
13602
13603 return GetInventory().AreChildrenAccessible();
13604 }
13605
13606
13607
13608
13609
13610
13611
13612
13613
13614
13615
13616
13617
13618
13619
13620
13621
13622
13623
13624
13625
13627 {
13628 int id = muzzle_owner.GetMuzzleID();
13629 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13630
13631 if (WPOF_array)
13632 {
13633 for (int i = 0; i < WPOF_array.Count(); i++)
13634 {
13635 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13636
13637 if (WPOF)
13638 {
13639 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13640 }
13641 }
13642 }
13643 }
13644
13645
13647 {
13648 int id = muzzle_owner.GetMuzzleID();
13650
13651 if (WPOBE_array)
13652 {
13653 for (int i = 0; i < WPOBE_array.Count(); i++)
13654 {
13655 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13656
13657 if (WPOBE)
13658 {
13659 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13660 }
13661 }
13662 }
13663 }
13664
13665
13667 {
13668 int id = muzzle_owner.GetMuzzleID();
13669 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13670
13671 if (WPOOH_array)
13672 {
13673 for (int i = 0; i < WPOOH_array.Count(); i++)
13674 {
13675 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13676
13677 if (WPOOH)
13678 {
13679 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13680 }
13681 }
13682 }
13683 }
13684
13685
13687 {
13688 int id = muzzle_owner.GetMuzzleID();
13689 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13690
13691 if (WPOOH_array)
13692 {
13693 for (int i = 0; i < WPOOH_array.Count(); i++)
13694 {
13695 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13696
13697 if (WPOOH)
13698 {
13699 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13700 }
13701 }
13702 }
13703 }
13704
13705
13707 {
13708 int id = muzzle_owner.GetMuzzleID();
13709 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13710
13711 if (WPOOH_array)
13712 {
13713 for (int i = 0; i < WPOOH_array.Count(); i++)
13714 {
13715 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13716
13717 if (WPOOH)
13718 {
13719 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13720 }
13721 }
13722 }
13723 }
13724
13725
13726
13728 {
13730 {
13731 return true;
13732 }
13733
13734 return false;
13735 }
13736
13738 {
13740 {
13741 return true;
13742 }
13743
13744 return false;
13745 }
13746
13748 {
13750 {
13751 return true;
13752 }
13753
13754 return false;
13755 }
13756
13758 {
13759 return false;
13760 }
13761
13764 {
13765 return UATimeSpent.DEFAULT_DEPLOY;
13766 }
13767
13768
13769
13770
13772 {
13774 SetSynchDirty();
13775 }
13776
13778 {
13780 }
13781
13782
13784 {
13785 return false;
13786 }
13787
13790 {
13791 string att_type = "None";
13792
13793 if (ConfigIsExisting("soundAttType"))
13794 {
13795 att_type = ConfigGetString("soundAttType");
13796 }
13797
13799 }
13800
13802 {
13804 }
13805
13806
13807
13808
13809
13815
13817 {
13820
13822 }
13823
13824
13826 {
13828 return;
13829
13831
13834
13837
13838 SoundParameters params = new SoundParameters();
13842 }
13843
13844
13846 {
13848 {
13851
13852 SetSynchDirty();
13853
13856 }
13857 }
13858
13860 {
13862 }
13863
13864
13866 {
13868 return;
13869
13871 SetSynchDirty();
13872
13875 }
13876
13878 {
13881 }
13882
13884 {
13886 }
13887
13888 void OnApply(PlayerBase player);
13889
13891 {
13892 return 1.0;
13893 };
13894
13896 {
13898 }
13899
13901 {
13903 }
13904
13906
13908 {
13909 SetDynamicPhysicsLifeTime(0.01);
13911 }
13912
13914 {
13915 array<string> zone_names = new array<string>;
13916 GetDamageZones(zone_names);
13917 for (int i = 0; i < zone_names.Count(); i++)
13918 {
13919 SetHealthMax(zone_names.Get(i),"Health");
13920 }
13921 SetHealthMax("","Health");
13922 }
13923
13926 {
13927 float global_health = GetHealth01("","Health");
13928 array<string> zones = new array<string>;
13929 GetDamageZones(zones);
13930
13931 for (int i = 0; i < zones.Count(); i++)
13932 {
13933 SetHealth01(zones.Get(i),"Health",global_health);
13934 }
13935 }
13936
13939 {
13940 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13941 }
13942
13944 {
13945 if (!hasRootAsPlayer)
13946 {
13947 if (refParentIB)
13948 {
13949
13950 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13951 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13952
13953 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13954 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13955
13958 }
13959 else
13960 {
13961
13964 }
13965 }
13966 }
13967
13969 {
13971 {
13972 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13973 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13974 {
13975 float heatPermCoef = 1.0;
13977 while (ent)
13978 {
13979 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13980 ent = ent.GetHierarchyParent();
13981 }
13982
13983 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13984 }
13985 }
13986 }
13987
13989 {
13990
13991 EntityAI parent = GetHierarchyParent();
13992 if (!parent)
13993 {
13994 hasParent = false;
13995 hasRootAsPlayer = false;
13996 }
13997 else
13998 {
13999 hasParent = true;
14000 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14001 refParentIB =
ItemBase.Cast(parent);
14002 }
14003 }
14004
14005 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14006 {
14007
14008 }
14009
14011 {
14012
14013 return false;
14014 }
14015
14017 {
14018
14019
14020 return false;
14021 }
14022
14024 {
14025
14026 return false;
14027 }
14028
14031 {
14032 return !GetIsFrozen() &&
IsOpen();
14033 }
14034
14036 {
14037 bool hasParent = false, hasRootAsPlayer = false;
14039
14040 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14041 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14042
14043 if (wwtu || foodDecay)
14044 {
14048
14049 if (processWetness || processTemperature || processDecay)
14050 {
14052
14053 if (processWetness)
14054 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14055
14056 if (processTemperature)
14058
14059 if (processDecay)
14060 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14061 }
14062 }
14063 }
14064
14067 {
14069 }
14070
14072 {
14075
14076 return super.GetTemperatureFreezeThreshold();
14077 }
14078
14080 {
14083
14084 return super.GetTemperatureThawThreshold();
14085 }
14086
14088 {
14091
14092 return super.GetItemOverheatThreshold();
14093 }
14094
14096 {
14098 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14099
14100 return super.GetTemperatureFreezeTime();
14101 }
14102
14104 {
14106 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14107
14108 return super.GetTemperatureThawTime();
14109 }
14110
14115
14117 {
14118 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14119 }
14120
14122 {
14123 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14124 }
14125
14128 {
14130 }
14131
14133 {
14135 }
14136
14138 {
14140 }
14141
14144 {
14145 return null;
14146 }
14147
14150 {
14151 return false;
14152 }
14153
14155 {
14157 {
14160 if (!trg)
14161 {
14163 explosive = this;
14164 }
14165
14166 explosive.PairRemote(trg);
14168
14169 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14170 trg.SetPersistentPairID(persistentID);
14171 explosive.SetPersistentPairID(persistentID);
14172
14173 return true;
14174 }
14175 return false;
14176 }
14177
14180 {
14181 float ret = 1.0;
14184 ret *= GetHealth01();
14185
14186 return ret;
14187 }
14188
14189 #ifdef DEVELOPER
14190 override void SetDebugItem()
14191 {
14192 super.SetDebugItem();
14193 _itemBase = this;
14194 }
14195
14197 {
14198 string text = super.GetDebugText();
14199
14201 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14202
14203 return text;
14204 }
14205 #endif
14206
14208 {
14209 return true;
14210 }
14211
14213
14215
14217 {
14220 }
14221
14222
14230
14246
14247 [
Obsolete(
"Use ItemSoundHandler instead")]
14250 {
14251 if (!
g_Game.IsDedicatedServer())
14252 {
14253 if (ConfigIsExisting("attachSoundSet"))
14254 {
14255 string cfg_path = "";
14256 string soundset = "";
14257 string type_name =
GetType();
14258
14261 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14262 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14263
14264 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14265 {
14266 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14267 {
14268 if (cfg_slot_array[i] == slot_type)
14269 {
14270 soundset = cfg_soundset_array[i];
14271 break;
14272 }
14273 }
14274 }
14275
14276 if (soundset != "")
14277 {
14278 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14280 }
14281 }
14282 }
14283 }
14284
14286}
14287
14289{
14291 if (entity)
14292 {
14293 bool is_item = entity.IsInherited(
ItemBase);
14294 if (is_item && full_quantity)
14295 {
14298 }
14299 }
14300 else
14301 {
14303 return NULL;
14304 }
14305 return entity;
14306}
14307
14309{
14310 if (item)
14311 {
14312 if (health > 0)
14313 item.SetHealth("", "", health);
14314
14315 if (item.CanHaveTemperature())
14316 {
14318 if (item.CanFreeze())
14319 item.SetFrozen(false);
14320 }
14321
14322 if (item.HasEnergyManager())
14323 {
14324 if (quantity >= 0)
14325 {
14326 item.GetCompEM().SetEnergy0To1(quantity);
14327 }
14328 else
14329 {
14331 }
14332 }
14333 else if (item.IsMagazine())
14334 {
14335 Magazine mag = Magazine.Cast(item);
14336 if (quantity >= 0)
14337 {
14338 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14339 }
14340 else
14341 {
14343 }
14344
14345 }
14346 else
14347 {
14348 if (quantity >= 0)
14349 {
14350 item.SetQuantityNormalized(quantity, false);
14351 }
14352 else
14353 {
14355 }
14356
14357 }
14358 }
14359}
14360
14361#ifdef DEVELOPER
14363#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.