9423{
9425 {
9426 return true;
9427 }
9428};
9429
9431{
9432
9433};
9434
9435
9436
9438{
9442
9444
9447
9448
9449
9450
9451
9460
9466
9471
9476
9497 protected bool m_IsResultOfSplit
9498
9500
9505
9506
9507
9509
9513
9514
9515
9517
9520
9521
9522
9528
9529
9537
9540
9541
9543
9544
9546
9547
9552
9553
9558
9560
9561
9563
9564
9566 {
9571
9572 if (!
g_Game.IsDedicatedServer())
9573 {
9575 {
9577
9579 {
9581 }
9582 }
9583
9586 }
9587
9588 m_OldLocation = null;
9589
9591 {
9593 }
9594
9595 if (ConfigIsExisting("headSelectionsToHide"))
9596 {
9599 }
9600
9602 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9603 {
9605 }
9606
9608
9609 m_IsResultOfSplit = false;
9610
9612 }
9613
9615 {
9616 super.InitItemVariables();
9617
9623 m_Count = ConfigGetInt(
"count");
9624
9627
9632
9635
9640
9652
9656
9657
9660 if (ConfigIsExisting("canBeSplit"))
9661 {
9664 }
9665
9667 if (ConfigIsExisting("itemBehaviour"))
9669
9670
9673 RegisterNetSyncVariableInt("m_VarLiquidType");
9674 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9675
9676 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9677 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9678 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9679
9680 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9681 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9682 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9683 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9684
9685 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9686 RegisterNetSyncVariableBool("m_IsTakeable");
9687 RegisterNetSyncVariableBool("m_IsHologram");
9688
9691 {
9694 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9695 }
9696
9698
9700 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9702
9704 }
9705
9707 {
9709 }
9710
9712 {
9715 {
9720 }
9721 }
9722
9723 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9724 {
9726 {
9729 }
9730
9732 }
9733
9735 {
9741 }
9742
9744
9746 {
9748
9749 if (!action)
9750 {
9751 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9752 return;
9753 }
9754
9756 if (!ai)
9757 {
9759 return;
9760 }
9761
9763 if (!action_array)
9764 {
9765 action_array = new array<ActionBase_Basic>;
9767 }
9768 if (LogManager.IsActionLogEnable())
9769 {
9770 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9771 }
9772
9773 if (action_array.Find(action) != -1)
9774 {
9775 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9776 }
9777 else
9778 {
9779 action_array.Insert(action);
9780 }
9781 }
9782
9784 {
9785 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9786 ActionBase action = player.GetActionManager().GetAction(actionName);
9789
9790 if (action_array)
9791 {
9792 action_array.RemoveItem(action);
9793 }
9794 }
9795
9796
9797
9799 {
9800 ActionOverrideData overrideData = new ActionOverrideData();
9804
9806 if (!actionMap)
9807 {
9810 }
9811
9812 actionMap.Insert(this.
Type(), overrideData);
9813
9814 }
9815
9817
9819
9820
9822 {
9825
9828
9829 string config_to_search = "CfgVehicles";
9830 string muzzle_owner_config;
9831
9833 {
9834 if (IsInherited(Weapon))
9835 config_to_search = "CfgWeapons";
9836
9837 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9838
9839 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9840
9841 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9842
9843 if (config_OnFire_subclass_count > 0)
9844 {
9845 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9846
9847 for (int i = 0; i < config_OnFire_subclass_count; i++)
9848 {
9849 string particle_class = "";
9850 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9851 string config_OnFire_entry = config_OnFire_class + particle_class;
9852 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9853 WPOF_array.Insert(WPOF);
9854 }
9855
9856
9858 }
9859 }
9860
9862 {
9863 config_to_search = "CfgWeapons";
9864 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9865
9866 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9867
9868 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9869
9870 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9871 {
9872 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9873
9874 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9875 {
9876 string particle_class2 = "";
9877 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9878 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9879 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9880 WPOBE_array.Insert(WPOBE);
9881 }
9882
9883
9885 }
9886 }
9887 }
9888
9889
9891 {
9894
9896 {
9897 string config_to_search = "CfgVehicles";
9898
9899 if (IsInherited(Weapon))
9900 config_to_search = "CfgWeapons";
9901
9902 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9903 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9904
9905 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9906 {
9907
9909
9911 {
9913 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9915 return;
9916 }
9917
9920
9921
9922
9923 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9924 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9925
9926 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9927 {
9928 string particle_class = "";
9929 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9930 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9931 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9932
9933 if (entry_type == CT_CLASS)
9934 {
9935 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9936 WPOOH_array.Insert(WPOF);
9937 }
9938 }
9939
9940
9942 }
9943 }
9944 }
9945
9947 {
9949 }
9950
9952 {
9954 {
9956
9959
9962
9963 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9964 }
9965 }
9966
9968 {
9970 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9971
9973 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9974
9976 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9977
9979 {
9981 }
9982 }
9983
9985 {
9987 }
9988
9990 {
9993 else
9995
9997 {
10000 }
10001 else
10002 {
10005
10008 }
10009
10011 }
10012
10014 {
10016 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10017 }
10018
10020 {
10022 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
10024 }
10025
10027 {
10029 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10030 }
10031
10033 {
10036
10037 OverheatingParticle OP = new OverheatingParticle();
10042
10044 }
10045
10047 {
10050
10051 return -1;
10052 }
10053
10055 {
10057 {
10060
10061 for (int i = count; i > 0; --i)
10062 {
10063 int id = i - 1;
10066
10069
10070 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10071 {
10072 if (p)
10073 {
10076 }
10077 }
10078 }
10079 }
10080 }
10081
10083 {
10085 {
10087 {
10088 int id = i - 1;
10090
10091 if (OP)
10092 {
10094
10095 if (p)
10096 {
10098 }
10099
10100 delete OP;
10101 }
10102 }
10103
10106 }
10107 }
10108
10111 {
10112 return 0.0;
10113 }
10114
10115
10117 {
10118 return 250;
10119 }
10120
10122 {
10123 return 0;
10124 }
10125
10128 {
10130 return true;
10131
10132 return false;
10133 }
10134
10137 {
10140
10142 {
10144 }
10145 else
10146 {
10147
10149 }
10150
10152 }
10153
10160 {
10161 return -1;
10162 }
10163
10164
10165
10166
10168 {
10170 {
10171 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10172 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10173
10174 if (r_index >= 0)
10175 {
10176 InventoryLocation r_il = new InventoryLocation;
10177 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10178
10179 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10182 {
10183 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10184 }
10186 {
10187 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10188 }
10189
10190 }
10191
10192 player.GetHumanInventory().ClearUserReservedLocation(this);
10193 }
10194
10197 }
10198
10199
10200
10201
10203 {
10204 return ItemBase.m_DebugActionsMask;
10205 }
10206
10208 {
10209 return ItemBase.m_DebugActionsMask & mask;
10210 }
10211
10213 {
10214 ItemBase.m_DebugActionsMask = mask;
10215 }
10216
10218 {
10219 ItemBase.m_DebugActionsMask |= mask;
10220 }
10221
10223 {
10224 ItemBase.m_DebugActionsMask &= ~mask;
10225 }
10226
10228 {
10230 {
10232 }
10233 else
10234 {
10236 }
10237 }
10238
10239
10241 {
10242 if (GetEconomyProfile())
10243 {
10244 float q_max = GetEconomyProfile().GetQuantityMax();
10245 if (q_max > 0)
10246 {
10247 float q_min = GetEconomyProfile().GetQuantityMin();
10248 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10249
10251 {
10252 ComponentEnergyManager comp = GetCompEM();
10254 {
10256 }
10257 }
10259 {
10261
10262 }
10263
10264 }
10265 }
10266 }
10267
10270 {
10271 EntityAI parent = GetHierarchyParent();
10272
10273 if (parent)
10274 {
10275 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10276 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10277 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10278 }
10279 }
10280
10283 {
10284 EntityAI parent = GetHierarchyParent();
10285
10286 if (parent)
10287 {
10288 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10289 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10290 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10291 }
10292 }
10293
10295 {
10296
10297
10298
10299
10301
10303 {
10304 if (ScriptInputUserData.CanStoreInputUserData())
10305 {
10306 ScriptInputUserData ctx = new ScriptInputUserData;
10312 ctx.
Write(use_stack_max);
10315
10317 {
10318 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10319 }
10320 }
10321 }
10322 else if (!
g_Game.IsMultiplayer())
10323 {
10325 }
10326 }
10327
10329 {
10331 }
10332
10334 {
10336 }
10337
10339 {
10341 }
10342
10344 {
10345
10346 return false;
10347 }
10348
10350 {
10351 return false;
10352 }
10353
10357 {
10358 return false;
10359 }
10360
10362 {
10363 return "";
10364 }
10365
10367
10369 {
10370 return false;
10371 }
10372
10374 {
10375 return true;
10376 }
10377
10378
10379
10381 {
10382 return true;
10383 }
10384
10386 {
10387 return true;
10388 }
10389
10391 {
10392 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10394 }
10395
10397 {
10399 }
10400
10402 {
10404 if (!is_being_placed)
10406 SetSynchDirty();
10407 }
10408
10409
10411
10413 {
10415 }
10416
10418 {
10420 }
10421
10423 {
10424 return 1;
10425 }
10426
10428 {
10429 return false;
10430 }
10431
10433 {
10435 SetSynchDirty();
10436 }
10437
10438
10439
10440
10441
10442
10443
10444
10445
10446
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457
10458
10459
10460
10461
10462
10463
10464
10465
10466
10467
10468
10469
10470
10471
10473 {
10474 super.OnMovedInsideCargo(container);
10475
10476 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10477 }
10478
10479 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10480 {
10481 super.EEItemLocationChanged(oldLoc, newLoc);
10482
10483 PlayerBase newPlayer = null;
10484 PlayerBase oldPlayer = null;
10485
10486 if (newLoc.GetParent())
10487 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10488
10489 if (oldLoc.GetParent())
10490 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10491
10493 {
10494 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10495
10496 if (rIndex >= 0)
10497 {
10498 InventoryLocation rIl = new InventoryLocation;
10499 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10500
10501 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10504 {
10505 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10506 }
10508 {
10510 }
10511
10512 }
10513 }
10514
10516 {
10517 if (newPlayer)
10518 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10519
10520 if (newPlayer == oldPlayer)
10521 {
10522 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10523 {
10525 {
10526 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10527 {
10528 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10529 }
10530 }
10531 else
10532 {
10533 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10534 }
10535 }
10536
10537 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10538 {
10539 int type = oldLoc.GetType();
10541 {
10542 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10543 }
10545 {
10546 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10547 }
10548 }
10549 if (!m_OldLocation)
10550 {
10551 m_OldLocation = new InventoryLocation;
10552 }
10553 m_OldLocation.Copy(oldLoc);
10554 }
10555 else
10556 {
10557 if (m_OldLocation)
10558 {
10559 m_OldLocation.Reset();
10560 }
10561 }
10562
10563 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10564 }
10565 else
10566 {
10567 if (newPlayer)
10568 {
10569 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10570 if (resIndex >= 0)
10571 {
10572 InventoryLocation il = new InventoryLocation;
10573 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10575 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10578 {
10579 il.
GetParent().GetOnReleaseLock().Invoke(it);
10580 }
10582 {
10584 }
10585
10586 }
10587 }
10589 {
10590
10592 }
10593
10594 if (m_OldLocation)
10595 {
10596 m_OldLocation.Reset();
10597 }
10598 }
10599
10601 {
10602 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10603 }
10604
10606 {
10607 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10608 }
10609 }
10610
10611 override void EOnContact(IEntity other, Contact extra)
10612 {
10614 {
10615 int liquidType = -1;
10617 if (impactSpeed > 0.0)
10618 {
10620 #ifndef SERVER
10622 #else
10624 SetSynchDirty();
10625 #endif
10627 }
10628 }
10629
10630 #ifdef SERVER
10631 if (GetCompEM() && GetCompEM().IsPlugged())
10632 {
10633 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10634 GetCompEM().UnplugThis();
10635 }
10636 #endif
10637 }
10638
10640
10642 {
10644 }
10645
10647 {
10648
10649 }
10650
10652 {
10653 super.OnItemLocationChanged(old_owner, new_owner);
10654
10655 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10656 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10657
10658 if (!relatedPlayer && playerNew)
10659 relatedPlayer = playerNew;
10660
10661 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10662 {
10664 if (actionMgr)
10665 {
10666 ActionBase currentAction = actionMgr.GetRunningAction();
10667 if (currentAction)
10669 }
10670 }
10671
10672 Man ownerPlayerOld = null;
10673 Man ownerPlayerNew = null;
10674
10675 if (old_owner)
10676 {
10677 if (old_owner.
IsMan())
10678 {
10679 ownerPlayerOld = Man.Cast(old_owner);
10680 }
10681 else
10682 {
10683 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10684 }
10685 }
10686 else
10687 {
10689 {
10691
10692 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10693 {
10694 GetCompEM().UnplugThis();
10695 }
10696 }
10697 }
10698
10699 if (new_owner)
10700 {
10701 if (new_owner.
IsMan())
10702 {
10703 ownerPlayerNew = Man.Cast(new_owner);
10704 }
10705 else
10706 {
10707 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10708 }
10709 }
10710
10711 if (ownerPlayerOld != ownerPlayerNew)
10712 {
10713 if (ownerPlayerOld)
10714 {
10715 array<EntityAI> subItemsExit = new array<EntityAI>;
10717 for (int i = 0; i < subItemsExit.Count(); i++)
10718 {
10721 }
10722 }
10723
10724 if (ownerPlayerNew)
10725 {
10726 array<EntityAI> subItemsEnter = new array<EntityAI>;
10728 for (int j = 0; j < subItemsEnter.Count(); j++)
10729 {
10732 }
10733 }
10734 }
10735 else if (ownerPlayerNew != null)
10736 {
10737 PlayerBase nplayer;
10738 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10739 {
10740 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10742 for (int k = 0; k < subItemsUpdate.Count(); k++)
10743 {
10745 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10746 }
10747 }
10748 }
10749
10750 if (old_owner)
10751 old_owner.OnChildItemRemoved(this);
10752 if (new_owner)
10753 new_owner.OnChildItemReceived(this);
10754 }
10755
10756
10758 {
10759 super.EEDelete(parent);
10760 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10761 if (player)
10762 {
10764
10765 if (player.IsAlive())
10766 {
10767 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10768 if (r_index >= 0)
10769 {
10770 InventoryLocation r_il = new InventoryLocation;
10771 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10772
10773 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10776 {
10777 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10778 }
10780 {
10781 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10782 }
10783
10784 }
10785
10786 player.RemoveQuickBarEntityShortcut(this);
10787 }
10788 }
10789 }
10790
10792 {
10793 super.EEKilled(killer);
10794
10797 {
10798 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10799 {
10800 if (IsMagazine())
10801 {
10802 if (Magazine.Cast(this).GetAmmoCount() > 0)
10803 {
10805 }
10806 }
10807 else
10808 {
10810 }
10811 }
10812 }
10813 }
10814
10816 {
10817 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10818
10819 super.OnWasAttached(parent, slot_id);
10820
10823
10826 }
10827
10829 {
10830 super.OnWasDetached(parent, slot_id);
10831
10834
10837 }
10838
10840 {
10841 int idx;
10844
10845 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10846 if (inventory_slots.Count() < 1)
10847 {
10848 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10849 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10850 }
10851 else
10852 {
10853 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10854 }
10855
10856 idx = inventory_slots.Find(slot);
10857 if (idx < 0)
10858 return "";
10859
10860 return attach_types.Get(idx);
10861 }
10862
10864 {
10865 int idx = -1;
10866 string slot;
10867
10870
10871 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10872 if (inventory_slots.Count() < 1)
10873 {
10874 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10875 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10876 }
10877 else
10878 {
10879 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10880 if (detach_types.Count() < 1)
10881 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10882 }
10883
10884 for (int i = 0; i < inventory_slots.Count(); i++)
10885 {
10886 slot = inventory_slots.Get(i);
10887 }
10888
10889 if (slot != "")
10890 {
10891 if (detach_types.Count() == 1)
10892 idx = 0;
10893 else
10894 idx = inventory_slots.Find(slot);
10895 }
10896 if (idx < 0)
10897 return "";
10898
10899 return detach_types.Get(idx);
10900 }
10901
10903 {
10904
10906
10907
10908 float min_time = 1;
10909 float max_time = 3;
10910 float delay = Math.RandomFloat(min_time, max_time);
10911
10912 explode_timer.Run(delay, this, "DoAmmoExplosion");
10913 }
10914
10916 {
10917 Magazine magazine = Magazine.Cast(this);
10918 int pop_sounds_count = 6;
10919 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10920
10921
10922 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10923 string sound_name = pop_sounds[ sound_idx ];
10924 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10925
10926
10927 magazine.ServerAddAmmoCount(-1);
10928
10929
10930 float min_temp_to_explode = 100;
10931
10932 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10933 {
10935 }
10936 }
10937
10938
10939 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10940 {
10941 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10942
10943 const int CHANCE_DAMAGE_CARGO = 4;
10944 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10945 const int CHANCE_DAMAGE_NOTHING = 2;
10946
10948 {
10949 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10950 int chances;
10951 int rnd;
10952
10953 if (GetInventory().GetCargo())
10954 {
10955 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10956 rnd = Math.RandomInt(0,chances);
10957
10958 if (rnd < CHANCE_DAMAGE_CARGO)
10959 {
10961 }
10962 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10963 {
10965 }
10966 }
10967 else
10968 {
10969 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10970 rnd = Math.RandomInt(0,chances);
10971
10972 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10973 {
10975 }
10976 }
10977 }
10978 }
10979
10981 {
10982 CargoBase cargo = GetInventory().GetCargo();
10983 if (cargo)
10984 {
10986 if (item_count > 0)
10987 {
10988 int random_pick = Math.RandomInt(0, item_count);
10990 if (!item.IsExplosive())
10991 {
10992 item.AddHealth("","",damage);
10993 return true;
10994 }
10995 }
10996 }
10997 return false;
10998 }
10999
11001 {
11002 GameInventory inventory = GetInventory();
11004 if (attachment_count > 0)
11005 {
11006 int random_pick = Math.RandomInt(0, attachment_count);
11008 if (!attachment.IsExplosive())
11009 {
11010 attachment.AddHealth("","",damage);
11011 return true;
11012 }
11013 }
11014 return false;
11015 }
11016
11018 {
11020 }
11021
11023 {
11025 return GetInventory().CanRemoveEntity();
11026
11027 return false;
11028 }
11029
11031 {
11032
11034 return false;
11035
11036
11038 return false;
11039
11040
11041
11043 if (delta == 0)
11044 return false;
11045
11046
11047 return true;
11048 }
11049
11051 {
11053 {
11054 if (ScriptInputUserData.CanStoreInputUserData())
11055 {
11056 ScriptInputUserData ctx = new ScriptInputUserData;
11061 ctx.
Write(destination_entity);
11063 ctx.
Write(slot_id);
11065 }
11066 }
11067 else if (!
g_Game.IsMultiplayer())
11068 {
11070 }
11071 }
11072
11074 {
11075 float split_quantity_new;
11079 InventoryLocation loc = new InventoryLocation;
11080
11081 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11082 {
11084 split_quantity_new = stack_max;
11085 else
11087
11089 {
11090 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11091 if (new_item)
11092 {
11093 new_item.SetResultOfSplit(true);
11094 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11096 new_item.
SetQuantity(split_quantity_new,
false,
true);
11097 }
11098 }
11099 }
11100 else if (destination_entity && slot_id == -1)
11101 {
11102 if (quantity > stack_max)
11103 split_quantity_new = stack_max;
11104 else
11105 split_quantity_new = quantity;
11106
11108 {
11109 GameInventory destinationInventory = destination_entity.GetInventory();
11111 {
11114 }
11115
11116 if (new_item)
11117 {
11118 new_item.SetResultOfSplit(true);
11119 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11121 new_item.
SetQuantity(split_quantity_new,
false,
true);
11122 }
11123 }
11124 }
11125 else
11126 {
11127 if (stack_max != 0)
11128 {
11130 {
11132 }
11133
11134 if (split_quantity_new == 0)
11135 {
11136 if (!
g_Game.IsMultiplayer())
11137 player.PhysicalPredictiveDropItem(this);
11138 else
11139 player.ServerDropEntity(this);
11140 return;
11141 }
11142
11144 {
11146
11147 if (new_item)
11148 {
11149 new_item.SetResultOfSplit(true);
11150 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11153 new_item.PlaceOnSurface();
11154 }
11155 }
11156 }
11157 }
11158 }
11159
11161 {
11162 float split_quantity_new;
11166 InventoryLocation loc = new InventoryLocation;
11167
11168 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11169 {
11171 split_quantity_new = stack_max;
11172 else
11174
11176 {
11177 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11178 if (new_item)
11179 {
11180 new_item.SetResultOfSplit(true);
11181 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11183 new_item.
SetQuantity(split_quantity_new,
false,
true);
11184 }
11185 }
11186 }
11187 else if (destination_entity && slot_id == -1)
11188 {
11189 if (quantity > stack_max)
11190 split_quantity_new = stack_max;
11191 else
11192 split_quantity_new = quantity;
11193
11195 {
11196 GameInventory destinationInventory = destination_entity.GetInventory();
11198 {
11201 }
11202
11203 if (new_item)
11204 {
11205 new_item.SetResultOfSplit(true);
11206 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11208 new_item.
SetQuantity(split_quantity_new,
false,
true);
11209 }
11210 }
11211 }
11212 else
11213 {
11214 if (stack_max != 0)
11215 {
11217 {
11219 }
11220
11222 {
11224
11225 if (new_item)
11226 {
11227 new_item.SetResultOfSplit(true);
11228 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11231 new_item.PlaceOnSurface();
11232 }
11233 }
11234 }
11235 }
11236 }
11237
11239 {
11241 {
11242 if (ScriptInputUserData.CanStoreInputUserData())
11243 {
11244 ScriptInputUserData ctx = new ScriptInputUserData;
11249 dst.WriteToContext(ctx);
11251 }
11252 }
11253 else if (!
g_Game.IsMultiplayer())
11254 {
11256 }
11257 }
11258
11260 {
11262 {
11263 if (ScriptInputUserData.CanStoreInputUserData())
11264 {
11265 ScriptInputUserData ctx = new ScriptInputUserData;
11270 ctx.
Write(destination_entity);
11276 }
11277 }
11278 else if (!
g_Game.IsMultiplayer())
11279 {
11281 }
11282 }
11283
11285 {
11287 }
11288
11290 {
11292 float split_quantity_new;
11294 if (dst.IsValid())
11295 {
11296 int slot_id = dst.GetSlot();
11298
11299 if (quantity > stack_max)
11300 split_quantity_new = stack_max;
11301 else
11302 split_quantity_new = quantity;
11303
11305 {
11307
11308 if (new_item)
11309 {
11310 new_item.SetResultOfSplit(true);
11311 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11313 new_item.
SetQuantity(split_quantity_new,
false,
true);
11314 }
11315
11316 return new_item;
11317 }
11318 }
11319
11320 return null;
11321 }
11322
11324 {
11326 float split_quantity_new;
11328 if (destination_entity)
11329 {
11331 if (quantity > stackable)
11332 split_quantity_new = stackable;
11333 else
11334 split_quantity_new = quantity;
11335
11337 {
11338 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11339 if (new_item)
11340 {
11341 new_item.SetResultOfSplit(true);
11342 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11344 new_item.
SetQuantity(split_quantity_new,
false,
true);
11345 }
11346 }
11347 }
11348 }
11349
11351 {
11353 {
11354 if (ScriptInputUserData.CanStoreInputUserData())
11355 {
11356 ScriptInputUserData ctx = new ScriptInputUserData;
11361 ItemBase destination_entity =
this;
11362 ctx.
Write(destination_entity);
11366 }
11367 }
11368 else if (!
g_Game.IsMultiplayer())
11369 {
11371 }
11372 }
11373
11375 {
11377 float split_quantity_new;
11379 if (player)
11380 {
11382 if (quantity > stackable)
11383 split_quantity_new = stackable;
11384 else
11385 split_quantity_new = quantity;
11386
11388 {
11389 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11390 new_item =
ItemBase.Cast(in_hands);
11391 if (new_item)
11392 {
11393 new_item.SetResultOfSplit(true);
11394 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11396 new_item.SetQuantity(split_quantity_new, false, true);
11397 }
11398 }
11399 }
11400 }
11401
11403 {
11405 float split_quantity_new = Math.Floor(quantity * 0.5);
11406
11408 return;
11409
11411
11412 if (new_item)
11413 {
11414 if (new_item.GetQuantityMax() < split_quantity_new)
11415 {
11416 split_quantity_new = new_item.GetQuantityMax();
11417 }
11418
11419 new_item.SetResultOfSplit(true);
11420 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11421
11423 {
11426 }
11427 else
11428 {
11430 new_item.
SetQuantity(split_quantity_new,
false,
true);
11431 }
11432 }
11433 }
11434
11436 {
11438 float split_quantity_new = Math.Floor(quantity / 2);
11439
11441 return;
11442
11443 InventoryLocation invloc = new InventoryLocation;
11445
11447 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11448
11449 if (new_item)
11450 {
11451 if (new_item.GetQuantityMax() < split_quantity_new)
11452 {
11453 split_quantity_new = new_item.GetQuantityMax();
11454 }
11456 {
11459 }
11460 else if (split_quantity_new > 1)
11461 {
11463 new_item.
SetQuantity(split_quantity_new,
false,
true);
11464 }
11465 }
11466 }
11467
11470 {
11471 SetWeightDirty();
11473
11474 if (parent)
11475 parent.OnAttachmentQuantityChangedEx(this, delta);
11476
11478 {
11480 {
11482 }
11484 {
11485 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11487 }
11488 }
11489 }
11490
11493 {
11494
11495 }
11496
11499 {
11501 }
11502
11504 {
11505 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11506
11508 {
11509 if (newLevel == GameConstants.STATE_RUINED)
11510 {
11512 EntityAI parent = GetHierarchyParent();
11513 if (parent && parent.IsFireplace())
11514 {
11515 CargoBase cargo = GetInventory().GetCargo();
11516 if (cargo)
11517 {
11519 {
11521 }
11522 }
11523 }
11524 }
11525
11527 {
11528
11530 return;
11531 }
11532
11533 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11534 {
11536 }
11537 }
11538 }
11539
11540
11542 {
11543 super.OnRightClick();
11544
11546 {
11548 {
11549 if (ScriptInputUserData.CanStoreInputUserData())
11550 {
11551 EntityAI root = GetHierarchyRoot();
11552 Man playerOwner = GetHierarchyRootPlayer();
11553 InventoryLocation dst = new InventoryLocation;
11554
11555
11556 if (!playerOwner && root && root == this)
11557 {
11559 }
11560 else
11561 {
11562
11563 GetInventory().GetCurrentInventoryLocation(dst);
11565 {
11566 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11568 {
11570 }
11571 else
11572 {
11574
11575
11576 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11577 {
11579 }
11580 else
11581 {
11582 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11583 }
11584 }
11585 }
11586 }
11587
11588 ScriptInputUserData ctx = new ScriptInputUserData;
11596 }
11597 }
11598 else if (!
g_Game.IsMultiplayer())
11599 {
11601 }
11602 }
11603 }
11604
11606 {
11607 if (root)
11608 {
11609 vector m4[4];
11610 root.GetTransform(m4);
11611 dst.SetGround(this, m4);
11612 }
11613 else
11614 {
11615 GetInventory().GetCurrentInventoryLocation(dst);
11616 }
11617 }
11618
11619 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11620 {
11621
11622 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11623 return false;
11624
11625 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11626 return false;
11627
11628
11630 return false;
11631
11632
11633 Magazine mag = Magazine.Cast(this);
11634 if (mag)
11635 {
11636 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11637 return false;
11638
11639 if (stack_max_limit)
11640 {
11641 Magazine other_mag = Magazine.Cast(other_item);
11642 if (other_item)
11643 {
11644 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11645 return false;
11646 }
11647
11648 }
11649 }
11650 else
11651 {
11652
11654 return false;
11655
11657 return false;
11658 }
11659
11660 PlayerBase player = null;
11661 if (CastTo(player, GetHierarchyRootPlayer()))
11662 {
11663 if (player.GetInventory().HasAttachment(this))
11664 return false;
11665
11666 if (player.IsItemsToDelete())
11667 return false;
11668 }
11669
11670 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11671 return false;
11672
11673 int slotID;
11675 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11676 return false;
11677
11678 return true;
11679 }
11680
11682 {
11684 }
11685
11687 {
11688 return m_IsResultOfSplit;
11689 }
11690
11692 {
11693 m_IsResultOfSplit = value;
11694 }
11695
11697 {
11699 }
11700
11702 {
11703 float other_item_quantity = other_item.GetQuantity();
11704 float this_free_space;
11705
11707
11709
11710 if (other_item_quantity > this_free_space)
11711 {
11712 return this_free_space;
11713 }
11714 else
11715 {
11716 return other_item_quantity;
11717 }
11718 }
11719
11721 {
11723 }
11724
11726 {
11728 return;
11729
11730 if (!IsMagazine() && other_item)
11731 {
11733 if (quantity_used != 0)
11734 {
11735 float hp1 = GetHealth01("","");
11736 float hp2 = other_item.GetHealth01("","");
11737 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11738 hpResult = hpResult / (
GetQuantity() + quantity_used);
11739
11740 hpResult *= GetMaxHealth();
11741 Math.Round(hpResult);
11742 SetHealth("", "Health", hpResult);
11743
11745 other_item.AddQuantity(-quantity_used);
11746 }
11747 }
11749 }
11750
11752 {
11753 #ifdef SERVER
11754 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11755 GetHierarchyParent().IncreaseLifetimeUp();
11756 #endif
11757 };
11758
11760 {
11761 PlayerBase p = PlayerBase.Cast(player);
11762
11763 array<int> recipesIds = p.m_Recipes;
11764 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11765 if (moduleRecipesManager)
11766 {
11767 EntityAI itemInHands = player.GetEntityInHands();
11768 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11769 }
11770
11771 for (int i = 0;i < recipesIds.Count(); i++)
11772 {
11773 int key = recipesIds.Get(i);
11774 string recipeName = moduleRecipesManager.GetRecipeName(key);
11776 }
11777 }
11778
11779
11780 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11781 {
11782 super.GetDebugActions(outputList);
11783
11784
11790
11791
11796
11801
11802
11806
11807
11809 {
11813 }
11814
11817
11818
11822
11824
11825 InventoryLocation loc = new InventoryLocation();
11826 GetInventory().GetCurrentInventoryLocation(loc);
11828 {
11829 if (Gizmo_IsSupported())
11832 }
11833
11835 }
11836
11837
11838
11839
11841 {
11842 super.OnAction(action_id, player, ctx);
11843
11845 {
11846 switch (action_id)
11847 {
11851 return true;
11855 return true;
11856 }
11857 }
11858
11860 {
11861 switch (action_id)
11862 {
11864 Delete();
11865 return true;
11866 }
11867 }
11868
11869 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11870 {
11871 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11872 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11873 PlayerBase p = PlayerBase.Cast(player);
11874 if (
EActions.RECIPES_RANGE_START < 1000)
11875 {
11876 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11877 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11878 }
11879 }
11880 #ifndef SERVER
11881 else if (action_id ==
EActions.WATCH_PLAYER)
11882 {
11883 PluginDeveloper.SetDeveloperItemClientEx(player);
11884 }
11885 #endif
11887 {
11888 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11889 {
11890 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11891 OnDebugButtonPressServer(id + 1);
11892 }
11893
11894 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11895 {
11896 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11898 }
11899
11900 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11901 {
11902 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11904 }
11905
11906 else if (action_id ==
EActions.ADD_QUANTITY)
11907 {
11908 if (IsMagazine())
11909 {
11910 Magazine mag = Magazine.Cast(this);
11911 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11912 }
11913 else
11914 {
11916 }
11917
11918 if (m_EM)
11919 {
11920 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11921 }
11922
11923 }
11924
11925 else if (action_id ==
EActions.REMOVE_QUANTITY)
11926 {
11927 if (IsMagazine())
11928 {
11929 Magazine mag2 = Magazine.Cast(this);
11930 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11931 }
11932 else
11933 {
11935 }
11936 if (m_EM)
11937 {
11938 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11939 }
11940
11941 }
11942
11943 else if (action_id ==
EActions.SET_QUANTITY_0)
11944 {
11946
11947 if (m_EM)
11948 {
11949 m_EM.SetEnergy(0);
11950 }
11951 }
11952
11953 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11954 {
11956
11957 if (m_EM)
11958 {
11959 m_EM.SetEnergy(m_EM.GetEnergyMax());
11960 }
11961 }
11962
11963 else if (action_id ==
EActions.ADD_HEALTH)
11964 {
11965 AddHealth("","",GetMaxHealth("","Health")/5);
11966 }
11967 else if (action_id ==
EActions.REMOVE_HEALTH)
11968 {
11969 AddHealth("","",-GetMaxHealth("","Health")/5);
11970 }
11971 else if (action_id ==
EActions.DESTROY_HEALTH)
11972 {
11973 SetHealth01("","",0);
11974 }
11975 else if (action_id ==
EActions.WATCH_ITEM)
11976 {
11978 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11979 #ifdef DEVELOPER
11980 SetDebugDeveloper_item(this);
11981 #endif
11982 }
11983
11984 else if (action_id ==
EActions.ADD_TEMPERATURE)
11985 {
11986 AddTemperature(20);
11987
11988 }
11989
11990 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11991 {
11992 AddTemperature(-20);
11993
11994 }
11995
11996 else if (action_id ==
EActions.FLIP_FROZEN)
11997 {
11998 SetFrozen(!GetIsFrozen());
11999
12000 }
12001
12002 else if (action_id ==
EActions.ADD_WETNESS)
12003 {
12005
12006 }
12007
12008 else if (action_id ==
EActions.REMOVE_WETNESS)
12009 {
12011
12012 }
12013
12014 else if (action_id ==
EActions.LIQUIDTYPE_UP)
12015 {
12018
12019
12020 }
12021
12022 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
12023 {
12026 }
12027
12028 else if (action_id ==
EActions.MAKE_SPECIAL)
12029 {
12030 auto debugParams = DebugSpawnParams.WithPlayer(player);
12031 OnDebugSpawnEx(debugParams);
12032 }
12033
12034 }
12035
12036
12037 return false;
12038 }
12039
12040
12041
12042
12046
12049
12050
12051
12053 {
12054 return false;
12055 }
12056
12057
12059 {
12060 return true;
12061 }
12062
12063
12065 {
12066 return true;
12067 }
12068
12069
12070
12072 {
12073 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12074 return g_Game.ConfigIsExisting(config_path);
12075 }
12076
12079 {
12080 return null;
12081 }
12082
12084 {
12085 return false;
12086 }
12087
12089 {
12090 return false;
12091 }
12092
12096
12097
12099 {
12100 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12101 return module_repairing.CanRepair(this, item_repair_kit);
12102 }
12103
12104
12105 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12106 {
12107 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12108 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12109 }
12110
12111
12113 {
12114
12115
12116
12117
12118
12119
12120
12121
12122 return 1;
12123 }
12124
12125
12126
12128 {
12130 }
12131
12132
12133
12135 {
12137 }
12138
12139
12148 {
12149 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12150
12151 if (player)
12152 {
12153 player.MessageStatus(text);
12154 }
12155 }
12156
12157
12166 {
12167 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12168
12169 if (player)
12170 {
12171 player.MessageAction(text);
12172 }
12173 }
12174
12175
12184 {
12185 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12186
12187 if (player)
12188 {
12189 player.MessageFriendly(text);
12190 }
12191 }
12192
12193
12202 {
12203 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12204
12205 if (player)
12206 {
12207 player.MessageImportant(text);
12208 }
12209 }
12210
12212 {
12213 return true;
12214 }
12215
12216
12217 override bool KindOf(
string tag)
12218 {
12219 bool found = false;
12220 string item_name = this.
GetType();
12222 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12223
12224 int array_size = item_tag_array.Count();
12225 for (int i = 0; i < array_size; i++)
12226 {
12227 if (item_tag_array.Get(i) == tag)
12228 {
12229 found = true;
12230 break;
12231 }
12232 }
12233 return found;
12234 }
12235
12236
12238 {
12239
12240 super.OnRPC(sender, rpc_type,ctx);
12241
12242
12243 switch (rpc_type)
12244 {
12245 #ifndef SERVER
12246 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12247 Param2<bool, string> p = new Param2<bool, string>(false, "");
12248
12250 return;
12251
12252 bool play = p.param1;
12253 string soundSet = p.param2;
12254
12255 if (play)
12256 {
12258 {
12260 {
12262 }
12263 }
12264 else
12265 {
12267 }
12268 }
12269 else
12270 {
12272 }
12273
12274 break;
12275 #endif
12276
12277 }
12278
12280 {
12282 }
12283 }
12284
12285
12286
12287
12289 {
12290 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12291 return plugin.GetID(
name);
12292 }
12293
12295 {
12296 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12297 return plugin.GetName(id);
12298 }
12299
12302 {
12303
12304
12305 int varFlags;
12306 if (!ctx.
Read(varFlags))
12307 return;
12308
12309 if (varFlags & ItemVariableFlags.FLOAT)
12310 {
12312 }
12313 }
12314
12316 {
12317
12318 super.SerializeNumericalVars(floats_out);
12319
12320
12321
12323 {
12325 }
12326
12328 {
12330 }
12331
12333 {
12335 }
12336
12338 {
12343 }
12344
12346 {
12348 }
12349 }
12350
12352 {
12353
12354 super.DeSerializeNumericalVars(floats);
12355
12356
12357 int index = 0;
12358 int mask = Math.Round(floats.Get(index));
12359
12360 index++;
12361
12363 {
12365 {
12367 }
12368 else
12369 {
12370 float quantity = floats.Get(index);
12371 SetQuantity(quantity,
true,
false,
false,
false);
12372 }
12373 index++;
12374 }
12375
12377 {
12378 float wet = floats.Get(index);
12380 index++;
12381 }
12382
12384 {
12385 int liquidtype = Math.Round(floats.Get(index));
12387 index++;
12388 }
12389
12391 {
12393 index++;
12395 index++;
12397 index++;
12399 index++;
12400 }
12401
12403 {
12404 int cleanness = Math.Round(floats.Get(index));
12406 index++;
12407 }
12408 }
12409
12411 {
12412 super.WriteVarsToCTX(ctx);
12413
12414
12416 {
12418 }
12419
12421 {
12423 }
12424
12426 {
12428 }
12429
12431 {
12432 int r,g,b,a;
12438 }
12439
12441 {
12443 }
12444 }
12445
12447 {
12448 if (!super.ReadVarsFromCTX(ctx,version))
12449 return false;
12450
12451 int intValue;
12452 float value;
12453
12454 if (version < 140)
12455 {
12456 if (!ctx.
Read(intValue))
12457 return false;
12458
12459 m_VariablesMask = intValue;
12460 }
12461
12463 {
12464 if (!ctx.
Read(value))
12465 return false;
12466
12468 {
12470 }
12471 else
12472 {
12474 }
12475 }
12476
12477 if (version < 140)
12478 {
12480 {
12481 if (!ctx.
Read(value))
12482 return false;
12483 SetTemperatureDirect(value);
12484 }
12485 }
12486
12488 {
12489 if (!ctx.
Read(value))
12490 return false;
12492 }
12493
12495 {
12496 if (!ctx.
Read(intValue))
12497 return false;
12499 }
12500
12502 {
12503 int r,g,b,a;
12505 return false;
12507 return false;
12509 return false;
12511 return false;
12512
12514 }
12515
12517 {
12518 if (!ctx.
Read(intValue))
12519 return false;
12521 }
12522
12523 if (version >= 138 && version < 140)
12524 {
12526 {
12527 if (!ctx.
Read(intValue))
12528 return false;
12529 SetFrozen(intValue);
12530 }
12531 }
12532
12533 return true;
12534 }
12535
12536
12538 {
12541 {
12543 }
12544
12545 if (!super.OnStoreLoad(ctx, version))
12546 {
12548 return false;
12549 }
12550
12551 if (version >= 114)
12552 {
12553 bool hasQuickBarIndexSaved;
12554
12555 if (!ctx.
Read(hasQuickBarIndexSaved))
12556 {
12558 return false;
12559 }
12560
12561 if (hasQuickBarIndexSaved)
12562 {
12563 int itmQBIndex;
12564
12565
12566 if (!ctx.
Read(itmQBIndex))
12567 {
12569 return false;
12570 }
12571
12572 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12573 if (itmQBIndex != -1 && parentPlayer)
12574 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12575 }
12576 }
12577 else
12578 {
12579
12580 PlayerBase player;
12581 int itemQBIndex;
12582 if (version ==
int.
MAX)
12583 {
12584 if (!ctx.
Read(itemQBIndex))
12585 {
12587 return false;
12588 }
12589 }
12590 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12591 {
12592
12593 if (!ctx.
Read(itemQBIndex))
12594 {
12596 return false;
12597 }
12598 if (itemQBIndex != -1 && player)
12599 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12600 }
12601 }
12602
12603 if (version < 140)
12604 {
12605
12606 if (!LoadVariables(ctx, version))
12607 {
12609 return false;
12610 }
12611 }
12612
12613
12615 {
12617 return false;
12618 }
12619 if (version >= 132)
12620 {
12622 if (raib)
12623 {
12625 {
12627 return false;
12628 }
12629 }
12630 }
12631
12633 return true;
12634 }
12635
12636
12637
12639 {
12640 super.OnStoreSave(ctx);
12641
12642 PlayerBase player;
12643 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12644 {
12646
12647 int itemQBIndex = -1;
12648 itemQBIndex = player.FindQuickBarEntityIndex(this);
12649 ctx.
Write(itemQBIndex);
12650 }
12651 else
12652 {
12654 }
12655
12657
12659 if (raib)
12660 {
12662 }
12663 }
12664
12665
12667 {
12668 super.AfterStoreLoad();
12669
12671 {
12673 }
12674
12676 {
12679 }
12680 }
12681
12683 {
12684 super.EEOnAfterLoad();
12685
12687 {
12689 }
12690
12693 }
12694
12696 {
12697 return false;
12698 }
12699
12700
12701
12703 {
12705 {
12706 #ifdef PLATFORM_CONSOLE
12707
12709 {
12711 if (menu)
12712 {
12714 }
12715 }
12716 #endif
12717 }
12718
12720 {
12723 }
12724
12726 {
12727 SetWeightDirty();
12729 }
12731 {
12734 }
12735
12737 {
12740
12743 }
12745 {
12749 }
12750
12751 super.OnVariablesSynchronized();
12752 }
12753
12754
12755
12757 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12758 {
12759 if (!IsServerCheck(allow_client))
12760 return false;
12761
12763 return false;
12764
12767
12768 if (value <= (min + 0.001))
12769 value = min;
12770
12771 if (value == min)
12772 {
12773 if (destroy_config)
12774 {
12775 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12776 if (dstr)
12777 {
12779 this.Delete();
12780 return true;
12781 }
12782 }
12783 else if (destroy_forced)
12784 {
12786 this.Delete();
12787 return true;
12788 }
12789
12791 }
12792
12795
12797 {
12798 EntityAI parent = GetHierarchyRoot();
12799 InventoryLocation iLoc = new InventoryLocation();
12800 GetInventory().GetCurrentInventoryLocation(iLoc);
12802 {
12803 int iLocSlot = iLoc.
GetSlot();
12805 {
12807 }
12809 {
12811 }
12812 }
12813 }
12814
12816 {
12818
12819 if (delta)
12821 }
12822
12824
12825 return false;
12826 }
12827
12828
12830 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12831 {
12833 }
12834
12836 {
12839 }
12840
12842 {
12845 }
12846
12848 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12849 {
12850 float value_clamped = Math.Clamp(value, 0, 1);
12852 SetQuantity(result, destroy_config, destroy_forced);
12853 }
12854
12855
12858 {
12860 }
12861
12863 {
12865 }
12866
12867
12868
12869
12870
12871
12872
12873
12874
12875
12877 {
12878 int slot = -1;
12879 GameInventory inventory = GetInventory();
12880 if (inventory)
12881 {
12882 InventoryLocation il = new InventoryLocation;
12885 }
12886
12888 }
12889
12891 {
12892 float quantity_max = 0;
12893
12895 {
12896 if (attSlotID != -1)
12897 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12898
12899 if (quantity_max <= 0)
12901 }
12902
12903 if (quantity_max <= 0)
12905
12906 return quantity_max;
12907 }
12908
12910 {
12912 }
12913
12915 {
12917 }
12918
12919
12921 {
12923 }
12924
12926 {
12928 }
12929
12931 {
12933 }
12934
12935
12937 {
12938
12939 float weightEx = GetWeightEx();
12940 float special = GetInventoryAndCargoWeight();
12941 return weightEx - special;
12942 }
12943
12944
12946 {
12948 }
12949
12951 {
12953 {
12954 #ifdef DEVELOPER
12955 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12956 {
12957 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12959 }
12960 #endif
12961
12962 return GetQuantity() * GetConfigWeightModified();
12963 }
12964 else if (HasEnergyManager())
12965 {
12966 #ifdef DEVELOPER
12967 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12968 {
12969 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12970 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12971 }
12972 #endif
12973 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12974 }
12975 else
12976 {
12977 #ifdef DEVELOPER
12978 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12979 {
12980 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12981 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12982 }
12983 #endif
12984 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12985 }
12986 }
12987
12990 {
12991 int item_count = 0;
12993
12994 GameInventory inventory = GetInventory();
12995 CargoBase cargo = inventory.
GetCargo();
12996 if (cargo != NULL)
12997 {
12999 }
13000
13002 for (int i = 0; i < nAttachments; ++i)
13003 {
13005 if (item)
13006 item_count += item.GetNumberOfItems();
13007 }
13008 return item_count;
13009 }
13010
13013 {
13014 float weight = 0;
13015 float wetness = 1;
13016 if (include_wetness)
13019 {
13020 weight = wetness * m_ConfigWeight;
13021 }
13023 {
13024 weight = 1;
13025 }
13026 return weight;
13027 }
13028
13029
13030
13032 {
13033 GameInventory inventory = GetInventory();
13034 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
13035 {
13036 array<EntityAI> items = new array<EntityAI>;
13038 for (int i = 0; i < items.Count(); ++i)
13039 {
13041 if (item)
13042 {
13043 g_Game.ObjectDelete(item);
13044 }
13045 }
13046 }
13047 }
13048
13049
13050
13051
13053 {
13054 float energy = 0;
13055 if (HasEnergyManager())
13056 {
13057 energy = GetCompEM().GetEnergy();
13058 }
13059 return energy;
13060 }
13061
13062
13064 {
13065 super.OnEnergyConsumed();
13066
13068 }
13069
13071 {
13072 super.OnEnergyAdded();
13073
13075 }
13076
13077
13079 {
13080 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13081 {
13083 {
13084 float energy_0to1 = GetCompEM().GetEnergy0To1();
13086 }
13087 }
13088 }
13089
13090
13092 {
13093 return ConfigGetFloat("heatIsolation");
13094 }
13095
13097 {
13099 }
13100
13102 {
13103 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13104 if (
g_Game.ConfigIsExisting(paramPath))
13105 return g_Game.ConfigGetFloat(paramPath);
13106
13107 return 0.0;
13108 }
13109
13111 {
13112 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13113 if (
g_Game.ConfigIsExisting(paramPath))
13114 return g_Game.ConfigGetFloat(paramPath);
13115
13116 return 0.0;
13117 }
13118
13119 override void SetWet(
float value,
bool allow_client =
false)
13120 {
13121 if (!IsServerCheck(allow_client))
13122 return;
13123
13126
13128
13129 m_VarWet = Math.Clamp(value, min, max);
13130
13132 {
13135 }
13136 }
13137
13138 override void AddWet(
float value)
13139 {
13141 }
13142
13144 {
13146 }
13147
13149 {
13151 }
13152
13154 {
13156 }
13157
13159 {
13161 }
13162
13164 {
13166 }
13167
13168 override void OnWetChanged(
float newVal,
float oldVal)
13169 {
13172 if (newLevel != oldLevel)
13173 {
13175 }
13176 }
13177
13179 {
13180 SetWeightDirty();
13181 }
13182
13184 {
13185 return GetWetLevelInternal(
m_VarWet);
13186 }
13187
13188
13189
13191 {
13193 }
13194
13196 {
13198 }
13199
13201 {
13203 }
13204
13206 {
13208 }
13209
13210
13211
13213 {
13214 if (ConfigIsExisting("itemModelLength"))
13215 {
13216 return ConfigGetFloat("itemModelLength");
13217 }
13218 return 0;
13219 }
13220
13222 {
13223 if (ConfigIsExisting("itemAttachOffset"))
13224 {
13225 return ConfigGetFloat("itemAttachOffset");
13226 }
13227 return 0;
13228 }
13229
13230 override void SetCleanness(
int value,
bool allow_client =
false)
13231 {
13232 if (!IsServerCheck(allow_client))
13233 return;
13234
13236
13238
13241 }
13242
13244 {
13246 }
13247
13249 {
13250 return true;
13251 }
13252
13253
13254
13255
13257 {
13259 }
13260
13262 {
13264 }
13265
13266
13267
13268
13269 override void SetColor(
int r,
int g,
int b,
int a)
13270 {
13276 }
13278 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13279 {
13284 }
13285
13287 {
13289 }
13290
13293 {
13294 int r,g,b,a;
13296 r = r/255;
13297 g = g/255;
13298 b = b/255;
13299 a = a/255;
13300 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13301 }
13302
13303
13304
13305 override void SetLiquidType(
int value,
bool allow_client =
false)
13306 {
13307 if (!IsServerCheck(allow_client))
13308 return;
13309
13314 }
13315
13317 {
13318 return ConfigGetInt("varLiquidTypeInit");
13319 }
13320
13322 {
13324 }
13325
13327 {
13329 SetFrozen(false);
13330 }
13331
13334 {
13335 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13336 }
13337
13338
13341 {
13342 PlayerBase nplayer;
13343 if (PlayerBase.CastTo(nplayer, player))
13344 {
13346 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13347 }
13348 }
13349
13350
13353 {
13354 PlayerBase nplayer;
13355 if (PlayerBase.CastTo(nplayer,player))
13356 {
13357 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13358 }
13359
13360 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13361
13362 if (HasEnergyManager())
13363 {
13364 GetCompEM().UpdatePlugState();
13365 }
13366 }
13367
13368
13370 {
13371 super.OnPlacementStarted(player);
13372
13374 }
13375
13376 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13377 {
13379 {
13380 m_AdminLog.OnPlacementComplete(player,
this);
13381 }
13382
13383 super.OnPlacementComplete(player, position, orientation);
13384 }
13385
13386
13387
13388
13389
13391 {
13393 {
13394 return true;
13395 }
13396 else
13397 {
13398 return false;
13399 }
13400 }
13401
13402
13404 {
13406 {
13408 }
13409 }
13410
13411
13413 {
13415 }
13416
13418 {
13420 }
13421
13422 override void InsertAgent(
int agent,
float count = 1)
13423 {
13424 if (count < 1)
13425 return;
13426
13428 }
13429
13432 {
13434 }
13435
13436
13438 {
13440 }
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
13473
13474
13475
13476
13477
13478
13479
13480
13481
13482
13484 {
13486 return false;
13487 return true;
13488 }
13489
13491 {
13492
13494 }
13495
13496
13499 {
13500 super.CheckForRoofLimited(timeTresholdMS);
13501
13502 float time =
g_Game.GetTime();
13503 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13504 {
13505 m_PreviousRoofTestTime = time;
13506 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13507 }
13508 }
13509
13510
13512 {
13514 {
13515 return 0;
13516 }
13517
13518 if (GetInventory().GetAttachmentSlotsCount() != 0)
13519 {
13520 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13521 if (filter)
13522 return filter.GetProtectionLevel(type, false, system);
13523 else
13524 return 0;
13525 }
13526
13527 string subclassPath, entryName;
13528
13529 switch (type)
13530 {
13532 entryName = "biological";
13533 break;
13535 entryName = "chemical";
13536 break;
13537 default:
13538 entryName = "biological";
13539 break;
13540 }
13541
13542 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13543
13544 return g_Game.ConfigGetFloat(subclassPath + entryName);
13545 }
13546
13547
13548
13551 {
13552 if (!IsMagazine())
13554
13556 }
13557
13558
13559
13560
13561
13566 {
13567 return true;
13568 }
13569
13571 {
13573 }
13574
13575
13576
13577
13578
13580 {
13581 if (parent)
13582 {
13583 if (parent.IsInherited(DayZInfected))
13584 return true;
13585
13586 if (!parent.IsRuined())
13587 return true;
13588 }
13589
13590 return true;
13591 }
13592
13594 {
13595 if (!super.CanPutAsAttachment(parent))
13596 {
13597 return false;
13598 }
13599
13600 if (!IsRuined() && !parent.IsRuined())
13601 {
13602 return true;
13603 }
13604
13605 return false;
13606 }
13607
13609 {
13610
13611
13612
13613
13614 return super.CanReceiveItemIntoCargo(item);
13615 }
13616
13618 {
13619
13620
13621
13622
13623 GameInventory attachmentInv = attachment.GetInventory();
13625 {
13626 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13627 return false;
13628 }
13629
13630 InventoryLocation loc = new InventoryLocation();
13631 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13632 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13633 return false;
13634
13635 return super.CanReceiveAttachment(attachment, slotId);
13636 }
13637
13639 {
13640 if (!super.CanReleaseAttachment(attachment))
13641 return false;
13642
13643 return GetInventory().AreChildrenAccessible();
13644 }
13645
13646
13647
13648
13649
13650
13651
13652
13653
13654
13655
13656
13657
13658
13659
13660
13661
13662
13663
13664
13665
13667 {
13668 int id = muzzle_owner.GetMuzzleID();
13669 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13670
13671 if (WPOF_array)
13672 {
13673 for (int i = 0; i < WPOF_array.Count(); i++)
13674 {
13675 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13676
13677 if (WPOF)
13678 {
13679 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13680 }
13681 }
13682 }
13683 }
13684
13685
13687 {
13688 int id = muzzle_owner.GetMuzzleID();
13690
13691 if (WPOBE_array)
13692 {
13693 for (int i = 0; i < WPOBE_array.Count(); i++)
13694 {
13695 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13696
13697 if (WPOBE)
13698 {
13699 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13700 }
13701 }
13702 }
13703 }
13704
13705
13707 {
13708 int id = muzzle_owner.GetMuzzleID();
13709 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13710
13711 if (WPOOH_array)
13712 {
13713 for (int i = 0; i < WPOOH_array.Count(); i++)
13714 {
13715 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13716
13717 if (WPOOH)
13718 {
13719 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13720 }
13721 }
13722 }
13723 }
13724
13725
13727 {
13728 int id = muzzle_owner.GetMuzzleID();
13729 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13730
13731 if (WPOOH_array)
13732 {
13733 for (int i = 0; i < WPOOH_array.Count(); i++)
13734 {
13735 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13736
13737 if (WPOOH)
13738 {
13739 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13740 }
13741 }
13742 }
13743 }
13744
13745
13747 {
13748 int id = muzzle_owner.GetMuzzleID();
13749 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13750
13751 if (WPOOH_array)
13752 {
13753 for (int i = 0; i < WPOOH_array.Count(); i++)
13754 {
13755 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13756
13757 if (WPOOH)
13758 {
13759 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13760 }
13761 }
13762 }
13763 }
13764
13765
13766
13768 {
13770 {
13771 return true;
13772 }
13773
13774 return false;
13775 }
13776
13778 {
13780 {
13781 return true;
13782 }
13783
13784 return false;
13785 }
13786
13788 {
13790 {
13791 return true;
13792 }
13793
13794 return false;
13795 }
13796
13798 {
13799 return false;
13800 }
13801
13804 {
13805 return UATimeSpent.DEFAULT_DEPLOY;
13806 }
13807
13808
13809
13810
13812 {
13814 SetSynchDirty();
13815 }
13816
13818 {
13820 }
13821
13822
13824 {
13825 return false;
13826 }
13827
13830 {
13831 string att_type = "None";
13832
13833 if (ConfigIsExisting("soundAttType"))
13834 {
13835 att_type = ConfigGetString("soundAttType");
13836 }
13837
13839 }
13840
13842 {
13844 }
13845
13846
13847
13848
13849
13855
13857 {
13860
13862 }
13863
13864
13866 {
13868 return;
13869
13871
13874
13877
13878 SoundParameters params = new SoundParameters();
13882 }
13883
13884
13886 {
13888 {
13891
13892 SetSynchDirty();
13893
13896 }
13897 }
13898
13900 {
13902 }
13903
13904
13906 {
13908 return;
13909
13911 SetSynchDirty();
13912
13915 }
13916
13918 {
13921 }
13922
13924 {
13926 }
13927
13928 void OnApply(PlayerBase player);
13929
13931 {
13932 return 1.0;
13933 };
13934
13936 {
13938 }
13939
13941 {
13943 }
13944
13946
13948 {
13949 SetDynamicPhysicsLifeTime(0.01);
13951 }
13952
13954 {
13955 array<string> zone_names = new array<string>;
13956 GetDamageZones(zone_names);
13957 for (int i = 0; i < zone_names.Count(); i++)
13958 {
13959 SetHealthMax(zone_names.Get(i),"Health");
13960 }
13961 SetHealthMax("","Health");
13962 }
13963
13966 {
13967 float global_health = GetHealth01("","Health");
13968 array<string> zones = new array<string>;
13969 GetDamageZones(zones);
13970
13971 for (int i = 0; i < zones.Count(); i++)
13972 {
13973 SetHealth01(zones.Get(i),"Health",global_health);
13974 }
13975 }
13976
13979 {
13980 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13981 }
13982
13984 {
13985 if (!hasRootAsPlayer)
13986 {
13987 if (refParentIB)
13988 {
13989
13990 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13991 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13992
13993 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13994 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13995
13998 }
13999 else
14000 {
14001
14004 }
14005 }
14006 }
14007
14009 {
14011 {
14012 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
14013 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
14014 {
14015 float heatPermCoef = 1.0;
14017 while (ent)
14018 {
14019 heatPermCoef *= ent.GetHeatPermeabilityCoef();
14020 ent = ent.GetHierarchyParent();
14021 }
14022
14023 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
14024 }
14025 }
14026 }
14027
14029 {
14030
14031 EntityAI parent = GetHierarchyParent();
14032 if (!parent)
14033 {
14034 hasParent = false;
14035 hasRootAsPlayer = false;
14036 }
14037 else
14038 {
14039 hasParent = true;
14040 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
14041 refParentIB =
ItemBase.Cast(parent);
14042 }
14043 }
14044
14045 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
14046 {
14047
14048 }
14049
14051 {
14052
14053 return false;
14054 }
14055
14057 {
14058
14059
14060 return false;
14061 }
14062
14064 {
14065
14066 return false;
14067 }
14068
14071 {
14072 return !GetIsFrozen() &&
IsOpen();
14073 }
14074
14076 {
14077 bool hasParent = false, hasRootAsPlayer = false;
14079
14080 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14081 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14082
14083 if (wwtu || foodDecay)
14084 {
14088
14089 if (processWetness || processTemperature || processDecay)
14090 {
14092
14093 if (processWetness)
14094 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14095
14096 if (processTemperature)
14098
14099 if (processDecay)
14100 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14101 }
14102 }
14103 }
14104
14107 {
14109 }
14110
14112 {
14115
14116 return super.GetTemperatureFreezeThreshold();
14117 }
14118
14120 {
14123
14124 return super.GetTemperatureThawThreshold();
14125 }
14126
14128 {
14131
14132 return super.GetItemOverheatThreshold();
14133 }
14134
14136 {
14138 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14139
14140 return super.GetTemperatureFreezeTime();
14141 }
14142
14144 {
14146 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14147
14148 return super.GetTemperatureThawTime();
14149 }
14150
14155
14157 {
14158 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14159 }
14160
14162 {
14163 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14164 }
14165
14168 {
14170 }
14171
14173 {
14175 }
14176
14178 {
14180 }
14181
14184 {
14185 return null;
14186 }
14187
14190 {
14191 return false;
14192 }
14193
14195 {
14197 {
14200 if (!trg)
14201 {
14203 explosive = this;
14204 }
14205
14206 explosive.PairRemote(trg);
14208
14209 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14210 trg.SetPersistentPairID(persistentID);
14211 explosive.SetPersistentPairID(persistentID);
14212
14213 return true;
14214 }
14215 return false;
14216 }
14217
14220 {
14221 float ret = 1.0;
14224 ret *= GetHealth01();
14225
14226 return ret;
14227 }
14228
14229 #ifdef DEVELOPER
14230 override void SetDebugItem()
14231 {
14232 super.SetDebugItem();
14233 _itemBase = this;
14234 }
14235
14237 {
14238 string text = super.GetDebugText();
14239
14241 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14242
14243 return text;
14244 }
14245 #endif
14246
14248 {
14249 return true;
14250 }
14251
14253
14255
14257 {
14260 }
14261
14262
14270
14286
14287 [
Obsolete(
"Use ItemSoundHandler instead")]
14290 {
14291 if (!
g_Game.IsDedicatedServer())
14292 {
14293 if (ConfigIsExisting("attachSoundSet"))
14294 {
14295 string cfg_path = "";
14296 string soundset = "";
14297 string type_name =
GetType();
14298
14301 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14302 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14303
14304 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14305 {
14306 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14307 {
14308 if (cfg_slot_array[i] == slot_type)
14309 {
14310 soundset = cfg_soundset_array[i];
14311 break;
14312 }
14313 }
14314 }
14315
14316 if (soundset != "")
14317 {
14318 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14320 }
14321 }
14322 }
14323 }
14324
14326}
14327
14329{
14331 if (entity)
14332 {
14333 bool is_item = entity.IsInherited(
ItemBase);
14334 if (is_item && full_quantity)
14335 {
14338 }
14339 }
14340 else
14341 {
14343 return NULL;
14344 }
14345 return entity;
14346}
14347
14349{
14350 if (item)
14351 {
14352 if (health > 0)
14353 item.SetHealth("", "", health);
14354
14355 if (item.CanHaveTemperature())
14356 {
14358 if (item.CanFreeze())
14359 item.SetFrozen(false);
14360 }
14361
14362 if (item.HasEnergyManager())
14363 {
14364 if (quantity >= 0)
14365 {
14366 item.GetCompEM().SetEnergy0To1(quantity);
14367 }
14368 else
14369 {
14371 }
14372 }
14373 else if (item.IsMagazine())
14374 {
14375 Magazine mag = Magazine.Cast(item);
14376 if (quantity >= 0)
14377 {
14378 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14379 }
14380 else
14381 {
14383 }
14384
14385 }
14386 else
14387 {
14388 if (quantity >= 0)
14389 {
14390 item.SetQuantityNormalized(quantity, false);
14391 }
14392 else
14393 {
14395 }
14396
14397 }
14398 }
14399}
14400
14401#ifdef DEVELOPER
14403#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.