Items cannot be consumed if frozen by default. Override for exceptions.
9337{
9339 {
9340 return true;
9341 }
9342};
9343
9344
9345
9347{
9351
9353
9356
9357
9358
9359
9360
9369
9375
9380
9385
9406 protected bool m_IsResultOfSplit
9407
9409
9414
9415
9416
9418
9422
9423
9424
9426
9429
9430
9431
9437
9438
9446
9449
9450
9452
9453
9455
9456
9461
9462
9467
9468
9470
9471
9473 {
9478
9479 if (!
GetGame().IsDedicatedServer())
9480 {
9482 {
9484
9486 {
9488 }
9489 }
9490
9493 }
9494
9495 m_OldLocation = null;
9496
9498 {
9500 }
9501
9502 if (ConfigIsExisting("headSelectionsToHide"))
9503 {
9506 }
9507
9509 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9510 {
9512 }
9513
9515
9516 m_IsResultOfSplit = false;
9517
9519 }
9520
9522 {
9523 super.InitItemVariables();
9524
9530 m_Count = ConfigGetInt(
"count");
9531
9534
9539
9542
9547
9559
9563
9564
9567 if (ConfigIsExisting("canBeSplit"))
9568 {
9571 }
9572
9574 if (ConfigIsExisting("itemBehaviour"))
9576
9577
9580 RegisterNetSyncVariableInt("m_VarLiquidType");
9581 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9582
9583 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9584 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9585 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9586
9587 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9588 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9589 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9590 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9591
9592 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9593 RegisterNetSyncVariableBool("m_IsTakeable");
9594 RegisterNetSyncVariableBool("m_IsHologram");
9595
9598 {
9601 }
9602
9604
9606 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9608
9609 }
9610
9612 {
9614 }
9615
9617 {
9620 {
9625 }
9626 }
9627
9628 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9629 {
9631 {
9634 }
9635
9637 }
9638
9640 {
9646 }
9647
9649
9651 {
9653
9654 if (!action)
9655 {
9656 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9657 return;
9658 }
9659
9661 if (!ai)
9662 {
9664 return;
9665 }
9666
9668 if (!action_array)
9669 {
9670 action_array = new array<ActionBase_Basic>;
9672 }
9673 if (LogManager.IsActionLogEnable())
9674 {
9675 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9676 }
9677
9678 if (action_array.Find(action) != -1)
9679 {
9680 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9681 }
9682 else
9683 {
9684 action_array.Insert(action);
9685 }
9686 }
9687
9689 {
9691 ActionBase action = player.GetActionManager().GetAction(actionName);
9694
9695 if (action_array)
9696 {
9697 action_array.RemoveItem(action);
9698 }
9699 }
9700
9701
9702
9704 {
9705 ActionOverrideData overrideData = new ActionOverrideData();
9709
9711 if (!actionMap)
9712 {
9715 }
9716
9717 actionMap.Insert(this.
Type(), overrideData);
9718
9719 }
9720
9722
9724
9725
9727 {
9730
9733
9734 string config_to_search = "CfgVehicles";
9735 string muzzle_owner_config;
9736
9738 {
9739 if (IsInherited(Weapon))
9740 config_to_search = "CfgWeapons";
9741
9742 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9743
9744 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9745
9747
9748 if (config_OnFire_subclass_count > 0)
9749 {
9750 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9751
9752 for (int i = 0; i < config_OnFire_subclass_count; i++)
9753 {
9754 string particle_class = "";
9756 string config_OnFire_entry = config_OnFire_class + particle_class;
9757 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9758 WPOF_array.Insert(WPOF);
9759 }
9760
9761
9763 }
9764 }
9765
9767 {
9768 config_to_search = "CfgWeapons";
9769 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9770
9771 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9772
9774
9775 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9776 {
9777 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9778
9779 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9780 {
9781 string particle_class2 = "";
9783 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9784 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9785 WPOBE_array.Insert(WPOBE);
9786 }
9787
9788
9790 }
9791 }
9792 }
9793
9794
9796 {
9799
9801 {
9802 string config_to_search = "CfgVehicles";
9803
9804 if (IsInherited(Weapon))
9805 config_to_search = "CfgWeapons";
9806
9807 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9808 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9809
9810 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9811 {
9812
9814
9816 {
9818 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9820 return;
9821 }
9822
9825
9826
9827
9829 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9830
9831 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9832 {
9833 string particle_class = "";
9835 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9837
9838 if (entry_type == CT_CLASS)
9839 {
9840 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9841 WPOOH_array.Insert(WPOF);
9842 }
9843 }
9844
9845
9847 }
9848 }
9849 }
9850
9852 {
9854 }
9855
9857 {
9859 {
9861
9864
9867
9868 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9869 }
9870 }
9871
9873 {
9875 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9876
9878 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9879
9881 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9882
9884 {
9886 }
9887 }
9888
9890 {
9892 }
9893
9895 {
9898 else
9900
9902 {
9905 }
9906 else
9907 {
9910
9913 }
9914
9916 }
9917
9919 {
9921 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9922 }
9923
9925 {
9927 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9929 }
9930
9932 {
9934 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9935 }
9936
9938 {
9941
9942 OverheatingParticle OP = new OverheatingParticle();
9947
9949 }
9950
9952 {
9955
9956 return -1;
9957 }
9958
9960 {
9962 {
9965
9966 for (int i = count; i > 0; --i)
9967 {
9968 int id = i - 1;
9971
9974
9975 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9976 {
9977 if (p)
9978 {
9981 }
9982 }
9983 }
9984 }
9985 }
9986
9988 {
9990 {
9992 {
9993 int id = i - 1;
9995
9996 if (OP)
9997 {
9999
10000 if (p)
10001 {
10003 }
10004
10005 delete OP;
10006 }
10007 }
10008
10011 }
10012 }
10013
10016 {
10017 return 0.0;
10018 }
10019
10020
10022 {
10023 return 250;
10024 }
10025
10027 {
10028 return 0;
10029 }
10030
10033 {
10035 return true;
10036
10037 return false;
10038 }
10039
10042 {
10045
10047 {
10049 }
10050 else
10051 {
10052
10054 }
10055
10057 }
10058
10065 {
10066 return -1;
10067 }
10068
10069
10070
10071
10073 {
10075 {
10077 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10078
10079 if (r_index >= 0)
10080 {
10081 InventoryLocation r_il = new InventoryLocation;
10082 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10083
10084 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10087 {
10088 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10089 }
10091 {
10092 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10093 }
10094
10095 }
10096
10097 player.GetHumanInventory().ClearUserReservedLocation(this);
10098 }
10099
10102 }
10103
10104
10105
10106
10108 {
10109 return ItemBase.m_DebugActionsMask;
10110 }
10111
10113 {
10114 return ItemBase.m_DebugActionsMask & mask;
10115 }
10116
10118 {
10119 ItemBase.m_DebugActionsMask = mask;
10120 }
10121
10123 {
10124 ItemBase.m_DebugActionsMask |= mask;
10125 }
10126
10128 {
10129 ItemBase.m_DebugActionsMask &= ~mask;
10130 }
10131
10133 {
10135 {
10137 }
10138 else
10139 {
10141 }
10142 }
10143
10144
10146 {
10147 if (GetEconomyProfile())
10148 {
10149 float q_max = GetEconomyProfile().GetQuantityMax();
10150 if (q_max > 0)
10151 {
10152 float q_min = GetEconomyProfile().GetQuantityMin();
10153 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10154
10156 {
10157 ComponentEnergyManager comp = GetCompEM();
10159 {
10161 }
10162 }
10164 {
10166
10167 }
10168
10169 }
10170 }
10171 }
10172
10175 {
10176 EntityAI parent = GetHierarchyParent();
10177
10178 if (parent)
10179 {
10180 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10181 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10182 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10183 }
10184 }
10185
10188 {
10189 EntityAI parent = GetHierarchyParent();
10190
10191 if (parent)
10192 {
10193 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10194 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10195 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10196 }
10197 }
10198
10200 {
10201
10202
10203
10204
10206
10208 {
10209 if (ScriptInputUserData.CanStoreInputUserData())
10210 {
10211 ScriptInputUserData ctx = new ScriptInputUserData;
10217 ctx.
Write(use_stack_max);
10220
10222 {
10223 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10224 }
10225 }
10226 }
10227 else if (!
GetGame().IsMultiplayer())
10228 {
10230 }
10231 }
10232
10234 {
10236 }
10237
10239 {
10241 }
10242
10244 {
10246 }
10247
10249 {
10250
10251 return false;
10252 }
10253
10255 {
10256 return false;
10257 }
10258
10262 {
10263 return false;
10264 }
10265
10267 {
10268 return "";
10269 }
10270
10272
10274 {
10275 return false;
10276 }
10277
10279 {
10280 return true;
10281 }
10282
10283
10284
10286 {
10287 return true;
10288 }
10289
10291 {
10292 return true;
10293 }
10294
10296 {
10297 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10299 }
10300
10302 {
10304 }
10305
10307 {
10309 if (!is_being_placed)
10311 SetSynchDirty();
10312 }
10313
10314
10316
10318 {
10320 }
10321
10323 {
10325 }
10326
10328 {
10329 return 1;
10330 }
10331
10333 {
10334 return false;
10335 }
10336
10338 {
10340 SetSynchDirty();
10341 }
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10378 {
10379 super.OnMovedInsideCargo(container);
10380
10381 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10382 }
10383
10384 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10385 {
10386 super.EEItemLocationChanged(oldLoc,newLoc);
10387
10388 PlayerBase new_player = null;
10389 PlayerBase old_player = null;
10390
10391 if (newLoc.GetParent())
10392 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10393
10394 if (oldLoc.GetParent())
10395 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10396
10398 {
10399 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10400
10401 if (r_index >= 0)
10402 {
10403 InventoryLocation r_il = new InventoryLocation;
10404 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10405
10406 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10409 {
10410 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10411 }
10413 {
10414 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10415 }
10416
10417 }
10418 }
10419
10421 {
10422 if (new_player)
10423 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10424
10425 if (new_player == old_player)
10426 {
10427
10428 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10429 {
10431 {
10432 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10433 {
10434 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10435 }
10436 }
10437 else
10438 {
10439 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10440 }
10441 }
10442
10443 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10444 {
10445 int type = oldLoc.GetType();
10447 {
10448 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10449 }
10451 {
10452 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10453 }
10454 }
10455 if (!m_OldLocation)
10456 {
10457 m_OldLocation = new InventoryLocation;
10458 }
10459 m_OldLocation.Copy(oldLoc);
10460 }
10461 else
10462 {
10463 if (m_OldLocation)
10464 {
10465 m_OldLocation.Reset();
10466 }
10467 }
10468
10470 }
10471 else
10472 {
10473 if (new_player)
10474 {
10475 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10476 if (res_index >= 0)
10477 {
10478 InventoryLocation il = new InventoryLocation;
10479 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10481 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10484 {
10485 il.
GetParent().GetOnReleaseLock().Invoke(it);
10486 }
10488 {
10490 }
10491
10492 }
10493 }
10495 {
10496
10498 }
10499
10500 if (m_OldLocation)
10501 {
10502 m_OldLocation.Reset();
10503 }
10504 }
10505 }
10506
10507 override void EOnContact(IEntity other, Contact extra)
10508 {
10510 {
10511 int liquidType = -1;
10513 if (impactSpeed > 0.0)
10514 {
10516 #ifndef SERVER
10518 #else
10520 SetSynchDirty();
10521 #endif
10523 }
10524 }
10525
10526 #ifdef SERVER
10527 if (GetCompEM() && GetCompEM().IsPlugged())
10528 {
10529 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10530 GetCompEM().UnplugThis();
10531 }
10532 #endif
10533 }
10534
10536
10538 {
10540 }
10541
10543 {
10544
10545 }
10546
10548 {
10549 super.OnItemLocationChanged(old_owner, new_owner);
10550
10551 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10552 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10553
10554 if (!relatedPlayer && playerNew)
10555 relatedPlayer = playerNew;
10556
10557 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10558 {
10560 if (actionMgr)
10561 {
10562 ActionBase currentAction = actionMgr.GetRunningAction();
10563 if (currentAction)
10565 }
10566 }
10567
10568 Man ownerPlayerOld = null;
10569 Man ownerPlayerNew = null;
10570
10571 if (old_owner)
10572 {
10573 if (old_owner.
IsMan())
10574 {
10575 ownerPlayerOld = Man.Cast(old_owner);
10576 }
10577 else
10578 {
10579 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10580 }
10581 }
10582 else
10583 {
10585 {
10587
10588 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10589 {
10590 GetCompEM().UnplugThis();
10591 }
10592 }
10593 }
10594
10595 if (new_owner)
10596 {
10597 if (new_owner.
IsMan())
10598 {
10599 ownerPlayerNew = Man.Cast(new_owner);
10600 }
10601 else
10602 {
10603 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10604 }
10605 }
10606
10607 if (ownerPlayerOld != ownerPlayerNew)
10608 {
10609 if (ownerPlayerOld)
10610 {
10611 array<EntityAI> subItemsExit = new array<EntityAI>;
10613 for (int i = 0; i < subItemsExit.Count(); i++)
10614 {
10617 }
10618 }
10619
10620 if (ownerPlayerNew)
10621 {
10622 array<EntityAI> subItemsEnter = new array<EntityAI>;
10624 for (int j = 0; j < subItemsEnter.Count(); j++)
10625 {
10628 }
10629 }
10630 }
10631 else if (ownerPlayerNew != null)
10632 {
10633 PlayerBase nplayer;
10634 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10635 {
10636 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10638 for (int k = 0; k < subItemsUpdate.Count(); k++)
10639 {
10641 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10642 }
10643 }
10644 }
10645
10646 if (old_owner)
10647 old_owner.OnChildItemRemoved(this);
10648 if (new_owner)
10649 new_owner.OnChildItemReceived(this);
10650 }
10651
10652
10654 {
10655 super.EEDelete(parent);
10656 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10657 if (player)
10658 {
10660
10661 if (player.IsAlive())
10662 {
10663 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10664 if (r_index >= 0)
10665 {
10666 InventoryLocation r_il = new InventoryLocation;
10667 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10668
10669 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10672 {
10673 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10674 }
10676 {
10677 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10678 }
10679
10680 }
10681
10682 player.RemoveQuickBarEntityShortcut(this);
10683 }
10684 }
10685 }
10686
10688 {
10689 super.EEKilled(killer);
10690
10693 {
10694 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10695 {
10696 if (IsMagazine())
10697 {
10698 if (Magazine.Cast(this).GetAmmoCount() > 0)
10699 {
10701 }
10702 }
10703 else
10704 {
10706 }
10707 }
10708 }
10709 }
10710
10712 {
10713 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10714
10715 super.OnWasAttached(parent, slot_id);
10716
10719
10721 }
10722
10724 {
10725 super.OnWasDetached(parent, slot_id);
10726
10729 }
10730
10732 {
10733 int idx;
10736
10737 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10738 if (inventory_slots.Count() < 1)
10739 {
10740 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10741 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10742 }
10743 else
10744 {
10745 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10746 }
10747
10748 idx = inventory_slots.Find(slot);
10749 if (idx < 0)
10750 return "";
10751
10752 return attach_types.Get(idx);
10753 }
10754
10756 {
10757 int idx = -1;
10758 string slot;
10759
10762
10763 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10764 if (inventory_slots.Count() < 1)
10765 {
10766 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10767 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10768 }
10769 else
10770 {
10771 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10772 if (detach_types.Count() < 1)
10773 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10774 }
10775
10776 for (int i = 0; i < inventory_slots.Count(); i++)
10777 {
10778 slot = inventory_slots.Get(i);
10779 }
10780
10781 if (slot != "")
10782 {
10783 if (detach_types.Count() == 1)
10784 idx = 0;
10785 else
10786 idx = inventory_slots.Find(slot);
10787 }
10788 if (idx < 0)
10789 return "";
10790
10791 return detach_types.Get(idx);
10792 }
10793
10795 {
10796
10798
10799
10800 float min_time = 1;
10801 float max_time = 3;
10802 float delay = Math.RandomFloat(min_time, max_time);
10803
10804 explode_timer.Run(delay, this, "DoAmmoExplosion");
10805 }
10806
10808 {
10809 Magazine magazine = Magazine.Cast(this);
10810 int pop_sounds_count = 6;
10811 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10812
10813
10814 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10815 string sound_name = pop_sounds[ sound_idx ];
10817
10818
10819 magazine.ServerAddAmmoCount(-1);
10820
10821
10822 float min_temp_to_explode = 100;
10823
10824 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10825 {
10827 }
10828 }
10829
10830
10831 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10832 {
10833 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10834
10835 const int CHANCE_DAMAGE_CARGO = 4;
10836 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10837 const int CHANCE_DAMAGE_NOTHING = 2;
10838
10840 {
10841 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10842 int chances;
10843 int rnd;
10844
10845 if (GetInventory().GetCargo())
10846 {
10847 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10848 rnd = Math.RandomInt(0,chances);
10849
10850 if (rnd < CHANCE_DAMAGE_CARGO)
10851 {
10853 }
10854 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10855 {
10857 }
10858 }
10859 else
10860 {
10861 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10862 rnd = Math.RandomInt(0,chances);
10863
10864 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10865 {
10867 }
10868 }
10869 }
10870 }
10871
10873 {
10874 if (GetInventory().GetCargo())
10875 {
10876 int item_count = GetInventory().GetCargo().GetItemCount();
10877 if (item_count > 0)
10878 {
10879 int random_pick = Math.RandomInt(0, item_count);
10881 if (!item.IsExplosive())
10882 {
10883 item.AddHealth("","",damage);
10884 return true;
10885 }
10886 }
10887 }
10888 return false;
10889 }
10890
10892 {
10893 int attachment_count = GetInventory().AttachmentCount();
10894 if (attachment_count > 0)
10895 {
10896 int random_pick = Math.RandomInt(0, attachment_count);
10897 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10898 if (!attachment.IsExplosive())
10899 {
10900 attachment.AddHealth("","",damage);
10901 return true;
10902 }
10903 }
10904 return false;
10905 }
10906
10908 {
10910 }
10911
10913 {
10915 return GetInventory().CanRemoveEntity();
10916
10917 return false;
10918 }
10919
10921 {
10923 return;
10924
10926 {
10927 if (ScriptInputUserData.CanStoreInputUserData())
10928 {
10929 ScriptInputUserData ctx = new ScriptInputUserData;
10934 ctx.
Write(destination_entity);
10936 ctx.
Write(slot_id);
10938 }
10939 }
10940 else if (!
GetGame().IsMultiplayer())
10941 {
10943 }
10944 }
10945
10947 {
10949 return;
10950
10951 float split_quantity_new;
10955 InventoryLocation loc = new InventoryLocation;
10956
10957 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10958 {
10960 split_quantity_new = stack_max;
10961 else
10963
10964 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10965 if (new_item)
10966 {
10967 new_item.SetResultOfSplit(true);
10968 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10970 new_item.SetQuantity(split_quantity_new);
10971 }
10972 }
10973 else if (destination_entity && slot_id == -1)
10974 {
10975 if (quantity > stack_max)
10976 split_quantity_new = stack_max;
10977 else
10978 split_quantity_new = quantity;
10979
10981 {
10984 }
10985
10986 if (new_item)
10987 {
10988 new_item.SetResultOfSplit(true);
10989 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10991 new_item.SetQuantity(split_quantity_new);
10992 }
10993 }
10994 else
10995 {
10996 if (stack_max != 0)
10997 {
10999 {
11001 }
11002
11003 if (split_quantity_new == 0)
11004 {
11005 if (!
GetGame().IsMultiplayer())
11006 player.PhysicalPredictiveDropItem(this);
11007 else
11008 player.ServerDropEntity(this);
11009 return;
11010 }
11011
11013
11014 if (new_item)
11015 {
11016 new_item.SetResultOfSplit(true);
11017 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11019 new_item.SetQuantity(stack_max);
11020 new_item.PlaceOnSurface();
11021 }
11022 }
11023 }
11024 }
11025
11027 {
11029 return;
11030
11031 float split_quantity_new;
11035 InventoryLocation loc = new InventoryLocation;
11036
11037 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11038 {
11040 split_quantity_new = stack_max;
11041 else
11043
11044 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11045 if (new_item)
11046 {
11047 new_item.SetResultOfSplit(true);
11048 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11050 new_item.SetQuantity(split_quantity_new);
11051 }
11052 }
11053 else if (destination_entity && slot_id == -1)
11054 {
11055 if (quantity > stack_max)
11056 split_quantity_new = stack_max;
11057 else
11058 split_quantity_new = quantity;
11059
11061 {
11064 }
11065
11066 if (new_item)
11067 {
11068 new_item.SetResultOfSplit(true);
11069 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11071 new_item.SetQuantity(split_quantity_new);
11072 }
11073 }
11074 else
11075 {
11076 if (stack_max != 0)
11077 {
11079 {
11081 }
11082
11084
11085 if (new_item)
11086 {
11087 new_item.SetResultOfSplit(true);
11088 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11090 new_item.SetQuantity(stack_max);
11091 new_item.PlaceOnSurface();
11092 }
11093 }
11094 }
11095 }
11096
11098 {
11100 return;
11101
11103 {
11104 if (ScriptInputUserData.CanStoreInputUserData())
11105 {
11106 ScriptInputUserData ctx = new ScriptInputUserData;
11111 dst.WriteToContext(ctx);
11113 }
11114 }
11115 else if (!
GetGame().IsMultiplayer())
11116 {
11118 }
11119 }
11120
11122 {
11124 return;
11125
11127 {
11128 if (ScriptInputUserData.CanStoreInputUserData())
11129 {
11130 ScriptInputUserData ctx = new ScriptInputUserData;
11135 ctx.
Write(destination_entity);
11141 }
11142 }
11143 else if (!
GetGame().IsMultiplayer())
11144 {
11146 }
11147 }
11148
11150 {
11152 }
11153
11155 {
11157 return this;
11158
11160 float split_quantity_new;
11162 if (dst.IsValid())
11163 {
11164 int slot_id = dst.GetSlot();
11166
11167 if (quantity > stack_max)
11168 split_quantity_new = stack_max;
11169 else
11170 split_quantity_new = quantity;
11171
11173
11174 if (new_item)
11175 {
11176 new_item.SetResultOfSplit(true);
11177 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11180 }
11181
11182 return new_item;
11183 }
11184
11185 return null;
11186 }
11187
11189 {
11191 return;
11192
11194 float split_quantity_new;
11196 if (destination_entity)
11197 {
11199 if (quantity > stackable)
11200 split_quantity_new = stackable;
11201 else
11202 split_quantity_new = quantity;
11203
11204 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11205 if (new_item)
11206 {
11207 new_item.SetResultOfSplit(true);
11208 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11210 new_item.SetQuantity(split_quantity_new);
11211 }
11212 }
11213 }
11214
11216 {
11218 return;
11219
11221 {
11222 if (ScriptInputUserData.CanStoreInputUserData())
11223 {
11224 ScriptInputUserData ctx = new ScriptInputUserData;
11229 ItemBase destination_entity =
this;
11230 ctx.
Write(destination_entity);
11234 }
11235 }
11236 else if (!
GetGame().IsMultiplayer())
11237 {
11239 }
11240 }
11241
11243 {
11245 return;
11246
11248 float split_quantity_new;
11250 if (player)
11251 {
11253 if (quantity > stackable)
11254 split_quantity_new = stackable;
11255 else
11256 split_quantity_new = quantity;
11257
11258 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11259 new_item =
ItemBase.Cast(in_hands);
11260 if (new_item)
11261 {
11262 new_item.SetResultOfSplit(true);
11263 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11265 new_item.SetQuantity(split_quantity_new);
11266 }
11267 }
11268 }
11269
11271 {
11273 return;
11274
11276 float split_quantity_new = Math.Floor(quantity * 0.5);
11277
11279
11280 if (new_item)
11281 {
11282 if (new_item.GetQuantityMax() < split_quantity_new)
11283 {
11284 split_quantity_new = new_item.GetQuantityMax();
11285 }
11286
11287 new_item.SetResultOfSplit(true);
11288 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11289
11291 {
11294 }
11295 else
11296 {
11299 }
11300 }
11301 }
11302
11304 {
11306 return;
11307
11309 float split_quantity_new = Math.Floor(quantity / 2);
11310
11311 InventoryLocation invloc = new InventoryLocation;
11313
11315 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11316
11317 if (new_item)
11318 {
11319 if (new_item.GetQuantityMax() < split_quantity_new)
11320 {
11321 split_quantity_new = new_item.GetQuantityMax();
11322 }
11324 {
11327 }
11328 else
11329 {
11332 }
11333 }
11334 }
11335
11338 {
11339 SetWeightDirty();
11341
11342 if (parent)
11343 parent.OnAttachmentQuantityChangedEx(this, delta);
11344
11346 {
11348 {
11350 }
11352 {
11353 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11355 }
11356 }
11357
11358 }
11359
11362 {
11363
11364 }
11365
11368 {
11370 }
11371
11373 {
11374 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11375
11377 {
11378 if (newLevel == GameConstants.STATE_RUINED)
11379 {
11381 EntityAI parent = GetHierarchyParent();
11382 if (parent && parent.IsFireplace())
11383 {
11384 CargoBase cargo = GetInventory().GetCargo();
11385 if (cargo)
11386 {
11388 {
11390 }
11391 }
11392 }
11393 }
11394
11396 {
11397
11399 return;
11400 }
11401
11402 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11403 {
11405 }
11406 }
11407 }
11408
11409
11411 {
11412 super.OnRightClick();
11413
11415 {
11417 {
11418 if (ScriptInputUserData.CanStoreInputUserData())
11419 {
11420 vector m4[4];
11422
11423 EntityAI root = GetHierarchyRoot();
11424
11425 InventoryLocation dst = new InventoryLocation;
11427 {
11428 if (root)
11429 {
11430 root.GetTransform(m4);
11432 }
11433 else
11434 GetInventory().GetCurrentInventoryLocation(dst);
11435 }
11436 else
11437 {
11439
11440
11441 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11442 {
11443 if (root)
11444 {
11445 root.GetTransform(m4);
11447 }
11448 else
11449 GetInventory().GetCurrentInventoryLocation(dst);
11450 }
11451 else
11452 {
11453 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11454 }
11455 }
11456
11457 ScriptInputUserData ctx = new ScriptInputUserData;
11465 }
11466 }
11467 else if (!
GetGame().IsMultiplayer())
11468 {
11470 }
11471 }
11472 }
11473
11474 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11475 {
11476
11477 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11478 return false;
11479
11480 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11481 return false;
11482
11483
11485 return false;
11486
11487
11488 Magazine mag = Magazine.Cast(this);
11489 if (mag)
11490 {
11491 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11492 return false;
11493
11494 if (stack_max_limit)
11495 {
11496 Magazine other_mag = Magazine.Cast(other_item);
11497 if (other_item)
11498 {
11499 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11500 return false;
11501 }
11502
11503 }
11504 }
11505 else
11506 {
11507
11509 return false;
11510
11512 return false;
11513 }
11514
11515 PlayerBase player = null;
11516 if (CastTo(player, GetHierarchyRootPlayer()))
11517 {
11518 if (player.GetInventory().HasAttachment(this))
11519 return false;
11520
11521 if (player.IsItemsToDelete())
11522 return false;
11523 }
11524
11525 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11526 return false;
11527
11528 int slotID;
11530 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11531 return false;
11532
11533 return true;
11534 }
11535
11537 {
11539 }
11540
11542 {
11543 return m_IsResultOfSplit;
11544 }
11545
11547 {
11548 m_IsResultOfSplit = value;
11549 }
11550
11552 {
11554 }
11555
11557 {
11558 float other_item_quantity = other_item.GetQuantity();
11559 float this_free_space;
11560
11562
11564
11565 if (other_item_quantity > this_free_space)
11566 {
11567 return this_free_space;
11568 }
11569 else
11570 {
11571 return other_item_quantity;
11572 }
11573 }
11574
11576 {
11578 }
11579
11581 {
11583 return;
11584
11585 if (!IsMagazine() && other_item)
11586 {
11588 if (quantity_used != 0)
11589 {
11590 float hp1 = GetHealth01("","");
11591 float hp2 = other_item.GetHealth01("","");
11592 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11593 hpResult = hpResult / (
GetQuantity() + quantity_used);
11594
11595 hpResult *= GetMaxHealth();
11596 Math.Round(hpResult);
11597 SetHealth("", "Health", hpResult);
11598
11600 other_item.AddQuantity(-quantity_used);
11601 }
11602 }
11604 }
11605
11607 {
11608 #ifdef SERVER
11609 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11610 GetHierarchyParent().IncreaseLifetimeUp();
11611 #endif
11612 };
11613
11615 {
11616 PlayerBase p = PlayerBase.Cast(player);
11617
11618 array<int> recipesIds = p.m_Recipes;
11619 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11620 if (moduleRecipesManager)
11621 {
11622 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11623 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11624 }
11625
11626 for (int i = 0;i < recipesIds.Count(); i++)
11627 {
11628 int key = recipesIds.Get(i);
11629 string recipeName = moduleRecipesManager.GetRecipeName(key);
11631 }
11632 }
11633
11634
11635 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11636 {
11637 super.GetDebugActions(outputList);
11638
11639
11644
11645
11649
11653
11654
11657
11658
11660 {
11663 }
11664
11666
11669
11673 }
11674
11675
11676
11677
11679 {
11680 super.OnAction(action_id, player, ctx);
11681 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11682 {
11683 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11684 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11685 PlayerBase p = PlayerBase.Cast(player);
11686 if (
EActions.RECIPES_RANGE_START < 1000)
11687 {
11688 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11689 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11690 }
11691 }
11692 #ifndef SERVER
11693 else if (action_id ==
EActions.WATCH_PLAYER)
11694 {
11695 PluginDeveloper.SetDeveloperItemClientEx(player);
11696 }
11697 #endif
11699 {
11700 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11701 {
11702 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11703 OnDebugButtonPressServer(id + 1);
11704 }
11705
11706 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11707 {
11708 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11710 }
11711
11712 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11713 {
11714 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11716 }
11717
11718 else if (action_id ==
EActions.ADD_QUANTITY)
11719 {
11720 if (IsMagazine())
11721 {
11722 Magazine mag = Magazine.Cast(this);
11723 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11724 }
11725 else
11726 {
11728 }
11729
11730 if (m_EM)
11731 {
11732 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11733 }
11734
11735 }
11736
11737 else if (action_id ==
EActions.REMOVE_QUANTITY)
11738 {
11739 if (IsMagazine())
11740 {
11741 Magazine mag2 = Magazine.Cast(this);
11742 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11743 }
11744 else
11745 {
11747 }
11748 if (m_EM)
11749 {
11750 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11751 }
11752
11753 }
11754
11755 else if (action_id ==
EActions.SET_QUANTITY_0)
11756 {
11758
11759 if (m_EM)
11760 {
11761 m_EM.SetEnergy(0);
11762 }
11763 }
11764
11765 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11766 {
11768
11769 if (m_EM)
11770 {
11771 m_EM.SetEnergy(m_EM.GetEnergyMax());
11772 }
11773 }
11774
11775 else if (action_id ==
EActions.ADD_HEALTH)
11776 {
11777 AddHealth("","",GetMaxHealth("","Health")/5);
11778 }
11779 else if (action_id ==
EActions.REMOVE_HEALTH)
11780 {
11781 AddHealth("","",-GetMaxHealth("","Health")/5);
11782 }
11783 else if (action_id ==
EActions.DESTROY_HEALTH)
11784 {
11785 SetHealth01("","",0);
11786 }
11787 else if (action_id ==
EActions.WATCH_ITEM)
11788 {
11790 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11791 #ifdef DEVELOPER
11792 SetDebugDeveloper_item(this);
11793 #endif
11794 }
11795
11796 else if (action_id ==
EActions.ADD_TEMPERATURE)
11797 {
11798 AddTemperature(20);
11799
11800 }
11801
11802 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11803 {
11804 AddTemperature(-20);
11805
11806 }
11807
11808 else if (action_id ==
EActions.FLIP_FROZEN)
11809 {
11810 SetFrozen(!GetIsFrozen());
11811
11812 }
11813
11814 else if (action_id ==
EActions.ADD_WETNESS)
11815 {
11817
11818 }
11819
11820 else if (action_id ==
EActions.REMOVE_WETNESS)
11821 {
11823
11824 }
11825
11826 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11827 {
11830
11831
11832 }
11833
11834 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11835 {
11838 }
11839
11840 else if (action_id ==
EActions.MAKE_SPECIAL)
11841 {
11842 auto debugParams = DebugSpawnParams.WithPlayer(player);
11843 OnDebugSpawnEx(debugParams);
11844 }
11845
11846 else if (action_id ==
EActions.DELETE)
11847 {
11848 Delete();
11849 }
11850
11851 }
11852
11853
11854 return false;
11855 }
11856
11857
11858
11859
11863
11866
11867
11868
11870 {
11871 return false;
11872 }
11873
11874
11876 {
11877 return true;
11878 }
11879
11880
11882 {
11883 return true;
11884 }
11885
11886
11887
11889 {
11890 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11892 }
11893
11896 {
11897 return null;
11898 }
11899
11901 {
11902 return false;
11903 }
11904
11906 {
11907 return false;
11908 }
11909
11913
11914
11916 {
11917 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11918 return module_repairing.CanRepair(this, item_repair_kit);
11919 }
11920
11921
11922 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11923 {
11924 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11925 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11926 }
11927
11928
11930 {
11931
11932
11933
11934
11935
11936
11937
11938
11939 return 1;
11940 }
11941
11942
11943
11945 {
11947 }
11948
11949
11950
11952 {
11954 }
11955
11956
11965 {
11966 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11967
11968 if (player)
11969 {
11970 player.MessageStatus(text);
11971 }
11972 }
11973
11974
11983 {
11984 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11985
11986 if (player)
11987 {
11988 player.MessageAction(text);
11989 }
11990 }
11991
11992
12001 {
12002 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12003
12004 if (player)
12005 {
12006 player.MessageFriendly(text);
12007 }
12008 }
12009
12010
12019 {
12020 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12021
12022 if (player)
12023 {
12024 player.MessageImportant(text);
12025 }
12026 }
12027
12029 {
12030 return true;
12031 }
12032
12033
12034 override bool KindOf(
string tag)
12035 {
12036 bool found = false;
12037 string item_name = this.
GetType();
12040
12041 int array_size = item_tag_array.Count();
12042 for (int i = 0; i < array_size; i++)
12043 {
12044 if (item_tag_array.Get(i) == tag)
12045 {
12046 found = true;
12047 break;
12048 }
12049 }
12050 return found;
12051 }
12052
12053
12055 {
12056
12057 super.OnRPC(sender, rpc_type,ctx);
12058
12059
12060 switch (rpc_type)
12061 {
12062 #ifndef SERVER
12063 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12064 Param2<bool, string> p = new Param2<bool, string>(false, "");
12065
12067 return;
12068
12069 bool play = p.param1;
12070 string soundSet = p.param2;
12071
12072 if (play)
12073 {
12075 {
12077 {
12079 }
12080 }
12081 else
12082 {
12084 }
12085 }
12086 else
12087 {
12089 }
12090
12091 break;
12092 #endif
12093
12094 }
12095
12097 {
12099 }
12100 }
12101
12102
12103
12104
12106 {
12107 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12108 return plugin.GetID(
name);
12109 }
12110
12112 {
12113 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12114 return plugin.GetName(id);
12115 }
12116
12119 {
12120
12121
12122 int varFlags;
12123 if (!ctx.
Read(varFlags))
12124 return;
12125
12126 if (varFlags & ItemVariableFlags.FLOAT)
12127 {
12129 }
12130 }
12131
12133 {
12134
12135 super.SerializeNumericalVars(floats_out);
12136
12137
12138
12140 {
12142 }
12143
12145 {
12147 }
12148
12150 {
12152 }
12153
12155 {
12160 }
12161
12163 {
12165 }
12166 }
12167
12169 {
12170
12171 super.DeSerializeNumericalVars(floats);
12172
12173
12174 int index = 0;
12175 int mask = Math.Round(floats.Get(index));
12176
12177 index++;
12178
12180 {
12182 {
12184 }
12185 else
12186 {
12187 float quantity = floats.Get(index);
12188 SetQuantity(quantity,
true,
false,
false,
false);
12189 }
12190 index++;
12191 }
12192
12194 {
12195 float wet = floats.Get(index);
12197 index++;
12198 }
12199
12201 {
12202 int liquidtype = Math.Round(floats.Get(index));
12204 index++;
12205 }
12206
12208 {
12210 index++;
12212 index++;
12214 index++;
12216 index++;
12217 }
12218
12220 {
12221 int cleanness = Math.Round(floats.Get(index));
12223 index++;
12224 }
12225 }
12226
12228 {
12229 super.WriteVarsToCTX(ctx);
12230
12231
12233 {
12235 }
12236
12238 {
12240 }
12241
12243 {
12245 }
12246
12248 {
12249 int r,g,b,a;
12255 }
12256
12258 {
12260 }
12261 }
12262
12264 {
12265 if (!super.ReadVarsFromCTX(ctx,version))
12266 return false;
12267
12268 int intValue;
12269 float value;
12270
12271 if (version < 140)
12272 {
12273 if (!ctx.
Read(intValue))
12274 return false;
12275
12276 m_VariablesMask = intValue;
12277 }
12278
12280 {
12281 if (!ctx.
Read(value))
12282 return false;
12283
12285 {
12287 }
12288 else
12289 {
12291 }
12292 }
12293
12294 if (version < 140)
12295 {
12297 {
12298 if (!ctx.
Read(value))
12299 return false;
12300 SetTemperatureDirect(value);
12301 }
12302 }
12303
12305 {
12306 if (!ctx.
Read(value))
12307 return false;
12309 }
12310
12312 {
12313 if (!ctx.
Read(intValue))
12314 return false;
12316 }
12317
12319 {
12320 int r,g,b,a;
12322 return false;
12324 return false;
12326 return false;
12328 return false;
12329
12331 }
12332
12334 {
12335 if (!ctx.
Read(intValue))
12336 return false;
12338 }
12339
12340 if (version >= 138 && version < 140)
12341 {
12343 {
12344 if (!ctx.
Read(intValue))
12345 return false;
12346 SetFrozen(intValue);
12347 }
12348 }
12349
12350 return true;
12351 }
12352
12353
12355 {
12358 {
12360 }
12361
12362 if (!super.OnStoreLoad(ctx, version))
12363 {
12365 return false;
12366 }
12367
12368 if (version >= 114)
12369 {
12370 bool hasQuickBarIndexSaved;
12371
12372 if (!ctx.
Read(hasQuickBarIndexSaved))
12373 {
12375 return false;
12376 }
12377
12378 if (hasQuickBarIndexSaved)
12379 {
12380 int itmQBIndex;
12381
12382
12383 if (!ctx.
Read(itmQBIndex))
12384 {
12386 return false;
12387 }
12388
12389 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12390 if (itmQBIndex != -1 && parentPlayer)
12391 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12392 }
12393 }
12394 else
12395 {
12396
12397 PlayerBase player;
12398 int itemQBIndex;
12399 if (version ==
int.
MAX)
12400 {
12401 if (!ctx.
Read(itemQBIndex))
12402 {
12404 return false;
12405 }
12406 }
12407 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12408 {
12409
12410 if (!ctx.
Read(itemQBIndex))
12411 {
12413 return false;
12414 }
12415 if (itemQBIndex != -1 && player)
12416 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12417 }
12418 }
12419
12420 if (version < 140)
12421 {
12422
12423 if (!LoadVariables(ctx, version))
12424 {
12426 return false;
12427 }
12428 }
12429
12430
12432 {
12434 return false;
12435 }
12436 if (version >= 132)
12437 {
12439 if (raib)
12440 {
12442 {
12444 return false;
12445 }
12446 }
12447 }
12448
12450 return true;
12451 }
12452
12453
12454
12456 {
12457 super.OnStoreSave(ctx);
12458
12459 PlayerBase player;
12460 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12461 {
12463
12464 int itemQBIndex = -1;
12465 itemQBIndex = player.FindQuickBarEntityIndex(this);
12466 ctx.
Write(itemQBIndex);
12467 }
12468 else
12469 {
12471 }
12472
12474
12476 if (raib)
12477 {
12479 }
12480 }
12481
12482
12484 {
12485 super.AfterStoreLoad();
12486
12488 {
12490 }
12491
12493 {
12496 }
12497 }
12498
12500 {
12501 super.EEOnAfterLoad();
12502
12504 {
12506 }
12507
12510 }
12511
12513 {
12514 return false;
12515 }
12516
12517
12518
12520 {
12522 {
12523 #ifdef PLATFORM_CONSOLE
12524
12526 {
12528 if (menu)
12529 {
12531 }
12532 }
12533 #endif
12534 }
12535
12537 {
12540 }
12541
12543 {
12544 SetWeightDirty();
12546 }
12548 {
12551 }
12552
12554 {
12557 }
12559 {
12562 }
12563
12564 super.OnVariablesSynchronized();
12565 }
12566
12567
12568
12570 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12571 {
12572 if (!IsServerCheck(allow_client))
12573 return false;
12574
12576 return false;
12577
12580
12581 if (value <= (min + 0.001))
12582 value = min;
12583
12584 if (value == min)
12585 {
12586 if (destroy_config)
12587 {
12588 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12589 if (dstr)
12590 {
12592 this.Delete();
12593 return true;
12594 }
12595 }
12596 else if (destroy_forced)
12597 {
12599 this.Delete();
12600 return true;
12601 }
12602
12604 }
12605
12608
12610 {
12612
12613 if (delta)
12615 }
12616
12618
12619 return false;
12620 }
12621
12622
12624 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12625 {
12627 }
12628
12630 {
12633 }
12634
12636 {
12639 }
12640
12643 {
12644 float value_clamped = Math.Clamp(value, 0, 1);
12646 SetQuantity(result, destroy_config, destroy_forced);
12647 }
12648
12649
12652 {
12654 }
12655
12657 {
12659 }
12660
12661
12662
12663
12664
12665
12666
12667
12668
12669
12671 {
12672 int slot = -1;
12673 if (GetInventory())
12674 {
12675 InventoryLocation il = new InventoryLocation;
12676 GetInventory().GetCurrentInventoryLocation(il);
12678 }
12679
12681 }
12682
12684 {
12685 float quantity_max = 0;
12686
12688 {
12689 if (attSlotID != -1)
12690 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12691
12692 if (quantity_max <= 0)
12694 }
12695
12696 if (quantity_max <= 0)
12698
12699 return quantity_max;
12700 }
12701
12703 {
12705 }
12706
12708 {
12710 }
12711
12712
12714 {
12716 }
12717
12719 {
12721 }
12722
12724 {
12726 }
12727
12728
12730 {
12731
12732 float weightEx = GetWeightEx();
12733 float special = GetInventoryAndCargoWeight();
12734 return weightEx - special;
12735 }
12736
12737
12739 {
12741 }
12742
12744 {
12746 {
12747 #ifdef DEVELOPER
12748 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12749 {
12750 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12752 }
12753 #endif
12754
12755 return GetQuantity() * GetConfigWeightModified();
12756 }
12757 else if (HasEnergyManager())
12758 {
12759 #ifdef DEVELOPER
12760 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12761 {
12762 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12763 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12764 }
12765 #endif
12766 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12767 }
12768 else
12769 {
12770 #ifdef DEVELOPER
12771 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12772 {
12773 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12774 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12775 }
12776 #endif
12777 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12778 }
12779 }
12780
12783 {
12784 int item_count = 0;
12786
12787 if (GetInventory().GetCargo() != NULL)
12788 {
12789 item_count = GetInventory().GetCargo().GetItemCount();
12790 }
12791
12792 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12793 {
12794 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12795 if (item)
12796 item_count += item.GetNumberOfItems();
12797 }
12798 return item_count;
12799 }
12800
12803 {
12804 float weight = 0;
12805 float wetness = 1;
12806 if (include_wetness)
12809 {
12810 weight = wetness * m_ConfigWeight;
12811 }
12813 {
12814 weight = 1;
12815 }
12816 return weight;
12817 }
12818
12819
12820
12822 {
12823 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12824 {
12825 GameInventory inv = GetInventory();
12826 array<EntityAI> items = new array<EntityAI>;
12828 for (int i = 0; i < items.Count(); i++)
12829 {
12831 if (item)
12832 {
12834 }
12835 }
12836 }
12837 }
12838
12839
12840
12841
12843 {
12844 float energy = 0;
12845 if (HasEnergyManager())
12846 {
12847 energy = GetCompEM().GetEnergy();
12848 }
12849 return energy;
12850 }
12851
12852
12854 {
12855 super.OnEnergyConsumed();
12856
12858 }
12859
12861 {
12862 super.OnEnergyAdded();
12863
12865 }
12866
12867
12869 {
12870 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12871 {
12873 {
12874 float energy_0to1 = GetCompEM().GetEnergy0To1();
12876 }
12877 }
12878 }
12879
12880
12882 {
12883 return ConfigGetFloat("heatIsolation");
12884 }
12885
12887 {
12889 }
12890
12892 {
12893 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12894 if (
GetGame().ConfigIsExisting(paramPath))
12896
12897 return 0.0;
12898 }
12899
12901 {
12902 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12903 if (
GetGame().ConfigIsExisting(paramPath))
12905
12906 return 0.0;
12907 }
12908
12909 override void SetWet(
float value,
bool allow_client =
false)
12910 {
12911 if (!IsServerCheck(allow_client))
12912 return;
12913
12916
12918
12919 m_VarWet = Math.Clamp(value, min, max);
12920
12922 {
12925 }
12926 }
12927
12928 override void AddWet(
float value)
12929 {
12931 }
12932
12934 {
12936 }
12937
12939 {
12941 }
12942
12944 {
12946 }
12947
12949 {
12951 }
12952
12954 {
12956 }
12957
12958 override void OnWetChanged(
float newVal,
float oldVal)
12959 {
12962 if (newLevel != oldLevel)
12963 {
12965 }
12966 }
12967
12969 {
12970 SetWeightDirty();
12971 }
12972
12974 {
12975 return GetWetLevelInternal(
m_VarWet);
12976 }
12977
12978
12979
12981 {
12983 }
12984
12986 {
12988 }
12989
12991 {
12993 }
12994
12996 {
12998 }
12999
13000
13001
13003 {
13004 if (ConfigIsExisting("itemModelLength"))
13005 {
13006 return ConfigGetFloat("itemModelLength");
13007 }
13008 return 0;
13009 }
13010
13012 {
13013 if (ConfigIsExisting("itemAttachOffset"))
13014 {
13015 return ConfigGetFloat("itemAttachOffset");
13016 }
13017 return 0;
13018 }
13019
13020 override void SetCleanness(
int value,
bool allow_client =
false)
13021 {
13022 if (!IsServerCheck(allow_client))
13023 return;
13024
13026
13028
13031 }
13032
13034 {
13036 }
13037
13039 {
13040 return true;
13041 }
13042
13043
13044
13045
13047 {
13049 }
13050
13052 {
13054 }
13055
13056
13057
13058
13059 override void SetColor(
int r,
int g,
int b,
int a)
13060 {
13066 }
13068 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13069 {
13074 }
13075
13077 {
13079 }
13080
13083 {
13084 int r,g,b,a;
13086 r = r/255;
13087 g = g/255;
13088 b = b/255;
13089 a = a/255;
13090 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13091 }
13092
13093
13094
13095 override void SetLiquidType(
int value,
bool allow_client =
false)
13096 {
13097 if (!IsServerCheck(allow_client))
13098 return;
13099
13104 }
13105
13107 {
13108 return ConfigGetInt("varLiquidTypeInit");
13109 }
13110
13112 {
13114 }
13115
13117 {
13119 SetFrozen(false);
13120 }
13121
13124 {
13125 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13126 }
13127
13128
13131 {
13132 PlayerBase nplayer;
13133 if (PlayerBase.CastTo(nplayer, player))
13134 {
13136
13137 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13138 }
13139 }
13140
13141
13144 {
13145 PlayerBase nplayer;
13146 if (PlayerBase.CastTo(nplayer,player))
13147 {
13148
13149 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13150
13151 }
13152
13153
13154 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13155
13156
13157 if (HasEnergyManager())
13158 {
13159 GetCompEM().UpdatePlugState();
13160 }
13161 }
13162
13163
13165 {
13166 super.OnPlacementStarted(player);
13167
13169 }
13170
13171 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13172 {
13174 {
13175 m_AdminLog.OnPlacementComplete(player,
this);
13176 }
13177
13178 super.OnPlacementComplete(player, position, orientation);
13179 }
13180
13181
13182
13183
13184
13186 {
13188 {
13189 return true;
13190 }
13191 else
13192 {
13193 return false;
13194 }
13195 }
13196
13197
13199 {
13201 {
13203 }
13204 }
13205
13206
13208 {
13210 }
13211
13213 {
13215 }
13216
13217 override void InsertAgent(
int agent,
float count = 1)
13218 {
13219 if (count < 1)
13220 return;
13221
13223 }
13224
13227 {
13229 }
13230
13231
13233 {
13235 }
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13279 {
13281 return false;
13282 return true;
13283 }
13284
13286 {
13287
13289 }
13290
13291
13294 {
13295 super.CheckForRoofLimited(timeTresholdMS);
13296
13298 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13299 {
13300 m_PreviousRoofTestTime = time;
13301 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13302 }
13303 }
13304
13305
13307 {
13309 {
13310 return 0;
13311 }
13312
13313 if (GetInventory().GetAttachmentSlotsCount() != 0)
13314 {
13315 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13316 if (filter)
13317 return filter.GetProtectionLevel(type, false, system);
13318 else
13319 return 0;
13320 }
13321
13322 string subclassPath, entryName;
13323
13324 switch (type)
13325 {
13327 entryName = "biological";
13328 break;
13330 entryName = "chemical";
13331 break;
13332 default:
13333 entryName = "biological";
13334 break;
13335 }
13336
13337 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13338
13340 }
13341
13342
13343
13346 {
13347 if (!IsMagazine())
13349
13351 }
13352
13353
13354
13355
13356
13361 {
13362 return true;
13363 }
13364
13366 {
13368 }
13369
13370
13371
13372
13373
13375 {
13376 if (parent)
13377 {
13378 if (parent.IsInherited(DayZInfected))
13379 return true;
13380
13381 if (!parent.IsRuined())
13382 return true;
13383 }
13384
13385 return true;
13386 }
13387
13389 {
13390 if (!super.CanPutAsAttachment(parent))
13391 {
13392 return false;
13393 }
13394
13395 if (!IsRuined() && !parent.IsRuined())
13396 {
13397 return true;
13398 }
13399
13400 return false;
13401 }
13402
13404 {
13405
13406
13407
13408
13409 return super.CanReceiveItemIntoCargo(item);
13410 }
13411
13413 {
13414
13415
13416
13417
13418 GameInventory attachmentInv = attachment.GetInventory();
13420 {
13421 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13422 return false;
13423 }
13424
13425 InventoryLocation loc = new InventoryLocation();
13426 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13427 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13428 return false;
13429
13430 return super.CanReceiveAttachment(attachment, slotId);
13431 }
13432
13434 {
13435 if (!super.CanReleaseAttachment(attachment))
13436 return false;
13437
13438 return GetInventory().AreChildrenAccessible();
13439 }
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13462 {
13463 int id = muzzle_owner.GetMuzzleID();
13464 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13465
13466 if (WPOF_array)
13467 {
13468 for (int i = 0; i < WPOF_array.Count(); i++)
13469 {
13470 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13471
13472 if (WPOF)
13473 {
13474 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13475 }
13476 }
13477 }
13478 }
13479
13480
13482 {
13483 int id = muzzle_owner.GetMuzzleID();
13485
13486 if (WPOBE_array)
13487 {
13488 for (int i = 0; i < WPOBE_array.Count(); i++)
13489 {
13490 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13491
13492 if (WPOBE)
13493 {
13494 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13495 }
13496 }
13497 }
13498 }
13499
13500
13502 {
13503 int id = muzzle_owner.GetMuzzleID();
13504 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13505
13506 if (WPOOH_array)
13507 {
13508 for (int i = 0; i < WPOOH_array.Count(); i++)
13509 {
13510 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13511
13512 if (WPOOH)
13513 {
13514 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13515 }
13516 }
13517 }
13518 }
13519
13520
13522 {
13523 int id = muzzle_owner.GetMuzzleID();
13524 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13525
13526 if (WPOOH_array)
13527 {
13528 for (int i = 0; i < WPOOH_array.Count(); i++)
13529 {
13530 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13531
13532 if (WPOOH)
13533 {
13534 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13535 }
13536 }
13537 }
13538 }
13539
13540
13542 {
13543 int id = muzzle_owner.GetMuzzleID();
13544 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13545
13546 if (WPOOH_array)
13547 {
13548 for (int i = 0; i < WPOOH_array.Count(); i++)
13549 {
13550 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13551
13552 if (WPOOH)
13553 {
13554 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13555 }
13556 }
13557 }
13558 }
13559
13560
13561
13563 {
13565 {
13566 return true;
13567 }
13568
13569 return false;
13570 }
13571
13573 {
13575 {
13576 return true;
13577 }
13578
13579 return false;
13580 }
13581
13583 {
13585 {
13586 return true;
13587 }
13588
13589 return false;
13590 }
13591
13593 {
13594 return false;
13595 }
13596
13599 {
13600 return UATimeSpent.DEFAULT_DEPLOY;
13601 }
13602
13603
13604
13605
13607 {
13609 SetSynchDirty();
13610 }
13611
13613 {
13615 }
13616
13617
13619 {
13620 return false;
13621 }
13622
13625 {
13626 string att_type = "None";
13627
13628 if (ConfigIsExisting("soundAttType"))
13629 {
13630 att_type = ConfigGetString("soundAttType");
13631 }
13632
13634 }
13635
13637 {
13639 }
13640
13641
13642
13643
13644
13648
13650 {
13653
13655 }
13656
13657
13659 {
13661 return;
13662
13664
13667
13670
13671 SoundParameters params = new SoundParameters();
13675 }
13676
13677
13679 {
13681 return;
13682
13684 SetSynchDirty();
13685
13688 }
13689
13690
13692 {
13694 return;
13695
13697 SetSynchDirty();
13698
13701 }
13702
13704 {
13706 }
13707
13709 {
13711 }
13712
13715 {
13716 if (!
GetGame().IsDedicatedServer())
13717 {
13718 if (ConfigIsExisting("attachSoundSet"))
13719 {
13720 string cfg_path = "";
13721 string soundset = "";
13722 string type_name =
GetType();
13723
13726 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13727 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13728
13729 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13730 {
13731 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13732 {
13733 if (cfg_slot_array[i] == slot_type)
13734 {
13735 soundset = cfg_soundset_array[i];
13736 break;
13737 }
13738 }
13739 }
13740
13741 if (soundset != "")
13742 {
13743 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13745 }
13746 }
13747 }
13748 }
13749
13751 {
13752
13753 }
13754
13755 void OnApply(PlayerBase player);
13756
13758 {
13759 return 1.0;
13760 };
13761
13763 {
13765 }
13766
13768 {
13770 }
13771
13773
13775 {
13776 SetDynamicPhysicsLifeTime(0.01);
13778 }
13779
13781 {
13782 array<string> zone_names = new array<string>;
13783 GetDamageZones(zone_names);
13784 for (int i = 0; i < zone_names.Count(); i++)
13785 {
13786 SetHealthMax(zone_names.Get(i),"Health");
13787 }
13788 SetHealthMax("","Health");
13789 }
13790
13793 {
13794 float global_health = GetHealth01("","Health");
13795 array<string> zones = new array<string>;
13796 GetDamageZones(zones);
13797
13798 for (int i = 0; i < zones.Count(); i++)
13799 {
13800 SetHealth01(zones.Get(i),"Health",global_health);
13801 }
13802 }
13803
13806 {
13807 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13808 }
13809
13811 {
13812 if (!hasRootAsPlayer)
13813 {
13814 if (refParentIB)
13815 {
13816
13817 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13818 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13819
13820 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13821 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13822
13825 }
13826 else
13827 {
13828
13831 }
13832 }
13833 }
13834
13836 {
13838 {
13839 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13840 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13841 {
13842 float heatPermCoef = 1.0;
13844 while (ent)
13845 {
13846 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13847 ent = ent.GetHierarchyParent();
13848 }
13849
13850 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13851 }
13852 }
13853 }
13854
13856 {
13857
13858 EntityAI parent = GetHierarchyParent();
13859 if (!parent)
13860 {
13861 hasParent = false;
13862 hasRootAsPlayer = false;
13863 }
13864 else
13865 {
13866 hasParent = true;
13867 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13868 refParentIB =
ItemBase.Cast(parent);
13869 }
13870 }
13871
13872 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13873 {
13874
13875 }
13876
13878 {
13879
13880 return false;
13881 }
13882
13884 {
13885
13886
13887 return false;
13888 }
13889
13891 {
13892
13893 return false;
13894 }
13895
13898 {
13899 return !GetIsFrozen() &&
IsOpen();
13900 }
13901
13903 {
13904 bool hasParent = false, hasRootAsPlayer = false;
13906
13907 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13908 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13909
13910 if (wwtu || foodDecay)
13911 {
13915
13916 if (processWetness || processTemperature || processDecay)
13917 {
13919
13920 if (processWetness)
13921 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13922
13923 if (processTemperature)
13925
13926 if (processDecay)
13927 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13928 }
13929 }
13930 }
13931
13934 {
13936 }
13937
13939 {
13942
13943 return super.GetTemperatureFreezeThreshold();
13944 }
13945
13947 {
13950
13951 return super.GetTemperatureThawThreshold();
13952 }
13953
13955 {
13958
13959 return super.GetItemOverheatThreshold();
13960 }
13961
13963 {
13965 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13966
13967 return super.GetTemperatureFreezeTime();
13968 }
13969
13971 {
13973 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13974
13975 return super.GetTemperatureThawTime();
13976 }
13977
13982
13984 {
13985 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13986 }
13987
13989 {
13990 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13991 }
13992
13995 {
13997 }
13998
14000 {
14002 }
14003
14005 {
14007 }
14008
14011 {
14012 return null;
14013 }
14014
14017 {
14018 return false;
14019 }
14020
14022 {
14024 {
14027 if (!trg)
14028 {
14030 explosive = this;
14031 }
14032
14033 explosive.PairRemote(trg);
14035
14036 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14037 trg.SetPersistentPairID(persistentID);
14038 explosive.SetPersistentPairID(persistentID);
14039
14040 return true;
14041 }
14042 return false;
14043 }
14044
14047 {
14048 float ret = 1.0;
14051 ret *= GetHealth01();
14052
14053 return ret;
14054 }
14055
14056 #ifdef DEVELOPER
14057 override void SetDebugItem()
14058 {
14059 super.SetDebugItem();
14060 _itemBase = this;
14061 }
14062
14064 {
14065 string text = super.GetDebugText();
14066
14068 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14069
14070 return text;
14071 }
14072 #endif
14073
14075 {
14076 return true;
14077 }
14078
14080
14082
14084 {
14087 }
14088
14089
14097
14113}
14114
14116{
14118 if (entity)
14119 {
14120 bool is_item = entity.IsInherited(
ItemBase);
14121 if (is_item && full_quantity)
14122 {
14125 }
14126 }
14127 else
14128 {
14130 return NULL;
14131 }
14132 return entity;
14133}
14134
14136{
14137 if (item)
14138 {
14139 if (health > 0)
14140 item.SetHealth("", "", health);
14141
14142 if (item.CanHaveTemperature())
14143 {
14145 if (item.CanFreeze())
14146 item.SetFrozen(false);
14147 }
14148
14149 if (item.HasEnergyManager())
14150 {
14151 if (quantity >= 0)
14152 {
14153 item.GetCompEM().SetEnergy0To1(quantity);
14154 }
14155 else
14156 {
14158 }
14159 }
14160 else if (item.IsMagazine())
14161 {
14162 Magazine mag = Magazine.Cast(item);
14163 if (quantity >= 0)
14164 {
14165 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14166 }
14167 else
14168 {
14170 }
14171
14172 }
14173 else
14174 {
14175 if (quantity >= 0)
14176 {
14177 item.SetQuantityNormalized(quantity, false);
14178 }
14179 else
14180 {
14182 }
14183
14184 }
14185 }
14186}
14187
14188#ifdef DEVELOPER
14190#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
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
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
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
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 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...
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)
void StartItemSoundServer(int id)
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)
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)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
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)
void Open()
Implementations only.
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 EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
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)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
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 bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
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 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 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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
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
proto native CGame GetGame()
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
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
class JsonUndergroundAreaTriggerData GetPosition
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.