9377{
9379 {
9380 return true;
9381 }
9382};
9383
9385{
9386
9387};
9388
9389
9390
9392{
9396
9398
9401
9402
9403
9404
9405
9414
9420
9425
9430
9451 protected bool m_IsResultOfSplit
9452
9454
9459
9460
9461
9463
9467
9468
9469
9471
9474
9475
9476
9482
9483
9491
9494
9495
9497
9498
9500
9501
9506
9507
9512
9514
9515
9517
9518
9520 {
9525
9526 if (!
g_Game.IsDedicatedServer())
9527 {
9529 {
9531
9533 {
9535 }
9536 }
9537
9540 }
9541
9542 m_OldLocation = null;
9543
9545 {
9547 }
9548
9549 if (ConfigIsExisting("headSelectionsToHide"))
9550 {
9553 }
9554
9556 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9557 {
9559 }
9560
9562
9563 m_IsResultOfSplit = false;
9564
9566 }
9567
9569 {
9570 super.InitItemVariables();
9571
9577 m_Count = ConfigGetInt(
"count");
9578
9581
9586
9589
9594
9606
9610
9611
9614 if (ConfigIsExisting("canBeSplit"))
9615 {
9618 }
9619
9621 if (ConfigIsExisting("itemBehaviour"))
9623
9624
9627 RegisterNetSyncVariableInt("m_VarLiquidType");
9628 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9629
9630 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9631 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9632 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9633
9634 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9635 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9636 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9637 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9638
9639 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9640 RegisterNetSyncVariableBool("m_IsTakeable");
9641 RegisterNetSyncVariableBool("m_IsHologram");
9642
9645 {
9648 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9649 }
9650
9652
9654 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9656
9658 }
9659
9661 {
9663 }
9664
9666 {
9669 {
9674 }
9675 }
9676
9677 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9678 {
9680 {
9683 }
9684
9686 }
9687
9689 {
9695 }
9696
9698
9700 {
9702
9703 if (!action)
9704 {
9705 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9706 return;
9707 }
9708
9710 if (!ai)
9711 {
9713 return;
9714 }
9715
9717 if (!action_array)
9718 {
9719 action_array = new array<ActionBase_Basic>;
9721 }
9722 if (LogManager.IsActionLogEnable())
9723 {
9724 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9725 }
9726
9727 if (action_array.Find(action) != -1)
9728 {
9729 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9730 }
9731 else
9732 {
9733 action_array.Insert(action);
9734 }
9735 }
9736
9738 {
9739 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9740 ActionBase action = player.GetActionManager().GetAction(actionName);
9743
9744 if (action_array)
9745 {
9746 action_array.RemoveItem(action);
9747 }
9748 }
9749
9750
9751
9753 {
9754 ActionOverrideData overrideData = new ActionOverrideData();
9758
9760 if (!actionMap)
9761 {
9764 }
9765
9766 actionMap.Insert(this.
Type(), overrideData);
9767
9768 }
9769
9771
9773
9774
9776 {
9779
9782
9783 string config_to_search = "CfgVehicles";
9784 string muzzle_owner_config;
9785
9787 {
9788 if (IsInherited(Weapon))
9789 config_to_search = "CfgWeapons";
9790
9791 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9792
9793 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9794
9795 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9796
9797 if (config_OnFire_subclass_count > 0)
9798 {
9799 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9800
9801 for (int i = 0; i < config_OnFire_subclass_count; i++)
9802 {
9803 string particle_class = "";
9804 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9805 string config_OnFire_entry = config_OnFire_class + particle_class;
9806 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9807 WPOF_array.Insert(WPOF);
9808 }
9809
9810
9812 }
9813 }
9814
9816 {
9817 config_to_search = "CfgWeapons";
9818 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9819
9820 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9821
9822 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9823
9824 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9825 {
9826 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9827
9828 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9829 {
9830 string particle_class2 = "";
9831 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9832 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9833 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9834 WPOBE_array.Insert(WPOBE);
9835 }
9836
9837
9839 }
9840 }
9841 }
9842
9843
9845 {
9848
9850 {
9851 string config_to_search = "CfgVehicles";
9852
9853 if (IsInherited(Weapon))
9854 config_to_search = "CfgWeapons";
9855
9856 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9857 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9858
9859 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9860 {
9861
9863
9865 {
9867 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9869 return;
9870 }
9871
9874
9875
9876
9877 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9878 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9879
9880 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9881 {
9882 string particle_class = "";
9883 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9884 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9885 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9886
9887 if (entry_type == CT_CLASS)
9888 {
9889 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9890 WPOOH_array.Insert(WPOF);
9891 }
9892 }
9893
9894
9896 }
9897 }
9898 }
9899
9901 {
9903 }
9904
9906 {
9908 {
9910
9913
9916
9917 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9918 }
9919 }
9920
9922 {
9924 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9925
9927 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9928
9930 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9931
9933 {
9935 }
9936 }
9937
9939 {
9941 }
9942
9944 {
9947 else
9949
9951 {
9954 }
9955 else
9956 {
9959
9962 }
9963
9965 }
9966
9968 {
9970 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9971 }
9972
9974 {
9976 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9978 }
9979
9981 {
9983 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9984 }
9985
9987 {
9990
9991 OverheatingParticle OP = new OverheatingParticle();
9996
9998 }
9999
10001 {
10004
10005 return -1;
10006 }
10007
10009 {
10011 {
10014
10015 for (int i = count; i > 0; --i)
10016 {
10017 int id = i - 1;
10020
10023
10024 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10025 {
10026 if (p)
10027 {
10030 }
10031 }
10032 }
10033 }
10034 }
10035
10037 {
10039 {
10041 {
10042 int id = i - 1;
10044
10045 if (OP)
10046 {
10048
10049 if (p)
10050 {
10052 }
10053
10054 delete OP;
10055 }
10056 }
10057
10060 }
10061 }
10062
10065 {
10066 return 0.0;
10067 }
10068
10069
10071 {
10072 return 250;
10073 }
10074
10076 {
10077 return 0;
10078 }
10079
10082 {
10084 return true;
10085
10086 return false;
10087 }
10088
10091 {
10094
10096 {
10098 }
10099 else
10100 {
10101
10103 }
10104
10106 }
10107
10114 {
10115 return -1;
10116 }
10117
10118
10119
10120
10122 {
10124 {
10125 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10126 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10127
10128 if (r_index >= 0)
10129 {
10130 InventoryLocation r_il = new InventoryLocation;
10131 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10132
10133 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10136 {
10137 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10138 }
10140 {
10141 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10142 }
10143
10144 }
10145
10146 player.GetHumanInventory().ClearUserReservedLocation(this);
10147 }
10148
10151 }
10152
10153
10154
10155
10157 {
10158 return ItemBase.m_DebugActionsMask;
10159 }
10160
10162 {
10163 return ItemBase.m_DebugActionsMask & mask;
10164 }
10165
10167 {
10168 ItemBase.m_DebugActionsMask = mask;
10169 }
10170
10172 {
10173 ItemBase.m_DebugActionsMask |= mask;
10174 }
10175
10177 {
10178 ItemBase.m_DebugActionsMask &= ~mask;
10179 }
10180
10182 {
10184 {
10186 }
10187 else
10188 {
10190 }
10191 }
10192
10193
10195 {
10196 if (GetEconomyProfile())
10197 {
10198 float q_max = GetEconomyProfile().GetQuantityMax();
10199 if (q_max > 0)
10200 {
10201 float q_min = GetEconomyProfile().GetQuantityMin();
10202 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10203
10205 {
10206 ComponentEnergyManager comp = GetCompEM();
10208 {
10210 }
10211 }
10213 {
10215
10216 }
10217
10218 }
10219 }
10220 }
10221
10224 {
10225 EntityAI parent = GetHierarchyParent();
10226
10227 if (parent)
10228 {
10229 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10230 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10231 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10232 }
10233 }
10234
10237 {
10238 EntityAI parent = GetHierarchyParent();
10239
10240 if (parent)
10241 {
10242 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10243 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10244 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10245 }
10246 }
10247
10249 {
10250
10251
10252
10253
10255
10257 {
10258 if (ScriptInputUserData.CanStoreInputUserData())
10259 {
10260 ScriptInputUserData ctx = new ScriptInputUserData;
10266 ctx.
Write(use_stack_max);
10269
10271 {
10272 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10273 }
10274 }
10275 }
10276 else if (!
g_Game.IsMultiplayer())
10277 {
10279 }
10280 }
10281
10283 {
10285 }
10286
10288 {
10290 }
10291
10293 {
10295 }
10296
10298 {
10299
10300 return false;
10301 }
10302
10304 {
10305 return false;
10306 }
10307
10311 {
10312 return false;
10313 }
10314
10316 {
10317 return "";
10318 }
10319
10321
10323 {
10324 return false;
10325 }
10326
10328 {
10329 return true;
10330 }
10331
10332
10333
10335 {
10336 return true;
10337 }
10338
10340 {
10341 return true;
10342 }
10343
10345 {
10346 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10348 }
10349
10351 {
10353 }
10354
10356 {
10358 if (!is_being_placed)
10360 SetSynchDirty();
10361 }
10362
10363
10365
10367 {
10369 }
10370
10372 {
10374 }
10375
10377 {
10378 return 1;
10379 }
10380
10382 {
10383 return false;
10384 }
10385
10387 {
10389 SetSynchDirty();
10390 }
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10427 {
10428 super.OnMovedInsideCargo(container);
10429
10430 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10431 }
10432
10433 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10434 {
10435 super.EEItemLocationChanged(oldLoc, newLoc);
10436
10437 PlayerBase newPlayer = null;
10438 PlayerBase oldPlayer = null;
10439
10440 if (newLoc.GetParent())
10441 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10442
10443 if (oldLoc.GetParent())
10444 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10445
10447 {
10448 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10449
10450 if (rIndex >= 0)
10451 {
10452 InventoryLocation rIl = new InventoryLocation;
10453 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10454
10455 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10458 {
10459 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10460 }
10462 {
10464 }
10465
10466 }
10467 }
10468
10470 {
10471 if (newPlayer)
10472 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10473
10474 if (newPlayer == oldPlayer)
10475 {
10476 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10477 {
10479 {
10480 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10481 {
10482 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10483 }
10484 }
10485 else
10486 {
10487 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10488 }
10489 }
10490
10491 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10492 {
10493 int type = oldLoc.GetType();
10495 {
10496 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10497 }
10499 {
10500 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10501 }
10502 }
10503 if (!m_OldLocation)
10504 {
10505 m_OldLocation = new InventoryLocation;
10506 }
10507 m_OldLocation.Copy(oldLoc);
10508 }
10509 else
10510 {
10511 if (m_OldLocation)
10512 {
10513 m_OldLocation.Reset();
10514 }
10515 }
10516
10517 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10518 }
10519 else
10520 {
10521 if (newPlayer)
10522 {
10523 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10524 if (resIndex >= 0)
10525 {
10526 InventoryLocation il = new InventoryLocation;
10527 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10529 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10532 {
10533 il.
GetParent().GetOnReleaseLock().Invoke(it);
10534 }
10536 {
10538 }
10539
10540 }
10541 }
10543 {
10544
10546 }
10547
10548 if (m_OldLocation)
10549 {
10550 m_OldLocation.Reset();
10551 }
10552 }
10553
10555 {
10556 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10557 }
10558
10560 {
10561 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10562 }
10563 }
10564
10565 override void EOnContact(IEntity other, Contact extra)
10566 {
10568 {
10569 int liquidType = -1;
10571 if (impactSpeed > 0.0)
10572 {
10574 #ifndef SERVER
10576 #else
10578 SetSynchDirty();
10579 #endif
10581 }
10582 }
10583
10584 #ifdef SERVER
10585 if (GetCompEM() && GetCompEM().IsPlugged())
10586 {
10587 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10588 GetCompEM().UnplugThis();
10589 }
10590 #endif
10591 }
10592
10594
10596 {
10598 }
10599
10601 {
10602
10603 }
10604
10606 {
10607 super.OnItemLocationChanged(old_owner, new_owner);
10608
10609 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10610 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10611
10612 if (!relatedPlayer && playerNew)
10613 relatedPlayer = playerNew;
10614
10615 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10616 {
10618 if (actionMgr)
10619 {
10620 ActionBase currentAction = actionMgr.GetRunningAction();
10621 if (currentAction)
10623 }
10624 }
10625
10626 Man ownerPlayerOld = null;
10627 Man ownerPlayerNew = null;
10628
10629 if (old_owner)
10630 {
10631 if (old_owner.
IsMan())
10632 {
10633 ownerPlayerOld = Man.Cast(old_owner);
10634 }
10635 else
10636 {
10637 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10638 }
10639 }
10640 else
10641 {
10643 {
10645
10646 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10647 {
10648 GetCompEM().UnplugThis();
10649 }
10650 }
10651 }
10652
10653 if (new_owner)
10654 {
10655 if (new_owner.
IsMan())
10656 {
10657 ownerPlayerNew = Man.Cast(new_owner);
10658 }
10659 else
10660 {
10661 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10662 }
10663 }
10664
10665 if (ownerPlayerOld != ownerPlayerNew)
10666 {
10667 if (ownerPlayerOld)
10668 {
10669 array<EntityAI> subItemsExit = new array<EntityAI>;
10671 for (int i = 0; i < subItemsExit.Count(); i++)
10672 {
10675 }
10676 }
10677
10678 if (ownerPlayerNew)
10679 {
10680 array<EntityAI> subItemsEnter = new array<EntityAI>;
10682 for (int j = 0; j < subItemsEnter.Count(); j++)
10683 {
10686 }
10687 }
10688 }
10689 else if (ownerPlayerNew != null)
10690 {
10691 PlayerBase nplayer;
10692 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10693 {
10694 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10696 for (int k = 0; k < subItemsUpdate.Count(); k++)
10697 {
10699 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10700 }
10701 }
10702 }
10703
10704 if (old_owner)
10705 old_owner.OnChildItemRemoved(this);
10706 if (new_owner)
10707 new_owner.OnChildItemReceived(this);
10708 }
10709
10710
10712 {
10713 super.EEDelete(parent);
10714 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10715 if (player)
10716 {
10718
10719 if (player.IsAlive())
10720 {
10721 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10722 if (r_index >= 0)
10723 {
10724 InventoryLocation r_il = new InventoryLocation;
10725 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10726
10727 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10730 {
10731 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10732 }
10734 {
10735 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10736 }
10737
10738 }
10739
10740 player.RemoveQuickBarEntityShortcut(this);
10741 }
10742 }
10743 }
10744
10746 {
10747 super.EEKilled(killer);
10748
10751 {
10752 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10753 {
10754 if (IsMagazine())
10755 {
10756 if (Magazine.Cast(this).GetAmmoCount() > 0)
10757 {
10759 }
10760 }
10761 else
10762 {
10764 }
10765 }
10766 }
10767 }
10768
10770 {
10771 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10772
10773 super.OnWasAttached(parent, slot_id);
10774
10777
10780 }
10781
10783 {
10784 super.OnWasDetached(parent, slot_id);
10785
10788
10791 }
10792
10794 {
10795 int idx;
10798
10799 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10800 if (inventory_slots.Count() < 1)
10801 {
10802 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10803 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10804 }
10805 else
10806 {
10807 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10808 }
10809
10810 idx = inventory_slots.Find(slot);
10811 if (idx < 0)
10812 return "";
10813
10814 return attach_types.Get(idx);
10815 }
10816
10818 {
10819 int idx = -1;
10820 string slot;
10821
10824
10825 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10826 if (inventory_slots.Count() < 1)
10827 {
10828 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10829 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10830 }
10831 else
10832 {
10833 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10834 if (detach_types.Count() < 1)
10835 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10836 }
10837
10838 for (int i = 0; i < inventory_slots.Count(); i++)
10839 {
10840 slot = inventory_slots.Get(i);
10841 }
10842
10843 if (slot != "")
10844 {
10845 if (detach_types.Count() == 1)
10846 idx = 0;
10847 else
10848 idx = inventory_slots.Find(slot);
10849 }
10850 if (idx < 0)
10851 return "";
10852
10853 return detach_types.Get(idx);
10854 }
10855
10857 {
10858
10860
10861
10862 float min_time = 1;
10863 float max_time = 3;
10864 float delay = Math.RandomFloat(min_time, max_time);
10865
10866 explode_timer.Run(delay, this, "DoAmmoExplosion");
10867 }
10868
10870 {
10871 Magazine magazine = Magazine.Cast(this);
10872 int pop_sounds_count = 6;
10873 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10874
10875
10876 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10877 string sound_name = pop_sounds[ sound_idx ];
10878 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10879
10880
10881 magazine.ServerAddAmmoCount(-1);
10882
10883
10884 float min_temp_to_explode = 100;
10885
10886 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10887 {
10889 }
10890 }
10891
10892
10893 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10894 {
10895 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10896
10897 const int CHANCE_DAMAGE_CARGO = 4;
10898 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10899 const int CHANCE_DAMAGE_NOTHING = 2;
10900
10902 {
10903 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10904 int chances;
10905 int rnd;
10906
10907 if (GetInventory().GetCargo())
10908 {
10909 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10910 rnd = Math.RandomInt(0,chances);
10911
10912 if (rnd < CHANCE_DAMAGE_CARGO)
10913 {
10915 }
10916 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10917 {
10919 }
10920 }
10921 else
10922 {
10923 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10924 rnd = Math.RandomInt(0,chances);
10925
10926 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10927 {
10929 }
10930 }
10931 }
10932 }
10933
10935 {
10936 CargoBase cargo = GetInventory().GetCargo();
10937 if (cargo)
10938 {
10940 if (item_count > 0)
10941 {
10942 int random_pick = Math.RandomInt(0, item_count);
10944 if (!item.IsExplosive())
10945 {
10946 item.AddHealth("","",damage);
10947 return true;
10948 }
10949 }
10950 }
10951 return false;
10952 }
10953
10955 {
10956 GameInventory inventory = GetInventory();
10958 if (attachment_count > 0)
10959 {
10960 int random_pick = Math.RandomInt(0, attachment_count);
10962 if (!attachment.IsExplosive())
10963 {
10964 attachment.AddHealth("","",damage);
10965 return true;
10966 }
10967 }
10968 return false;
10969 }
10970
10972 {
10974 }
10975
10977 {
10979 return GetInventory().CanRemoveEntity();
10980
10981 return false;
10982 }
10983
10985 {
10986
10988 return false;
10989
10990
10992 return false;
10993
10994
10995
10997 if (delta == 0)
10998 return false;
10999
11000
11001 return true;
11002 }
11003
11005 {
11007 {
11008 if (ScriptInputUserData.CanStoreInputUserData())
11009 {
11010 ScriptInputUserData ctx = new ScriptInputUserData;
11015 ctx.
Write(destination_entity);
11017 ctx.
Write(slot_id);
11019 }
11020 }
11021 else if (!
g_Game.IsMultiplayer())
11022 {
11024 }
11025 }
11026
11028 {
11029 float split_quantity_new;
11033 InventoryLocation loc = new InventoryLocation;
11034
11035 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11036 {
11038 split_quantity_new = stack_max;
11039 else
11041
11043 {
11044 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11045 if (new_item)
11046 {
11047 new_item.SetResultOfSplit(true);
11048 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11050 new_item.
SetQuantity(split_quantity_new,
false,
true);
11051 }
11052 }
11053 }
11054 else if (destination_entity && slot_id == -1)
11055 {
11056 if (quantity > stack_max)
11057 split_quantity_new = stack_max;
11058 else
11059 split_quantity_new = quantity;
11060
11062 {
11063 GameInventory destinationInventory = destination_entity.GetInventory();
11065 {
11068 }
11069
11070 if (new_item)
11071 {
11072 new_item.SetResultOfSplit(true);
11073 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11075 new_item.
SetQuantity(split_quantity_new,
false,
true);
11076 }
11077 }
11078 }
11079 else
11080 {
11081 if (stack_max != 0)
11082 {
11084 {
11086 }
11087
11088 if (split_quantity_new == 0)
11089 {
11090 if (!
g_Game.IsMultiplayer())
11091 player.PhysicalPredictiveDropItem(this);
11092 else
11093 player.ServerDropEntity(this);
11094 return;
11095 }
11096
11098 {
11100
11101 if (new_item)
11102 {
11103 new_item.SetResultOfSplit(true);
11104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11107 new_item.PlaceOnSurface();
11108 }
11109 }
11110 }
11111 }
11112 }
11113
11115 {
11116 float split_quantity_new;
11120 InventoryLocation loc = new InventoryLocation;
11121
11122 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11123 {
11125 split_quantity_new = stack_max;
11126 else
11128
11130 {
11131 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11132 if (new_item)
11133 {
11134 new_item.SetResultOfSplit(true);
11135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11137 new_item.
SetQuantity(split_quantity_new,
false,
true);
11138 }
11139 }
11140 }
11141 else if (destination_entity && slot_id == -1)
11142 {
11143 if (quantity > stack_max)
11144 split_quantity_new = stack_max;
11145 else
11146 split_quantity_new = quantity;
11147
11149 {
11150 GameInventory destinationInventory = destination_entity.GetInventory();
11152 {
11155 }
11156
11157 if (new_item)
11158 {
11159 new_item.SetResultOfSplit(true);
11160 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11162 new_item.
SetQuantity(split_quantity_new,
false,
true);
11163 }
11164 }
11165 }
11166 else
11167 {
11168 if (stack_max != 0)
11169 {
11171 {
11173 }
11174
11176 {
11178
11179 if (new_item)
11180 {
11181 new_item.SetResultOfSplit(true);
11182 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11185 new_item.PlaceOnSurface();
11186 }
11187 }
11188 }
11189 }
11190 }
11191
11193 {
11195 {
11196 if (ScriptInputUserData.CanStoreInputUserData())
11197 {
11198 ScriptInputUserData ctx = new ScriptInputUserData;
11203 dst.WriteToContext(ctx);
11205 }
11206 }
11207 else if (!
g_Game.IsMultiplayer())
11208 {
11210 }
11211 }
11212
11214 {
11216 {
11217 if (ScriptInputUserData.CanStoreInputUserData())
11218 {
11219 ScriptInputUserData ctx = new ScriptInputUserData;
11224 ctx.
Write(destination_entity);
11230 }
11231 }
11232 else if (!
g_Game.IsMultiplayer())
11233 {
11235 }
11236 }
11237
11239 {
11241 }
11242
11244 {
11246 float split_quantity_new;
11248 if (dst.IsValid())
11249 {
11250 int slot_id = dst.GetSlot();
11252
11253 if (quantity > stack_max)
11254 split_quantity_new = stack_max;
11255 else
11256 split_quantity_new = quantity;
11257
11259 {
11261
11262 if (new_item)
11263 {
11264 new_item.SetResultOfSplit(true);
11265 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11267 new_item.
SetQuantity(split_quantity_new,
false,
true);
11268 }
11269
11270 return new_item;
11271 }
11272 }
11273
11274 return null;
11275 }
11276
11278 {
11280 float split_quantity_new;
11282 if (destination_entity)
11283 {
11285 if (quantity > stackable)
11286 split_quantity_new = stackable;
11287 else
11288 split_quantity_new = quantity;
11289
11291 {
11292 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
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 }
11302 }
11303
11305 {
11307 {
11308 if (ScriptInputUserData.CanStoreInputUserData())
11309 {
11310 ScriptInputUserData ctx = new ScriptInputUserData;
11315 ItemBase destination_entity =
this;
11316 ctx.
Write(destination_entity);
11320 }
11321 }
11322 else if (!
g_Game.IsMultiplayer())
11323 {
11325 }
11326 }
11327
11329 {
11331 float split_quantity_new;
11333 if (player)
11334 {
11336 if (quantity > stackable)
11337 split_quantity_new = stackable;
11338 else
11339 split_quantity_new = quantity;
11340
11342 {
11343 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11344 new_item =
ItemBase.Cast(in_hands);
11345 if (new_item)
11346 {
11347 new_item.SetResultOfSplit(true);
11348 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11350 new_item.SetQuantity(split_quantity_new, false, true);
11351 }
11352 }
11353 }
11354 }
11355
11357 {
11359 float split_quantity_new = Math.Floor(quantity * 0.5);
11360
11362 return;
11363
11365
11366 if (new_item)
11367 {
11368 if (new_item.GetQuantityMax() < split_quantity_new)
11369 {
11370 split_quantity_new = new_item.GetQuantityMax();
11371 }
11372
11373 new_item.SetResultOfSplit(true);
11374 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11375
11377 {
11380 }
11381 else
11382 {
11384 new_item.
SetQuantity(split_quantity_new,
false,
true);
11385 }
11386 }
11387 }
11388
11390 {
11392 float split_quantity_new = Math.Floor(quantity / 2);
11393
11395 return;
11396
11397 InventoryLocation invloc = new InventoryLocation;
11399
11401 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11402
11403 if (new_item)
11404 {
11405 if (new_item.GetQuantityMax() < split_quantity_new)
11406 {
11407 split_quantity_new = new_item.GetQuantityMax();
11408 }
11410 {
11413 }
11414 else if (split_quantity_new > 1)
11415 {
11417 new_item.
SetQuantity(split_quantity_new,
false,
true);
11418 }
11419 }
11420 }
11421
11424 {
11425 SetWeightDirty();
11427
11428 if (parent)
11429 parent.OnAttachmentQuantityChangedEx(this, delta);
11430
11432 {
11434 {
11436 }
11438 {
11439 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11441 }
11442 }
11443 }
11444
11447 {
11448
11449 }
11450
11453 {
11455 }
11456
11458 {
11459 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11460
11462 {
11463 if (newLevel == GameConstants.STATE_RUINED)
11464 {
11466 EntityAI parent = GetHierarchyParent();
11467 if (parent && parent.IsFireplace())
11468 {
11469 CargoBase cargo = GetInventory().GetCargo();
11470 if (cargo)
11471 {
11473 {
11475 }
11476 }
11477 }
11478 }
11479
11481 {
11482
11484 return;
11485 }
11486
11487 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11488 {
11490 }
11491 }
11492 }
11493
11494
11496 {
11497 super.OnRightClick();
11498
11500 {
11502 {
11503 if (ScriptInputUserData.CanStoreInputUserData())
11504 {
11505 EntityAI root = GetHierarchyRoot();
11506 Man playerOwner = GetHierarchyRootPlayer();
11507 InventoryLocation dst = new InventoryLocation;
11508
11509
11510 if (!playerOwner && root && root == this)
11511 {
11513 }
11514 else
11515 {
11516
11517 GetInventory().GetCurrentInventoryLocation(dst);
11519 {
11520 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11522 {
11524 }
11525 else
11526 {
11528
11529
11530 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11531 {
11533 }
11534 else
11535 {
11536 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11537 }
11538 }
11539 }
11540 }
11541
11542 ScriptInputUserData ctx = new ScriptInputUserData;
11550 }
11551 }
11552 else if (!
g_Game.IsMultiplayer())
11553 {
11555 }
11556 }
11557 }
11558
11560 {
11561 if (root)
11562 {
11563 vector m4[4];
11564 root.GetTransform(m4);
11565 dst.SetGround(this, m4);
11566 }
11567 else
11568 {
11569 GetInventory().GetCurrentInventoryLocation(dst);
11570 }
11571 }
11572
11573 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11574 {
11575
11576 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11577 return false;
11578
11579 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11580 return false;
11581
11582
11584 return false;
11585
11586
11587 Magazine mag = Magazine.Cast(this);
11588 if (mag)
11589 {
11590 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11591 return false;
11592
11593 if (stack_max_limit)
11594 {
11595 Magazine other_mag = Magazine.Cast(other_item);
11596 if (other_item)
11597 {
11598 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11599 return false;
11600 }
11601
11602 }
11603 }
11604 else
11605 {
11606
11608 return false;
11609
11611 return false;
11612 }
11613
11614 PlayerBase player = null;
11615 if (CastTo(player, GetHierarchyRootPlayer()))
11616 {
11617 if (player.GetInventory().HasAttachment(this))
11618 return false;
11619
11620 if (player.IsItemsToDelete())
11621 return false;
11622 }
11623
11624 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11625 return false;
11626
11627 int slotID;
11629 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11630 return false;
11631
11632 return true;
11633 }
11634
11636 {
11638 }
11639
11641 {
11642 return m_IsResultOfSplit;
11643 }
11644
11646 {
11647 m_IsResultOfSplit = value;
11648 }
11649
11651 {
11653 }
11654
11656 {
11657 float other_item_quantity = other_item.GetQuantity();
11658 float this_free_space;
11659
11661
11663
11664 if (other_item_quantity > this_free_space)
11665 {
11666 return this_free_space;
11667 }
11668 else
11669 {
11670 return other_item_quantity;
11671 }
11672 }
11673
11675 {
11677 }
11678
11680 {
11682 return;
11683
11684 if (!IsMagazine() && other_item)
11685 {
11687 if (quantity_used != 0)
11688 {
11689 float hp1 = GetHealth01("","");
11690 float hp2 = other_item.GetHealth01("","");
11691 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11692 hpResult = hpResult / (
GetQuantity() + quantity_used);
11693
11694 hpResult *= GetMaxHealth();
11695 Math.Round(hpResult);
11696 SetHealth("", "Health", hpResult);
11697
11699 other_item.AddQuantity(-quantity_used);
11700 }
11701 }
11703 }
11704
11706 {
11707 #ifdef SERVER
11708 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11709 GetHierarchyParent().IncreaseLifetimeUp();
11710 #endif
11711 };
11712
11714 {
11715 PlayerBase p = PlayerBase.Cast(player);
11716
11717 array<int> recipesIds = p.m_Recipes;
11718 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11719 if (moduleRecipesManager)
11720 {
11721 EntityAI itemInHands = player.GetEntityInHands();
11722 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11723 }
11724
11725 for (int i = 0;i < recipesIds.Count(); i++)
11726 {
11727 int key = recipesIds.Get(i);
11728 string recipeName = moduleRecipesManager.GetRecipeName(key);
11730 }
11731 }
11732
11733
11734 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11735 {
11736 super.GetDebugActions(outputList);
11737
11738
11744
11745
11750
11755
11756
11760
11761
11763 {
11767 }
11768
11771
11772
11776
11778
11779 InventoryLocation loc = new InventoryLocation();
11780 GetInventory().GetCurrentInventoryLocation(loc);
11782 {
11783 if (Gizmo_IsSupported())
11786 }
11787
11789 }
11790
11791
11792
11793
11795 {
11796 super.OnAction(action_id, player, ctx);
11797
11799 {
11800 switch (action_id)
11801 {
11805 return true;
11809 return true;
11810 }
11811 }
11812
11814 {
11815 switch (action_id)
11816 {
11818 Delete();
11819 return true;
11820 }
11821 }
11822
11823 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11824 {
11825 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11826 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11827 PlayerBase p = PlayerBase.Cast(player);
11828 if (
EActions.RECIPES_RANGE_START < 1000)
11829 {
11830 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11831 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11832 }
11833 }
11834 #ifndef SERVER
11835 else if (action_id ==
EActions.WATCH_PLAYER)
11836 {
11837 PluginDeveloper.SetDeveloperItemClientEx(player);
11838 }
11839 #endif
11841 {
11842 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11843 {
11844 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11845 OnDebugButtonPressServer(id + 1);
11846 }
11847
11848 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11849 {
11850 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11852 }
11853
11854 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11855 {
11856 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11858 }
11859
11860 else if (action_id ==
EActions.ADD_QUANTITY)
11861 {
11862 if (IsMagazine())
11863 {
11864 Magazine mag = Magazine.Cast(this);
11865 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11866 }
11867 else
11868 {
11870 }
11871
11872 if (m_EM)
11873 {
11874 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11875 }
11876
11877 }
11878
11879 else if (action_id ==
EActions.REMOVE_QUANTITY)
11880 {
11881 if (IsMagazine())
11882 {
11883 Magazine mag2 = Magazine.Cast(this);
11884 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11885 }
11886 else
11887 {
11889 }
11890 if (m_EM)
11891 {
11892 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11893 }
11894
11895 }
11896
11897 else if (action_id ==
EActions.SET_QUANTITY_0)
11898 {
11900
11901 if (m_EM)
11902 {
11903 m_EM.SetEnergy(0);
11904 }
11905 }
11906
11907 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11908 {
11910
11911 if (m_EM)
11912 {
11913 m_EM.SetEnergy(m_EM.GetEnergyMax());
11914 }
11915 }
11916
11917 else if (action_id ==
EActions.ADD_HEALTH)
11918 {
11919 AddHealth("","",GetMaxHealth("","Health")/5);
11920 }
11921 else if (action_id ==
EActions.REMOVE_HEALTH)
11922 {
11923 AddHealth("","",-GetMaxHealth("","Health")/5);
11924 }
11925 else if (action_id ==
EActions.DESTROY_HEALTH)
11926 {
11927 SetHealth01("","",0);
11928 }
11929 else if (action_id ==
EActions.WATCH_ITEM)
11930 {
11932 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11933 #ifdef DEVELOPER
11934 SetDebugDeveloper_item(this);
11935 #endif
11936 }
11937
11938 else if (action_id ==
EActions.ADD_TEMPERATURE)
11939 {
11940 AddTemperature(20);
11941
11942 }
11943
11944 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11945 {
11946 AddTemperature(-20);
11947
11948 }
11949
11950 else if (action_id ==
EActions.FLIP_FROZEN)
11951 {
11952 SetFrozen(!GetIsFrozen());
11953
11954 }
11955
11956 else if (action_id ==
EActions.ADD_WETNESS)
11957 {
11959
11960 }
11961
11962 else if (action_id ==
EActions.REMOVE_WETNESS)
11963 {
11965
11966 }
11967
11968 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11969 {
11972
11973
11974 }
11975
11976 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11977 {
11980 }
11981
11982 else if (action_id ==
EActions.MAKE_SPECIAL)
11983 {
11984 auto debugParams = DebugSpawnParams.WithPlayer(player);
11985 OnDebugSpawnEx(debugParams);
11986 }
11987
11988 }
11989
11990
11991 return false;
11992 }
11993
11994
11995
11996
12000
12003
12004
12005
12007 {
12008 return false;
12009 }
12010
12011
12013 {
12014 return true;
12015 }
12016
12017
12019 {
12020 return true;
12021 }
12022
12023
12024
12026 {
12027 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12028 return g_Game.ConfigIsExisting(config_path);
12029 }
12030
12033 {
12034 return null;
12035 }
12036
12038 {
12039 return false;
12040 }
12041
12043 {
12044 return false;
12045 }
12046
12050
12051
12053 {
12054 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12055 return module_repairing.CanRepair(this, item_repair_kit);
12056 }
12057
12058
12059 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12060 {
12061 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12062 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12063 }
12064
12065
12067 {
12068
12069
12070
12071
12072
12073
12074
12075
12076 return 1;
12077 }
12078
12079
12080
12082 {
12084 }
12085
12086
12087
12089 {
12091 }
12092
12093
12102 {
12103 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12104
12105 if (player)
12106 {
12107 player.MessageStatus(text);
12108 }
12109 }
12110
12111
12120 {
12121 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12122
12123 if (player)
12124 {
12125 player.MessageAction(text);
12126 }
12127 }
12128
12129
12138 {
12139 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12140
12141 if (player)
12142 {
12143 player.MessageFriendly(text);
12144 }
12145 }
12146
12147
12156 {
12157 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12158
12159 if (player)
12160 {
12161 player.MessageImportant(text);
12162 }
12163 }
12164
12166 {
12167 return true;
12168 }
12169
12170
12171 override bool KindOf(
string tag)
12172 {
12173 bool found = false;
12174 string item_name = this.
GetType();
12176 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12177
12178 int array_size = item_tag_array.Count();
12179 for (int i = 0; i < array_size; i++)
12180 {
12181 if (item_tag_array.Get(i) == tag)
12182 {
12183 found = true;
12184 break;
12185 }
12186 }
12187 return found;
12188 }
12189
12190
12192 {
12193
12194 super.OnRPC(sender, rpc_type,ctx);
12195
12196
12197 switch (rpc_type)
12198 {
12199 #ifndef SERVER
12200 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12201 Param2<bool, string> p = new Param2<bool, string>(false, "");
12202
12204 return;
12205
12206 bool play = p.param1;
12207 string soundSet = p.param2;
12208
12209 if (play)
12210 {
12212 {
12214 {
12216 }
12217 }
12218 else
12219 {
12221 }
12222 }
12223 else
12224 {
12226 }
12227
12228 break;
12229 #endif
12230
12231 }
12232
12234 {
12236 }
12237 }
12238
12239
12240
12241
12243 {
12244 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12245 return plugin.GetID(
name);
12246 }
12247
12249 {
12250 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12251 return plugin.GetName(id);
12252 }
12253
12256 {
12257
12258
12259 int varFlags;
12260 if (!ctx.
Read(varFlags))
12261 return;
12262
12263 if (varFlags & ItemVariableFlags.FLOAT)
12264 {
12266 }
12267 }
12268
12270 {
12271
12272 super.SerializeNumericalVars(floats_out);
12273
12274
12275
12277 {
12279 }
12280
12282 {
12284 }
12285
12287 {
12289 }
12290
12292 {
12297 }
12298
12300 {
12302 }
12303 }
12304
12306 {
12307
12308 super.DeSerializeNumericalVars(floats);
12309
12310
12311 int index = 0;
12312 int mask = Math.Round(floats.Get(index));
12313
12314 index++;
12315
12317 {
12319 {
12321 }
12322 else
12323 {
12324 float quantity = floats.Get(index);
12325 SetQuantity(quantity,
true,
false,
false,
false);
12326 }
12327 index++;
12328 }
12329
12331 {
12332 float wet = floats.Get(index);
12334 index++;
12335 }
12336
12338 {
12339 int liquidtype = Math.Round(floats.Get(index));
12341 index++;
12342 }
12343
12345 {
12347 index++;
12349 index++;
12351 index++;
12353 index++;
12354 }
12355
12357 {
12358 int cleanness = Math.Round(floats.Get(index));
12360 index++;
12361 }
12362 }
12363
12365 {
12366 super.WriteVarsToCTX(ctx);
12367
12368
12370 {
12372 }
12373
12375 {
12377 }
12378
12380 {
12382 }
12383
12385 {
12386 int r,g,b,a;
12392 }
12393
12395 {
12397 }
12398 }
12399
12401 {
12402 if (!super.ReadVarsFromCTX(ctx,version))
12403 return false;
12404
12405 int intValue;
12406 float value;
12407
12408 if (version < 140)
12409 {
12410 if (!ctx.
Read(intValue))
12411 return false;
12412
12413 m_VariablesMask = intValue;
12414 }
12415
12417 {
12418 if (!ctx.
Read(value))
12419 return false;
12420
12422 {
12424 }
12425 else
12426 {
12428 }
12429 }
12430
12431 if (version < 140)
12432 {
12434 {
12435 if (!ctx.
Read(value))
12436 return false;
12437 SetTemperatureDirect(value);
12438 }
12439 }
12440
12442 {
12443 if (!ctx.
Read(value))
12444 return false;
12446 }
12447
12449 {
12450 if (!ctx.
Read(intValue))
12451 return false;
12453 }
12454
12456 {
12457 int r,g,b,a;
12459 return false;
12461 return false;
12463 return false;
12465 return false;
12466
12468 }
12469
12471 {
12472 if (!ctx.
Read(intValue))
12473 return false;
12475 }
12476
12477 if (version >= 138 && version < 140)
12478 {
12480 {
12481 if (!ctx.
Read(intValue))
12482 return false;
12483 SetFrozen(intValue);
12484 }
12485 }
12486
12487 return true;
12488 }
12489
12490
12492 {
12495 {
12497 }
12498
12499 if (!super.OnStoreLoad(ctx, version))
12500 {
12502 return false;
12503 }
12504
12505 if (version >= 114)
12506 {
12507 bool hasQuickBarIndexSaved;
12508
12509 if (!ctx.
Read(hasQuickBarIndexSaved))
12510 {
12512 return false;
12513 }
12514
12515 if (hasQuickBarIndexSaved)
12516 {
12517 int itmQBIndex;
12518
12519
12520 if (!ctx.
Read(itmQBIndex))
12521 {
12523 return false;
12524 }
12525
12526 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12527 if (itmQBIndex != -1 && parentPlayer)
12528 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12529 }
12530 }
12531 else
12532 {
12533
12534 PlayerBase player;
12535 int itemQBIndex;
12536 if (version ==
int.
MAX)
12537 {
12538 if (!ctx.
Read(itemQBIndex))
12539 {
12541 return false;
12542 }
12543 }
12544 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12545 {
12546
12547 if (!ctx.
Read(itemQBIndex))
12548 {
12550 return false;
12551 }
12552 if (itemQBIndex != -1 && player)
12553 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12554 }
12555 }
12556
12557 if (version < 140)
12558 {
12559
12560 if (!LoadVariables(ctx, version))
12561 {
12563 return false;
12564 }
12565 }
12566
12567
12569 {
12571 return false;
12572 }
12573 if (version >= 132)
12574 {
12576 if (raib)
12577 {
12579 {
12581 return false;
12582 }
12583 }
12584 }
12585
12587 return true;
12588 }
12589
12590
12591
12593 {
12594 super.OnStoreSave(ctx);
12595
12596 PlayerBase player;
12597 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12598 {
12600
12601 int itemQBIndex = -1;
12602 itemQBIndex = player.FindQuickBarEntityIndex(this);
12603 ctx.
Write(itemQBIndex);
12604 }
12605 else
12606 {
12608 }
12609
12611
12613 if (raib)
12614 {
12616 }
12617 }
12618
12619
12621 {
12622 super.AfterStoreLoad();
12623
12625 {
12627 }
12628
12630 {
12633 }
12634 }
12635
12637 {
12638 super.EEOnAfterLoad();
12639
12641 {
12643 }
12644
12647 }
12648
12650 {
12651 return false;
12652 }
12653
12654
12655
12657 {
12659 {
12660 #ifdef PLATFORM_CONSOLE
12661
12663 {
12665 if (menu)
12666 {
12668 }
12669 }
12670 #endif
12671 }
12672
12674 {
12677 }
12678
12680 {
12681 SetWeightDirty();
12683 }
12685 {
12688 }
12689
12691 {
12694
12697 }
12699 {
12703 }
12704
12705 super.OnVariablesSynchronized();
12706 }
12707
12708
12709
12711 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12712 {
12713 if (!IsServerCheck(allow_client))
12714 return false;
12715
12717 return false;
12718
12721
12722 if (value <= (min + 0.001))
12723 value = min;
12724
12725 if (value == min)
12726 {
12727 if (destroy_config)
12728 {
12729 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12730 if (dstr)
12731 {
12733 this.Delete();
12734 return true;
12735 }
12736 }
12737 else if (destroy_forced)
12738 {
12740 this.Delete();
12741 return true;
12742 }
12743
12745 }
12746
12749
12751 {
12752 EntityAI parent = GetHierarchyRoot();
12753 InventoryLocation iLoc = new InventoryLocation();
12754 GetInventory().GetCurrentInventoryLocation(iLoc);
12756 {
12757 int iLocSlot = iLoc.
GetSlot();
12759 {
12761 }
12763 {
12765 }
12766 }
12767 }
12768
12770 {
12772
12773 if (delta)
12775 }
12776
12778
12779 return false;
12780 }
12781
12782
12784 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12785 {
12787 }
12788
12790 {
12793 }
12794
12796 {
12799 }
12800
12802 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12803 {
12804 float value_clamped = Math.Clamp(value, 0, 1);
12806 SetQuantity(result, destroy_config, destroy_forced);
12807 }
12808
12809
12812 {
12814 }
12815
12817 {
12819 }
12820
12821
12822
12823
12824
12825
12826
12827
12828
12829
12831 {
12832 int slot = -1;
12833 GameInventory inventory = GetInventory();
12834 if (inventory)
12835 {
12836 InventoryLocation il = new InventoryLocation;
12839 }
12840
12842 }
12843
12845 {
12846 float quantity_max = 0;
12847
12849 {
12850 if (attSlotID != -1)
12851 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12852
12853 if (quantity_max <= 0)
12855 }
12856
12857 if (quantity_max <= 0)
12859
12860 return quantity_max;
12861 }
12862
12864 {
12866 }
12867
12869 {
12871 }
12872
12873
12875 {
12877 }
12878
12880 {
12882 }
12883
12885 {
12887 }
12888
12889
12891 {
12892
12893 float weightEx = GetWeightEx();
12894 float special = GetInventoryAndCargoWeight();
12895 return weightEx - special;
12896 }
12897
12898
12900 {
12902 }
12903
12905 {
12907 {
12908 #ifdef DEVELOPER
12909 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12910 {
12911 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12913 }
12914 #endif
12915
12916 return GetQuantity() * GetConfigWeightModified();
12917 }
12918 else if (HasEnergyManager())
12919 {
12920 #ifdef DEVELOPER
12921 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12922 {
12923 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12924 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12925 }
12926 #endif
12927 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12928 }
12929 else
12930 {
12931 #ifdef DEVELOPER
12932 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12933 {
12934 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12935 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12936 }
12937 #endif
12938 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12939 }
12940 }
12941
12944 {
12945 int item_count = 0;
12947
12948 GameInventory inventory = GetInventory();
12949 CargoBase cargo = inventory.
GetCargo();
12950 if (cargo != NULL)
12951 {
12953 }
12954
12956 for (int i = 0; i < nAttachments; ++i)
12957 {
12959 if (item)
12960 item_count += item.GetNumberOfItems();
12961 }
12962 return item_count;
12963 }
12964
12967 {
12968 float weight = 0;
12969 float wetness = 1;
12970 if (include_wetness)
12973 {
12974 weight = wetness * m_ConfigWeight;
12975 }
12977 {
12978 weight = 1;
12979 }
12980 return weight;
12981 }
12982
12983
12984
12986 {
12987 GameInventory inventory = GetInventory();
12988 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12989 {
12990 array<EntityAI> items = new array<EntityAI>;
12992 for (int i = 0; i < items.Count(); ++i)
12993 {
12995 if (item)
12996 {
12997 g_Game.ObjectDelete(item);
12998 }
12999 }
13000 }
13001 }
13002
13003
13004
13005
13007 {
13008 float energy = 0;
13009 if (HasEnergyManager())
13010 {
13011 energy = GetCompEM().GetEnergy();
13012 }
13013 return energy;
13014 }
13015
13016
13018 {
13019 super.OnEnergyConsumed();
13020
13022 }
13023
13025 {
13026 super.OnEnergyAdded();
13027
13029 }
13030
13031
13033 {
13034 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13035 {
13037 {
13038 float energy_0to1 = GetCompEM().GetEnergy0To1();
13040 }
13041 }
13042 }
13043
13044
13046 {
13047 return ConfigGetFloat("heatIsolation");
13048 }
13049
13051 {
13053 }
13054
13056 {
13057 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13058 if (
g_Game.ConfigIsExisting(paramPath))
13059 return g_Game.ConfigGetFloat(paramPath);
13060
13061 return 0.0;
13062 }
13063
13065 {
13066 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13067 if (
g_Game.ConfigIsExisting(paramPath))
13068 return g_Game.ConfigGetFloat(paramPath);
13069
13070 return 0.0;
13071 }
13072
13073 override void SetWet(
float value,
bool allow_client =
false)
13074 {
13075 if (!IsServerCheck(allow_client))
13076 return;
13077
13080
13082
13083 m_VarWet = Math.Clamp(value, min, max);
13084
13086 {
13089 }
13090 }
13091
13092 override void AddWet(
float value)
13093 {
13095 }
13096
13098 {
13100 }
13101
13103 {
13105 }
13106
13108 {
13110 }
13111
13113 {
13115 }
13116
13118 {
13120 }
13121
13122 override void OnWetChanged(
float newVal,
float oldVal)
13123 {
13126 if (newLevel != oldLevel)
13127 {
13129 }
13130 }
13131
13133 {
13134 SetWeightDirty();
13135 }
13136
13138 {
13139 return GetWetLevelInternal(
m_VarWet);
13140 }
13141
13142
13143
13145 {
13147 }
13148
13150 {
13152 }
13153
13155 {
13157 }
13158
13160 {
13162 }
13163
13164
13165
13167 {
13168 if (ConfigIsExisting("itemModelLength"))
13169 {
13170 return ConfigGetFloat("itemModelLength");
13171 }
13172 return 0;
13173 }
13174
13176 {
13177 if (ConfigIsExisting("itemAttachOffset"))
13178 {
13179 return ConfigGetFloat("itemAttachOffset");
13180 }
13181 return 0;
13182 }
13183
13184 override void SetCleanness(
int value,
bool allow_client =
false)
13185 {
13186 if (!IsServerCheck(allow_client))
13187 return;
13188
13190
13192
13195 }
13196
13198 {
13200 }
13201
13203 {
13204 return true;
13205 }
13206
13207
13208
13209
13211 {
13213 }
13214
13216 {
13218 }
13219
13220
13221
13222
13223 override void SetColor(
int r,
int g,
int b,
int a)
13224 {
13230 }
13232 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13233 {
13238 }
13239
13241 {
13243 }
13244
13247 {
13248 int r,g,b,a;
13250 r = r/255;
13251 g = g/255;
13252 b = b/255;
13253 a = a/255;
13254 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13255 }
13256
13257
13258
13259 override void SetLiquidType(
int value,
bool allow_client =
false)
13260 {
13261 if (!IsServerCheck(allow_client))
13262 return;
13263
13268 }
13269
13271 {
13272 return ConfigGetInt("varLiquidTypeInit");
13273 }
13274
13276 {
13278 }
13279
13281 {
13283 SetFrozen(false);
13284 }
13285
13288 {
13289 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13290 }
13291
13292
13295 {
13296 PlayerBase nplayer;
13297 if (PlayerBase.CastTo(nplayer, player))
13298 {
13300 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13301 }
13302 }
13303
13304
13307 {
13308 PlayerBase nplayer;
13309 if (PlayerBase.CastTo(nplayer,player))
13310 {
13311 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13312 }
13313
13314 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13315
13316 if (HasEnergyManager())
13317 {
13318 GetCompEM().UpdatePlugState();
13319 }
13320 }
13321
13322
13324 {
13325 super.OnPlacementStarted(player);
13326
13328 }
13329
13330 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13331 {
13333 {
13334 m_AdminLog.OnPlacementComplete(player,
this);
13335 }
13336
13337 super.OnPlacementComplete(player, position, orientation);
13338 }
13339
13340
13341
13342
13343
13345 {
13347 {
13348 return true;
13349 }
13350 else
13351 {
13352 return false;
13353 }
13354 }
13355
13356
13358 {
13360 {
13362 }
13363 }
13364
13365
13367 {
13369 }
13370
13372 {
13374 }
13375
13376 override void InsertAgent(
int agent,
float count = 1)
13377 {
13378 if (count < 1)
13379 return;
13380
13382 }
13383
13386 {
13388 }
13389
13390
13392 {
13394 }
13395
13396
13397
13398
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13438 {
13440 return false;
13441 return true;
13442 }
13443
13445 {
13446
13448 }
13449
13450
13453 {
13454 super.CheckForRoofLimited(timeTresholdMS);
13455
13456 float time =
g_Game.GetTime();
13457 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13458 {
13459 m_PreviousRoofTestTime = time;
13460 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13461 }
13462 }
13463
13464
13466 {
13468 {
13469 return 0;
13470 }
13471
13472 if (GetInventory().GetAttachmentSlotsCount() != 0)
13473 {
13474 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13475 if (filter)
13476 return filter.GetProtectionLevel(type, false, system);
13477 else
13478 return 0;
13479 }
13480
13481 string subclassPath, entryName;
13482
13483 switch (type)
13484 {
13486 entryName = "biological";
13487 break;
13489 entryName = "chemical";
13490 break;
13491 default:
13492 entryName = "biological";
13493 break;
13494 }
13495
13496 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13497
13498 return g_Game.ConfigGetFloat(subclassPath + entryName);
13499 }
13500
13501
13502
13505 {
13506 if (!IsMagazine())
13508
13510 }
13511
13512
13513
13514
13515
13520 {
13521 return true;
13522 }
13523
13525 {
13527 }
13528
13529
13530
13531
13532
13534 {
13535 if (parent)
13536 {
13537 if (parent.IsInherited(DayZInfected))
13538 return true;
13539
13540 if (!parent.IsRuined())
13541 return true;
13542 }
13543
13544 return true;
13545 }
13546
13548 {
13549 if (!super.CanPutAsAttachment(parent))
13550 {
13551 return false;
13552 }
13553
13554 if (!IsRuined() && !parent.IsRuined())
13555 {
13556 return true;
13557 }
13558
13559 return false;
13560 }
13561
13563 {
13564
13565
13566
13567
13568 return super.CanReceiveItemIntoCargo(item);
13569 }
13570
13572 {
13573
13574
13575
13576
13577 GameInventory attachmentInv = attachment.GetInventory();
13579 {
13580 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13581 return false;
13582 }
13583
13584 InventoryLocation loc = new InventoryLocation();
13585 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13586 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13587 return false;
13588
13589 return super.CanReceiveAttachment(attachment, slotId);
13590 }
13591
13593 {
13594 if (!super.CanReleaseAttachment(attachment))
13595 return false;
13596
13597 return GetInventory().AreChildrenAccessible();
13598 }
13599
13600
13601
13602
13603
13604
13605
13606
13607
13608
13609
13610
13611
13612
13613
13614
13615
13616
13617
13618
13619
13621 {
13622 int id = muzzle_owner.GetMuzzleID();
13623 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13624
13625 if (WPOF_array)
13626 {
13627 for (int i = 0; i < WPOF_array.Count(); i++)
13628 {
13629 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13630
13631 if (WPOF)
13632 {
13633 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13634 }
13635 }
13636 }
13637 }
13638
13639
13641 {
13642 int id = muzzle_owner.GetMuzzleID();
13644
13645 if (WPOBE_array)
13646 {
13647 for (int i = 0; i < WPOBE_array.Count(); i++)
13648 {
13649 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13650
13651 if (WPOBE)
13652 {
13653 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13654 }
13655 }
13656 }
13657 }
13658
13659
13661 {
13662 int id = muzzle_owner.GetMuzzleID();
13663 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13664
13665 if (WPOOH_array)
13666 {
13667 for (int i = 0; i < WPOOH_array.Count(); i++)
13668 {
13669 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13670
13671 if (WPOOH)
13672 {
13673 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13674 }
13675 }
13676 }
13677 }
13678
13679
13681 {
13682 int id = muzzle_owner.GetMuzzleID();
13683 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13684
13685 if (WPOOH_array)
13686 {
13687 for (int i = 0; i < WPOOH_array.Count(); i++)
13688 {
13689 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13690
13691 if (WPOOH)
13692 {
13693 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13694 }
13695 }
13696 }
13697 }
13698
13699
13701 {
13702 int id = muzzle_owner.GetMuzzleID();
13703 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13704
13705 if (WPOOH_array)
13706 {
13707 for (int i = 0; i < WPOOH_array.Count(); i++)
13708 {
13709 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13710
13711 if (WPOOH)
13712 {
13713 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13714 }
13715 }
13716 }
13717 }
13718
13719
13720
13722 {
13724 {
13725 return true;
13726 }
13727
13728 return false;
13729 }
13730
13732 {
13734 {
13735 return true;
13736 }
13737
13738 return false;
13739 }
13740
13742 {
13744 {
13745 return true;
13746 }
13747
13748 return false;
13749 }
13750
13752 {
13753 return false;
13754 }
13755
13758 {
13759 return UATimeSpent.DEFAULT_DEPLOY;
13760 }
13761
13762
13763
13764
13766 {
13768 SetSynchDirty();
13769 }
13770
13772 {
13774 }
13775
13776
13778 {
13779 return false;
13780 }
13781
13784 {
13785 string att_type = "None";
13786
13787 if (ConfigIsExisting("soundAttType"))
13788 {
13789 att_type = ConfigGetString("soundAttType");
13790 }
13791
13793 }
13794
13796 {
13798 }
13799
13800
13801
13802
13803
13809
13811 {
13814
13816 }
13817
13818
13820 {
13822 return;
13823
13825
13828
13831
13832 SoundParameters params = new SoundParameters();
13836 }
13837
13838
13840 {
13842 {
13845
13846 SetSynchDirty();
13847
13850 }
13851 }
13852
13854 {
13856 }
13857
13858
13860 {
13862 return;
13863
13865 SetSynchDirty();
13866
13869 }
13870
13872 {
13875 }
13876
13878 {
13880 }
13881
13882 void OnApply(PlayerBase player);
13883
13885 {
13886 return 1.0;
13887 };
13888
13890 {
13892 }
13893
13895 {
13897 }
13898
13900
13902 {
13903 SetDynamicPhysicsLifeTime(0.01);
13905 }
13906
13908 {
13909 array<string> zone_names = new array<string>;
13910 GetDamageZones(zone_names);
13911 for (int i = 0; i < zone_names.Count(); i++)
13912 {
13913 SetHealthMax(zone_names.Get(i),"Health");
13914 }
13915 SetHealthMax("","Health");
13916 }
13917
13920 {
13921 float global_health = GetHealth01("","Health");
13922 array<string> zones = new array<string>;
13923 GetDamageZones(zones);
13924
13925 for (int i = 0; i < zones.Count(); i++)
13926 {
13927 SetHealth01(zones.Get(i),"Health",global_health);
13928 }
13929 }
13930
13933 {
13934 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13935 }
13936
13938 {
13939 if (!hasRootAsPlayer)
13940 {
13941 if (refParentIB)
13942 {
13943
13944 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13945 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13946
13947 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13948 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13949
13952 }
13953 else
13954 {
13955
13958 }
13959 }
13960 }
13961
13963 {
13965 {
13966 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13967 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13968 {
13969 float heatPermCoef = 1.0;
13971 while (ent)
13972 {
13973 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13974 ent = ent.GetHierarchyParent();
13975 }
13976
13977 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13978 }
13979 }
13980 }
13981
13983 {
13984
13985 EntityAI parent = GetHierarchyParent();
13986 if (!parent)
13987 {
13988 hasParent = false;
13989 hasRootAsPlayer = false;
13990 }
13991 else
13992 {
13993 hasParent = true;
13994 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13995 refParentIB =
ItemBase.Cast(parent);
13996 }
13997 }
13998
13999 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14000 {
14001
14002 }
14003
14005 {
14006
14007 return false;
14008 }
14009
14011 {
14012
14013
14014 return false;
14015 }
14016
14018 {
14019
14020 return false;
14021 }
14022
14025 {
14026 return !GetIsFrozen() &&
IsOpen();
14027 }
14028
14030 {
14031 bool hasParent = false, hasRootAsPlayer = false;
14033
14034 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14035 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14036
14037 if (wwtu || foodDecay)
14038 {
14042
14043 if (processWetness || processTemperature || processDecay)
14044 {
14046
14047 if (processWetness)
14048 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14049
14050 if (processTemperature)
14052
14053 if (processDecay)
14054 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14055 }
14056 }
14057 }
14058
14061 {
14063 }
14064
14066 {
14069
14070 return super.GetTemperatureFreezeThreshold();
14071 }
14072
14074 {
14077
14078 return super.GetTemperatureThawThreshold();
14079 }
14080
14082 {
14085
14086 return super.GetItemOverheatThreshold();
14087 }
14088
14090 {
14092 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14093
14094 return super.GetTemperatureFreezeTime();
14095 }
14096
14098 {
14100 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14101
14102 return super.GetTemperatureThawTime();
14103 }
14104
14109
14111 {
14112 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14113 }
14114
14116 {
14117 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14118 }
14119
14122 {
14124 }
14125
14127 {
14129 }
14130
14132 {
14134 }
14135
14138 {
14139 return null;
14140 }
14141
14144 {
14145 return false;
14146 }
14147
14149 {
14151 {
14154 if (!trg)
14155 {
14157 explosive = this;
14158 }
14159
14160 explosive.PairRemote(trg);
14162
14163 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14164 trg.SetPersistentPairID(persistentID);
14165 explosive.SetPersistentPairID(persistentID);
14166
14167 return true;
14168 }
14169 return false;
14170 }
14171
14174 {
14175 float ret = 1.0;
14178 ret *= GetHealth01();
14179
14180 return ret;
14181 }
14182
14183 #ifdef DEVELOPER
14184 override void SetDebugItem()
14185 {
14186 super.SetDebugItem();
14187 _itemBase = this;
14188 }
14189
14191 {
14192 string text = super.GetDebugText();
14193
14195 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14196
14197 return text;
14198 }
14199 #endif
14200
14202 {
14203 return true;
14204 }
14205
14207
14209
14211 {
14214 }
14215
14216
14224
14240
14241 [
Obsolete(
"Use ItemSoundHandler instead")]
14244 {
14245 if (!
g_Game.IsDedicatedServer())
14246 {
14247 if (ConfigIsExisting("attachSoundSet"))
14248 {
14249 string cfg_path = "";
14250 string soundset = "";
14251 string type_name =
GetType();
14252
14255 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14256 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14257
14258 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14259 {
14260 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14261 {
14262 if (cfg_slot_array[i] == slot_type)
14263 {
14264 soundset = cfg_soundset_array[i];
14265 break;
14266 }
14267 }
14268 }
14269
14270 if (soundset != "")
14271 {
14272 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14274 }
14275 }
14276 }
14277 }
14278
14280}
14281
14283{
14285 if (entity)
14286 {
14287 bool is_item = entity.IsInherited(
ItemBase);
14288 if (is_item && full_quantity)
14289 {
14292 }
14293 }
14294 else
14295 {
14297 return NULL;
14298 }
14299 return entity;
14300}
14301
14303{
14304 if (item)
14305 {
14306 if (health > 0)
14307 item.SetHealth("", "", health);
14308
14309 if (item.CanHaveTemperature())
14310 {
14312 if (item.CanFreeze())
14313 item.SetFrozen(false);
14314 }
14315
14316 if (item.HasEnergyManager())
14317 {
14318 if (quantity >= 0)
14319 {
14320 item.GetCompEM().SetEnergy0To1(quantity);
14321 }
14322 else
14323 {
14325 }
14326 }
14327 else if (item.IsMagazine())
14328 {
14329 Magazine mag = Magazine.Cast(item);
14330 if (quantity >= 0)
14331 {
14332 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14333 }
14334 else
14335 {
14337 }
14338
14339 }
14340 else
14341 {
14342 if (quantity >= 0)
14343 {
14344 item.SetQuantityNormalized(quantity, false);
14345 }
14346 else
14347 {
14349 }
14350
14351 }
14352 }
14353}
14354
14355#ifdef DEVELOPER
14357#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.