9408{
9410 {
9411 return true;
9412 }
9413};
9414
9416{
9417
9418};
9419
9420
9421
9423{
9427
9429
9432
9433
9434
9435
9436
9445
9451
9456
9461
9482 protected bool m_IsResultOfSplit
9483
9485
9490
9491
9492
9494
9498
9499
9500
9502
9505
9506
9507
9513
9514
9522
9525
9526
9528
9529
9531
9532
9537
9538
9543
9545
9546
9548
9549
9551 {
9556
9557 if (!
g_Game.IsDedicatedServer())
9558 {
9560 {
9562
9564 {
9566 }
9567 }
9568
9571 }
9572
9573 m_OldLocation = null;
9574
9576 {
9578 }
9579
9580 if (ConfigIsExisting("headSelectionsToHide"))
9581 {
9584 }
9585
9587 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9588 {
9590 }
9591
9593
9594 m_IsResultOfSplit = false;
9595
9597 }
9598
9600 {
9601 super.InitItemVariables();
9602
9608 m_Count = ConfigGetInt(
"count");
9609
9612
9617
9620
9625
9637
9641
9642
9645 if (ConfigIsExisting("canBeSplit"))
9646 {
9649 }
9650
9652 if (ConfigIsExisting("itemBehaviour"))
9654
9655
9658 RegisterNetSyncVariableInt("m_VarLiquidType");
9659 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9660
9661 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9662 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9663 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9664
9665 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9666 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9667 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9668 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9669
9670 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9671 RegisterNetSyncVariableBool("m_IsTakeable");
9672 RegisterNetSyncVariableBool("m_IsHologram");
9673
9676 {
9679 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9680 }
9681
9683
9685 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9687
9689 }
9690
9692 {
9694 }
9695
9697 {
9700 {
9705 }
9706 }
9707
9708 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9709 {
9711 {
9714 }
9715
9717 }
9718
9720 {
9726 }
9727
9729
9731 {
9733
9734 if (!action)
9735 {
9736 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9737 return;
9738 }
9739
9741 if (!ai)
9742 {
9744 return;
9745 }
9746
9748 if (!action_array)
9749 {
9750 action_array = new array<ActionBase_Basic>;
9752 }
9753 if (LogManager.IsActionLogEnable())
9754 {
9755 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9756 }
9757
9758 if (action_array.Find(action) != -1)
9759 {
9760 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9761 }
9762 else
9763 {
9764 action_array.Insert(action);
9765 }
9766 }
9767
9769 {
9770 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9771 ActionBase action = player.GetActionManager().GetAction(actionName);
9774
9775 if (action_array)
9776 {
9777 action_array.RemoveItem(action);
9778 }
9779 }
9780
9781
9782
9784 {
9785 ActionOverrideData overrideData = new ActionOverrideData();
9789
9791 if (!actionMap)
9792 {
9795 }
9796
9797 actionMap.Insert(this.
Type(), overrideData);
9798
9799 }
9800
9802
9804
9805
9807 {
9810
9813
9814 string config_to_search = "CfgVehicles";
9815 string muzzle_owner_config;
9816
9818 {
9819 if (IsInherited(Weapon))
9820 config_to_search = "CfgWeapons";
9821
9822 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9823
9824 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9825
9826 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9827
9828 if (config_OnFire_subclass_count > 0)
9829 {
9830 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9831
9832 for (int i = 0; i < config_OnFire_subclass_count; i++)
9833 {
9834 string particle_class = "";
9835 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9836 string config_OnFire_entry = config_OnFire_class + particle_class;
9837 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9838 WPOF_array.Insert(WPOF);
9839 }
9840
9841
9843 }
9844 }
9845
9847 {
9848 config_to_search = "CfgWeapons";
9849 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9850
9851 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9852
9853 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9854
9855 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9856 {
9857 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9858
9859 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9860 {
9861 string particle_class2 = "";
9862 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9863 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9864 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9865 WPOBE_array.Insert(WPOBE);
9866 }
9867
9868
9870 }
9871 }
9872 }
9873
9874
9876 {
9879
9881 {
9882 string config_to_search = "CfgVehicles";
9883
9884 if (IsInherited(Weapon))
9885 config_to_search = "CfgWeapons";
9886
9887 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9888 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9889
9890 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9891 {
9892
9894
9896 {
9898 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9900 return;
9901 }
9902
9905
9906
9907
9908 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9909 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9910
9911 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9912 {
9913 string particle_class = "";
9914 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9915 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9916 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9917
9918 if (entry_type == CT_CLASS)
9919 {
9920 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9921 WPOOH_array.Insert(WPOF);
9922 }
9923 }
9924
9925
9927 }
9928 }
9929 }
9930
9932 {
9934 }
9935
9937 {
9939 {
9941
9944
9947
9948 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9949 }
9950 }
9951
9953 {
9955 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9956
9958 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9959
9961 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9962
9964 {
9966 }
9967 }
9968
9970 {
9972 }
9973
9975 {
9978 else
9980
9982 {
9985 }
9986 else
9987 {
9990
9993 }
9994
9996 }
9997
9999 {
10001 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10002 }
10003
10005 {
10007 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10009 }
10010
10012 {
10014 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10015 }
10016
10018 {
10021
10022 OverheatingParticle OP = new OverheatingParticle();
10027
10029 }
10030
10032 {
10035
10036 return -1;
10037 }
10038
10040 {
10042 {
10045
10046 for (int i = count; i > 0; --i)
10047 {
10048 int id = i - 1;
10051
10054
10055 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10056 {
10057 if (p)
10058 {
10061 }
10062 }
10063 }
10064 }
10065 }
10066
10068 {
10070 {
10072 {
10073 int id = i - 1;
10075
10076 if (OP)
10077 {
10079
10080 if (p)
10081 {
10083 }
10084
10085 delete OP;
10086 }
10087 }
10088
10091 }
10092 }
10093
10096 {
10097 return 0.0;
10098 }
10099
10100
10102 {
10103 return 250;
10104 }
10105
10107 {
10108 return 0;
10109 }
10110
10113 {
10115 return true;
10116
10117 return false;
10118 }
10119
10122 {
10125
10127 {
10129 }
10130 else
10131 {
10132
10134 }
10135
10137 }
10138
10145 {
10146 return -1;
10147 }
10148
10149
10150
10151
10153 {
10155 {
10156 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10157 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10158
10159 if (r_index >= 0)
10160 {
10161 InventoryLocation r_il = new InventoryLocation;
10162 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10163
10164 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10167 {
10168 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10169 }
10171 {
10172 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10173 }
10174
10175 }
10176
10177 player.GetHumanInventory().ClearUserReservedLocation(this);
10178 }
10179
10182 }
10183
10184
10185
10186
10188 {
10189 return ItemBase.m_DebugActionsMask;
10190 }
10191
10193 {
10194 return ItemBase.m_DebugActionsMask & mask;
10195 }
10196
10198 {
10199 ItemBase.m_DebugActionsMask = mask;
10200 }
10201
10203 {
10204 ItemBase.m_DebugActionsMask |= mask;
10205 }
10206
10208 {
10209 ItemBase.m_DebugActionsMask &= ~mask;
10210 }
10211
10213 {
10215 {
10217 }
10218 else
10219 {
10221 }
10222 }
10223
10224
10226 {
10227 if (GetEconomyProfile())
10228 {
10229 float q_max = GetEconomyProfile().GetQuantityMax();
10230 if (q_max > 0)
10231 {
10232 float q_min = GetEconomyProfile().GetQuantityMin();
10233 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10234
10236 {
10237 ComponentEnergyManager comp = GetCompEM();
10239 {
10241 }
10242 }
10244 {
10246
10247 }
10248
10249 }
10250 }
10251 }
10252
10255 {
10256 EntityAI parent = GetHierarchyParent();
10257
10258 if (parent)
10259 {
10260 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10261 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10262 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10263 }
10264 }
10265
10268 {
10269 EntityAI parent = GetHierarchyParent();
10270
10271 if (parent)
10272 {
10273 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10274 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10275 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10276 }
10277 }
10278
10280 {
10281
10282
10283
10284
10286
10288 {
10289 if (ScriptInputUserData.CanStoreInputUserData())
10290 {
10291 ScriptInputUserData ctx = new ScriptInputUserData;
10297 ctx.
Write(use_stack_max);
10300
10302 {
10303 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10304 }
10305 }
10306 }
10307 else if (!
g_Game.IsMultiplayer())
10308 {
10310 }
10311 }
10312
10314 {
10316 }
10317
10319 {
10321 }
10322
10324 {
10326 }
10327
10329 {
10330
10331 return false;
10332 }
10333
10335 {
10336 return false;
10337 }
10338
10342 {
10343 return false;
10344 }
10345
10347 {
10348 return "";
10349 }
10350
10352
10354 {
10355 return false;
10356 }
10357
10359 {
10360 return true;
10361 }
10362
10363
10364
10366 {
10367 return true;
10368 }
10369
10371 {
10372 return true;
10373 }
10374
10376 {
10377 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10379 }
10380
10382 {
10384 }
10385
10387 {
10389 if (!is_being_placed)
10391 SetSynchDirty();
10392 }
10393
10394
10396
10398 {
10400 }
10401
10403 {
10405 }
10406
10408 {
10409 return 1;
10410 }
10411
10413 {
10414 return false;
10415 }
10416
10418 {
10420 SetSynchDirty();
10421 }
10422
10423
10424
10425
10426
10427
10428
10429
10430
10431
10432
10433
10434
10435
10436
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10458 {
10459 super.OnMovedInsideCargo(container);
10460
10461 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10462 }
10463
10464 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10465 {
10466 super.EEItemLocationChanged(oldLoc, newLoc);
10467
10468 PlayerBase newPlayer = null;
10469 PlayerBase oldPlayer = null;
10470
10471 if (newLoc.GetParent())
10472 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10473
10474 if (oldLoc.GetParent())
10475 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10476
10478 {
10479 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10480
10481 if (rIndex >= 0)
10482 {
10483 InventoryLocation rIl = new InventoryLocation;
10484 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10485
10486 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10489 {
10490 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10491 }
10493 {
10495 }
10496
10497 }
10498 }
10499
10501 {
10502 if (newPlayer)
10503 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10504
10505 if (newPlayer == oldPlayer)
10506 {
10507 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10508 {
10510 {
10511 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10512 {
10513 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10514 }
10515 }
10516 else
10517 {
10518 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10519 }
10520 }
10521
10522 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10523 {
10524 int type = oldLoc.GetType();
10526 {
10527 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10528 }
10530 {
10531 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10532 }
10533 }
10534 if (!m_OldLocation)
10535 {
10536 m_OldLocation = new InventoryLocation;
10537 }
10538 m_OldLocation.Copy(oldLoc);
10539 }
10540 else
10541 {
10542 if (m_OldLocation)
10543 {
10544 m_OldLocation.Reset();
10545 }
10546 }
10547
10548 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10549 }
10550 else
10551 {
10552 if (newPlayer)
10553 {
10554 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10555 if (resIndex >= 0)
10556 {
10557 InventoryLocation il = new InventoryLocation;
10558 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10560 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10563 {
10564 il.
GetParent().GetOnReleaseLock().Invoke(it);
10565 }
10567 {
10569 }
10570
10571 }
10572 }
10574 {
10575
10577 }
10578
10579 if (m_OldLocation)
10580 {
10581 m_OldLocation.Reset();
10582 }
10583 }
10584
10586 {
10587 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10588 }
10589
10591 {
10592 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10593 }
10594 }
10595
10596 override void EOnContact(IEntity other, Contact extra)
10597 {
10599 {
10600 int liquidType = -1;
10602 if (impactSpeed > 0.0)
10603 {
10605 #ifndef SERVER
10607 #else
10609 SetSynchDirty();
10610 #endif
10612 }
10613 }
10614
10615 #ifdef SERVER
10616 if (GetCompEM() && GetCompEM().IsPlugged())
10617 {
10618 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10619 GetCompEM().UnplugThis();
10620 }
10621 #endif
10622 }
10623
10625
10627 {
10629 }
10630
10632 {
10633
10634 }
10635
10637 {
10638 super.OnItemLocationChanged(old_owner, new_owner);
10639
10640 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10641 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10642
10643 if (!relatedPlayer && playerNew)
10644 relatedPlayer = playerNew;
10645
10646 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10647 {
10649 if (actionMgr)
10650 {
10651 ActionBase currentAction = actionMgr.GetRunningAction();
10652 if (currentAction)
10654 }
10655 }
10656
10657 Man ownerPlayerOld = null;
10658 Man ownerPlayerNew = null;
10659
10660 if (old_owner)
10661 {
10662 if (old_owner.
IsMan())
10663 {
10664 ownerPlayerOld = Man.Cast(old_owner);
10665 }
10666 else
10667 {
10668 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10669 }
10670 }
10671 else
10672 {
10674 {
10676
10677 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10678 {
10679 GetCompEM().UnplugThis();
10680 }
10681 }
10682 }
10683
10684 if (new_owner)
10685 {
10686 if (new_owner.
IsMan())
10687 {
10688 ownerPlayerNew = Man.Cast(new_owner);
10689 }
10690 else
10691 {
10692 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10693 }
10694 }
10695
10696 if (ownerPlayerOld != ownerPlayerNew)
10697 {
10698 if (ownerPlayerOld)
10699 {
10700 array<EntityAI> subItemsExit = new array<EntityAI>;
10702 for (int i = 0; i < subItemsExit.Count(); i++)
10703 {
10706 }
10707 }
10708
10709 if (ownerPlayerNew)
10710 {
10711 array<EntityAI> subItemsEnter = new array<EntityAI>;
10713 for (int j = 0; j < subItemsEnter.Count(); j++)
10714 {
10717 }
10718 }
10719 }
10720 else if (ownerPlayerNew != null)
10721 {
10722 PlayerBase nplayer;
10723 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10724 {
10725 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10727 for (int k = 0; k < subItemsUpdate.Count(); k++)
10728 {
10730 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10731 }
10732 }
10733 }
10734
10735 if (old_owner)
10736 old_owner.OnChildItemRemoved(this);
10737 if (new_owner)
10738 new_owner.OnChildItemReceived(this);
10739 }
10740
10741
10743 {
10744 super.EEDelete(parent);
10745 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10746 if (player)
10747 {
10749
10750 if (player.IsAlive())
10751 {
10752 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10753 if (r_index >= 0)
10754 {
10755 InventoryLocation r_il = new InventoryLocation;
10756 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10757
10758 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10761 {
10762 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10763 }
10765 {
10766 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10767 }
10768
10769 }
10770
10771 player.RemoveQuickBarEntityShortcut(this);
10772 }
10773 }
10774 }
10775
10777 {
10778 super.EEKilled(killer);
10779
10782 {
10783 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10784 {
10785 if (IsMagazine())
10786 {
10787 if (Magazine.Cast(this).GetAmmoCount() > 0)
10788 {
10790 }
10791 }
10792 else
10793 {
10795 }
10796 }
10797 }
10798 }
10799
10801 {
10802 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10803
10804 super.OnWasAttached(parent, slot_id);
10805
10808
10811 }
10812
10814 {
10815 super.OnWasDetached(parent, slot_id);
10816
10819
10822 }
10823
10825 {
10826 int idx;
10829
10830 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10831 if (inventory_slots.Count() < 1)
10832 {
10833 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10834 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10835 }
10836 else
10837 {
10838 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10839 }
10840
10841 idx = inventory_slots.Find(slot);
10842 if (idx < 0)
10843 return "";
10844
10845 return attach_types.Get(idx);
10846 }
10847
10849 {
10850 int idx = -1;
10851 string slot;
10852
10855
10856 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10857 if (inventory_slots.Count() < 1)
10858 {
10859 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10860 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10861 }
10862 else
10863 {
10864 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10865 if (detach_types.Count() < 1)
10866 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10867 }
10868
10869 for (int i = 0; i < inventory_slots.Count(); i++)
10870 {
10871 slot = inventory_slots.Get(i);
10872 }
10873
10874 if (slot != "")
10875 {
10876 if (detach_types.Count() == 1)
10877 idx = 0;
10878 else
10879 idx = inventory_slots.Find(slot);
10880 }
10881 if (idx < 0)
10882 return "";
10883
10884 return detach_types.Get(idx);
10885 }
10886
10888 {
10889
10891
10892
10893 float min_time = 1;
10894 float max_time = 3;
10895 float delay = Math.RandomFloat(min_time, max_time);
10896
10897 explode_timer.Run(delay, this, "DoAmmoExplosion");
10898 }
10899
10901 {
10902 Magazine magazine = Magazine.Cast(this);
10903 int pop_sounds_count = 6;
10904 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10905
10906
10907 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10908 string sound_name = pop_sounds[ sound_idx ];
10909 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10910
10911
10912 magazine.ServerAddAmmoCount(-1);
10913
10914
10915 float min_temp_to_explode = 100;
10916
10917 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10918 {
10920 }
10921 }
10922
10923
10924 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10925 {
10926 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10927
10928 const int CHANCE_DAMAGE_CARGO = 4;
10929 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10930 const int CHANCE_DAMAGE_NOTHING = 2;
10931
10933 {
10934 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10935 int chances;
10936 int rnd;
10937
10938 if (GetInventory().GetCargo())
10939 {
10940 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10941 rnd = Math.RandomInt(0,chances);
10942
10943 if (rnd < CHANCE_DAMAGE_CARGO)
10944 {
10946 }
10947 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10948 {
10950 }
10951 }
10952 else
10953 {
10954 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10955 rnd = Math.RandomInt(0,chances);
10956
10957 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10958 {
10960 }
10961 }
10962 }
10963 }
10964
10966 {
10967 CargoBase cargo = GetInventory().GetCargo();
10968 if (cargo)
10969 {
10971 if (item_count > 0)
10972 {
10973 int random_pick = Math.RandomInt(0, item_count);
10975 if (!item.IsExplosive())
10976 {
10977 item.AddHealth("","",damage);
10978 return true;
10979 }
10980 }
10981 }
10982 return false;
10983 }
10984
10986 {
10987 GameInventory inventory = GetInventory();
10989 if (attachment_count > 0)
10990 {
10991 int random_pick = Math.RandomInt(0, attachment_count);
10993 if (!attachment.IsExplosive())
10994 {
10995 attachment.AddHealth("","",damage);
10996 return true;
10997 }
10998 }
10999 return false;
11000 }
11001
11003 {
11005 }
11006
11008 {
11010 return GetInventory().CanRemoveEntity();
11011
11012 return false;
11013 }
11014
11016 {
11017
11019 return false;
11020
11021
11023 return false;
11024
11025
11026
11028 if (delta == 0)
11029 return false;
11030
11031
11032 return true;
11033 }
11034
11036 {
11038 {
11039 if (ScriptInputUserData.CanStoreInputUserData())
11040 {
11041 ScriptInputUserData ctx = new ScriptInputUserData;
11046 ctx.
Write(destination_entity);
11048 ctx.
Write(slot_id);
11050 }
11051 }
11052 else if (!
g_Game.IsMultiplayer())
11053 {
11055 }
11056 }
11057
11059 {
11060 float split_quantity_new;
11064 InventoryLocation loc = new InventoryLocation;
11065
11066 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11067 {
11069 split_quantity_new = stack_max;
11070 else
11072
11074 {
11075 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
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 if (destination_entity && slot_id == -1)
11086 {
11087 if (quantity > stack_max)
11088 split_quantity_new = stack_max;
11089 else
11090 split_quantity_new = quantity;
11091
11093 {
11094 GameInventory destinationInventory = destination_entity.GetInventory();
11096 {
11099 }
11100
11101 if (new_item)
11102 {
11103 new_item.SetResultOfSplit(true);
11104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11106 new_item.
SetQuantity(split_quantity_new,
false,
true);
11107 }
11108 }
11109 }
11110 else
11111 {
11112 if (stack_max != 0)
11113 {
11115 {
11117 }
11118
11119 if (split_quantity_new == 0)
11120 {
11121 if (!
g_Game.IsMultiplayer())
11122 player.PhysicalPredictiveDropItem(this);
11123 else
11124 player.ServerDropEntity(this);
11125 return;
11126 }
11127
11129 {
11131
11132 if (new_item)
11133 {
11134 new_item.SetResultOfSplit(true);
11135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11138 new_item.PlaceOnSurface();
11139 }
11140 }
11141 }
11142 }
11143 }
11144
11146 {
11147 float split_quantity_new;
11151 InventoryLocation loc = new InventoryLocation;
11152
11153 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11154 {
11156 split_quantity_new = stack_max;
11157 else
11159
11161 {
11162 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
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 if (destination_entity && slot_id == -1)
11173 {
11174 if (quantity > stack_max)
11175 split_quantity_new = stack_max;
11176 else
11177 split_quantity_new = quantity;
11178
11180 {
11181 GameInventory destinationInventory = destination_entity.GetInventory();
11183 {
11186 }
11187
11188 if (new_item)
11189 {
11190 new_item.SetResultOfSplit(true);
11191 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11193 new_item.
SetQuantity(split_quantity_new,
false,
true);
11194 }
11195 }
11196 }
11197 else
11198 {
11199 if (stack_max != 0)
11200 {
11202 {
11204 }
11205
11207 {
11209
11210 if (new_item)
11211 {
11212 new_item.SetResultOfSplit(true);
11213 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11216 new_item.PlaceOnSurface();
11217 }
11218 }
11219 }
11220 }
11221 }
11222
11224 {
11226 {
11227 if (ScriptInputUserData.CanStoreInputUserData())
11228 {
11229 ScriptInputUserData ctx = new ScriptInputUserData;
11234 dst.WriteToContext(ctx);
11236 }
11237 }
11238 else if (!
g_Game.IsMultiplayer())
11239 {
11241 }
11242 }
11243
11245 {
11247 {
11248 if (ScriptInputUserData.CanStoreInputUserData())
11249 {
11250 ScriptInputUserData ctx = new ScriptInputUserData;
11255 ctx.
Write(destination_entity);
11261 }
11262 }
11263 else if (!
g_Game.IsMultiplayer())
11264 {
11266 }
11267 }
11268
11270 {
11272 }
11273
11275 {
11277 float split_quantity_new;
11279 if (dst.IsValid())
11280 {
11281 int slot_id = dst.GetSlot();
11283
11284 if (quantity > stack_max)
11285 split_quantity_new = stack_max;
11286 else
11287 split_quantity_new = quantity;
11288
11290 {
11292
11293 if (new_item)
11294 {
11295 new_item.SetResultOfSplit(true);
11296 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11298 new_item.
SetQuantity(split_quantity_new,
false,
true);
11299 }
11300
11301 return new_item;
11302 }
11303 }
11304
11305 return null;
11306 }
11307
11309 {
11311 float split_quantity_new;
11313 if (destination_entity)
11314 {
11316 if (quantity > stackable)
11317 split_quantity_new = stackable;
11318 else
11319 split_quantity_new = quantity;
11320
11322 {
11323 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11324 if (new_item)
11325 {
11326 new_item.SetResultOfSplit(true);
11327 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11329 new_item.
SetQuantity(split_quantity_new,
false,
true);
11330 }
11331 }
11332 }
11333 }
11334
11336 {
11338 {
11339 if (ScriptInputUserData.CanStoreInputUserData())
11340 {
11341 ScriptInputUserData ctx = new ScriptInputUserData;
11346 ItemBase destination_entity =
this;
11347 ctx.
Write(destination_entity);
11351 }
11352 }
11353 else if (!
g_Game.IsMultiplayer())
11354 {
11356 }
11357 }
11358
11360 {
11362 float split_quantity_new;
11364 if (player)
11365 {
11367 if (quantity > stackable)
11368 split_quantity_new = stackable;
11369 else
11370 split_quantity_new = quantity;
11371
11373 {
11374 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11375 new_item =
ItemBase.Cast(in_hands);
11376 if (new_item)
11377 {
11378 new_item.SetResultOfSplit(true);
11379 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11381 new_item.SetQuantity(split_quantity_new, false, true);
11382 }
11383 }
11384 }
11385 }
11386
11388 {
11390 float split_quantity_new = Math.Floor(quantity * 0.5);
11391
11393 return;
11394
11396
11397 if (new_item)
11398 {
11399 if (new_item.GetQuantityMax() < split_quantity_new)
11400 {
11401 split_quantity_new = new_item.GetQuantityMax();
11402 }
11403
11404 new_item.SetResultOfSplit(true);
11405 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11406
11408 {
11411 }
11412 else
11413 {
11415 new_item.
SetQuantity(split_quantity_new,
false,
true);
11416 }
11417 }
11418 }
11419
11421 {
11423 float split_quantity_new = Math.Floor(quantity / 2);
11424
11426 return;
11427
11428 InventoryLocation invloc = new InventoryLocation;
11430
11432 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11433
11434 if (new_item)
11435 {
11436 if (new_item.GetQuantityMax() < split_quantity_new)
11437 {
11438 split_quantity_new = new_item.GetQuantityMax();
11439 }
11441 {
11444 }
11445 else if (split_quantity_new > 1)
11446 {
11448 new_item.
SetQuantity(split_quantity_new,
false,
true);
11449 }
11450 }
11451 }
11452
11455 {
11456 SetWeightDirty();
11458
11459 if (parent)
11460 parent.OnAttachmentQuantityChangedEx(this, delta);
11461
11463 {
11465 {
11467 }
11469 {
11470 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11472 }
11473 }
11474 }
11475
11478 {
11479
11480 }
11481
11484 {
11486 }
11487
11489 {
11490 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11491
11493 {
11494 if (newLevel == GameConstants.STATE_RUINED)
11495 {
11497 EntityAI parent = GetHierarchyParent();
11498 if (parent && parent.IsFireplace())
11499 {
11500 CargoBase cargo = GetInventory().GetCargo();
11501 if (cargo)
11502 {
11504 {
11506 }
11507 }
11508 }
11509 }
11510
11512 {
11513
11515 return;
11516 }
11517
11518 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11519 {
11521 }
11522 }
11523 }
11524
11525
11527 {
11528 super.OnRightClick();
11529
11531 {
11533 {
11534 if (ScriptInputUserData.CanStoreInputUserData())
11535 {
11536 EntityAI root = GetHierarchyRoot();
11537 Man playerOwner = GetHierarchyRootPlayer();
11538 InventoryLocation dst = new InventoryLocation;
11539
11540
11541 if (!playerOwner && root && root == this)
11542 {
11544 }
11545 else
11546 {
11547
11548 GetInventory().GetCurrentInventoryLocation(dst);
11550 {
11551 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11553 {
11555 }
11556 else
11557 {
11559
11560
11561 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11562 {
11564 }
11565 else
11566 {
11567 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11568 }
11569 }
11570 }
11571 }
11572
11573 ScriptInputUserData ctx = new ScriptInputUserData;
11581 }
11582 }
11583 else if (!
g_Game.IsMultiplayer())
11584 {
11586 }
11587 }
11588 }
11589
11591 {
11592 if (root)
11593 {
11594 vector m4[4];
11595 root.GetTransform(m4);
11596 dst.SetGround(this, m4);
11597 }
11598 else
11599 {
11600 GetInventory().GetCurrentInventoryLocation(dst);
11601 }
11602 }
11603
11604 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11605 {
11606
11607 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11608 return false;
11609
11610 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11611 return false;
11612
11613
11615 return false;
11616
11617
11618 Magazine mag = Magazine.Cast(this);
11619 if (mag)
11620 {
11621 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11622 return false;
11623
11624 if (stack_max_limit)
11625 {
11626 Magazine other_mag = Magazine.Cast(other_item);
11627 if (other_item)
11628 {
11629 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11630 return false;
11631 }
11632
11633 }
11634 }
11635 else
11636 {
11637
11639 return false;
11640
11642 return false;
11643 }
11644
11645 PlayerBase player = null;
11646 if (CastTo(player, GetHierarchyRootPlayer()))
11647 {
11648 if (player.GetInventory().HasAttachment(this))
11649 return false;
11650
11651 if (player.IsItemsToDelete())
11652 return false;
11653 }
11654
11655 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11656 return false;
11657
11658 int slotID;
11660 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11661 return false;
11662
11663 return true;
11664 }
11665
11667 {
11669 }
11670
11672 {
11673 return m_IsResultOfSplit;
11674 }
11675
11677 {
11678 m_IsResultOfSplit = value;
11679 }
11680
11682 {
11684 }
11685
11687 {
11688 float other_item_quantity = other_item.GetQuantity();
11689 float this_free_space;
11690
11692
11694
11695 if (other_item_quantity > this_free_space)
11696 {
11697 return this_free_space;
11698 }
11699 else
11700 {
11701 return other_item_quantity;
11702 }
11703 }
11704
11706 {
11708 }
11709
11711 {
11713 return;
11714
11715 if (!IsMagazine() && other_item)
11716 {
11718 if (quantity_used != 0)
11719 {
11720 float hp1 = GetHealth01("","");
11721 float hp2 = other_item.GetHealth01("","");
11722 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11723 hpResult = hpResult / (
GetQuantity() + quantity_used);
11724
11725 hpResult *= GetMaxHealth();
11726 Math.Round(hpResult);
11727 SetHealth("", "Health", hpResult);
11728
11730 other_item.AddQuantity(-quantity_used);
11731 }
11732 }
11734 }
11735
11737 {
11738 #ifdef SERVER
11739 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11740 GetHierarchyParent().IncreaseLifetimeUp();
11741 #endif
11742 };
11743
11745 {
11746 PlayerBase p = PlayerBase.Cast(player);
11747
11748 array<int> recipesIds = p.m_Recipes;
11749 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11750 if (moduleRecipesManager)
11751 {
11752 EntityAI itemInHands = player.GetEntityInHands();
11753 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11754 }
11755
11756 for (int i = 0;i < recipesIds.Count(); i++)
11757 {
11758 int key = recipesIds.Get(i);
11759 string recipeName = moduleRecipesManager.GetRecipeName(key);
11761 }
11762 }
11763
11764
11765 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11766 {
11767 super.GetDebugActions(outputList);
11768
11769
11775
11776
11781
11786
11787
11791
11792
11794 {
11798 }
11799
11802
11803
11807
11809
11810 InventoryLocation loc = new InventoryLocation();
11811 GetInventory().GetCurrentInventoryLocation(loc);
11813 {
11814 if (Gizmo_IsSupported())
11817 }
11818
11820 }
11821
11822
11823
11824
11826 {
11827 super.OnAction(action_id, player, ctx);
11828
11830 {
11831 switch (action_id)
11832 {
11836 return true;
11840 return true;
11841 }
11842 }
11843
11845 {
11846 switch (action_id)
11847 {
11849 Delete();
11850 return true;
11851 }
11852 }
11853
11854 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11855 {
11856 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11857 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11858 PlayerBase p = PlayerBase.Cast(player);
11859 if (
EActions.RECIPES_RANGE_START < 1000)
11860 {
11861 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11862 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11863 }
11864 }
11865 #ifndef SERVER
11866 else if (action_id ==
EActions.WATCH_PLAYER)
11867 {
11868 PluginDeveloper.SetDeveloperItemClientEx(player);
11869 }
11870 #endif
11872 {
11873 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11874 {
11875 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11876 OnDebugButtonPressServer(id + 1);
11877 }
11878
11879 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11880 {
11881 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11883 }
11884
11885 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11886 {
11887 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11889 }
11890
11891 else if (action_id ==
EActions.ADD_QUANTITY)
11892 {
11893 if (IsMagazine())
11894 {
11895 Magazine mag = Magazine.Cast(this);
11896 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11897 }
11898 else
11899 {
11901 }
11902
11903 if (m_EM)
11904 {
11905 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11906 }
11907
11908 }
11909
11910 else if (action_id ==
EActions.REMOVE_QUANTITY)
11911 {
11912 if (IsMagazine())
11913 {
11914 Magazine mag2 = Magazine.Cast(this);
11915 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11916 }
11917 else
11918 {
11920 }
11921 if (m_EM)
11922 {
11923 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11924 }
11925
11926 }
11927
11928 else if (action_id ==
EActions.SET_QUANTITY_0)
11929 {
11931
11932 if (m_EM)
11933 {
11934 m_EM.SetEnergy(0);
11935 }
11936 }
11937
11938 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11939 {
11941
11942 if (m_EM)
11943 {
11944 m_EM.SetEnergy(m_EM.GetEnergyMax());
11945 }
11946 }
11947
11948 else if (action_id ==
EActions.ADD_HEALTH)
11949 {
11950 AddHealth("","",GetMaxHealth("","Health")/5);
11951 }
11952 else if (action_id ==
EActions.REMOVE_HEALTH)
11953 {
11954 AddHealth("","",-GetMaxHealth("","Health")/5);
11955 }
11956 else if (action_id ==
EActions.DESTROY_HEALTH)
11957 {
11958 SetHealth01("","",0);
11959 }
11960 else if (action_id ==
EActions.WATCH_ITEM)
11961 {
11963 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11964 #ifdef DEVELOPER
11965 SetDebugDeveloper_item(this);
11966 #endif
11967 }
11968
11969 else if (action_id ==
EActions.ADD_TEMPERATURE)
11970 {
11971 AddTemperature(20);
11972
11973 }
11974
11975 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11976 {
11977 AddTemperature(-20);
11978
11979 }
11980
11981 else if (action_id ==
EActions.FLIP_FROZEN)
11982 {
11983 SetFrozen(!GetIsFrozen());
11984
11985 }
11986
11987 else if (action_id ==
EActions.ADD_WETNESS)
11988 {
11990
11991 }
11992
11993 else if (action_id ==
EActions.REMOVE_WETNESS)
11994 {
11996
11997 }
11998
11999 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12000 {
12003
12004
12005 }
12006
12007 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12008 {
12011 }
12012
12013 else if (action_id ==
EActions.MAKE_SPECIAL)
12014 {
12015 auto debugParams = DebugSpawnParams.WithPlayer(player);
12016 OnDebugSpawnEx(debugParams);
12017 }
12018
12019 }
12020
12021
12022 return false;
12023 }
12024
12025
12026
12027
12031
12034
12035
12036
12038 {
12039 return false;
12040 }
12041
12042
12044 {
12045 return true;
12046 }
12047
12048
12050 {
12051 return true;
12052 }
12053
12054
12055
12057 {
12058 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12059 return g_Game.ConfigIsExisting(config_path);
12060 }
12061
12064 {
12065 return null;
12066 }
12067
12069 {
12070 return false;
12071 }
12072
12074 {
12075 return false;
12076 }
12077
12081
12082
12084 {
12085 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12086 return module_repairing.CanRepair(this, item_repair_kit);
12087 }
12088
12089
12090 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12091 {
12092 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12093 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12094 }
12095
12096
12098 {
12099
12100
12101
12102
12103
12104
12105
12106
12107 return 1;
12108 }
12109
12110
12111
12113 {
12115 }
12116
12117
12118
12120 {
12122 }
12123
12124
12133 {
12134 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12135
12136 if (player)
12137 {
12138 player.MessageStatus(text);
12139 }
12140 }
12141
12142
12151 {
12152 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12153
12154 if (player)
12155 {
12156 player.MessageAction(text);
12157 }
12158 }
12159
12160
12169 {
12170 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12171
12172 if (player)
12173 {
12174 player.MessageFriendly(text);
12175 }
12176 }
12177
12178
12187 {
12188 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12189
12190 if (player)
12191 {
12192 player.MessageImportant(text);
12193 }
12194 }
12195
12197 {
12198 return true;
12199 }
12200
12201
12202 override bool KindOf(
string tag)
12203 {
12204 bool found = false;
12205 string item_name = this.
GetType();
12207 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12208
12209 int array_size = item_tag_array.Count();
12210 for (int i = 0; i < array_size; i++)
12211 {
12212 if (item_tag_array.Get(i) == tag)
12213 {
12214 found = true;
12215 break;
12216 }
12217 }
12218 return found;
12219 }
12220
12221
12223 {
12224
12225 super.OnRPC(sender, rpc_type,ctx);
12226
12227
12228 switch (rpc_type)
12229 {
12230 #ifndef SERVER
12231 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12232 Param2<bool, string> p = new Param2<bool, string>(false, "");
12233
12235 return;
12236
12237 bool play = p.param1;
12238 string soundSet = p.param2;
12239
12240 if (play)
12241 {
12243 {
12245 {
12247 }
12248 }
12249 else
12250 {
12252 }
12253 }
12254 else
12255 {
12257 }
12258
12259 break;
12260 #endif
12261
12262 }
12263
12265 {
12267 }
12268 }
12269
12270
12271
12272
12274 {
12275 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12276 return plugin.GetID(
name);
12277 }
12278
12280 {
12281 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12282 return plugin.GetName(id);
12283 }
12284
12287 {
12288
12289
12290 int varFlags;
12291 if (!ctx.
Read(varFlags))
12292 return;
12293
12294 if (varFlags & ItemVariableFlags.FLOAT)
12295 {
12297 }
12298 }
12299
12301 {
12302
12303 super.SerializeNumericalVars(floats_out);
12304
12305
12306
12308 {
12310 }
12311
12313 {
12315 }
12316
12318 {
12320 }
12321
12323 {
12328 }
12329
12331 {
12333 }
12334 }
12335
12337 {
12338
12339 super.DeSerializeNumericalVars(floats);
12340
12341
12342 int index = 0;
12343 int mask = Math.Round(floats.Get(index));
12344
12345 index++;
12346
12348 {
12350 {
12352 }
12353 else
12354 {
12355 float quantity = floats.Get(index);
12356 SetQuantity(quantity,
true,
false,
false,
false);
12357 }
12358 index++;
12359 }
12360
12362 {
12363 float wet = floats.Get(index);
12365 index++;
12366 }
12367
12369 {
12370 int liquidtype = Math.Round(floats.Get(index));
12372 index++;
12373 }
12374
12376 {
12378 index++;
12380 index++;
12382 index++;
12384 index++;
12385 }
12386
12388 {
12389 int cleanness = Math.Round(floats.Get(index));
12391 index++;
12392 }
12393 }
12394
12396 {
12397 super.WriteVarsToCTX(ctx);
12398
12399
12401 {
12403 }
12404
12406 {
12408 }
12409
12411 {
12413 }
12414
12416 {
12417 int r,g,b,a;
12423 }
12424
12426 {
12428 }
12429 }
12430
12432 {
12433 if (!super.ReadVarsFromCTX(ctx,version))
12434 return false;
12435
12436 int intValue;
12437 float value;
12438
12439 if (version < 140)
12440 {
12441 if (!ctx.
Read(intValue))
12442 return false;
12443
12444 m_VariablesMask = intValue;
12445 }
12446
12448 {
12449 if (!ctx.
Read(value))
12450 return false;
12451
12453 {
12455 }
12456 else
12457 {
12459 }
12460 }
12461
12462 if (version < 140)
12463 {
12465 {
12466 if (!ctx.
Read(value))
12467 return false;
12468 SetTemperatureDirect(value);
12469 }
12470 }
12471
12473 {
12474 if (!ctx.
Read(value))
12475 return false;
12477 }
12478
12480 {
12481 if (!ctx.
Read(intValue))
12482 return false;
12484 }
12485
12487 {
12488 int r,g,b,a;
12490 return false;
12492 return false;
12494 return false;
12496 return false;
12497
12499 }
12500
12502 {
12503 if (!ctx.
Read(intValue))
12504 return false;
12506 }
12507
12508 if (version >= 138 && version < 140)
12509 {
12511 {
12512 if (!ctx.
Read(intValue))
12513 return false;
12514 SetFrozen(intValue);
12515 }
12516 }
12517
12518 return true;
12519 }
12520
12521
12523 {
12526 {
12528 }
12529
12530 if (!super.OnStoreLoad(ctx, version))
12531 {
12533 return false;
12534 }
12535
12536 if (version >= 114)
12537 {
12538 bool hasQuickBarIndexSaved;
12539
12540 if (!ctx.
Read(hasQuickBarIndexSaved))
12541 {
12543 return false;
12544 }
12545
12546 if (hasQuickBarIndexSaved)
12547 {
12548 int itmQBIndex;
12549
12550
12551 if (!ctx.
Read(itmQBIndex))
12552 {
12554 return false;
12555 }
12556
12557 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12558 if (itmQBIndex != -1 && parentPlayer)
12559 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12560 }
12561 }
12562 else
12563 {
12564
12565 PlayerBase player;
12566 int itemQBIndex;
12567 if (version ==
int.
MAX)
12568 {
12569 if (!ctx.
Read(itemQBIndex))
12570 {
12572 return false;
12573 }
12574 }
12575 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12576 {
12577
12578 if (!ctx.
Read(itemQBIndex))
12579 {
12581 return false;
12582 }
12583 if (itemQBIndex != -1 && player)
12584 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12585 }
12586 }
12587
12588 if (version < 140)
12589 {
12590
12591 if (!LoadVariables(ctx, version))
12592 {
12594 return false;
12595 }
12596 }
12597
12598
12600 {
12602 return false;
12603 }
12604 if (version >= 132)
12605 {
12607 if (raib)
12608 {
12610 {
12612 return false;
12613 }
12614 }
12615 }
12616
12618 return true;
12619 }
12620
12621
12622
12624 {
12625 super.OnStoreSave(ctx);
12626
12627 PlayerBase player;
12628 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12629 {
12631
12632 int itemQBIndex = -1;
12633 itemQBIndex = player.FindQuickBarEntityIndex(this);
12634 ctx.
Write(itemQBIndex);
12635 }
12636 else
12637 {
12639 }
12640
12642
12644 if (raib)
12645 {
12647 }
12648 }
12649
12650
12652 {
12653 super.AfterStoreLoad();
12654
12656 {
12658 }
12659
12661 {
12664 }
12665 }
12666
12668 {
12669 super.EEOnAfterLoad();
12670
12672 {
12674 }
12675
12678 }
12679
12681 {
12682 return false;
12683 }
12684
12685
12686
12688 {
12690 {
12691 #ifdef PLATFORM_CONSOLE
12692
12694 {
12696 if (menu)
12697 {
12699 }
12700 }
12701 #endif
12702 }
12703
12705 {
12708 }
12709
12711 {
12712 SetWeightDirty();
12714 }
12716 {
12719 }
12720
12722 {
12725
12728 }
12730 {
12734 }
12735
12736 super.OnVariablesSynchronized();
12737 }
12738
12739
12740
12742 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12743 {
12744 if (!IsServerCheck(allow_client))
12745 return false;
12746
12748 return false;
12749
12752
12753 if (value <= (min + 0.001))
12754 value = min;
12755
12756 if (value == min)
12757 {
12758 if (destroy_config)
12759 {
12760 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12761 if (dstr)
12762 {
12764 this.Delete();
12765 return true;
12766 }
12767 }
12768 else if (destroy_forced)
12769 {
12771 this.Delete();
12772 return true;
12773 }
12774
12776 }
12777
12780
12782 {
12783 EntityAI parent = GetHierarchyRoot();
12784 InventoryLocation iLoc = new InventoryLocation();
12785 GetInventory().GetCurrentInventoryLocation(iLoc);
12787 {
12788 int iLocSlot = iLoc.
GetSlot();
12790 {
12792 }
12794 {
12796 }
12797 }
12798 }
12799
12801 {
12803
12804 if (delta)
12806 }
12807
12809
12810 return false;
12811 }
12812
12813
12815 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12816 {
12818 }
12819
12821 {
12824 }
12825
12827 {
12830 }
12831
12833 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12834 {
12835 float value_clamped = Math.Clamp(value, 0, 1);
12837 SetQuantity(result, destroy_config, destroy_forced);
12838 }
12839
12840
12843 {
12845 }
12846
12848 {
12850 }
12851
12852
12853
12854
12855
12856
12857
12858
12859
12860
12862 {
12863 int slot = -1;
12864 GameInventory inventory = GetInventory();
12865 if (inventory)
12866 {
12867 InventoryLocation il = new InventoryLocation;
12870 }
12871
12873 }
12874
12876 {
12877 float quantity_max = 0;
12878
12880 {
12881 if (attSlotID != -1)
12882 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12883
12884 if (quantity_max <= 0)
12886 }
12887
12888 if (quantity_max <= 0)
12890
12891 return quantity_max;
12892 }
12893
12895 {
12897 }
12898
12900 {
12902 }
12903
12904
12906 {
12908 }
12909
12911 {
12913 }
12914
12916 {
12918 }
12919
12920
12922 {
12923
12924 float weightEx = GetWeightEx();
12925 float special = GetInventoryAndCargoWeight();
12926 return weightEx - special;
12927 }
12928
12929
12931 {
12933 }
12934
12936 {
12938 {
12939 #ifdef DEVELOPER
12940 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12941 {
12942 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12944 }
12945 #endif
12946
12947 return GetQuantity() * GetConfigWeightModified();
12948 }
12949 else if (HasEnergyManager())
12950 {
12951 #ifdef DEVELOPER
12952 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12953 {
12954 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12955 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12956 }
12957 #endif
12958 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12959 }
12960 else
12961 {
12962 #ifdef DEVELOPER
12963 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12964 {
12965 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12966 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12967 }
12968 #endif
12969 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12970 }
12971 }
12972
12975 {
12976 int item_count = 0;
12978
12979 GameInventory inventory = GetInventory();
12980 CargoBase cargo = inventory.
GetCargo();
12981 if (cargo != NULL)
12982 {
12984 }
12985
12987 for (int i = 0; i < nAttachments; ++i)
12988 {
12990 if (item)
12991 item_count += item.GetNumberOfItems();
12992 }
12993 return item_count;
12994 }
12995
12998 {
12999 float weight = 0;
13000 float wetness = 1;
13001 if (include_wetness)
13004 {
13005 weight = wetness * m_ConfigWeight;
13006 }
13008 {
13009 weight = 1;
13010 }
13011 return weight;
13012 }
13013
13014
13015
13017 {
13018 GameInventory inventory = GetInventory();
13019 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
13020 {
13021 array<EntityAI> items = new array<EntityAI>;
13023 for (int i = 0; i < items.Count(); ++i)
13024 {
13026 if (item)
13027 {
13028 g_Game.ObjectDelete(item);
13029 }
13030 }
13031 }
13032 }
13033
13034
13035
13036
13038 {
13039 float energy = 0;
13040 if (HasEnergyManager())
13041 {
13042 energy = GetCompEM().GetEnergy();
13043 }
13044 return energy;
13045 }
13046
13047
13049 {
13050 super.OnEnergyConsumed();
13051
13053 }
13054
13056 {
13057 super.OnEnergyAdded();
13058
13060 }
13061
13062
13064 {
13065 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13066 {
13068 {
13069 float energy_0to1 = GetCompEM().GetEnergy0To1();
13071 }
13072 }
13073 }
13074
13075
13077 {
13078 return ConfigGetFloat("heatIsolation");
13079 }
13080
13082 {
13084 }
13085
13087 {
13088 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13089 if (
g_Game.ConfigIsExisting(paramPath))
13090 return g_Game.ConfigGetFloat(paramPath);
13091
13092 return 0.0;
13093 }
13094
13096 {
13097 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13098 if (
g_Game.ConfigIsExisting(paramPath))
13099 return g_Game.ConfigGetFloat(paramPath);
13100
13101 return 0.0;
13102 }
13103
13104 override void SetWet(
float value,
bool allow_client =
false)
13105 {
13106 if (!IsServerCheck(allow_client))
13107 return;
13108
13111
13113
13114 m_VarWet = Math.Clamp(value, min, max);
13115
13117 {
13120 }
13121 }
13122
13123 override void AddWet(
float value)
13124 {
13126 }
13127
13129 {
13131 }
13132
13134 {
13136 }
13137
13139 {
13141 }
13142
13144 {
13146 }
13147
13149 {
13151 }
13152
13153 override void OnWetChanged(
float newVal,
float oldVal)
13154 {
13157 if (newLevel != oldLevel)
13158 {
13160 }
13161 }
13162
13164 {
13165 SetWeightDirty();
13166 }
13167
13169 {
13170 return GetWetLevelInternal(
m_VarWet);
13171 }
13172
13173
13174
13176 {
13178 }
13179
13181 {
13183 }
13184
13186 {
13188 }
13189
13191 {
13193 }
13194
13195
13196
13198 {
13199 if (ConfigIsExisting("itemModelLength"))
13200 {
13201 return ConfigGetFloat("itemModelLength");
13202 }
13203 return 0;
13204 }
13205
13207 {
13208 if (ConfigIsExisting("itemAttachOffset"))
13209 {
13210 return ConfigGetFloat("itemAttachOffset");
13211 }
13212 return 0;
13213 }
13214
13215 override void SetCleanness(
int value,
bool allow_client =
false)
13216 {
13217 if (!IsServerCheck(allow_client))
13218 return;
13219
13221
13223
13226 }
13227
13229 {
13231 }
13232
13234 {
13235 return true;
13236 }
13237
13238
13239
13240
13242 {
13244 }
13245
13247 {
13249 }
13250
13251
13252
13253
13254 override void SetColor(
int r,
int g,
int b,
int a)
13255 {
13261 }
13263 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13264 {
13269 }
13270
13272 {
13274 }
13275
13278 {
13279 int r,g,b,a;
13281 r = r/255;
13282 g = g/255;
13283 b = b/255;
13284 a = a/255;
13285 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13286 }
13287
13288
13289
13290 override void SetLiquidType(
int value,
bool allow_client =
false)
13291 {
13292 if (!IsServerCheck(allow_client))
13293 return;
13294
13299 }
13300
13302 {
13303 return ConfigGetInt("varLiquidTypeInit");
13304 }
13305
13307 {
13309 }
13310
13312 {
13314 SetFrozen(false);
13315 }
13316
13319 {
13320 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13321 }
13322
13323
13326 {
13327 PlayerBase nplayer;
13328 if (PlayerBase.CastTo(nplayer, player))
13329 {
13331 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13332 }
13333 }
13334
13335
13338 {
13339 PlayerBase nplayer;
13340 if (PlayerBase.CastTo(nplayer,player))
13341 {
13342 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13343 }
13344
13345 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13346
13347 if (HasEnergyManager())
13348 {
13349 GetCompEM().UpdatePlugState();
13350 }
13351 }
13352
13353
13355 {
13356 super.OnPlacementStarted(player);
13357
13359 }
13360
13361 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13362 {
13364 {
13365 m_AdminLog.OnPlacementComplete(player,
this);
13366 }
13367
13368 super.OnPlacementComplete(player, position, orientation);
13369 }
13370
13371
13372
13373
13374
13376 {
13378 {
13379 return true;
13380 }
13381 else
13382 {
13383 return false;
13384 }
13385 }
13386
13387
13389 {
13391 {
13393 }
13394 }
13395
13396
13398 {
13400 }
13401
13403 {
13405 }
13406
13407 override void InsertAgent(
int agent,
float count = 1)
13408 {
13409 if (count < 1)
13410 return;
13411
13413 }
13414
13417 {
13419 }
13420
13421
13423 {
13425 }
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13469 {
13471 return false;
13472 return true;
13473 }
13474
13476 {
13477
13479 }
13480
13481
13484 {
13485 super.CheckForRoofLimited(timeTresholdMS);
13486
13487 float time =
g_Game.GetTime();
13488 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13489 {
13490 m_PreviousRoofTestTime = time;
13491 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13492 }
13493 }
13494
13495
13497 {
13499 {
13500 return 0;
13501 }
13502
13503 if (GetInventory().GetAttachmentSlotsCount() != 0)
13504 {
13505 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13506 if (filter)
13507 return filter.GetProtectionLevel(type, false, system);
13508 else
13509 return 0;
13510 }
13511
13512 string subclassPath, entryName;
13513
13514 switch (type)
13515 {
13517 entryName = "biological";
13518 break;
13520 entryName = "chemical";
13521 break;
13522 default:
13523 entryName = "biological";
13524 break;
13525 }
13526
13527 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13528
13529 return g_Game.ConfigGetFloat(subclassPath + entryName);
13530 }
13531
13532
13533
13536 {
13537 if (!IsMagazine())
13539
13541 }
13542
13543
13544
13545
13546
13551 {
13552 return true;
13553 }
13554
13556 {
13558 }
13559
13560
13561
13562
13563
13565 {
13566 if (parent)
13567 {
13568 if (parent.IsInherited(DayZInfected))
13569 return true;
13570
13571 if (!parent.IsRuined())
13572 return true;
13573 }
13574
13575 return true;
13576 }
13577
13579 {
13580 if (!super.CanPutAsAttachment(parent))
13581 {
13582 return false;
13583 }
13584
13585 if (!IsRuined() && !parent.IsRuined())
13586 {
13587 return true;
13588 }
13589
13590 return false;
13591 }
13592
13594 {
13595
13596
13597
13598
13599 return super.CanReceiveItemIntoCargo(item);
13600 }
13601
13603 {
13604
13605
13606
13607
13608 GameInventory attachmentInv = attachment.GetInventory();
13610 {
13611 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13612 return false;
13613 }
13614
13615 InventoryLocation loc = new InventoryLocation();
13616 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13617 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13618 return false;
13619
13620 return super.CanReceiveAttachment(attachment, slotId);
13621 }
13622
13624 {
13625 if (!super.CanReleaseAttachment(attachment))
13626 return false;
13627
13628 return GetInventory().AreChildrenAccessible();
13629 }
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
13642
13643
13644
13645
13646
13647
13648
13649
13650
13652 {
13653 int id = muzzle_owner.GetMuzzleID();
13654 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13655
13656 if (WPOF_array)
13657 {
13658 for (int i = 0; i < WPOF_array.Count(); i++)
13659 {
13660 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13661
13662 if (WPOF)
13663 {
13664 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13665 }
13666 }
13667 }
13668 }
13669
13670
13672 {
13673 int id = muzzle_owner.GetMuzzleID();
13675
13676 if (WPOBE_array)
13677 {
13678 for (int i = 0; i < WPOBE_array.Count(); i++)
13679 {
13680 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13681
13682 if (WPOBE)
13683 {
13684 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13685 }
13686 }
13687 }
13688 }
13689
13690
13692 {
13693 int id = muzzle_owner.GetMuzzleID();
13694 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13695
13696 if (WPOOH_array)
13697 {
13698 for (int i = 0; i < WPOOH_array.Count(); i++)
13699 {
13700 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13701
13702 if (WPOOH)
13703 {
13704 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13705 }
13706 }
13707 }
13708 }
13709
13710
13712 {
13713 int id = muzzle_owner.GetMuzzleID();
13714 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13715
13716 if (WPOOH_array)
13717 {
13718 for (int i = 0; i < WPOOH_array.Count(); i++)
13719 {
13720 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13721
13722 if (WPOOH)
13723 {
13724 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13725 }
13726 }
13727 }
13728 }
13729
13730
13732 {
13733 int id = muzzle_owner.GetMuzzleID();
13734 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13735
13736 if (WPOOH_array)
13737 {
13738 for (int i = 0; i < WPOOH_array.Count(); i++)
13739 {
13740 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13741
13742 if (WPOOH)
13743 {
13744 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13745 }
13746 }
13747 }
13748 }
13749
13750
13751
13753 {
13755 {
13756 return true;
13757 }
13758
13759 return false;
13760 }
13761
13763 {
13765 {
13766 return true;
13767 }
13768
13769 return false;
13770 }
13771
13773 {
13775 {
13776 return true;
13777 }
13778
13779 return false;
13780 }
13781
13783 {
13784 return false;
13785 }
13786
13789 {
13790 return UATimeSpent.DEFAULT_DEPLOY;
13791 }
13792
13793
13794
13795
13797 {
13799 SetSynchDirty();
13800 }
13801
13803 {
13805 }
13806
13807
13809 {
13810 return false;
13811 }
13812
13815 {
13816 string att_type = "None";
13817
13818 if (ConfigIsExisting("soundAttType"))
13819 {
13820 att_type = ConfigGetString("soundAttType");
13821 }
13822
13824 }
13825
13827 {
13829 }
13830
13831
13832
13833
13834
13840
13842 {
13845
13847 }
13848
13849
13851 {
13853 return;
13854
13856
13859
13862
13863 SoundParameters params = new SoundParameters();
13867 }
13868
13869
13871 {
13873 {
13876
13877 SetSynchDirty();
13878
13881 }
13882 }
13883
13885 {
13887 }
13888
13889
13891 {
13893 return;
13894
13896 SetSynchDirty();
13897
13900 }
13901
13903 {
13906 }
13907
13909 {
13911 }
13912
13913 void OnApply(PlayerBase player);
13914
13916 {
13917 return 1.0;
13918 };
13919
13921 {
13923 }
13924
13926 {
13928 }
13929
13931
13933 {
13934 SetDynamicPhysicsLifeTime(0.01);
13936 }
13937
13939 {
13940 array<string> zone_names = new array<string>;
13941 GetDamageZones(zone_names);
13942 for (int i = 0; i < zone_names.Count(); i++)
13943 {
13944 SetHealthMax(zone_names.Get(i),"Health");
13945 }
13946 SetHealthMax("","Health");
13947 }
13948
13951 {
13952 float global_health = GetHealth01("","Health");
13953 array<string> zones = new array<string>;
13954 GetDamageZones(zones);
13955
13956 for (int i = 0; i < zones.Count(); i++)
13957 {
13958 SetHealth01(zones.Get(i),"Health",global_health);
13959 }
13960 }
13961
13964 {
13965 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13966 }
13967
13969 {
13970 if (!hasRootAsPlayer)
13971 {
13972 if (refParentIB)
13973 {
13974
13975 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13976 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13977
13978 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13979 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13980
13983 }
13984 else
13985 {
13986
13989 }
13990 }
13991 }
13992
13994 {
13996 {
13997 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13998 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13999 {
14000 float heatPermCoef = 1.0;
14002 while (ent)
14003 {
14004 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14005 ent = ent.GetHierarchyParent();
14006 }
14007
14008 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14009 }
14010 }
14011 }
14012
14014 {
14015
14016 EntityAI parent = GetHierarchyParent();
14017 if (!parent)
14018 {
14019 hasParent = false;
14020 hasRootAsPlayer = false;
14021 }
14022 else
14023 {
14024 hasParent = true;
14025 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14026 refParentIB =
ItemBase.Cast(parent);
14027 }
14028 }
14029
14030 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14031 {
14032
14033 }
14034
14036 {
14037
14038 return false;
14039 }
14040
14042 {
14043
14044
14045 return false;
14046 }
14047
14049 {
14050
14051 return false;
14052 }
14053
14056 {
14057 return !GetIsFrozen() &&
IsOpen();
14058 }
14059
14061 {
14062 bool hasParent = false, hasRootAsPlayer = false;
14064
14065 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14066 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14067
14068 if (wwtu || foodDecay)
14069 {
14073
14074 if (processWetness || processTemperature || processDecay)
14075 {
14077
14078 if (processWetness)
14079 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14080
14081 if (processTemperature)
14083
14084 if (processDecay)
14085 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14086 }
14087 }
14088 }
14089
14092 {
14094 }
14095
14097 {
14100
14101 return super.GetTemperatureFreezeThreshold();
14102 }
14103
14105 {
14108
14109 return super.GetTemperatureThawThreshold();
14110 }
14111
14113 {
14116
14117 return super.GetItemOverheatThreshold();
14118 }
14119
14121 {
14123 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14124
14125 return super.GetTemperatureFreezeTime();
14126 }
14127
14129 {
14131 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14132
14133 return super.GetTemperatureThawTime();
14134 }
14135
14140
14142 {
14143 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14144 }
14145
14147 {
14148 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14149 }
14150
14153 {
14155 }
14156
14158 {
14160 }
14161
14163 {
14165 }
14166
14169 {
14170 return null;
14171 }
14172
14175 {
14176 return false;
14177 }
14178
14180 {
14182 {
14185 if (!trg)
14186 {
14188 explosive = this;
14189 }
14190
14191 explosive.PairRemote(trg);
14193
14194 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14195 trg.SetPersistentPairID(persistentID);
14196 explosive.SetPersistentPairID(persistentID);
14197
14198 return true;
14199 }
14200 return false;
14201 }
14202
14205 {
14206 float ret = 1.0;
14209 ret *= GetHealth01();
14210
14211 return ret;
14212 }
14213
14214 #ifdef DEVELOPER
14215 override void SetDebugItem()
14216 {
14217 super.SetDebugItem();
14218 _itemBase = this;
14219 }
14220
14222 {
14223 string text = super.GetDebugText();
14224
14226 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14227
14228 return text;
14229 }
14230 #endif
14231
14233 {
14234 return true;
14235 }
14236
14238
14240
14242 {
14245 }
14246
14247
14255
14271
14272 [
Obsolete(
"Use ItemSoundHandler instead")]
14275 {
14276 if (!
g_Game.IsDedicatedServer())
14277 {
14278 if (ConfigIsExisting("attachSoundSet"))
14279 {
14280 string cfg_path = "";
14281 string soundset = "";
14282 string type_name =
GetType();
14283
14286 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14287 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14288
14289 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14290 {
14291 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14292 {
14293 if (cfg_slot_array[i] == slot_type)
14294 {
14295 soundset = cfg_soundset_array[i];
14296 break;
14297 }
14298 }
14299 }
14300
14301 if (soundset != "")
14302 {
14303 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14305 }
14306 }
14307 }
14308 }
14309
14311}
14312
14314{
14316 if (entity)
14317 {
14318 bool is_item = entity.IsInherited(
ItemBase);
14319 if (is_item && full_quantity)
14320 {
14323 }
14324 }
14325 else
14326 {
14328 return NULL;
14329 }
14330 return entity;
14331}
14332
14334{
14335 if (item)
14336 {
14337 if (health > 0)
14338 item.SetHealth("", "", health);
14339
14340 if (item.CanHaveTemperature())
14341 {
14343 if (item.CanFreeze())
14344 item.SetFrozen(false);
14345 }
14346
14347 if (item.HasEnergyManager())
14348 {
14349 if (quantity >= 0)
14350 {
14351 item.GetCompEM().SetEnergy0To1(quantity);
14352 }
14353 else
14354 {
14356 }
14357 }
14358 else if (item.IsMagazine())
14359 {
14360 Magazine mag = Magazine.Cast(item);
14361 if (quantity >= 0)
14362 {
14363 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14364 }
14365 else
14366 {
14368 }
14369
14370 }
14371 else
14372 {
14373 if (quantity >= 0)
14374 {
14375 item.SetQuantityNormalized(quantity, false);
14376 }
14377 else
14378 {
14380 }
14381
14382 }
14383 }
14384}
14385
14386#ifdef DEVELOPER
14388#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.