9323{
9325 {
9326 return true;
9327 }
9328};
9329
9330
9331
9333{
9337
9339
9342
9343
9344
9345
9346
9355
9361
9366
9371
9392 protected bool m_IsResultOfSplit
9393
9395
9400
9401
9402
9404
9408
9409
9410
9412
9415
9416
9417
9423
9424
9432
9435
9436
9438
9439
9441
9442
9447
9448
9453
9454
9456
9457
9459 {
9464
9465 if (!
GetGame().IsDedicatedServer())
9466 {
9468 {
9470
9472 {
9474 }
9475 }
9476
9479 }
9480
9481 m_OldLocation = null;
9482
9484 {
9486 }
9487
9488 if (ConfigIsExisting("headSelectionsToHide"))
9489 {
9492 }
9493
9495 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9496 {
9498 }
9499
9501
9502 m_IsResultOfSplit = false;
9503
9505 }
9506
9508 {
9509 super.InitItemVariables();
9510
9516 m_Count = ConfigGetInt(
"count");
9517
9520
9525
9528
9533
9545
9549
9550
9553 if (ConfigIsExisting("canBeSplit"))
9554 {
9557 }
9558
9560 if (ConfigIsExisting("itemBehaviour"))
9562
9563
9566 RegisterNetSyncVariableInt("m_VarLiquidType");
9567 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9568
9569 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9570 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9571 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9572
9573 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9574 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9575 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9576 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9577
9578 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9579 RegisterNetSyncVariableBool("m_IsTakeable");
9580 RegisterNetSyncVariableBool("m_IsHologram");
9581
9584 {
9587 }
9588
9590
9592 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9594
9595 }
9596
9598 {
9600 }
9601
9603 {
9606 {
9611 }
9612 }
9613
9614 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9615 {
9617 {
9620 }
9621
9623 }
9624
9626 {
9632 }
9633
9635
9637 {
9639
9640 if (!action)
9641 {
9642 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9643 return;
9644 }
9645
9647 if (!ai)
9648 {
9650 return;
9651 }
9652
9654 if (!action_array)
9655 {
9656 action_array = new array<ActionBase_Basic>;
9658 }
9659 if (LogManager.IsActionLogEnable())
9660 {
9661 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9662 }
9663
9664 if (action_array.Find(action) != -1)
9665 {
9666 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9667 }
9668 else
9669 {
9670 action_array.Insert(action);
9671 }
9672 }
9673
9675 {
9677 ActionBase action = player.GetActionManager().GetAction(actionName);
9680
9681 if (action_array)
9682 {
9683 action_array.RemoveItem(action);
9684 }
9685 }
9686
9687
9688
9690 {
9691 ActionOverrideData overrideData = new ActionOverrideData();
9695
9697 if (!actionMap)
9698 {
9701 }
9702
9703 actionMap.Insert(this.
Type(), overrideData);
9704
9705 }
9706
9708
9710
9711
9713 {
9716
9719
9720 string config_to_search = "CfgVehicles";
9721 string muzzle_owner_config;
9722
9724 {
9725 if (IsInherited(Weapon))
9726 config_to_search = "CfgWeapons";
9727
9728 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9729
9730 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9731
9733
9734 if (config_OnFire_subclass_count > 0)
9735 {
9736 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9737
9738 for (int i = 0; i < config_OnFire_subclass_count; i++)
9739 {
9740 string particle_class = "";
9742 string config_OnFire_entry = config_OnFire_class + particle_class;
9743 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9744 WPOF_array.Insert(WPOF);
9745 }
9746
9747
9749 }
9750 }
9751
9753 {
9754 config_to_search = "CfgWeapons";
9755 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9756
9757 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9758
9760
9761 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9762 {
9763 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9764
9765 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9766 {
9767 string particle_class2 = "";
9769 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9770 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9771 WPOBE_array.Insert(WPOBE);
9772 }
9773
9774
9776 }
9777 }
9778 }
9779
9780
9782 {
9785
9787 {
9788 string config_to_search = "CfgVehicles";
9789
9790 if (IsInherited(Weapon))
9791 config_to_search = "CfgWeapons";
9792
9793 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9794 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9795
9796 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9797 {
9798
9800
9802 {
9804 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9806 return;
9807 }
9808
9811
9812
9813
9815 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9816
9817 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9818 {
9819 string particle_class = "";
9821 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9823
9824 if (entry_type == CT_CLASS)
9825 {
9826 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9827 WPOOH_array.Insert(WPOF);
9828 }
9829 }
9830
9831
9833 }
9834 }
9835 }
9836
9838 {
9840 }
9841
9843 {
9845 {
9847
9850
9853
9854 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9855 }
9856 }
9857
9859 {
9861 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9862
9864 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9865
9867 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9868
9870 {
9872 }
9873 }
9874
9876 {
9878 }
9879
9881 {
9884 else
9886
9888 {
9891 }
9892 else
9893 {
9896
9899 }
9900
9902 }
9903
9905 {
9907 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9908 }
9909
9911 {
9913 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9915 }
9916
9918 {
9920 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9921 }
9922
9924 {
9927
9928 OverheatingParticle OP = new OverheatingParticle();
9933
9935 }
9936
9938 {
9941
9942 return -1;
9943 }
9944
9946 {
9948 {
9951
9952 for (int i = count; i > 0; --i)
9953 {
9954 int id = i - 1;
9957
9960
9961 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9962 {
9963 if (p)
9964 {
9967 }
9968 }
9969 }
9970 }
9971 }
9972
9974 {
9976 {
9978 {
9979 int id = i - 1;
9981
9982 if (OP)
9983 {
9985
9986 if (p)
9987 {
9989 }
9990
9991 delete OP;
9992 }
9993 }
9994
9997 }
9998 }
9999
10002 {
10003 return 0.0;
10004 }
10005
10006
10008 {
10009 return 250;
10010 }
10011
10013 {
10014 return 0;
10015 }
10016
10019 {
10021 return true;
10022
10023 return false;
10024 }
10025
10028 {
10031
10033 {
10035 }
10036 else
10037 {
10038
10040 }
10041
10043 }
10044
10051 {
10052 return -1;
10053 }
10054
10055
10056
10057
10059 {
10061 {
10063 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10064
10065 if (r_index >= 0)
10066 {
10067 InventoryLocation r_il = new InventoryLocation;
10068 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10069
10070 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10073 {
10074 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10075 }
10077 {
10078 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10079 }
10080
10081 }
10082
10083 player.GetHumanInventory().ClearUserReservedLocation(this);
10084 }
10085
10088 }
10089
10090
10091
10092
10094 {
10095 return ItemBase.m_DebugActionsMask;
10096 }
10097
10099 {
10100 return ItemBase.m_DebugActionsMask & mask;
10101 }
10102
10104 {
10105 ItemBase.m_DebugActionsMask = mask;
10106 }
10107
10109 {
10110 ItemBase.m_DebugActionsMask |= mask;
10111 }
10112
10114 {
10115 ItemBase.m_DebugActionsMask &= ~mask;
10116 }
10117
10119 {
10121 {
10123 }
10124 else
10125 {
10127 }
10128 }
10129
10130
10132 {
10133 if (GetEconomyProfile())
10134 {
10135 float q_max = GetEconomyProfile().GetQuantityMax();
10136 if (q_max > 0)
10137 {
10138 float q_min = GetEconomyProfile().GetQuantityMin();
10139 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10140
10142 {
10143 ComponentEnergyManager comp = GetCompEM();
10145 {
10147 }
10148 }
10150 {
10152
10153 }
10154
10155 }
10156 }
10157 }
10158
10161 {
10162 EntityAI parent = GetHierarchyParent();
10163
10164 if (parent)
10165 {
10166 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10167 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10168 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10169 }
10170 }
10171
10174 {
10175 EntityAI parent = GetHierarchyParent();
10176
10177 if (parent)
10178 {
10179 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10180 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10181 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10182 }
10183 }
10184
10186 {
10187
10188
10189
10190
10192
10194 {
10195 if (ScriptInputUserData.CanStoreInputUserData())
10196 {
10197 ScriptInputUserData ctx = new ScriptInputUserData;
10203 ctx.
Write(use_stack_max);
10206
10208 {
10209 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10210 }
10211 }
10212 }
10213 else if (!
GetGame().IsMultiplayer())
10214 {
10216 }
10217 }
10218
10220 {
10222 }
10223
10225 {
10227 }
10228
10230 {
10232 }
10233
10235 {
10236
10237 return false;
10238 }
10239
10241 {
10242 return false;
10243 }
10244
10248 {
10249 return false;
10250 }
10251
10253 {
10254 return "";
10255 }
10256
10258
10260 {
10261 return false;
10262 }
10263
10265 {
10266 return true;
10267 }
10268
10269
10270
10272 {
10273 return true;
10274 }
10275
10277 {
10278 return true;
10279 }
10280
10282 {
10283 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10285 }
10286
10288 {
10290 }
10291
10293 {
10295 if (!is_being_placed)
10297 SetSynchDirty();
10298 }
10299
10300
10302
10304 {
10306 }
10307
10309 {
10311 }
10312
10314 {
10315 return 1;
10316 }
10317
10319 {
10320 return false;
10321 }
10322
10324 {
10326 SetSynchDirty();
10327 }
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10364 {
10365 super.OnMovedInsideCargo(container);
10366
10367 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10368 }
10369
10370 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10371 {
10372 super.EEItemLocationChanged(oldLoc,newLoc);
10373
10374 PlayerBase new_player = null;
10375 PlayerBase old_player = null;
10376
10377 if (newLoc.GetParent())
10378 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10379
10380 if (oldLoc.GetParent())
10381 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10382
10384 {
10385 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10386
10387 if (r_index >= 0)
10388 {
10389 InventoryLocation r_il = new InventoryLocation;
10390 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10391
10392 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10395 {
10396 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10397 }
10399 {
10400 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10401 }
10402
10403 }
10404 }
10405
10407 {
10408 if (new_player)
10409 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10410
10411 if (new_player == old_player)
10412 {
10413
10414 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10415 {
10417 {
10418 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10419 {
10420 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10421 }
10422 }
10423 else
10424 {
10425 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10426 }
10427 }
10428
10429 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10430 {
10431 int type = oldLoc.GetType();
10433 {
10434 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10435 }
10437 {
10438 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10439 }
10440 }
10441 if (!m_OldLocation)
10442 {
10443 m_OldLocation = new InventoryLocation;
10444 }
10445 m_OldLocation.Copy(oldLoc);
10446 }
10447 else
10448 {
10449 if (m_OldLocation)
10450 {
10451 m_OldLocation.Reset();
10452 }
10453 }
10454
10456 }
10457 else
10458 {
10459 if (new_player)
10460 {
10461 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10462 if (res_index >= 0)
10463 {
10464 InventoryLocation il = new InventoryLocation;
10465 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10467 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10470 {
10471 il.
GetParent().GetOnReleaseLock().Invoke(it);
10472 }
10474 {
10476 }
10477
10478 }
10479 }
10481 {
10482
10484 }
10485
10486 if (m_OldLocation)
10487 {
10488 m_OldLocation.Reset();
10489 }
10490 }
10491 }
10492
10493 override void EOnContact(IEntity other, Contact extra)
10494 {
10496 {
10497 int liquidType = -1;
10499 if (impactSpeed > 0.0)
10500 {
10502 #ifndef SERVER
10504 #else
10506 SetSynchDirty();
10507 #endif
10509 }
10510 }
10511
10512 #ifdef SERVER
10513 if (GetCompEM() && GetCompEM().IsPlugged())
10514 {
10515 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10516 GetCompEM().UnplugThis();
10517 }
10518 #endif
10519 }
10520
10522
10524 {
10526 }
10527
10529 {
10530
10531 }
10532
10534 {
10535 super.OnItemLocationChanged(old_owner, new_owner);
10536
10537 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10538 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10539
10540 if (!relatedPlayer && playerNew)
10541 relatedPlayer = playerNew;
10542
10543 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10544 {
10546 if (actionMgr)
10547 {
10548 ActionBase currentAction = actionMgr.GetRunningAction();
10549 if (currentAction)
10551 }
10552 }
10553
10554 Man ownerPlayerOld = null;
10555 Man ownerPlayerNew = null;
10556
10557 if (old_owner)
10558 {
10559 if (old_owner.
IsMan())
10560 {
10561 ownerPlayerOld = Man.Cast(old_owner);
10562 }
10563 else
10564 {
10565 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10566 }
10567 }
10568 else
10569 {
10571 {
10573
10574 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10575 {
10576 GetCompEM().UnplugThis();
10577 }
10578 }
10579 }
10580
10581 if (new_owner)
10582 {
10583 if (new_owner.
IsMan())
10584 {
10585 ownerPlayerNew = Man.Cast(new_owner);
10586 }
10587 else
10588 {
10589 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10590 }
10591 }
10592
10593 if (ownerPlayerOld != ownerPlayerNew)
10594 {
10595 if (ownerPlayerOld)
10596 {
10597 array<EntityAI> subItemsExit = new array<EntityAI>;
10599 for (int i = 0; i < subItemsExit.Count(); i++)
10600 {
10603 }
10604 }
10605
10606 if (ownerPlayerNew)
10607 {
10608 array<EntityAI> subItemsEnter = new array<EntityAI>;
10610 for (int j = 0; j < subItemsEnter.Count(); j++)
10611 {
10614 }
10615 }
10616 }
10617 else if (ownerPlayerNew != null)
10618 {
10619 PlayerBase nplayer;
10620 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10621 {
10622 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10624 for (int k = 0; k < subItemsUpdate.Count(); k++)
10625 {
10627 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10628 }
10629 }
10630 }
10631
10632 if (old_owner)
10633 old_owner.OnChildItemRemoved(this);
10634 if (new_owner)
10635 new_owner.OnChildItemReceived(this);
10636 }
10637
10638
10640 {
10641 super.EEDelete(parent);
10642 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10643 if (player)
10644 {
10646
10647 if (player.IsAlive())
10648 {
10649 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10650 if (r_index >= 0)
10651 {
10652 InventoryLocation r_il = new InventoryLocation;
10653 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10654
10655 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10658 {
10659 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10660 }
10662 {
10663 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10664 }
10665
10666 }
10667
10668 player.RemoveQuickBarEntityShortcut(this);
10669 }
10670 }
10671 }
10672
10674 {
10675 super.EEKilled(killer);
10676
10679 {
10680 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10681 {
10682 if (IsMagazine())
10683 {
10684 if (Magazine.Cast(this).GetAmmoCount() > 0)
10685 {
10687 }
10688 }
10689 else
10690 {
10692 }
10693 }
10694 }
10695 }
10696
10698 {
10699 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10700
10701 super.OnWasAttached(parent, slot_id);
10702
10705
10707 }
10708
10710 {
10711 super.OnWasDetached(parent, slot_id);
10712
10715 }
10716
10718 {
10719 int idx;
10722
10723 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10724 if (inventory_slots.Count() < 1)
10725 {
10726 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10727 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10728 }
10729 else
10730 {
10731 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10732 }
10733
10734 idx = inventory_slots.Find(slot);
10735 if (idx < 0)
10736 return "";
10737
10738 return attach_types.Get(idx);
10739 }
10740
10742 {
10743 int idx = -1;
10744 string slot;
10745
10748
10749 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10750 if (inventory_slots.Count() < 1)
10751 {
10752 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10753 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10754 }
10755 else
10756 {
10757 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10758 if (detach_types.Count() < 1)
10759 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10760 }
10761
10762 for (int i = 0; i < inventory_slots.Count(); i++)
10763 {
10764 slot = inventory_slots.Get(i);
10765 }
10766
10767 if (slot != "")
10768 {
10769 if (detach_types.Count() == 1)
10770 idx = 0;
10771 else
10772 idx = inventory_slots.Find(slot);
10773 }
10774 if (idx < 0)
10775 return "";
10776
10777 return detach_types.Get(idx);
10778 }
10779
10781 {
10782
10784
10785
10786 float min_time = 1;
10787 float max_time = 3;
10788 float delay = Math.RandomFloat(min_time, max_time);
10789
10790 explode_timer.Run(delay, this, "DoAmmoExplosion");
10791 }
10792
10794 {
10795 Magazine magazine = Magazine.Cast(this);
10796 int pop_sounds_count = 6;
10797 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10798
10799
10800 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10801 string sound_name = pop_sounds[ sound_idx ];
10803
10804
10805 magazine.ServerAddAmmoCount(-1);
10806
10807
10808 float min_temp_to_explode = 100;
10809
10810 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10811 {
10813 }
10814 }
10815
10816
10817 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10818 {
10819 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10820
10821 const int CHANCE_DAMAGE_CARGO = 4;
10822 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10823 const int CHANCE_DAMAGE_NOTHING = 2;
10824
10826 {
10827 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10828 int chances;
10829 int rnd;
10830
10831 if (GetInventory().GetCargo())
10832 {
10833 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10834 rnd = Math.RandomInt(0,chances);
10835
10836 if (rnd < CHANCE_DAMAGE_CARGO)
10837 {
10839 }
10840 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10841 {
10843 }
10844 }
10845 else
10846 {
10847 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10848 rnd = Math.RandomInt(0,chances);
10849
10850 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10851 {
10853 }
10854 }
10855 }
10856 }
10857
10859 {
10860 if (GetInventory().GetCargo())
10861 {
10862 int item_count = GetInventory().GetCargo().GetItemCount();
10863 if (item_count > 0)
10864 {
10865 int random_pick = Math.RandomInt(0, item_count);
10867 if (!item.IsExplosive())
10868 {
10869 item.AddHealth("","",damage);
10870 return true;
10871 }
10872 }
10873 }
10874 return false;
10875 }
10876
10878 {
10879 int attachment_count = GetInventory().AttachmentCount();
10880 if (attachment_count > 0)
10881 {
10882 int random_pick = Math.RandomInt(0, attachment_count);
10883 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10884 if (!attachment.IsExplosive())
10885 {
10886 attachment.AddHealth("","",damage);
10887 return true;
10888 }
10889 }
10890 return false;
10891 }
10892
10894 {
10896 }
10897
10899 {
10901 return GetInventory().CanRemoveEntity();
10902
10903 return false;
10904 }
10905
10907 {
10909 return;
10910
10912 {
10913 if (ScriptInputUserData.CanStoreInputUserData())
10914 {
10915 ScriptInputUserData ctx = new ScriptInputUserData;
10920 ctx.
Write(destination_entity);
10922 ctx.
Write(slot_id);
10924 }
10925 }
10926 else if (!
GetGame().IsMultiplayer())
10927 {
10929 }
10930 }
10931
10933 {
10935 return;
10936
10937 float split_quantity_new;
10941 InventoryLocation loc = new InventoryLocation;
10942
10943 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10944 {
10946 split_quantity_new = stack_max;
10947 else
10949
10950 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10951 if (new_item)
10952 {
10953 new_item.SetResultOfSplit(true);
10954 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10956 new_item.SetQuantity(split_quantity_new);
10957 }
10958 }
10959 else if (destination_entity && slot_id == -1)
10960 {
10961 if (quantity > stack_max)
10962 split_quantity_new = stack_max;
10963 else
10964 split_quantity_new = quantity;
10965
10967 {
10970 }
10971
10972 if (new_item)
10973 {
10974 new_item.SetResultOfSplit(true);
10975 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10977 new_item.SetQuantity(split_quantity_new);
10978 }
10979 }
10980 else
10981 {
10982 if (stack_max != 0)
10983 {
10985 {
10987 }
10988
10989 if (split_quantity_new == 0)
10990 {
10991 if (!
GetGame().IsMultiplayer())
10992 player.PhysicalPredictiveDropItem(this);
10993 else
10994 player.ServerDropEntity(this);
10995 return;
10996 }
10997
10999
11000 if (new_item)
11001 {
11002 new_item.SetResultOfSplit(true);
11003 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11005 new_item.SetQuantity(stack_max);
11006 new_item.PlaceOnSurface();
11007 }
11008 }
11009 }
11010 }
11011
11013 {
11015 return;
11016
11017 float split_quantity_new;
11021 InventoryLocation loc = new InventoryLocation;
11022
11023 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11024 {
11026 split_quantity_new = stack_max;
11027 else
11029
11030 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11031 if (new_item)
11032 {
11033 new_item.SetResultOfSplit(true);
11034 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11036 new_item.SetQuantity(split_quantity_new);
11037 }
11038 }
11039 else if (destination_entity && slot_id == -1)
11040 {
11041 if (quantity > stack_max)
11042 split_quantity_new = stack_max;
11043 else
11044 split_quantity_new = quantity;
11045
11047 {
11050 }
11051
11052 if (new_item)
11053 {
11054 new_item.SetResultOfSplit(true);
11055 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11057 new_item.SetQuantity(split_quantity_new);
11058 }
11059 }
11060 else
11061 {
11062 if (stack_max != 0)
11063 {
11065 {
11067 }
11068
11070
11071 if (new_item)
11072 {
11073 new_item.SetResultOfSplit(true);
11074 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11076 new_item.SetQuantity(stack_max);
11077 new_item.PlaceOnSurface();
11078 }
11079 }
11080 }
11081 }
11082
11084 {
11086 return;
11087
11089 {
11090 if (ScriptInputUserData.CanStoreInputUserData())
11091 {
11092 ScriptInputUserData ctx = new ScriptInputUserData;
11097 dst.WriteToContext(ctx);
11099 }
11100 }
11101 else if (!
GetGame().IsMultiplayer())
11102 {
11104 }
11105 }
11106
11108 {
11110 return;
11111
11113 {
11114 if (ScriptInputUserData.CanStoreInputUserData())
11115 {
11116 ScriptInputUserData ctx = new ScriptInputUserData;
11121 ctx.
Write(destination_entity);
11127 }
11128 }
11129 else if (!
GetGame().IsMultiplayer())
11130 {
11132 }
11133 }
11134
11136 {
11138 }
11139
11141 {
11143 return this;
11144
11146 float split_quantity_new;
11148 if (dst.IsValid())
11149 {
11150 int slot_id = dst.GetSlot();
11152
11153 if (quantity > stack_max)
11154 split_quantity_new = stack_max;
11155 else
11156 split_quantity_new = quantity;
11157
11159
11160 if (new_item)
11161 {
11162 new_item.SetResultOfSplit(true);
11163 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11166 }
11167
11168 return new_item;
11169 }
11170
11171 return null;
11172 }
11173
11175 {
11177 return;
11178
11180 float split_quantity_new;
11182 if (destination_entity)
11183 {
11185 if (quantity > stackable)
11186 split_quantity_new = stackable;
11187 else
11188 split_quantity_new = quantity;
11189
11190 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11191 if (new_item)
11192 {
11193 new_item.SetResultOfSplit(true);
11194 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11196 new_item.SetQuantity(split_quantity_new);
11197 }
11198 }
11199 }
11200
11202 {
11204 return;
11205
11207 {
11208 if (ScriptInputUserData.CanStoreInputUserData())
11209 {
11210 ScriptInputUserData ctx = new ScriptInputUserData;
11215 ItemBase destination_entity =
this;
11216 ctx.
Write(destination_entity);
11220 }
11221 }
11222 else if (!
GetGame().IsMultiplayer())
11223 {
11225 }
11226 }
11227
11229 {
11231 return;
11232
11234 float split_quantity_new;
11236 if (player)
11237 {
11239 if (quantity > stackable)
11240 split_quantity_new = stackable;
11241 else
11242 split_quantity_new = quantity;
11243
11244 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11245 new_item =
ItemBase.Cast(in_hands);
11246 if (new_item)
11247 {
11248 new_item.SetResultOfSplit(true);
11249 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11251 new_item.SetQuantity(split_quantity_new);
11252 }
11253 }
11254 }
11255
11257 {
11259 return;
11260
11262 float split_quantity_new = Math.Floor(quantity * 0.5);
11263
11265
11266 if (new_item)
11267 {
11268 if (new_item.GetQuantityMax() < split_quantity_new)
11269 {
11270 split_quantity_new = new_item.GetQuantityMax();
11271 }
11272
11273 new_item.SetResultOfSplit(true);
11274 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11275
11277 {
11280 }
11281 else
11282 {
11285 }
11286 }
11287 }
11288
11290 {
11292 return;
11293
11295 float split_quantity_new = Math.Floor(quantity / 2);
11296
11297 InventoryLocation invloc = new InventoryLocation;
11299
11301 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11302
11303 if (new_item)
11304 {
11305 if (new_item.GetQuantityMax() < split_quantity_new)
11306 {
11307 split_quantity_new = new_item.GetQuantityMax();
11308 }
11310 {
11313 }
11314 else
11315 {
11318 }
11319 }
11320 }
11321
11324 {
11325 SetWeightDirty();
11327
11328 if (parent)
11329 parent.OnAttachmentQuantityChangedEx(this, delta);
11330
11332 {
11334 {
11336 }
11338 {
11339 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11341 }
11342 }
11343
11344 }
11345
11348 {
11349
11350 }
11351
11354 {
11356 }
11357
11359 {
11360 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11361
11363 {
11364 if (newLevel == GameConstants.STATE_RUINED)
11365 {
11367 EntityAI parent = GetHierarchyParent();
11368 if (parent && parent.IsFireplace())
11369 {
11370 CargoBase cargo = GetInventory().GetCargo();
11371 if (cargo)
11372 {
11374 {
11376 }
11377 }
11378 }
11379 }
11380
11382 {
11383
11385 return;
11386 }
11387
11388 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11389 {
11391 }
11392 }
11393 }
11394
11395
11397 {
11398 super.OnRightClick();
11399
11401 {
11403 {
11404 if (ScriptInputUserData.CanStoreInputUserData())
11405 {
11406 vector m4[4];
11408
11409 EntityAI root = GetHierarchyRoot();
11410
11411 InventoryLocation dst = new InventoryLocation;
11413 {
11414 if (root)
11415 {
11416 root.GetTransform(m4);
11418 }
11419 else
11420 GetInventory().GetCurrentInventoryLocation(dst);
11421 }
11422 else
11423 {
11425
11426
11427 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11428 {
11429 if (root)
11430 {
11431 root.GetTransform(m4);
11433 }
11434 else
11435 GetInventory().GetCurrentInventoryLocation(dst);
11436 }
11437 else
11438 {
11439 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11440 }
11441 }
11442
11443 ScriptInputUserData ctx = new ScriptInputUserData;
11451 }
11452 }
11453 else if (!
GetGame().IsMultiplayer())
11454 {
11456 }
11457 }
11458 }
11459
11460 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11461 {
11462
11463 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11464 return false;
11465
11466 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11467 return false;
11468
11469
11471 return false;
11472
11473
11474 Magazine mag = Magazine.Cast(this);
11475 if (mag)
11476 {
11477 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11478 return false;
11479
11480 if (stack_max_limit)
11481 {
11482 Magazine other_mag = Magazine.Cast(other_item);
11483 if (other_item)
11484 {
11485 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11486 return false;
11487 }
11488
11489 }
11490 }
11491 else
11492 {
11493
11495 return false;
11496
11498 return false;
11499 }
11500
11501 PlayerBase player = null;
11502 if (CastTo(player, GetHierarchyRootPlayer()))
11503 {
11504 if (player.GetInventory().HasAttachment(this))
11505 return false;
11506
11507 if (player.IsItemsToDelete())
11508 return false;
11509 }
11510
11511 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11512 return false;
11513
11514 int slotID;
11516 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11517 return false;
11518
11519 return true;
11520 }
11521
11523 {
11525 }
11526
11528 {
11529 return m_IsResultOfSplit;
11530 }
11531
11533 {
11534 m_IsResultOfSplit = value;
11535 }
11536
11538 {
11540 }
11541
11543 {
11544 float other_item_quantity = other_item.GetQuantity();
11545 float this_free_space;
11546
11548
11550
11551 if (other_item_quantity > this_free_space)
11552 {
11553 return this_free_space;
11554 }
11555 else
11556 {
11557 return other_item_quantity;
11558 }
11559 }
11560
11562 {
11564 }
11565
11567 {
11569 return;
11570
11571 if (!IsMagazine() && other_item)
11572 {
11574 if (quantity_used != 0)
11575 {
11576 float hp1 = GetHealth01("","");
11577 float hp2 = other_item.GetHealth01("","");
11578 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11579 hpResult = hpResult / (
GetQuantity() + quantity_used);
11580
11581 hpResult *= GetMaxHealth();
11582 Math.Round(hpResult);
11583 SetHealth("", "Health", hpResult);
11584
11586 other_item.AddQuantity(-quantity_used);
11587 }
11588 }
11590 }
11591
11593 {
11594 #ifdef SERVER
11595 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11596 GetHierarchyParent().IncreaseLifetimeUp();
11597 #endif
11598 };
11599
11601 {
11602 PlayerBase p = PlayerBase.Cast(player);
11603
11604 array<int> recipesIds = p.m_Recipes;
11605 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11606 if (moduleRecipesManager)
11607 {
11608 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11609 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11610 }
11611
11612 for (int i = 0;i < recipesIds.Count(); i++)
11613 {
11614 int key = recipesIds.Get(i);
11615 string recipeName = moduleRecipesManager.GetRecipeName(key);
11617 }
11618 }
11619
11620
11621 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11622 {
11623 super.GetDebugActions(outputList);
11624
11625
11630
11631
11635
11639
11640
11643
11644
11646 {
11649 }
11650
11652
11655
11659 }
11660
11661
11662
11663
11665 {
11666 super.OnAction(action_id, player, ctx);
11667 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11668 {
11669 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11670 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11671 PlayerBase p = PlayerBase.Cast(player);
11672 if (
EActions.RECIPES_RANGE_START < 1000)
11673 {
11674 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11675 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11676 }
11677 }
11678 #ifndef SERVER
11679 else if (action_id ==
EActions.WATCH_PLAYER)
11680 {
11681 PluginDeveloper.SetDeveloperItemClientEx(player);
11682 }
11683 #endif
11685 {
11686 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11687 {
11688 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11689 OnDebugButtonPressServer(id + 1);
11690 }
11691
11692 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11693 {
11694 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11696 }
11697
11698 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11699 {
11700 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11702 }
11703
11704 else if (action_id ==
EActions.ADD_QUANTITY)
11705 {
11706 if (IsMagazine())
11707 {
11708 Magazine mag = Magazine.Cast(this);
11709 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11710 }
11711 else
11712 {
11714 }
11715
11716 if (m_EM)
11717 {
11718 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11719 }
11720
11721 }
11722
11723 else if (action_id ==
EActions.REMOVE_QUANTITY)
11724 {
11725 if (IsMagazine())
11726 {
11727 Magazine mag2 = Magazine.Cast(this);
11728 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11729 }
11730 else
11731 {
11733 }
11734 if (m_EM)
11735 {
11736 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11737 }
11738
11739 }
11740
11741 else if (action_id ==
EActions.SET_QUANTITY_0)
11742 {
11744
11745 if (m_EM)
11746 {
11747 m_EM.SetEnergy(0);
11748 }
11749 }
11750
11751 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11752 {
11754
11755 if (m_EM)
11756 {
11757 m_EM.SetEnergy(m_EM.GetEnergyMax());
11758 }
11759 }
11760
11761 else if (action_id ==
EActions.ADD_HEALTH)
11762 {
11763 AddHealth("","",GetMaxHealth("","Health")/5);
11764 }
11765 else if (action_id ==
EActions.REMOVE_HEALTH)
11766 {
11767 AddHealth("","",-GetMaxHealth("","Health")/5);
11768 }
11769 else if (action_id ==
EActions.DESTROY_HEALTH)
11770 {
11771 SetHealth01("","",0);
11772 }
11773 else if (action_id ==
EActions.WATCH_ITEM)
11774 {
11776 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11777 #ifdef DEVELOPER
11778 SetDebugDeveloper_item(this);
11779 #endif
11780 }
11781
11782 else if (action_id ==
EActions.ADD_TEMPERATURE)
11783 {
11784 AddTemperature(20);
11785
11786 }
11787
11788 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11789 {
11790 AddTemperature(-20);
11791
11792 }
11793
11794 else if (action_id ==
EActions.FLIP_FROZEN)
11795 {
11796 SetFrozen(!GetIsFrozen());
11797
11798 }
11799
11800 else if (action_id ==
EActions.ADD_WETNESS)
11801 {
11803
11804 }
11805
11806 else if (action_id ==
EActions.REMOVE_WETNESS)
11807 {
11809
11810 }
11811
11812 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11813 {
11816
11817
11818 }
11819
11820 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11821 {
11824 }
11825
11826 else if (action_id ==
EActions.MAKE_SPECIAL)
11827 {
11828 auto debugParams = DebugSpawnParams.WithPlayer(player);
11829 OnDebugSpawnEx(debugParams);
11830 }
11831
11832 else if (action_id ==
EActions.DELETE)
11833 {
11834 Delete();
11835 }
11836
11837 }
11838
11839
11840 return false;
11841 }
11842
11843
11844
11845
11849
11852
11853
11854
11856 {
11857 return false;
11858 }
11859
11860
11862 {
11863 return true;
11864 }
11865
11866
11868 {
11869 return true;
11870 }
11871
11872
11873
11875 {
11876 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11878 }
11879
11882 {
11883 return null;
11884 }
11885
11887 {
11888 return false;
11889 }
11890
11892 {
11893 return false;
11894 }
11895
11899
11900
11902 {
11903 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11904 return module_repairing.CanRepair(this, item_repair_kit);
11905 }
11906
11907
11908 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11909 {
11910 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11911 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11912 }
11913
11914
11916 {
11917
11918
11919
11920
11921
11922
11923
11924
11925 return 1;
11926 }
11927
11928
11929
11931 {
11933 }
11934
11935
11936
11938 {
11940 }
11941
11942
11951 {
11952 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11953
11954 if (player)
11955 {
11956 player.MessageStatus(text);
11957 }
11958 }
11959
11960
11969 {
11970 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11971
11972 if (player)
11973 {
11974 player.MessageAction(text);
11975 }
11976 }
11977
11978
11987 {
11988 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11989
11990 if (player)
11991 {
11992 player.MessageFriendly(text);
11993 }
11994 }
11995
11996
12005 {
12006 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12007
12008 if (player)
12009 {
12010 player.MessageImportant(text);
12011 }
12012 }
12013
12015 {
12016 return true;
12017 }
12018
12019
12020 override bool KindOf(
string tag)
12021 {
12022 bool found = false;
12023 string item_name = this.
GetType();
12026
12027 int array_size = item_tag_array.Count();
12028 for (int i = 0; i < array_size; i++)
12029 {
12030 if (item_tag_array.Get(i) == tag)
12031 {
12032 found = true;
12033 break;
12034 }
12035 }
12036 return found;
12037 }
12038
12039
12041 {
12042
12043 super.OnRPC(sender, rpc_type,ctx);
12044
12045
12046 switch (rpc_type)
12047 {
12048 #ifndef SERVER
12049 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12050 Param2<bool, string> p = new Param2<bool, string>(false, "");
12051
12053 return;
12054
12055 bool play = p.param1;
12056 string soundSet = p.param2;
12057
12058 if (play)
12059 {
12061 {
12063 {
12065 }
12066 }
12067 else
12068 {
12070 }
12071 }
12072 else
12073 {
12075 }
12076
12077 break;
12078 #endif
12079
12080 }
12081
12083 {
12085 }
12086 }
12087
12088
12089
12090
12092 {
12093 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12094 return plugin.GetID(
name);
12095 }
12096
12098 {
12099 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12100 return plugin.GetName(id);
12101 }
12102
12105 {
12106
12107
12108 int varFlags;
12109 if (!ctx.
Read(varFlags))
12110 return;
12111
12112 if (varFlags & ItemVariableFlags.FLOAT)
12113 {
12115 }
12116 }
12117
12119 {
12120
12121 super.SerializeNumericalVars(floats_out);
12122
12123
12124
12126 {
12128 }
12129
12131 {
12133 }
12134
12136 {
12138 }
12139
12141 {
12146 }
12147
12149 {
12151 }
12152 }
12153
12155 {
12156
12157 super.DeSerializeNumericalVars(floats);
12158
12159
12160 int index = 0;
12161 int mask = Math.Round(floats.Get(index));
12162
12163 index++;
12164
12166 {
12168 {
12170 }
12171 else
12172 {
12173 float quantity = floats.Get(index);
12174 SetQuantity(quantity,
true,
false,
false,
false);
12175 }
12176 index++;
12177 }
12178
12180 {
12181 float wet = floats.Get(index);
12183 index++;
12184 }
12185
12187 {
12188 int liquidtype = Math.Round(floats.Get(index));
12190 index++;
12191 }
12192
12194 {
12196 index++;
12198 index++;
12200 index++;
12202 index++;
12203 }
12204
12206 {
12207 int cleanness = Math.Round(floats.Get(index));
12209 index++;
12210 }
12211 }
12212
12214 {
12215 super.WriteVarsToCTX(ctx);
12216
12217
12219 {
12221 }
12222
12224 {
12226 }
12227
12229 {
12231 }
12232
12234 {
12235 int r,g,b,a;
12241 }
12242
12244 {
12246 }
12247 }
12248
12250 {
12251 if (!super.ReadVarsFromCTX(ctx,version))
12252 return false;
12253
12254 int intValue;
12255 float value;
12256
12257 if (version < 140)
12258 {
12259 if (!ctx.
Read(intValue))
12260 return false;
12261
12262 m_VariablesMask = intValue;
12263 }
12264
12266 {
12267 if (!ctx.
Read(value))
12268 return false;
12269
12271 {
12273 }
12274 else
12275 {
12277 }
12278 }
12279
12280 if (version < 140)
12281 {
12283 {
12284 if (!ctx.
Read(value))
12285 return false;
12286 SetTemperatureDirect(value);
12287 }
12288 }
12289
12291 {
12292 if (!ctx.
Read(value))
12293 return false;
12295 }
12296
12298 {
12299 if (!ctx.
Read(intValue))
12300 return false;
12302 }
12303
12305 {
12306 int r,g,b,a;
12308 return false;
12310 return false;
12312 return false;
12314 return false;
12315
12317 }
12318
12320 {
12321 if (!ctx.
Read(intValue))
12322 return false;
12324 }
12325
12326 if (version >= 138 && version < 140)
12327 {
12329 {
12330 if (!ctx.
Read(intValue))
12331 return false;
12332 SetFrozen(intValue);
12333 }
12334 }
12335
12336 return true;
12337 }
12338
12339
12341 {
12344 {
12346 }
12347
12348 if (!super.OnStoreLoad(ctx, version))
12349 {
12351 return false;
12352 }
12353
12354 if (version >= 114)
12355 {
12356 bool hasQuickBarIndexSaved;
12357
12358 if (!ctx.
Read(hasQuickBarIndexSaved))
12359 {
12361 return false;
12362 }
12363
12364 if (hasQuickBarIndexSaved)
12365 {
12366 int itmQBIndex;
12367
12368
12369 if (!ctx.
Read(itmQBIndex))
12370 {
12372 return false;
12373 }
12374
12375 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12376 if (itmQBIndex != -1 && parentPlayer)
12377 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12378 }
12379 }
12380 else
12381 {
12382
12383 PlayerBase player;
12384 int itemQBIndex;
12385 if (version ==
int.
MAX)
12386 {
12387 if (!ctx.
Read(itemQBIndex))
12388 {
12390 return false;
12391 }
12392 }
12393 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12394 {
12395
12396 if (!ctx.
Read(itemQBIndex))
12397 {
12399 return false;
12400 }
12401 if (itemQBIndex != -1 && player)
12402 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12403 }
12404 }
12405
12406 if (version < 140)
12407 {
12408
12409 if (!LoadVariables(ctx, version))
12410 {
12412 return false;
12413 }
12414 }
12415
12416
12418 {
12420 return false;
12421 }
12422 if (version >= 132)
12423 {
12425 if (raib)
12426 {
12428 {
12430 return false;
12431 }
12432 }
12433 }
12434
12436 return true;
12437 }
12438
12439
12440
12442 {
12443 super.OnStoreSave(ctx);
12444
12445 PlayerBase player;
12446 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12447 {
12449
12450 int itemQBIndex = -1;
12451 itemQBIndex = player.FindQuickBarEntityIndex(this);
12452 ctx.
Write(itemQBIndex);
12453 }
12454 else
12455 {
12457 }
12458
12460
12462 if (raib)
12463 {
12465 }
12466 }
12467
12468
12470 {
12471 super.AfterStoreLoad();
12472
12474 {
12476 }
12477
12479 {
12482 }
12483 }
12484
12486 {
12487 super.EEOnAfterLoad();
12488
12490 {
12492 }
12493
12496 }
12497
12499 {
12500 return false;
12501 }
12502
12503
12504
12506 {
12508 {
12509 #ifdef PLATFORM_CONSOLE
12510
12512 {
12514 if (menu)
12515 {
12517 }
12518 }
12519 #endif
12520 }
12521
12523 {
12526 }
12527
12529 {
12530 SetWeightDirty();
12532 }
12534 {
12537 }
12538
12540 {
12543 }
12545 {
12548 }
12549
12550 super.OnVariablesSynchronized();
12551 }
12552
12553
12554
12556 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12557 {
12558 if (!IsServerCheck(allow_client))
12559 return false;
12560
12562 return false;
12563
12566
12567 if (value <= (min + 0.001))
12568 value = min;
12569
12570 if (value == min)
12571 {
12572 if (destroy_config)
12573 {
12574 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12575 if (dstr)
12576 {
12578 this.Delete();
12579 return true;
12580 }
12581 }
12582 else if (destroy_forced)
12583 {
12585 this.Delete();
12586 return true;
12587 }
12588
12590 }
12591
12594
12596 {
12598
12599 if (delta)
12601 }
12602
12604
12605 return false;
12606 }
12607
12608
12610 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12611 {
12613 }
12614
12616 {
12619 }
12620
12622 {
12625 }
12626
12629 {
12630 float value_clamped = Math.Clamp(value, 0, 1);
12632 SetQuantity(result, destroy_config, destroy_forced);
12633 }
12634
12635
12638 {
12640 }
12641
12643 {
12645 }
12646
12647
12648
12649
12650
12651
12652
12653
12654
12655
12657 {
12658 int slot = -1;
12659 if (GetInventory())
12660 {
12661 InventoryLocation il = new InventoryLocation;
12662 GetInventory().GetCurrentInventoryLocation(il);
12664 }
12665
12667 }
12668
12670 {
12671 float quantity_max = 0;
12672
12674 {
12675 if (attSlotID != -1)
12676 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12677
12678 if (quantity_max <= 0)
12680 }
12681
12682 if (quantity_max <= 0)
12684
12685 return quantity_max;
12686 }
12687
12689 {
12691 }
12692
12694 {
12696 }
12697
12698
12700 {
12702 }
12703
12705 {
12707 }
12708
12710 {
12712 }
12713
12714
12716 {
12717
12718 float weightEx = GetWeightEx();
12719 float special = GetInventoryAndCargoWeight();
12720 return weightEx - special;
12721 }
12722
12723
12725 {
12727 }
12728
12730 {
12732 {
12733 #ifdef DEVELOPER
12734 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12735 {
12736 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12738 }
12739 #endif
12740
12741 return GetQuantity() * GetConfigWeightModified();
12742 }
12743 else if (HasEnergyManager())
12744 {
12745 #ifdef DEVELOPER
12746 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12747 {
12748 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12749 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12750 }
12751 #endif
12752 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12753 }
12754 else
12755 {
12756 #ifdef DEVELOPER
12757 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12758 {
12759 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12760 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12761 }
12762 #endif
12763 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12764 }
12765 }
12766
12769 {
12770 int item_count = 0;
12772
12773 if (GetInventory().GetCargo() != NULL)
12774 {
12775 item_count = GetInventory().GetCargo().GetItemCount();
12776 }
12777
12778 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12779 {
12780 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12781 if (item)
12782 item_count += item.GetNumberOfItems();
12783 }
12784 return item_count;
12785 }
12786
12789 {
12790 float weight = 0;
12791 float wetness = 1;
12792 if (include_wetness)
12795 {
12796 weight = wetness * m_ConfigWeight;
12797 }
12799 {
12800 weight = 1;
12801 }
12802 return weight;
12803 }
12804
12805
12806
12808 {
12809 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12810 {
12811 GameInventory inv = GetInventory();
12812 array<EntityAI> items = new array<EntityAI>;
12814 for (int i = 0; i < items.Count(); i++)
12815 {
12817 if (item)
12818 {
12820 }
12821 }
12822 }
12823 }
12824
12825
12826
12827
12829 {
12830 float energy = 0;
12831 if (HasEnergyManager())
12832 {
12833 energy = GetCompEM().GetEnergy();
12834 }
12835 return energy;
12836 }
12837
12838
12840 {
12841 super.OnEnergyConsumed();
12842
12844 }
12845
12847 {
12848 super.OnEnergyAdded();
12849
12851 }
12852
12853
12855 {
12856 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12857 {
12859 {
12860 float energy_0to1 = GetCompEM().GetEnergy0To1();
12862 }
12863 }
12864 }
12865
12866
12868 {
12869 return ConfigGetFloat("heatIsolation");
12870 }
12871
12873 {
12875 }
12876
12878 {
12879 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12880 if (
GetGame().ConfigIsExisting(paramPath))
12882
12883 return 0.0;
12884 }
12885
12887 {
12888 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12889 if (
GetGame().ConfigIsExisting(paramPath))
12891
12892 return 0.0;
12893 }
12894
12895 override void SetWet(
float value,
bool allow_client =
false)
12896 {
12897 if (!IsServerCheck(allow_client))
12898 return;
12899
12902
12904
12905 m_VarWet = Math.Clamp(value, min, max);
12906
12908 {
12911 }
12912 }
12913
12914 override void AddWet(
float value)
12915 {
12917 }
12918
12920 {
12922 }
12923
12925 {
12927 }
12928
12930 {
12932 }
12933
12935 {
12937 }
12938
12940 {
12942 }
12943
12944 override void OnWetChanged(
float newVal,
float oldVal)
12945 {
12948 if (newLevel != oldLevel)
12949 {
12951 }
12952 }
12953
12955 {
12956 SetWeightDirty();
12957 }
12958
12960 {
12961 return GetWetLevelInternal(
m_VarWet);
12962 }
12963
12964
12965
12967 {
12969 }
12970
12972 {
12974 }
12975
12977 {
12979 }
12980
12982 {
12984 }
12985
12986
12987
12989 {
12990 if (ConfigIsExisting("itemModelLength"))
12991 {
12992 return ConfigGetFloat("itemModelLength");
12993 }
12994 return 0;
12995 }
12996
12998 {
12999 if (ConfigIsExisting("itemAttachOffset"))
13000 {
13001 return ConfigGetFloat("itemAttachOffset");
13002 }
13003 return 0;
13004 }
13005
13006 override void SetCleanness(
int value,
bool allow_client =
false)
13007 {
13008 if (!IsServerCheck(allow_client))
13009 return;
13010
13012
13014
13017 }
13018
13020 {
13022 }
13023
13025 {
13026 return true;
13027 }
13028
13029
13030
13031
13033 {
13035 }
13036
13038 {
13040 }
13041
13042
13043
13044
13045 override void SetColor(
int r,
int g,
int b,
int a)
13046 {
13052 }
13054 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13055 {
13060 }
13061
13063 {
13065 }
13066
13069 {
13070 int r,g,b,a;
13072 r = r/255;
13073 g = g/255;
13074 b = b/255;
13075 a = a/255;
13076 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13077 }
13078
13079
13080
13081 override void SetLiquidType(
int value,
bool allow_client =
false)
13082 {
13083 if (!IsServerCheck(allow_client))
13084 return;
13085
13090 }
13091
13093 {
13094 return ConfigGetInt("varLiquidTypeInit");
13095 }
13096
13098 {
13100 }
13101
13103 {
13105 SetFrozen(false);
13106 }
13107
13110 {
13111 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13112 }
13113
13114
13117 {
13118 PlayerBase nplayer;
13119 if (PlayerBase.CastTo(nplayer, player))
13120 {
13122
13123 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13124 }
13125 }
13126
13127
13130 {
13131 PlayerBase nplayer;
13132 if (PlayerBase.CastTo(nplayer,player))
13133 {
13134
13135 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13136
13137 }
13138
13139
13140 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13141
13142
13143 if (HasEnergyManager())
13144 {
13145 GetCompEM().UpdatePlugState();
13146 }
13147 }
13148
13149
13151 {
13152 super.OnPlacementStarted(player);
13153
13155 }
13156
13157 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13158 {
13160 {
13161 m_AdminLog.OnPlacementComplete(player,
this);
13162 }
13163
13164 super.OnPlacementComplete(player, position, orientation);
13165 }
13166
13167
13168
13169
13170
13172 {
13174 {
13175 return true;
13176 }
13177 else
13178 {
13179 return false;
13180 }
13181 }
13182
13183
13185 {
13187 {
13189 }
13190 }
13191
13192
13194 {
13196 }
13197
13199 {
13201 }
13202
13203 override void InsertAgent(
int agent,
float count = 1)
13204 {
13205 if (count < 1)
13206 return;
13207
13209 }
13210
13213 {
13215 }
13216
13217
13219 {
13221 }
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
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
13265 {
13267 return false;
13268 return true;
13269 }
13270
13272 {
13273
13275 }
13276
13277
13280 {
13281 super.CheckForRoofLimited(timeTresholdMS);
13282
13284 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13285 {
13286 m_PreviousRoofTestTime = time;
13287 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13288 }
13289 }
13290
13291
13293 {
13295 {
13296 return 0;
13297 }
13298
13299 if (GetInventory().GetAttachmentSlotsCount() != 0)
13300 {
13301 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13302 if (filter)
13303 return filter.GetProtectionLevel(type, false, system);
13304 else
13305 return 0;
13306 }
13307
13308 string subclassPath, entryName;
13309
13310 switch (type)
13311 {
13313 entryName = "biological";
13314 break;
13316 entryName = "chemical";
13317 break;
13318 default:
13319 entryName = "biological";
13320 break;
13321 }
13322
13323 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13324
13326 }
13327
13328
13329
13332 {
13333 if (!IsMagazine())
13335
13337 }
13338
13339
13340
13341
13342
13347 {
13348 return true;
13349 }
13350
13352 {
13354 }
13355
13356
13357
13358
13359
13361 {
13362 if (parent)
13363 {
13364 if (parent.IsInherited(DayZInfected))
13365 return true;
13366
13367 if (!parent.IsRuined())
13368 return true;
13369 }
13370
13371 return true;
13372 }
13373
13375 {
13376 if (!super.CanPutAsAttachment(parent))
13377 {
13378 return false;
13379 }
13380
13381 if (!IsRuined() && !parent.IsRuined())
13382 {
13383 return true;
13384 }
13385
13386 return false;
13387 }
13388
13390 {
13391
13392
13393
13394
13395 return super.CanReceiveItemIntoCargo(item);
13396 }
13397
13399 {
13400
13401
13402
13403
13404 GameInventory attachmentInv = attachment.GetInventory();
13406 {
13407 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13408 return false;
13409 }
13410
13411 InventoryLocation loc = new InventoryLocation();
13412 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13413 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13414 return false;
13415
13416 return super.CanReceiveAttachment(attachment, slotId);
13417 }
13418
13420 {
13421 if (!super.CanReleaseAttachment(attachment))
13422 return false;
13423
13424 return GetInventory().AreChildrenAccessible();
13425 }
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13448 {
13449 int id = muzzle_owner.GetMuzzleID();
13450 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13451
13452 if (WPOF_array)
13453 {
13454 for (int i = 0; i < WPOF_array.Count(); i++)
13455 {
13456 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13457
13458 if (WPOF)
13459 {
13460 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13461 }
13462 }
13463 }
13464 }
13465
13466
13468 {
13469 int id = muzzle_owner.GetMuzzleID();
13471
13472 if (WPOBE_array)
13473 {
13474 for (int i = 0; i < WPOBE_array.Count(); i++)
13475 {
13476 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13477
13478 if (WPOBE)
13479 {
13480 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13481 }
13482 }
13483 }
13484 }
13485
13486
13488 {
13489 int id = muzzle_owner.GetMuzzleID();
13490 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13491
13492 if (WPOOH_array)
13493 {
13494 for (int i = 0; i < WPOOH_array.Count(); i++)
13495 {
13496 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13497
13498 if (WPOOH)
13499 {
13500 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13501 }
13502 }
13503 }
13504 }
13505
13506
13508 {
13509 int id = muzzle_owner.GetMuzzleID();
13510 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13511
13512 if (WPOOH_array)
13513 {
13514 for (int i = 0; i < WPOOH_array.Count(); i++)
13515 {
13516 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13517
13518 if (WPOOH)
13519 {
13520 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13521 }
13522 }
13523 }
13524 }
13525
13526
13528 {
13529 int id = muzzle_owner.GetMuzzleID();
13530 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13531
13532 if (WPOOH_array)
13533 {
13534 for (int i = 0; i < WPOOH_array.Count(); i++)
13535 {
13536 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13537
13538 if (WPOOH)
13539 {
13540 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13541 }
13542 }
13543 }
13544 }
13545
13546
13547
13549 {
13551 {
13552 return true;
13553 }
13554
13555 return false;
13556 }
13557
13559 {
13561 {
13562 return true;
13563 }
13564
13565 return false;
13566 }
13567
13569 {
13571 {
13572 return true;
13573 }
13574
13575 return false;
13576 }
13577
13579 {
13580 return false;
13581 }
13582
13585 {
13586 return UATimeSpent.DEFAULT_DEPLOY;
13587 }
13588
13589
13590
13591
13593 {
13595 SetSynchDirty();
13596 }
13597
13599 {
13601 }
13602
13603
13605 {
13606 return false;
13607 }
13608
13611 {
13612 string att_type = "None";
13613
13614 if (ConfigIsExisting("soundAttType"))
13615 {
13616 att_type = ConfigGetString("soundAttType");
13617 }
13618
13620 }
13621
13623 {
13625 }
13626
13627
13628
13629
13630
13634
13636 {
13639
13641 }
13642
13643
13645 {
13647 return;
13648
13650
13653
13656
13657 SoundParameters params = new SoundParameters();
13661 }
13662
13663
13665 {
13667 return;
13668
13670 SetSynchDirty();
13671
13674 }
13675
13676
13678 {
13680 return;
13681
13683 SetSynchDirty();
13684
13687 }
13688
13690 {
13692 }
13693
13695 {
13697 }
13698
13701 {
13702 if (!
GetGame().IsDedicatedServer())
13703 {
13704 if (ConfigIsExisting("attachSoundSet"))
13705 {
13706 string cfg_path = "";
13707 string soundset = "";
13708 string type_name =
GetType();
13709
13712 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13713 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13714
13715 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13716 {
13717 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13718 {
13719 if (cfg_slot_array[i] == slot_type)
13720 {
13721 soundset = cfg_soundset_array[i];
13722 break;
13723 }
13724 }
13725 }
13726
13727 if (soundset != "")
13728 {
13729 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13731 }
13732 }
13733 }
13734 }
13735
13737 {
13738
13739 }
13740
13741 void OnApply(PlayerBase player);
13742
13744 {
13745 return 1.0;
13746 };
13747
13749 {
13751 }
13752
13754 {
13756 }
13757
13759
13761 {
13762 SetDynamicPhysicsLifeTime(0.01);
13764 }
13765
13767 {
13768 array<string> zone_names = new array<string>;
13769 GetDamageZones(zone_names);
13770 for (int i = 0; i < zone_names.Count(); i++)
13771 {
13772 SetHealthMax(zone_names.Get(i),"Health");
13773 }
13774 SetHealthMax("","Health");
13775 }
13776
13779 {
13780 float global_health = GetHealth01("","Health");
13781 array<string> zones = new array<string>;
13782 GetDamageZones(zones);
13783
13784 for (int i = 0; i < zones.Count(); i++)
13785 {
13786 SetHealth01(zones.Get(i),"Health",global_health);
13787 }
13788 }
13789
13792 {
13793 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13794 }
13795
13797 {
13798 if (!hasRootAsPlayer)
13799 {
13800 if (refParentIB)
13801 {
13802
13803 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13804 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13805
13806 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13807 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13808
13811 }
13812 else
13813 {
13814
13817 }
13818 }
13819 }
13820
13822 {
13824 {
13825 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13826 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13827 {
13828 float heatPermCoef = 1.0;
13830 while (ent)
13831 {
13832 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13833 ent = ent.GetHierarchyParent();
13834 }
13835
13836 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13837 }
13838 }
13839 }
13840
13842 {
13843
13844 EntityAI parent = GetHierarchyParent();
13845 if (!parent)
13846 {
13847 hasParent = false;
13848 hasRootAsPlayer = false;
13849 }
13850 else
13851 {
13852 hasParent = true;
13853 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13854 refParentIB =
ItemBase.Cast(parent);
13855 }
13856 }
13857
13858 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13859 {
13860
13861 }
13862
13864 {
13865
13866 return false;
13867 }
13868
13870 {
13871
13872
13873 return false;
13874 }
13875
13877 {
13878
13879 return false;
13880 }
13881
13884 {
13885 return !GetIsFrozen() &&
IsOpen();
13886 }
13887
13889 {
13890 bool hasParent = false, hasRootAsPlayer = false;
13892
13893 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13894 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13895
13896 if (wwtu || foodDecay)
13897 {
13901
13902 if (processWetness || processTemperature || processDecay)
13903 {
13905
13906 if (processWetness)
13907 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13908
13909 if (processTemperature)
13911
13912 if (processDecay)
13913 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13914 }
13915 }
13916 }
13917
13920 {
13922 }
13923
13925 {
13928
13929 return super.GetTemperatureFreezeThreshold();
13930 }
13931
13933 {
13936
13937 return super.GetTemperatureThawThreshold();
13938 }
13939
13941 {
13944
13945 return super.GetItemOverheatThreshold();
13946 }
13947
13949 {
13951 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13952
13953 return super.GetTemperatureFreezeTime();
13954 }
13955
13957 {
13959 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13960
13961 return super.GetTemperatureThawTime();
13962 }
13963
13968
13970 {
13971 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13972 }
13973
13975 {
13976 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13977 }
13978
13981 {
13983 }
13984
13986 {
13988 }
13989
13991 {
13993 }
13994
13997 {
13998 return null;
13999 }
14000
14003 {
14004 return false;
14005 }
14006
14008 {
14010 {
14013 if (!trg)
14014 {
14016 explosive = this;
14017 }
14018
14019 explosive.PairRemote(trg);
14021
14022 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14023 trg.SetPersistentPairID(persistentID);
14024 explosive.SetPersistentPairID(persistentID);
14025
14026 return true;
14027 }
14028 return false;
14029 }
14030
14033 {
14034 float ret = 1.0;
14037 ret *= GetHealth01();
14038
14039 return ret;
14040 }
14041
14042 #ifdef DEVELOPER
14043 override void SetDebugItem()
14044 {
14045 super.SetDebugItem();
14046 _itemBase = this;
14047 }
14048
14050 {
14051 string text = super.GetDebugText();
14052
14054 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14055
14056 return text;
14057 }
14058 #endif
14059
14061 {
14062 return true;
14063 }
14064
14066
14068
14070 {
14073 }
14074
14075
14083
14099}
14100
14102{
14104 if (entity)
14105 {
14106 bool is_item = entity.IsInherited(
ItemBase);
14107 if (is_item && full_quantity)
14108 {
14111 }
14112 }
14113 else
14114 {
14116 return NULL;
14117 }
14118 return entity;
14119}
14120
14122{
14123 if (item)
14124 {
14125 if (health > 0)
14126 item.SetHealth("", "", health);
14127
14128 if (item.CanHaveTemperature())
14129 {
14131 if (item.CanFreeze())
14132 item.SetFrozen(false);
14133 }
14134
14135 if (item.HasEnergyManager())
14136 {
14137 if (quantity >= 0)
14138 {
14139 item.GetCompEM().SetEnergy0To1(quantity);
14140 }
14141 else
14142 {
14144 }
14145 }
14146 else if (item.IsMagazine())
14147 {
14148 Magazine mag = Magazine.Cast(item);
14149 if (quantity >= 0)
14150 {
14151 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14152 }
14153 else
14154 {
14156 }
14157
14158 }
14159 else
14160 {
14161 if (quantity >= 0)
14162 {
14163 item.SetQuantityNormalized(quantity, false);
14164 }
14165 else
14166 {
14168 }
14169
14170 }
14171 }
14172}
14173
14174#ifdef DEVELOPER
14176#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.