9356{
9358 {
9359 return true;
9360 }
9361};
9362
9363
9364
9366{
9370
9372
9375
9376
9377
9378
9379
9388
9394
9399
9404
9425 protected bool m_IsResultOfSplit
9426
9428
9433
9434
9435
9437
9441
9442
9443
9445
9448
9449
9450
9456
9457
9465
9468
9469
9471
9472
9474
9475
9480
9481
9486
9487
9489
9490
9492 {
9497
9498 if (!
GetGame().IsDedicatedServer())
9499 {
9501 {
9503
9505 {
9507 }
9508 }
9509
9512 }
9513
9514 m_OldLocation = null;
9515
9517 {
9519 }
9520
9521 if (ConfigIsExisting("headSelectionsToHide"))
9522 {
9525 }
9526
9528 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9529 {
9531 }
9532
9534
9535 m_IsResultOfSplit = false;
9536
9538 }
9539
9541 {
9542 super.InitItemVariables();
9543
9549 m_Count = ConfigGetInt(
"count");
9550
9553
9558
9561
9566
9578
9582
9583
9586 if (ConfigIsExisting("canBeSplit"))
9587 {
9590 }
9591
9593 if (ConfigIsExisting("itemBehaviour"))
9595
9596
9599 RegisterNetSyncVariableInt("m_VarLiquidType");
9600 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9601
9602 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9603 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9604 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9605
9606 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9607 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9608 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9609 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9610
9611 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9612 RegisterNetSyncVariableBool("m_IsTakeable");
9613 RegisterNetSyncVariableBool("m_IsHologram");
9614
9617 {
9620 }
9621
9623
9625 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9627
9628 }
9629
9631 {
9633 }
9634
9636 {
9639 {
9644 }
9645 }
9646
9647 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9648 {
9650 {
9653 }
9654
9656 }
9657
9659 {
9665 }
9666
9668
9670 {
9672
9673 if (!action)
9674 {
9675 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9676 return;
9677 }
9678
9680 if (!ai)
9681 {
9683 return;
9684 }
9685
9687 if (!action_array)
9688 {
9689 action_array = new array<ActionBase_Basic>;
9691 }
9692 if (LogManager.IsActionLogEnable())
9693 {
9694 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9695 }
9696
9697 if (action_array.Find(action) != -1)
9698 {
9699 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9700 }
9701 else
9702 {
9703 action_array.Insert(action);
9704 }
9705 }
9706
9708 {
9710 ActionBase action = player.GetActionManager().GetAction(actionName);
9713
9714 if (action_array)
9715 {
9716 action_array.RemoveItem(action);
9717 }
9718 }
9719
9720
9721
9723 {
9724 ActionOverrideData overrideData = new ActionOverrideData();
9728
9730 if (!actionMap)
9731 {
9734 }
9735
9736 actionMap.Insert(this.
Type(), overrideData);
9737
9738 }
9739
9741
9743
9744
9746 {
9749
9752
9753 string config_to_search = "CfgVehicles";
9754 string muzzle_owner_config;
9755
9757 {
9758 if (IsInherited(Weapon))
9759 config_to_search = "CfgWeapons";
9760
9761 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9762
9763 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9764
9766
9767 if (config_OnFire_subclass_count > 0)
9768 {
9769 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9770
9771 for (int i = 0; i < config_OnFire_subclass_count; i++)
9772 {
9773 string particle_class = "";
9775 string config_OnFire_entry = config_OnFire_class + particle_class;
9776 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9777 WPOF_array.Insert(WPOF);
9778 }
9779
9780
9782 }
9783 }
9784
9786 {
9787 config_to_search = "CfgWeapons";
9788 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9789
9790 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9791
9793
9794 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9795 {
9796 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9797
9798 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9799 {
9800 string particle_class2 = "";
9802 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9803 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9804 WPOBE_array.Insert(WPOBE);
9805 }
9806
9807
9809 }
9810 }
9811 }
9812
9813
9815 {
9818
9820 {
9821 string config_to_search = "CfgVehicles";
9822
9823 if (IsInherited(Weapon))
9824 config_to_search = "CfgWeapons";
9825
9826 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9827 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9828
9829 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9830 {
9831
9833
9835 {
9837 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9839 return;
9840 }
9841
9844
9845
9846
9848 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9849
9850 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9851 {
9852 string particle_class = "";
9854 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9856
9857 if (entry_type == CT_CLASS)
9858 {
9859 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9860 WPOOH_array.Insert(WPOF);
9861 }
9862 }
9863
9864
9866 }
9867 }
9868 }
9869
9871 {
9873 }
9874
9876 {
9878 {
9880
9883
9886
9887 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9888 }
9889 }
9890
9892 {
9894 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9895
9897 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9898
9900 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9901
9903 {
9905 }
9906 }
9907
9909 {
9911 }
9912
9914 {
9917 else
9919
9921 {
9924 }
9925 else
9926 {
9929
9932 }
9933
9935 }
9936
9938 {
9940 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9941 }
9942
9944 {
9946 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9948 }
9949
9951 {
9953 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9954 }
9955
9957 {
9960
9961 OverheatingParticle OP = new OverheatingParticle();
9966
9968 }
9969
9971 {
9974
9975 return -1;
9976 }
9977
9979 {
9981 {
9984
9985 for (int i = count; i > 0; --i)
9986 {
9987 int id = i - 1;
9990
9993
9994 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9995 {
9996 if (p)
9997 {
10000 }
10001 }
10002 }
10003 }
10004 }
10005
10007 {
10009 {
10011 {
10012 int id = i - 1;
10014
10015 if (OP)
10016 {
10018
10019 if (p)
10020 {
10022 }
10023
10024 delete OP;
10025 }
10026 }
10027
10030 }
10031 }
10032
10035 {
10036 return 0.0;
10037 }
10038
10039
10041 {
10042 return 250;
10043 }
10044
10046 {
10047 return 0;
10048 }
10049
10052 {
10054 return true;
10055
10056 return false;
10057 }
10058
10061 {
10064
10066 {
10068 }
10069 else
10070 {
10071
10073 }
10074
10076 }
10077
10084 {
10085 return -1;
10086 }
10087
10088
10089
10090
10092 {
10094 {
10096 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10097
10098 if (r_index >= 0)
10099 {
10100 InventoryLocation r_il = new InventoryLocation;
10101 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10102
10103 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10106 {
10107 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10108 }
10110 {
10111 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10112 }
10113
10114 }
10115
10116 player.GetHumanInventory().ClearUserReservedLocation(this);
10117 }
10118
10121 }
10122
10123
10124
10125
10127 {
10128 return ItemBase.m_DebugActionsMask;
10129 }
10130
10132 {
10133 return ItemBase.m_DebugActionsMask & mask;
10134 }
10135
10137 {
10138 ItemBase.m_DebugActionsMask = mask;
10139 }
10140
10142 {
10143 ItemBase.m_DebugActionsMask |= mask;
10144 }
10145
10147 {
10148 ItemBase.m_DebugActionsMask &= ~mask;
10149 }
10150
10152 {
10154 {
10156 }
10157 else
10158 {
10160 }
10161 }
10162
10163
10165 {
10166 if (GetEconomyProfile())
10167 {
10168 float q_max = GetEconomyProfile().GetQuantityMax();
10169 if (q_max > 0)
10170 {
10171 float q_min = GetEconomyProfile().GetQuantityMin();
10172 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10173
10175 {
10176 ComponentEnergyManager comp = GetCompEM();
10178 {
10180 }
10181 }
10183 {
10185
10186 }
10187
10188 }
10189 }
10190 }
10191
10194 {
10195 EntityAI parent = GetHierarchyParent();
10196
10197 if (parent)
10198 {
10199 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10200 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10201 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10202 }
10203 }
10204
10207 {
10208 EntityAI parent = GetHierarchyParent();
10209
10210 if (parent)
10211 {
10212 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10213 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10214 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10215 }
10216 }
10217
10219 {
10220
10221
10222
10223
10225
10227 {
10228 if (ScriptInputUserData.CanStoreInputUserData())
10229 {
10230 ScriptInputUserData ctx = new ScriptInputUserData;
10236 ctx.
Write(use_stack_max);
10239
10241 {
10242 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10243 }
10244 }
10245 }
10246 else if (!
GetGame().IsMultiplayer())
10247 {
10249 }
10250 }
10251
10253 {
10255 }
10256
10258 {
10260 }
10261
10263 {
10265 }
10266
10268 {
10269
10270 return false;
10271 }
10272
10274 {
10275 return false;
10276 }
10277
10281 {
10282 return false;
10283 }
10284
10286 {
10287 return "";
10288 }
10289
10291
10293 {
10294 return false;
10295 }
10296
10298 {
10299 return true;
10300 }
10301
10302
10303
10305 {
10306 return true;
10307 }
10308
10310 {
10311 return true;
10312 }
10313
10315 {
10316 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10318 }
10319
10321 {
10323 }
10324
10326 {
10328 if (!is_being_placed)
10330 SetSynchDirty();
10331 }
10332
10333
10335
10337 {
10339 }
10340
10342 {
10344 }
10345
10347 {
10348 return 1;
10349 }
10350
10352 {
10353 return false;
10354 }
10355
10357 {
10359 SetSynchDirty();
10360 }
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10397 {
10398 super.OnMovedInsideCargo(container);
10399
10400 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10401 }
10402
10403 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10404 {
10405 super.EEItemLocationChanged(oldLoc,newLoc);
10406
10407 PlayerBase new_player = null;
10408 PlayerBase old_player = null;
10409
10410 if (newLoc.GetParent())
10411 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10412
10413 if (oldLoc.GetParent())
10414 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10415
10417 {
10418 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10419
10420 if (r_index >= 0)
10421 {
10422 InventoryLocation r_il = new InventoryLocation;
10423 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10424
10425 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10428 {
10429 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10430 }
10432 {
10433 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10434 }
10435
10436 }
10437 }
10438
10440 {
10441 if (new_player)
10442 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10443
10444 if (new_player == old_player)
10445 {
10446
10447 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10448 {
10450 {
10451 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10452 {
10453 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10454 }
10455 }
10456 else
10457 {
10458 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10459 }
10460 }
10461
10462 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10463 {
10464 int type = oldLoc.GetType();
10466 {
10467 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10468 }
10470 {
10471 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10472 }
10473 }
10474 if (!m_OldLocation)
10475 {
10476 m_OldLocation = new InventoryLocation;
10477 }
10478 m_OldLocation.Copy(oldLoc);
10479 }
10480 else
10481 {
10482 if (m_OldLocation)
10483 {
10484 m_OldLocation.Reset();
10485 }
10486 }
10487
10489 }
10490 else
10491 {
10492 if (new_player)
10493 {
10494 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10495 if (res_index >= 0)
10496 {
10497 InventoryLocation il = new InventoryLocation;
10498 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10500 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10503 {
10504 il.
GetParent().GetOnReleaseLock().Invoke(it);
10505 }
10507 {
10509 }
10510
10511 }
10512 }
10514 {
10515
10517 }
10518
10519 if (m_OldLocation)
10520 {
10521 m_OldLocation.Reset();
10522 }
10523 }
10524 }
10525
10526 override void EOnContact(IEntity other, Contact extra)
10527 {
10529 {
10530 int liquidType = -1;
10532 if (impactSpeed > 0.0)
10533 {
10535 #ifndef SERVER
10537 #else
10539 SetSynchDirty();
10540 #endif
10542 }
10543 }
10544
10545 #ifdef SERVER
10546 if (GetCompEM() && GetCompEM().IsPlugged())
10547 {
10548 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10549 GetCompEM().UnplugThis();
10550 }
10551 #endif
10552 }
10553
10555
10557 {
10559 }
10560
10562 {
10563
10564 }
10565
10567 {
10568 super.OnItemLocationChanged(old_owner, new_owner);
10569
10570 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10571 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10572
10573 if (!relatedPlayer && playerNew)
10574 relatedPlayer = playerNew;
10575
10576 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10577 {
10579 if (actionMgr)
10580 {
10581 ActionBase currentAction = actionMgr.GetRunningAction();
10582 if (currentAction)
10584 }
10585 }
10586
10587 Man ownerPlayerOld = null;
10588 Man ownerPlayerNew = null;
10589
10590 if (old_owner)
10591 {
10592 if (old_owner.
IsMan())
10593 {
10594 ownerPlayerOld = Man.Cast(old_owner);
10595 }
10596 else
10597 {
10598 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10599 }
10600 }
10601 else
10602 {
10604 {
10606
10607 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10608 {
10609 GetCompEM().UnplugThis();
10610 }
10611 }
10612 }
10613
10614 if (new_owner)
10615 {
10616 if (new_owner.
IsMan())
10617 {
10618 ownerPlayerNew = Man.Cast(new_owner);
10619 }
10620 else
10621 {
10622 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10623 }
10624 }
10625
10626 if (ownerPlayerOld != ownerPlayerNew)
10627 {
10628 if (ownerPlayerOld)
10629 {
10630 array<EntityAI> subItemsExit = new array<EntityAI>;
10632 for (int i = 0; i < subItemsExit.Count(); i++)
10633 {
10636 }
10637 }
10638
10639 if (ownerPlayerNew)
10640 {
10641 array<EntityAI> subItemsEnter = new array<EntityAI>;
10643 for (int j = 0; j < subItemsEnter.Count(); j++)
10644 {
10647 }
10648 }
10649 }
10650 else if (ownerPlayerNew != null)
10651 {
10652 PlayerBase nplayer;
10653 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10654 {
10655 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10657 for (int k = 0; k < subItemsUpdate.Count(); k++)
10658 {
10660 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10661 }
10662 }
10663 }
10664
10665 if (old_owner)
10666 old_owner.OnChildItemRemoved(this);
10667 if (new_owner)
10668 new_owner.OnChildItemReceived(this);
10669 }
10670
10671
10673 {
10674 super.EEDelete(parent);
10675 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10676 if (player)
10677 {
10679
10680 if (player.IsAlive())
10681 {
10682 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10683 if (r_index >= 0)
10684 {
10685 InventoryLocation r_il = new InventoryLocation;
10686 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10687
10688 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10691 {
10692 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10693 }
10695 {
10696 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10697 }
10698
10699 }
10700
10701 player.RemoveQuickBarEntityShortcut(this);
10702 }
10703 }
10704 }
10705
10707 {
10708 super.EEKilled(killer);
10709
10712 {
10713 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10714 {
10715 if (IsMagazine())
10716 {
10717 if (Magazine.Cast(this).GetAmmoCount() > 0)
10718 {
10720 }
10721 }
10722 else
10723 {
10725 }
10726 }
10727 }
10728 }
10729
10731 {
10732 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10733
10734 super.OnWasAttached(parent, slot_id);
10735
10738
10740 }
10741
10743 {
10744 super.OnWasDetached(parent, slot_id);
10745
10748 }
10749
10751 {
10752 int idx;
10755
10756 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10757 if (inventory_slots.Count() < 1)
10758 {
10759 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10760 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10761 }
10762 else
10763 {
10764 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10765 }
10766
10767 idx = inventory_slots.Find(slot);
10768 if (idx < 0)
10769 return "";
10770
10771 return attach_types.Get(idx);
10772 }
10773
10775 {
10776 int idx = -1;
10777 string slot;
10778
10781
10782 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10783 if (inventory_slots.Count() < 1)
10784 {
10785 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10786 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10787 }
10788 else
10789 {
10790 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10791 if (detach_types.Count() < 1)
10792 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10793 }
10794
10795 for (int i = 0; i < inventory_slots.Count(); i++)
10796 {
10797 slot = inventory_slots.Get(i);
10798 }
10799
10800 if (slot != "")
10801 {
10802 if (detach_types.Count() == 1)
10803 idx = 0;
10804 else
10805 idx = inventory_slots.Find(slot);
10806 }
10807 if (idx < 0)
10808 return "";
10809
10810 return detach_types.Get(idx);
10811 }
10812
10814 {
10815
10817
10818
10819 float min_time = 1;
10820 float max_time = 3;
10821 float delay = Math.RandomFloat(min_time, max_time);
10822
10823 explode_timer.Run(delay, this, "DoAmmoExplosion");
10824 }
10825
10827 {
10828 Magazine magazine = Magazine.Cast(this);
10829 int pop_sounds_count = 6;
10830 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10831
10832
10833 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10834 string sound_name = pop_sounds[ sound_idx ];
10836
10837
10838 magazine.ServerAddAmmoCount(-1);
10839
10840
10841 float min_temp_to_explode = 100;
10842
10843 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10844 {
10846 }
10847 }
10848
10849
10850 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10851 {
10852 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10853
10854 const int CHANCE_DAMAGE_CARGO = 4;
10855 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10856 const int CHANCE_DAMAGE_NOTHING = 2;
10857
10859 {
10860 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10861 int chances;
10862 int rnd;
10863
10864 if (GetInventory().GetCargo())
10865 {
10866 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10867 rnd = Math.RandomInt(0,chances);
10868
10869 if (rnd < CHANCE_DAMAGE_CARGO)
10870 {
10872 }
10873 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10874 {
10876 }
10877 }
10878 else
10879 {
10880 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10881 rnd = Math.RandomInt(0,chances);
10882
10883 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10884 {
10886 }
10887 }
10888 }
10889 }
10890
10892 {
10893 if (GetInventory().GetCargo())
10894 {
10895 int item_count = GetInventory().GetCargo().GetItemCount();
10896 if (item_count > 0)
10897 {
10898 int random_pick = Math.RandomInt(0, item_count);
10900 if (!item.IsExplosive())
10901 {
10902 item.AddHealth("","",damage);
10903 return true;
10904 }
10905 }
10906 }
10907 return false;
10908 }
10909
10911 {
10912 int attachment_count = GetInventory().AttachmentCount();
10913 if (attachment_count > 0)
10914 {
10915 int random_pick = Math.RandomInt(0, attachment_count);
10916 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10917 if (!attachment.IsExplosive())
10918 {
10919 attachment.AddHealth("","",damage);
10920 return true;
10921 }
10922 }
10923 return false;
10924 }
10925
10927 {
10929 }
10930
10932 {
10934 return GetInventory().CanRemoveEntity();
10935
10936 return false;
10937 }
10938
10940 {
10941
10943 return false;
10944
10945
10947 return false;
10948
10949
10950
10952 if (delta == 0)
10953 return false;
10954
10955
10956 return true;
10957 }
10958
10960 {
10962 {
10963 if (ScriptInputUserData.CanStoreInputUserData())
10964 {
10965 ScriptInputUserData ctx = new ScriptInputUserData;
10970 ctx.
Write(destination_entity);
10972 ctx.
Write(slot_id);
10974 }
10975 }
10976 else if (!
GetGame().IsMultiplayer())
10977 {
10979 }
10980 }
10981
10983 {
10984 float split_quantity_new;
10988 InventoryLocation loc = new InventoryLocation;
10989
10990 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10991 {
10993 split_quantity_new = stack_max;
10994 else
10996
10998 {
10999 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11000 if (new_item)
11001 {
11002 new_item.SetResultOfSplit(true);
11003 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11005 new_item.
SetQuantity(split_quantity_new,
false,
true);
11006 }
11007 }
11008 }
11009 else if (destination_entity && slot_id == -1)
11010 {
11011 if (quantity > stack_max)
11012 split_quantity_new = stack_max;
11013 else
11014 split_quantity_new = quantity;
11015
11017 {
11019 {
11022 }
11023
11024 if (new_item)
11025 {
11026 new_item.SetResultOfSplit(true);
11027 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11029 new_item.
SetQuantity(split_quantity_new,
false,
true);
11030 }
11031 }
11032 }
11033 else
11034 {
11035 if (stack_max != 0)
11036 {
11038 {
11040 }
11041
11042 if (split_quantity_new == 0)
11043 {
11044 if (!
GetGame().IsMultiplayer())
11045 player.PhysicalPredictiveDropItem(this);
11046 else
11047 player.ServerDropEntity(this);
11048 return;
11049 }
11050
11052 {
11054
11055 if (new_item)
11056 {
11057 new_item.SetResultOfSplit(true);
11058 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11061 new_item.PlaceOnSurface();
11062 }
11063 }
11064 }
11065 }
11066 }
11067
11069 {
11070 float split_quantity_new;
11074 InventoryLocation loc = new InventoryLocation;
11075
11076 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11077 {
11079 split_quantity_new = stack_max;
11080 else
11082
11084 {
11085 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11086 if (new_item)
11087 {
11088 new_item.SetResultOfSplit(true);
11089 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11091 new_item.
SetQuantity(split_quantity_new,
false,
true);
11092 }
11093 }
11094 }
11095 else if (destination_entity && slot_id == -1)
11096 {
11097 if (quantity > stack_max)
11098 split_quantity_new = stack_max;
11099 else
11100 split_quantity_new = quantity;
11101
11103 {
11105 {
11108 }
11109
11110 if (new_item)
11111 {
11112 new_item.SetResultOfSplit(true);
11113 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11115 new_item.
SetQuantity(split_quantity_new,
false,
true);
11116 }
11117 }
11118 }
11119 else
11120 {
11121 if (stack_max != 0)
11122 {
11124 {
11126 }
11127
11129 {
11131
11132 if (new_item)
11133 {
11134 new_item.SetResultOfSplit(true);
11135 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11138 new_item.PlaceOnSurface();
11139 }
11140 }
11141 }
11142 }
11143 }
11144
11146 {
11148 {
11149 if (ScriptInputUserData.CanStoreInputUserData())
11150 {
11151 ScriptInputUserData ctx = new ScriptInputUserData;
11156 dst.WriteToContext(ctx);
11158 }
11159 }
11160 else if (!
GetGame().IsMultiplayer())
11161 {
11163 }
11164 }
11165
11167 {
11169 {
11170 if (ScriptInputUserData.CanStoreInputUserData())
11171 {
11172 ScriptInputUserData ctx = new ScriptInputUserData;
11177 ctx.
Write(destination_entity);
11183 }
11184 }
11185 else if (!
GetGame().IsMultiplayer())
11186 {
11188 }
11189 }
11190
11192 {
11194 }
11195
11197 {
11199 float split_quantity_new;
11201 if (dst.IsValid())
11202 {
11203 int slot_id = dst.GetSlot();
11205
11206 if (quantity > stack_max)
11207 split_quantity_new = stack_max;
11208 else
11209 split_quantity_new = quantity;
11210
11212 {
11214
11215 if (new_item)
11216 {
11217 new_item.SetResultOfSplit(true);
11218 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11220 new_item.
SetQuantity(split_quantity_new,
false,
true);
11221 }
11222
11223 return new_item;
11224 }
11225 }
11226
11227 return null;
11228 }
11229
11231 {
11233 float split_quantity_new;
11235 if (destination_entity)
11236 {
11238 if (quantity > stackable)
11239 split_quantity_new = stackable;
11240 else
11241 split_quantity_new = quantity;
11242
11244 {
11245 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11246 if (new_item)
11247 {
11248 new_item.SetResultOfSplit(true);
11249 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11251 new_item.
SetQuantity(split_quantity_new,
false,
true);
11252 }
11253 }
11254 }
11255 }
11256
11258 {
11260 {
11261 if (ScriptInputUserData.CanStoreInputUserData())
11262 {
11263 ScriptInputUserData ctx = new ScriptInputUserData;
11268 ItemBase destination_entity =
this;
11269 ctx.
Write(destination_entity);
11273 }
11274 }
11275 else if (!
GetGame().IsMultiplayer())
11276 {
11278 }
11279 }
11280
11282 {
11284 float split_quantity_new;
11286 if (player)
11287 {
11289 if (quantity > stackable)
11290 split_quantity_new = stackable;
11291 else
11292 split_quantity_new = quantity;
11293
11295 {
11296 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11297 new_item =
ItemBase.Cast(in_hands);
11298 if (new_item)
11299 {
11300 new_item.SetResultOfSplit(true);
11301 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11303 new_item.SetQuantity(split_quantity_new, false, true);
11304 }
11305 }
11306 }
11307 }
11308
11310 {
11312 float split_quantity_new = Math.Floor(quantity * 0.5);
11313
11315 return;
11316
11318
11319 if (new_item)
11320 {
11321 if (new_item.GetQuantityMax() < split_quantity_new)
11322 {
11323 split_quantity_new = new_item.GetQuantityMax();
11324 }
11325
11326 new_item.SetResultOfSplit(true);
11327 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11328
11330 {
11333 }
11334 else
11335 {
11337 new_item.
SetQuantity(split_quantity_new,
false,
true);
11338 }
11339 }
11340 }
11341
11343 {
11345 float split_quantity_new = Math.Floor(quantity / 2);
11346
11348 return;
11349
11350 InventoryLocation invloc = new InventoryLocation;
11352
11354 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11355
11356 if (new_item)
11357 {
11358 if (new_item.GetQuantityMax() < split_quantity_new)
11359 {
11360 split_quantity_new = new_item.GetQuantityMax();
11361 }
11363 {
11366 }
11367 else if (split_quantity_new > 1)
11368 {
11370 new_item.
SetQuantity(split_quantity_new,
false,
true);
11371 }
11372 }
11373 }
11374
11377 {
11378 SetWeightDirty();
11380
11381 if (parent)
11382 parent.OnAttachmentQuantityChangedEx(this, delta);
11383
11385 {
11387 {
11389 }
11391 {
11392 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11394 }
11395 }
11396
11397 }
11398
11401 {
11402
11403 }
11404
11407 {
11409 }
11410
11412 {
11413 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11414
11416 {
11417 if (newLevel == GameConstants.STATE_RUINED)
11418 {
11420 EntityAI parent = GetHierarchyParent();
11421 if (parent && parent.IsFireplace())
11422 {
11423 CargoBase cargo = GetInventory().GetCargo();
11424 if (cargo)
11425 {
11427 {
11429 }
11430 }
11431 }
11432 }
11433
11435 {
11436
11438 return;
11439 }
11440
11441 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11442 {
11444 }
11445 }
11446 }
11447
11448
11450 {
11451 super.OnRightClick();
11452
11454 {
11456 {
11457 if (ScriptInputUserData.CanStoreInputUserData())
11458 {
11459 EntityAI root = GetHierarchyRoot();
11460 Man playerOwner = GetHierarchyRootPlayer();
11461 InventoryLocation dst = new InventoryLocation;
11462
11463
11464 if (!playerOwner && root && root == this)
11465 {
11467 }
11468 else
11469 {
11470
11471 GetInventory().GetCurrentInventoryLocation(dst);
11473 {
11476 {
11478 }
11479 else
11480 {
11482
11483
11484 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11485 {
11487 }
11488 else
11489 {
11490 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11491 }
11492 }
11493 }
11494 }
11495
11496 ScriptInputUserData ctx = new ScriptInputUserData;
11504 }
11505 }
11506 else if (!
GetGame().IsMultiplayer())
11507 {
11509 }
11510 }
11511 }
11512
11514 {
11515 if (root)
11516 {
11517 vector m4[4];
11518 root.GetTransform(m4);
11519 dst.SetGround(this, m4);
11520 }
11521 else
11522 {
11523 GetInventory().GetCurrentInventoryLocation(dst);
11524 }
11525 }
11526
11527 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11528 {
11529
11530 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11531 return false;
11532
11533 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11534 return false;
11535
11536
11538 return false;
11539
11540
11541 Magazine mag = Magazine.Cast(this);
11542 if (mag)
11543 {
11544 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11545 return false;
11546
11547 if (stack_max_limit)
11548 {
11549 Magazine other_mag = Magazine.Cast(other_item);
11550 if (other_item)
11551 {
11552 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11553 return false;
11554 }
11555
11556 }
11557 }
11558 else
11559 {
11560
11562 return false;
11563
11565 return false;
11566 }
11567
11568 PlayerBase player = null;
11569 if (CastTo(player, GetHierarchyRootPlayer()))
11570 {
11571 if (player.GetInventory().HasAttachment(this))
11572 return false;
11573
11574 if (player.IsItemsToDelete())
11575 return false;
11576 }
11577
11578 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11579 return false;
11580
11581 int slotID;
11583 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11584 return false;
11585
11586 return true;
11587 }
11588
11590 {
11592 }
11593
11595 {
11596 return m_IsResultOfSplit;
11597 }
11598
11600 {
11601 m_IsResultOfSplit = value;
11602 }
11603
11605 {
11607 }
11608
11610 {
11611 float other_item_quantity = other_item.GetQuantity();
11612 float this_free_space;
11613
11615
11617
11618 if (other_item_quantity > this_free_space)
11619 {
11620 return this_free_space;
11621 }
11622 else
11623 {
11624 return other_item_quantity;
11625 }
11626 }
11627
11629 {
11631 }
11632
11634 {
11636 return;
11637
11638 if (!IsMagazine() && other_item)
11639 {
11641 if (quantity_used != 0)
11642 {
11643 float hp1 = GetHealth01("","");
11644 float hp2 = other_item.GetHealth01("","");
11645 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11646 hpResult = hpResult / (
GetQuantity() + quantity_used);
11647
11648 hpResult *= GetMaxHealth();
11649 Math.Round(hpResult);
11650 SetHealth("", "Health", hpResult);
11651
11653 other_item.AddQuantity(-quantity_used);
11654 }
11655 }
11657 }
11658
11660 {
11661 #ifdef SERVER
11662 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11663 GetHierarchyParent().IncreaseLifetimeUp();
11664 #endif
11665 };
11666
11668 {
11669 PlayerBase p = PlayerBase.Cast(player);
11670
11671 array<int> recipesIds = p.m_Recipes;
11672 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11673 if (moduleRecipesManager)
11674 {
11675 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11676 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11677 }
11678
11679 for (int i = 0;i < recipesIds.Count(); i++)
11680 {
11681 int key = recipesIds.Get(i);
11682 string recipeName = moduleRecipesManager.GetRecipeName(key);
11684 }
11685 }
11686
11687
11688 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11689 {
11690 super.GetDebugActions(outputList);
11691
11692
11698
11699
11704
11709
11710
11714
11715
11717 {
11721 }
11722
11725
11726
11730
11732
11733 InventoryLocation loc = new InventoryLocation();
11734 GetInventory().GetCurrentInventoryLocation(loc);
11736 {
11737 if (Gizmo_IsSupported())
11740 }
11741
11743 }
11744
11745
11746
11747
11749 {
11750 super.OnAction(action_id, player, ctx);
11751
11753 {
11754 switch (action_id)
11755 {
11758 return true;
11761 return true;
11762 }
11763 }
11764
11766 {
11767 switch (action_id)
11768 {
11770 Delete();
11771 return true;
11772 }
11773 }
11774
11775 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11776 {
11777 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11778 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11779 PlayerBase p = PlayerBase.Cast(player);
11780 if (
EActions.RECIPES_RANGE_START < 1000)
11781 {
11782 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11783 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11784 }
11785 }
11786 #ifndef SERVER
11787 else if (action_id ==
EActions.WATCH_PLAYER)
11788 {
11789 PluginDeveloper.SetDeveloperItemClientEx(player);
11790 }
11791 #endif
11793 {
11794 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11795 {
11796 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11797 OnDebugButtonPressServer(id + 1);
11798 }
11799
11800 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11801 {
11802 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11804 }
11805
11806 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11807 {
11808 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11810 }
11811
11812 else if (action_id ==
EActions.ADD_QUANTITY)
11813 {
11814 if (IsMagazine())
11815 {
11816 Magazine mag = Magazine.Cast(this);
11817 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11818 }
11819 else
11820 {
11822 }
11823
11824 if (m_EM)
11825 {
11826 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11827 }
11828
11829 }
11830
11831 else if (action_id ==
EActions.REMOVE_QUANTITY)
11832 {
11833 if (IsMagazine())
11834 {
11835 Magazine mag2 = Magazine.Cast(this);
11836 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11837 }
11838 else
11839 {
11841 }
11842 if (m_EM)
11843 {
11844 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11845 }
11846
11847 }
11848
11849 else if (action_id ==
EActions.SET_QUANTITY_0)
11850 {
11852
11853 if (m_EM)
11854 {
11855 m_EM.SetEnergy(0);
11856 }
11857 }
11858
11859 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11860 {
11862
11863 if (m_EM)
11864 {
11865 m_EM.SetEnergy(m_EM.GetEnergyMax());
11866 }
11867 }
11868
11869 else if (action_id ==
EActions.ADD_HEALTH)
11870 {
11871 AddHealth("","",GetMaxHealth("","Health")/5);
11872 }
11873 else if (action_id ==
EActions.REMOVE_HEALTH)
11874 {
11875 AddHealth("","",-GetMaxHealth("","Health")/5);
11876 }
11877 else if (action_id ==
EActions.DESTROY_HEALTH)
11878 {
11879 SetHealth01("","",0);
11880 }
11881 else if (action_id ==
EActions.WATCH_ITEM)
11882 {
11884 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11885 #ifdef DEVELOPER
11886 SetDebugDeveloper_item(this);
11887 #endif
11888 }
11889
11890 else if (action_id ==
EActions.ADD_TEMPERATURE)
11891 {
11892 AddTemperature(20);
11893
11894 }
11895
11896 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11897 {
11898 AddTemperature(-20);
11899
11900 }
11901
11902 else if (action_id ==
EActions.FLIP_FROZEN)
11903 {
11904 SetFrozen(!GetIsFrozen());
11905
11906 }
11907
11908 else if (action_id ==
EActions.ADD_WETNESS)
11909 {
11911
11912 }
11913
11914 else if (action_id ==
EActions.REMOVE_WETNESS)
11915 {
11917
11918 }
11919
11920 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11921 {
11924
11925
11926 }
11927
11928 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11929 {
11932 }
11933
11934 else if (action_id ==
EActions.MAKE_SPECIAL)
11935 {
11936 auto debugParams = DebugSpawnParams.WithPlayer(player);
11937 OnDebugSpawnEx(debugParams);
11938 }
11939
11940 }
11941
11942
11943 return false;
11944 }
11945
11946
11947
11948
11952
11955
11956
11957
11959 {
11960 return false;
11961 }
11962
11963
11965 {
11966 return true;
11967 }
11968
11969
11971 {
11972 return true;
11973 }
11974
11975
11976
11978 {
11979 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11981 }
11982
11985 {
11986 return null;
11987 }
11988
11990 {
11991 return false;
11992 }
11993
11995 {
11996 return false;
11997 }
11998
12002
12003
12005 {
12006 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12007 return module_repairing.CanRepair(this, item_repair_kit);
12008 }
12009
12010
12011 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12012 {
12013 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12014 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12015 }
12016
12017
12019 {
12020
12021
12022
12023
12024
12025
12026
12027
12028 return 1;
12029 }
12030
12031
12032
12034 {
12036 }
12037
12038
12039
12041 {
12043 }
12044
12045
12054 {
12055 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12056
12057 if (player)
12058 {
12059 player.MessageStatus(text);
12060 }
12061 }
12062
12063
12072 {
12073 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12074
12075 if (player)
12076 {
12077 player.MessageAction(text);
12078 }
12079 }
12080
12081
12090 {
12091 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12092
12093 if (player)
12094 {
12095 player.MessageFriendly(text);
12096 }
12097 }
12098
12099
12108 {
12109 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12110
12111 if (player)
12112 {
12113 player.MessageImportant(text);
12114 }
12115 }
12116
12118 {
12119 return true;
12120 }
12121
12122
12123 override bool KindOf(
string tag)
12124 {
12125 bool found = false;
12126 string item_name = this.
GetType();
12129
12130 int array_size = item_tag_array.Count();
12131 for (int i = 0; i < array_size; i++)
12132 {
12133 if (item_tag_array.Get(i) == tag)
12134 {
12135 found = true;
12136 break;
12137 }
12138 }
12139 return found;
12140 }
12141
12142
12144 {
12145
12146 super.OnRPC(sender, rpc_type,ctx);
12147
12148
12149 switch (rpc_type)
12150 {
12151 #ifndef SERVER
12152 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12153 Param2<bool, string> p = new Param2<bool, string>(false, "");
12154
12156 return;
12157
12158 bool play = p.param1;
12159 string soundSet = p.param2;
12160
12161 if (play)
12162 {
12164 {
12166 {
12168 }
12169 }
12170 else
12171 {
12173 }
12174 }
12175 else
12176 {
12178 }
12179
12180 break;
12181 #endif
12182
12183 }
12184
12186 {
12188 }
12189 }
12190
12191
12192
12193
12195 {
12196 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12197 return plugin.GetID(
name);
12198 }
12199
12201 {
12202 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12203 return plugin.GetName(id);
12204 }
12205
12208 {
12209
12210
12211 int varFlags;
12212 if (!ctx.
Read(varFlags))
12213 return;
12214
12215 if (varFlags & ItemVariableFlags.FLOAT)
12216 {
12218 }
12219 }
12220
12222 {
12223
12224 super.SerializeNumericalVars(floats_out);
12225
12226
12227
12229 {
12231 }
12232
12234 {
12236 }
12237
12239 {
12241 }
12242
12244 {
12249 }
12250
12252 {
12254 }
12255 }
12256
12258 {
12259
12260 super.DeSerializeNumericalVars(floats);
12261
12262
12263 int index = 0;
12264 int mask = Math.Round(floats.Get(index));
12265
12266 index++;
12267
12269 {
12271 {
12273 }
12274 else
12275 {
12276 float quantity = floats.Get(index);
12277 SetQuantity(quantity,
true,
false,
false,
false);
12278 }
12279 index++;
12280 }
12281
12283 {
12284 float wet = floats.Get(index);
12286 index++;
12287 }
12288
12290 {
12291 int liquidtype = Math.Round(floats.Get(index));
12293 index++;
12294 }
12295
12297 {
12299 index++;
12301 index++;
12303 index++;
12305 index++;
12306 }
12307
12309 {
12310 int cleanness = Math.Round(floats.Get(index));
12312 index++;
12313 }
12314 }
12315
12317 {
12318 super.WriteVarsToCTX(ctx);
12319
12320
12322 {
12324 }
12325
12327 {
12329 }
12330
12332 {
12334 }
12335
12337 {
12338 int r,g,b,a;
12344 }
12345
12347 {
12349 }
12350 }
12351
12353 {
12354 if (!super.ReadVarsFromCTX(ctx,version))
12355 return false;
12356
12357 int intValue;
12358 float value;
12359
12360 if (version < 140)
12361 {
12362 if (!ctx.
Read(intValue))
12363 return false;
12364
12365 m_VariablesMask = intValue;
12366 }
12367
12369 {
12370 if (!ctx.
Read(value))
12371 return false;
12372
12374 {
12376 }
12377 else
12378 {
12380 }
12381 }
12382
12383 if (version < 140)
12384 {
12386 {
12387 if (!ctx.
Read(value))
12388 return false;
12389 SetTemperatureDirect(value);
12390 }
12391 }
12392
12394 {
12395 if (!ctx.
Read(value))
12396 return false;
12398 }
12399
12401 {
12402 if (!ctx.
Read(intValue))
12403 return false;
12405 }
12406
12408 {
12409 int r,g,b,a;
12411 return false;
12413 return false;
12415 return false;
12417 return false;
12418
12420 }
12421
12423 {
12424 if (!ctx.
Read(intValue))
12425 return false;
12427 }
12428
12429 if (version >= 138 && version < 140)
12430 {
12432 {
12433 if (!ctx.
Read(intValue))
12434 return false;
12435 SetFrozen(intValue);
12436 }
12437 }
12438
12439 return true;
12440 }
12441
12442
12444 {
12447 {
12449 }
12450
12451 if (!super.OnStoreLoad(ctx, version))
12452 {
12454 return false;
12455 }
12456
12457 if (version >= 114)
12458 {
12459 bool hasQuickBarIndexSaved;
12460
12461 if (!ctx.
Read(hasQuickBarIndexSaved))
12462 {
12464 return false;
12465 }
12466
12467 if (hasQuickBarIndexSaved)
12468 {
12469 int itmQBIndex;
12470
12471
12472 if (!ctx.
Read(itmQBIndex))
12473 {
12475 return false;
12476 }
12477
12478 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12479 if (itmQBIndex != -1 && parentPlayer)
12480 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12481 }
12482 }
12483 else
12484 {
12485
12486 PlayerBase player;
12487 int itemQBIndex;
12488 if (version ==
int.
MAX)
12489 {
12490 if (!ctx.
Read(itemQBIndex))
12491 {
12493 return false;
12494 }
12495 }
12496 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12497 {
12498
12499 if (!ctx.
Read(itemQBIndex))
12500 {
12502 return false;
12503 }
12504 if (itemQBIndex != -1 && player)
12505 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12506 }
12507 }
12508
12509 if (version < 140)
12510 {
12511
12512 if (!LoadVariables(ctx, version))
12513 {
12515 return false;
12516 }
12517 }
12518
12519
12521 {
12523 return false;
12524 }
12525 if (version >= 132)
12526 {
12528 if (raib)
12529 {
12531 {
12533 return false;
12534 }
12535 }
12536 }
12537
12539 return true;
12540 }
12541
12542
12543
12545 {
12546 super.OnStoreSave(ctx);
12547
12548 PlayerBase player;
12549 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12550 {
12552
12553 int itemQBIndex = -1;
12554 itemQBIndex = player.FindQuickBarEntityIndex(this);
12555 ctx.
Write(itemQBIndex);
12556 }
12557 else
12558 {
12560 }
12561
12563
12565 if (raib)
12566 {
12568 }
12569 }
12570
12571
12573 {
12574 super.AfterStoreLoad();
12575
12577 {
12579 }
12580
12582 {
12585 }
12586 }
12587
12589 {
12590 super.EEOnAfterLoad();
12591
12593 {
12595 }
12596
12599 }
12600
12602 {
12603 return false;
12604 }
12605
12606
12607
12609 {
12611 {
12612 #ifdef PLATFORM_CONSOLE
12613
12615 {
12617 if (menu)
12618 {
12620 }
12621 }
12622 #endif
12623 }
12624
12626 {
12629 }
12630
12632 {
12633 SetWeightDirty();
12635 }
12637 {
12640 }
12641
12643 {
12646 }
12648 {
12651 }
12652
12653 super.OnVariablesSynchronized();
12654 }
12655
12656
12657
12659 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12660 {
12661 if (!IsServerCheck(allow_client))
12662 return false;
12663
12665 return false;
12666
12669
12670 if (value <= (min + 0.001))
12671 value = min;
12672
12673 if (value == min)
12674 {
12675 if (destroy_config)
12676 {
12677 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12678 if (dstr)
12679 {
12681 this.Delete();
12682 return true;
12683 }
12684 }
12685 else if (destroy_forced)
12686 {
12688 this.Delete();
12689 return true;
12690 }
12691
12693 }
12694
12697
12699 {
12701
12702 if (delta)
12704 }
12705
12707
12708 return false;
12709 }
12710
12711
12713 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12714 {
12716 }
12717
12719 {
12722 }
12723
12725 {
12728 }
12729
12731 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12732 {
12733 float value_clamped = Math.Clamp(value, 0, 1);
12735 SetQuantity(result, destroy_config, destroy_forced);
12736 }
12737
12738
12741 {
12743 }
12744
12746 {
12748 }
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12760 {
12761 int slot = -1;
12762 if (GetInventory())
12763 {
12764 InventoryLocation il = new InventoryLocation;
12765 GetInventory().GetCurrentInventoryLocation(il);
12767 }
12768
12770 }
12771
12773 {
12774 float quantity_max = 0;
12775
12777 {
12778 if (attSlotID != -1)
12779 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12780
12781 if (quantity_max <= 0)
12783 }
12784
12785 if (quantity_max <= 0)
12787
12788 return quantity_max;
12789 }
12790
12792 {
12794 }
12795
12797 {
12799 }
12800
12801
12803 {
12805 }
12806
12808 {
12810 }
12811
12813 {
12815 }
12816
12817
12819 {
12820
12821 float weightEx = GetWeightEx();
12822 float special = GetInventoryAndCargoWeight();
12823 return weightEx - special;
12824 }
12825
12826
12828 {
12830 }
12831
12833 {
12835 {
12836 #ifdef DEVELOPER
12837 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12838 {
12839 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12841 }
12842 #endif
12843
12844 return GetQuantity() * GetConfigWeightModified();
12845 }
12846 else if (HasEnergyManager())
12847 {
12848 #ifdef DEVELOPER
12849 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12850 {
12851 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12852 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12853 }
12854 #endif
12855 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12856 }
12857 else
12858 {
12859 #ifdef DEVELOPER
12860 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12861 {
12862 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12863 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12864 }
12865 #endif
12866 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12867 }
12868 }
12869
12872 {
12873 int item_count = 0;
12875
12876 if (GetInventory().GetCargo() != NULL)
12877 {
12878 item_count = GetInventory().GetCargo().GetItemCount();
12879 }
12880
12881 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12882 {
12883 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12884 if (item)
12885 item_count += item.GetNumberOfItems();
12886 }
12887 return item_count;
12888 }
12889
12892 {
12893 float weight = 0;
12894 float wetness = 1;
12895 if (include_wetness)
12898 {
12899 weight = wetness * m_ConfigWeight;
12900 }
12902 {
12903 weight = 1;
12904 }
12905 return weight;
12906 }
12907
12908
12909
12911 {
12912 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12913 {
12914 GameInventory inv = GetInventory();
12915 array<EntityAI> items = new array<EntityAI>;
12917 for (int i = 0; i < items.Count(); i++)
12918 {
12920 if (item)
12921 {
12923 }
12924 }
12925 }
12926 }
12927
12928
12929
12930
12932 {
12933 float energy = 0;
12934 if (HasEnergyManager())
12935 {
12936 energy = GetCompEM().GetEnergy();
12937 }
12938 return energy;
12939 }
12940
12941
12943 {
12944 super.OnEnergyConsumed();
12945
12947 }
12948
12950 {
12951 super.OnEnergyAdded();
12952
12954 }
12955
12956
12958 {
12959 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12960 {
12962 {
12963 float energy_0to1 = GetCompEM().GetEnergy0To1();
12965 }
12966 }
12967 }
12968
12969
12971 {
12972 return ConfigGetFloat("heatIsolation");
12973 }
12974
12976 {
12978 }
12979
12981 {
12982 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12983 if (
GetGame().ConfigIsExisting(paramPath))
12985
12986 return 0.0;
12987 }
12988
12990 {
12991 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12992 if (
GetGame().ConfigIsExisting(paramPath))
12994
12995 return 0.0;
12996 }
12997
12998 override void SetWet(
float value,
bool allow_client =
false)
12999 {
13000 if (!IsServerCheck(allow_client))
13001 return;
13002
13005
13007
13008 m_VarWet = Math.Clamp(value, min, max);
13009
13011 {
13014 }
13015 }
13016
13017 override void AddWet(
float value)
13018 {
13020 }
13021
13023 {
13025 }
13026
13028 {
13030 }
13031
13033 {
13035 }
13036
13038 {
13040 }
13041
13043 {
13045 }
13046
13047 override void OnWetChanged(
float newVal,
float oldVal)
13048 {
13051 if (newLevel != oldLevel)
13052 {
13054 }
13055 }
13056
13058 {
13059 SetWeightDirty();
13060 }
13061
13063 {
13064 return GetWetLevelInternal(
m_VarWet);
13065 }
13066
13067
13068
13070 {
13072 }
13073
13075 {
13077 }
13078
13080 {
13082 }
13083
13085 {
13087 }
13088
13089
13090
13092 {
13093 if (ConfigIsExisting("itemModelLength"))
13094 {
13095 return ConfigGetFloat("itemModelLength");
13096 }
13097 return 0;
13098 }
13099
13101 {
13102 if (ConfigIsExisting("itemAttachOffset"))
13103 {
13104 return ConfigGetFloat("itemAttachOffset");
13105 }
13106 return 0;
13107 }
13108
13109 override void SetCleanness(
int value,
bool allow_client =
false)
13110 {
13111 if (!IsServerCheck(allow_client))
13112 return;
13113
13115
13117
13120 }
13121
13123 {
13125 }
13126
13128 {
13129 return true;
13130 }
13131
13132
13133
13134
13136 {
13138 }
13139
13141 {
13143 }
13144
13145
13146
13147
13148 override void SetColor(
int r,
int g,
int b,
int a)
13149 {
13155 }
13157 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13158 {
13163 }
13164
13166 {
13168 }
13169
13172 {
13173 int r,g,b,a;
13175 r = r/255;
13176 g = g/255;
13177 b = b/255;
13178 a = a/255;
13179 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13180 }
13181
13182
13183
13184 override void SetLiquidType(
int value,
bool allow_client =
false)
13185 {
13186 if (!IsServerCheck(allow_client))
13187 return;
13188
13193 }
13194
13196 {
13197 return ConfigGetInt("varLiquidTypeInit");
13198 }
13199
13201 {
13203 }
13204
13206 {
13208 SetFrozen(false);
13209 }
13210
13213 {
13214 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13215 }
13216
13217
13220 {
13221 PlayerBase nplayer;
13222 if (PlayerBase.CastTo(nplayer, player))
13223 {
13225
13226 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13227 }
13228 }
13229
13230
13233 {
13234 PlayerBase nplayer;
13235 if (PlayerBase.CastTo(nplayer,player))
13236 {
13237
13238 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13239
13240 }
13241
13242
13243 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13244
13245
13246 if (HasEnergyManager())
13247 {
13248 GetCompEM().UpdatePlugState();
13249 }
13250 }
13251
13252
13254 {
13255 super.OnPlacementStarted(player);
13256
13258 }
13259
13260 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13261 {
13263 {
13264 m_AdminLog.OnPlacementComplete(player,
this);
13265 }
13266
13267 super.OnPlacementComplete(player, position, orientation);
13268 }
13269
13270
13271
13272
13273
13275 {
13277 {
13278 return true;
13279 }
13280 else
13281 {
13282 return false;
13283 }
13284 }
13285
13286
13288 {
13290 {
13292 }
13293 }
13294
13295
13297 {
13299 }
13300
13302 {
13304 }
13305
13306 override void InsertAgent(
int agent,
float count = 1)
13307 {
13308 if (count < 1)
13309 return;
13310
13312 }
13313
13316 {
13318 }
13319
13320
13322 {
13324 }
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13368 {
13370 return false;
13371 return true;
13372 }
13373
13375 {
13376
13378 }
13379
13380
13383 {
13384 super.CheckForRoofLimited(timeTresholdMS);
13385
13387 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13388 {
13389 m_PreviousRoofTestTime = time;
13390 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13391 }
13392 }
13393
13394
13396 {
13398 {
13399 return 0;
13400 }
13401
13402 if (GetInventory().GetAttachmentSlotsCount() != 0)
13403 {
13404 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13405 if (filter)
13406 return filter.GetProtectionLevel(type, false, system);
13407 else
13408 return 0;
13409 }
13410
13411 string subclassPath, entryName;
13412
13413 switch (type)
13414 {
13416 entryName = "biological";
13417 break;
13419 entryName = "chemical";
13420 break;
13421 default:
13422 entryName = "biological";
13423 break;
13424 }
13425
13426 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13427
13429 }
13430
13431
13432
13435 {
13436 if (!IsMagazine())
13438
13440 }
13441
13442
13443
13444
13445
13450 {
13451 return true;
13452 }
13453
13455 {
13457 }
13458
13459
13460
13461
13462
13464 {
13465 if (parent)
13466 {
13467 if (parent.IsInherited(DayZInfected))
13468 return true;
13469
13470 if (!parent.IsRuined())
13471 return true;
13472 }
13473
13474 return true;
13475 }
13476
13478 {
13479 if (!super.CanPutAsAttachment(parent))
13480 {
13481 return false;
13482 }
13483
13484 if (!IsRuined() && !parent.IsRuined())
13485 {
13486 return true;
13487 }
13488
13489 return false;
13490 }
13491
13493 {
13494
13495
13496
13497
13498 return super.CanReceiveItemIntoCargo(item);
13499 }
13500
13502 {
13503
13504
13505
13506
13507 GameInventory attachmentInv = attachment.GetInventory();
13509 {
13510 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13511 return false;
13512 }
13513
13514 InventoryLocation loc = new InventoryLocation();
13515 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13516 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13517 return false;
13518
13519 return super.CanReceiveAttachment(attachment, slotId);
13520 }
13521
13523 {
13524 if (!super.CanReleaseAttachment(attachment))
13525 return false;
13526
13527 return GetInventory().AreChildrenAccessible();
13528 }
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13544
13545
13546
13547
13548
13549
13551 {
13552 int id = muzzle_owner.GetMuzzleID();
13553 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13554
13555 if (WPOF_array)
13556 {
13557 for (int i = 0; i < WPOF_array.Count(); i++)
13558 {
13559 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13560
13561 if (WPOF)
13562 {
13563 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13564 }
13565 }
13566 }
13567 }
13568
13569
13571 {
13572 int id = muzzle_owner.GetMuzzleID();
13574
13575 if (WPOBE_array)
13576 {
13577 for (int i = 0; i < WPOBE_array.Count(); i++)
13578 {
13579 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13580
13581 if (WPOBE)
13582 {
13583 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13584 }
13585 }
13586 }
13587 }
13588
13589
13591 {
13592 int id = muzzle_owner.GetMuzzleID();
13593 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13594
13595 if (WPOOH_array)
13596 {
13597 for (int i = 0; i < WPOOH_array.Count(); i++)
13598 {
13599 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13600
13601 if (WPOOH)
13602 {
13603 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13604 }
13605 }
13606 }
13607 }
13608
13609
13611 {
13612 int id = muzzle_owner.GetMuzzleID();
13613 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13614
13615 if (WPOOH_array)
13616 {
13617 for (int i = 0; i < WPOOH_array.Count(); i++)
13618 {
13619 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13620
13621 if (WPOOH)
13622 {
13623 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13624 }
13625 }
13626 }
13627 }
13628
13629
13631 {
13632 int id = muzzle_owner.GetMuzzleID();
13633 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13634
13635 if (WPOOH_array)
13636 {
13637 for (int i = 0; i < WPOOH_array.Count(); i++)
13638 {
13639 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13640
13641 if (WPOOH)
13642 {
13643 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13644 }
13645 }
13646 }
13647 }
13648
13649
13650
13652 {
13654 {
13655 return true;
13656 }
13657
13658 return false;
13659 }
13660
13662 {
13664 {
13665 return true;
13666 }
13667
13668 return false;
13669 }
13670
13672 {
13674 {
13675 return true;
13676 }
13677
13678 return false;
13679 }
13680
13682 {
13683 return false;
13684 }
13685
13688 {
13689 return UATimeSpent.DEFAULT_DEPLOY;
13690 }
13691
13692
13693
13694
13696 {
13698 SetSynchDirty();
13699 }
13700
13702 {
13704 }
13705
13706
13708 {
13709 return false;
13710 }
13711
13714 {
13715 string att_type = "None";
13716
13717 if (ConfigIsExisting("soundAttType"))
13718 {
13719 att_type = ConfigGetString("soundAttType");
13720 }
13721
13723 }
13724
13726 {
13728 }
13729
13730
13731
13732
13733
13739
13741 {
13744
13746 }
13747
13748
13750 {
13752 return;
13753
13755
13758
13761
13762 SoundParameters params = new SoundParameters();
13766 }
13767
13768
13770 {
13772 return;
13773
13775 SetSynchDirty();
13776
13779 }
13780
13781
13783 {
13785 return;
13786
13788 SetSynchDirty();
13789
13792 }
13793
13795 {
13797 }
13798
13800 {
13802 }
13803
13806 {
13807 if (!
GetGame().IsDedicatedServer())
13808 {
13809 if (ConfigIsExisting("attachSoundSet"))
13810 {
13811 string cfg_path = "";
13812 string soundset = "";
13813 string type_name =
GetType();
13814
13817 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13818 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13819
13820 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13821 {
13822 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13823 {
13824 if (cfg_slot_array[i] == slot_type)
13825 {
13826 soundset = cfg_soundset_array[i];
13827 break;
13828 }
13829 }
13830 }
13831
13832 if (soundset != "")
13833 {
13834 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13836 }
13837 }
13838 }
13839 }
13840
13842 {
13843
13844 }
13845
13846 void OnApply(PlayerBase player);
13847
13849 {
13850 return 1.0;
13851 };
13852
13854 {
13856 }
13857
13859 {
13861 }
13862
13864
13866 {
13867 SetDynamicPhysicsLifeTime(0.01);
13869 }
13870
13872 {
13873 array<string> zone_names = new array<string>;
13874 GetDamageZones(zone_names);
13875 for (int i = 0; i < zone_names.Count(); i++)
13876 {
13877 SetHealthMax(zone_names.Get(i),"Health");
13878 }
13879 SetHealthMax("","Health");
13880 }
13881
13884 {
13885 float global_health = GetHealth01("","Health");
13886 array<string> zones = new array<string>;
13887 GetDamageZones(zones);
13888
13889 for (int i = 0; i < zones.Count(); i++)
13890 {
13891 SetHealth01(zones.Get(i),"Health",global_health);
13892 }
13893 }
13894
13897 {
13898 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13899 }
13900
13902 {
13903 if (!hasRootAsPlayer)
13904 {
13905 if (refParentIB)
13906 {
13907
13908 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13909 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13910
13911 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13912 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13913
13916 }
13917 else
13918 {
13919
13922 }
13923 }
13924 }
13925
13927 {
13929 {
13930 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13931 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13932 {
13933 float heatPermCoef = 1.0;
13935 while (ent)
13936 {
13937 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13938 ent = ent.GetHierarchyParent();
13939 }
13940
13941 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13942 }
13943 }
13944 }
13945
13947 {
13948
13949 EntityAI parent = GetHierarchyParent();
13950 if (!parent)
13951 {
13952 hasParent = false;
13953 hasRootAsPlayer = false;
13954 }
13955 else
13956 {
13957 hasParent = true;
13958 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13959 refParentIB =
ItemBase.Cast(parent);
13960 }
13961 }
13962
13963 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13964 {
13965
13966 }
13967
13969 {
13970
13971 return false;
13972 }
13973
13975 {
13976
13977
13978 return false;
13979 }
13980
13982 {
13983
13984 return false;
13985 }
13986
13989 {
13990 return !GetIsFrozen() &&
IsOpen();
13991 }
13992
13994 {
13995 bool hasParent = false, hasRootAsPlayer = false;
13997
13998 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13999 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14000
14001 if (wwtu || foodDecay)
14002 {
14006
14007 if (processWetness || processTemperature || processDecay)
14008 {
14010
14011 if (processWetness)
14012 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14013
14014 if (processTemperature)
14016
14017 if (processDecay)
14018 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14019 }
14020 }
14021 }
14022
14025 {
14027 }
14028
14030 {
14033
14034 return super.GetTemperatureFreezeThreshold();
14035 }
14036
14038 {
14041
14042 return super.GetTemperatureThawThreshold();
14043 }
14044
14046 {
14049
14050 return super.GetItemOverheatThreshold();
14051 }
14052
14054 {
14056 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14057
14058 return super.GetTemperatureFreezeTime();
14059 }
14060
14062 {
14064 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14065
14066 return super.GetTemperatureThawTime();
14067 }
14068
14073
14075 {
14076 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14077 }
14078
14080 {
14081 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14082 }
14083
14086 {
14088 }
14089
14091 {
14093 }
14094
14096 {
14098 }
14099
14102 {
14103 return null;
14104 }
14105
14108 {
14109 return false;
14110 }
14111
14113 {
14115 {
14118 if (!trg)
14119 {
14121 explosive = this;
14122 }
14123
14124 explosive.PairRemote(trg);
14126
14127 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14128 trg.SetPersistentPairID(persistentID);
14129 explosive.SetPersistentPairID(persistentID);
14130
14131 return true;
14132 }
14133 return false;
14134 }
14135
14138 {
14139 float ret = 1.0;
14142 ret *= GetHealth01();
14143
14144 return ret;
14145 }
14146
14147 #ifdef DEVELOPER
14148 override void SetDebugItem()
14149 {
14150 super.SetDebugItem();
14151 _itemBase = this;
14152 }
14153
14155 {
14156 string text = super.GetDebugText();
14157
14159 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14160
14161 return text;
14162 }
14163 #endif
14164
14166 {
14167 return true;
14168 }
14169
14171
14173
14175 {
14178 }
14179
14180
14188
14204}
14205
14207{
14209 if (entity)
14210 {
14211 bool is_item = entity.IsInherited(
ItemBase);
14212 if (is_item && full_quantity)
14213 {
14216 }
14217 }
14218 else
14219 {
14221 return NULL;
14222 }
14223 return entity;
14224}
14225
14227{
14228 if (item)
14229 {
14230 if (health > 0)
14231 item.SetHealth("", "", health);
14232
14233 if (item.CanHaveTemperature())
14234 {
14236 if (item.CanFreeze())
14237 item.SetFrozen(false);
14238 }
14239
14240 if (item.HasEnergyManager())
14241 {
14242 if (quantity >= 0)
14243 {
14244 item.GetCompEM().SetEnergy0To1(quantity);
14245 }
14246 else
14247 {
14249 }
14250 }
14251 else if (item.IsMagazine())
14252 {
14253 Magazine mag = Magazine.Cast(item);
14254 if (quantity >= 0)
14255 {
14256 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14257 }
14258 else
14259 {
14261 }
14262
14263 }
14264 else
14265 {
14266 if (quantity >= 0)
14267 {
14268 item.SetQuantityNormalized(quantity, false);
14269 }
14270 else
14271 {
14273 }
14274
14275 }
14276 }
14277}
14278
14279#ifdef DEVELOPER
14281#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
Open
Implementations only.
override void EEOnCECreate()
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 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)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
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 void GizmoSelectObject(Object object)
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 native void GizmoSelectPhysics(Physics physics)
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
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto 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.