9330{
9332 {
9333 return true;
9334 }
9335};
9336
9337
9338
9340{
9344
9346
9349
9350
9351
9352
9353
9362
9368
9373
9378
9399 protected bool m_IsResultOfSplit
9400
9402
9407
9408
9409
9411
9415
9416
9417
9419
9422
9423
9424
9430
9431
9439
9442
9443
9445
9446
9448
9449
9454
9455
9460
9461
9463
9464
9466 {
9471
9472 if (!
GetGame().IsDedicatedServer())
9473 {
9475 {
9477
9479 {
9481 }
9482 }
9483
9486 }
9487
9488 m_OldLocation = null;
9489
9491 {
9493 }
9494
9495 if (ConfigIsExisting("headSelectionsToHide"))
9496 {
9499 }
9500
9502 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9503 {
9505 }
9506
9508
9509 m_IsResultOfSplit = false;
9510
9512 }
9513
9515 {
9516 super.InitItemVariables();
9517
9523 m_Count = ConfigGetInt(
"count");
9524
9527
9532
9535
9540
9552
9556
9557
9560 if (ConfigIsExisting("canBeSplit"))
9561 {
9564 }
9565
9567 if (ConfigIsExisting("itemBehaviour"))
9569
9570
9573 RegisterNetSyncVariableInt("m_VarLiquidType");
9574 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9575
9576 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9577 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9578 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9579
9580 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9581 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9582 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9583 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9584
9585 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9586 RegisterNetSyncVariableBool("m_IsTakeable");
9587 RegisterNetSyncVariableBool("m_IsHologram");
9588
9591 {
9594 }
9595
9597
9599 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9601
9602 }
9603
9605 {
9607 }
9608
9610 {
9613 {
9618 }
9619 }
9620
9621 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9622 {
9624 {
9627 }
9628
9630 }
9631
9633 {
9639 }
9640
9642
9644 {
9646
9647 if (!action)
9648 {
9649 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9650 return;
9651 }
9652
9654 if (!ai)
9655 {
9657 return;
9658 }
9659
9661 if (!action_array)
9662 {
9663 action_array = new array<ActionBase_Basic>;
9665 }
9666 if (LogManager.IsActionLogEnable())
9667 {
9668 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9669 }
9670
9671 if (action_array.Find(action) != -1)
9672 {
9673 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9674 }
9675 else
9676 {
9677 action_array.Insert(action);
9678 }
9679 }
9680
9682 {
9684 ActionBase action = player.GetActionManager().GetAction(actionName);
9687
9688 if (action_array)
9689 {
9690 action_array.RemoveItem(action);
9691 }
9692 }
9693
9694
9695
9697 {
9698 ActionOverrideData overrideData = new ActionOverrideData();
9702
9704 if (!actionMap)
9705 {
9708 }
9709
9710 actionMap.Insert(this.
Type(), overrideData);
9711
9712 }
9713
9715
9717
9718
9720 {
9723
9726
9727 string config_to_search = "CfgVehicles";
9728 string muzzle_owner_config;
9729
9731 {
9732 if (IsInherited(Weapon))
9733 config_to_search = "CfgWeapons";
9734
9735 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9736
9737 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9738
9740
9741 if (config_OnFire_subclass_count > 0)
9742 {
9743 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9744
9745 for (int i = 0; i < config_OnFire_subclass_count; i++)
9746 {
9747 string particle_class = "";
9749 string config_OnFire_entry = config_OnFire_class + particle_class;
9750 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9751 WPOF_array.Insert(WPOF);
9752 }
9753
9754
9756 }
9757 }
9758
9760 {
9761 config_to_search = "CfgWeapons";
9762 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9763
9764 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9765
9767
9768 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9769 {
9770 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9771
9772 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9773 {
9774 string particle_class2 = "";
9776 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9777 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9778 WPOBE_array.Insert(WPOBE);
9779 }
9780
9781
9783 }
9784 }
9785 }
9786
9787
9789 {
9792
9794 {
9795 string config_to_search = "CfgVehicles";
9796
9797 if (IsInherited(Weapon))
9798 config_to_search = "CfgWeapons";
9799
9800 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9801 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9802
9803 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9804 {
9805
9807
9809 {
9811 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9813 return;
9814 }
9815
9818
9819
9820
9822 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9823
9824 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9825 {
9826 string particle_class = "";
9828 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9830
9831 if (entry_type == CT_CLASS)
9832 {
9833 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9834 WPOOH_array.Insert(WPOF);
9835 }
9836 }
9837
9838
9840 }
9841 }
9842 }
9843
9845 {
9847 }
9848
9850 {
9852 {
9854
9857
9860
9861 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9862 }
9863 }
9864
9866 {
9868 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9869
9871 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9872
9874 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9875
9877 {
9879 }
9880 }
9881
9883 {
9885 }
9886
9888 {
9891 else
9893
9895 {
9898 }
9899 else
9900 {
9903
9906 }
9907
9909 }
9910
9912 {
9914 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9915 }
9916
9918 {
9920 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9922 }
9923
9925 {
9927 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9928 }
9929
9931 {
9934
9935 OverheatingParticle OP = new OverheatingParticle();
9940
9942 }
9943
9945 {
9948
9949 return -1;
9950 }
9951
9953 {
9955 {
9958
9959 for (int i = count; i > 0; --i)
9960 {
9961 int id = i - 1;
9964
9967
9968 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9969 {
9970 if (p)
9971 {
9974 }
9975 }
9976 }
9977 }
9978 }
9979
9981 {
9983 {
9985 {
9986 int id = i - 1;
9988
9989 if (OP)
9990 {
9992
9993 if (p)
9994 {
9996 }
9997
9998 delete OP;
9999 }
10000 }
10001
10004 }
10005 }
10006
10009 {
10010 return 0.0;
10011 }
10012
10013
10015 {
10016 return 250;
10017 }
10018
10020 {
10021 return 0;
10022 }
10023
10026 {
10028 return true;
10029
10030 return false;
10031 }
10032
10035 {
10038
10040 {
10042 }
10043 else
10044 {
10045
10047 }
10048
10050 }
10051
10058 {
10059 return -1;
10060 }
10061
10062
10063
10064
10066 {
10068 {
10070 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10071
10072 if (r_index >= 0)
10073 {
10074 InventoryLocation r_il = new InventoryLocation;
10075 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10076
10077 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10080 {
10081 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10082 }
10084 {
10085 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10086 }
10087
10088 }
10089
10090 player.GetHumanInventory().ClearUserReservedLocation(this);
10091 }
10092
10095 }
10096
10097
10098
10099
10101 {
10102 return ItemBase.m_DebugActionsMask;
10103 }
10104
10106 {
10107 return ItemBase.m_DebugActionsMask & mask;
10108 }
10109
10111 {
10112 ItemBase.m_DebugActionsMask = mask;
10113 }
10114
10116 {
10117 ItemBase.m_DebugActionsMask |= mask;
10118 }
10119
10121 {
10122 ItemBase.m_DebugActionsMask &= ~mask;
10123 }
10124
10126 {
10128 {
10130 }
10131 else
10132 {
10134 }
10135 }
10136
10137
10139 {
10140 if (GetEconomyProfile())
10141 {
10142 float q_max = GetEconomyProfile().GetQuantityMax();
10143 if (q_max > 0)
10144 {
10145 float q_min = GetEconomyProfile().GetQuantityMin();
10146 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10147
10149 {
10150 ComponentEnergyManager comp = GetCompEM();
10152 {
10154 }
10155 }
10157 {
10159
10160 }
10161
10162 }
10163 }
10164 }
10165
10168 {
10169 EntityAI parent = GetHierarchyParent();
10170
10171 if (parent)
10172 {
10173 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10174 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10175 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10176 }
10177 }
10178
10181 {
10182 EntityAI parent = GetHierarchyParent();
10183
10184 if (parent)
10185 {
10186 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10187 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10188 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10189 }
10190 }
10191
10193 {
10194
10195
10196
10197
10199
10201 {
10202 if (ScriptInputUserData.CanStoreInputUserData())
10203 {
10204 ScriptInputUserData ctx = new ScriptInputUserData;
10210 ctx.
Write(use_stack_max);
10213
10215 {
10216 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10217 }
10218 }
10219 }
10220 else if (!
GetGame().IsMultiplayer())
10221 {
10223 }
10224 }
10225
10227 {
10229 }
10230
10232 {
10234 }
10235
10237 {
10239 }
10240
10242 {
10243
10244 return false;
10245 }
10246
10248 {
10249 return false;
10250 }
10251
10255 {
10256 return false;
10257 }
10258
10260 {
10261 return "";
10262 }
10263
10265
10267 {
10268 return false;
10269 }
10270
10272 {
10273 return true;
10274 }
10275
10276
10277
10279 {
10280 return true;
10281 }
10282
10284 {
10285 return true;
10286 }
10287
10289 {
10290 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10292 }
10293
10295 {
10297 }
10298
10300 {
10302 if (!is_being_placed)
10304 SetSynchDirty();
10305 }
10306
10307
10309
10311 {
10313 }
10314
10316 {
10318 }
10319
10321 {
10322 return 1;
10323 }
10324
10326 {
10327 return false;
10328 }
10329
10331 {
10333 SetSynchDirty();
10334 }
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10371 {
10372 super.OnMovedInsideCargo(container);
10373
10374 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10375 }
10376
10377 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10378 {
10379 super.EEItemLocationChanged(oldLoc,newLoc);
10380
10381 PlayerBase new_player = null;
10382 PlayerBase old_player = null;
10383
10384 if (newLoc.GetParent())
10385 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10386
10387 if (oldLoc.GetParent())
10388 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10389
10391 {
10392 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10393
10394 if (r_index >= 0)
10395 {
10396 InventoryLocation r_il = new InventoryLocation;
10397 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10398
10399 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10402 {
10403 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10404 }
10406 {
10407 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10408 }
10409
10410 }
10411 }
10412
10414 {
10415 if (new_player)
10416 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10417
10418 if (new_player == old_player)
10419 {
10420
10421 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10422 {
10424 {
10425 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10426 {
10427 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10428 }
10429 }
10430 else
10431 {
10432 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10433 }
10434 }
10435
10436 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10437 {
10438 int type = oldLoc.GetType();
10440 {
10441 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10442 }
10444 {
10445 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10446 }
10447 }
10448 if (!m_OldLocation)
10449 {
10450 m_OldLocation = new InventoryLocation;
10451 }
10452 m_OldLocation.Copy(oldLoc);
10453 }
10454 else
10455 {
10456 if (m_OldLocation)
10457 {
10458 m_OldLocation.Reset();
10459 }
10460 }
10461
10463 }
10464 else
10465 {
10466 if (new_player)
10467 {
10468 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10469 if (res_index >= 0)
10470 {
10471 InventoryLocation il = new InventoryLocation;
10472 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10474 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10477 {
10478 il.
GetParent().GetOnReleaseLock().Invoke(it);
10479 }
10481 {
10483 }
10484
10485 }
10486 }
10488 {
10489
10491 }
10492
10493 if (m_OldLocation)
10494 {
10495 m_OldLocation.Reset();
10496 }
10497 }
10498 }
10499
10500 override void EOnContact(IEntity other, Contact extra)
10501 {
10503 {
10504 int liquidType = -1;
10506 if (impactSpeed > 0.0)
10507 {
10509 #ifndef SERVER
10511 #else
10513 SetSynchDirty();
10514 #endif
10516 }
10517 }
10518
10519 #ifdef SERVER
10520 if (GetCompEM() && GetCompEM().IsPlugged())
10521 {
10522 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10523 GetCompEM().UnplugThis();
10524 }
10525 #endif
10526 }
10527
10529
10531 {
10533 }
10534
10536 {
10537
10538 }
10539
10541 {
10542 super.OnItemLocationChanged(old_owner, new_owner);
10543
10544 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10545 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10546
10547 if (!relatedPlayer && playerNew)
10548 relatedPlayer = playerNew;
10549
10550 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10551 {
10553 if (actionMgr)
10554 {
10555 ActionBase currentAction = actionMgr.GetRunningAction();
10556 if (currentAction)
10558 }
10559 }
10560
10561 Man ownerPlayerOld = null;
10562 Man ownerPlayerNew = null;
10563
10564 if (old_owner)
10565 {
10566 if (old_owner.
IsMan())
10567 {
10568 ownerPlayerOld = Man.Cast(old_owner);
10569 }
10570 else
10571 {
10572 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10573 }
10574 }
10575 else
10576 {
10578 {
10580
10581 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10582 {
10583 GetCompEM().UnplugThis();
10584 }
10585 }
10586 }
10587
10588 if (new_owner)
10589 {
10590 if (new_owner.
IsMan())
10591 {
10592 ownerPlayerNew = Man.Cast(new_owner);
10593 }
10594 else
10595 {
10596 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10597 }
10598 }
10599
10600 if (ownerPlayerOld != ownerPlayerNew)
10601 {
10602 if (ownerPlayerOld)
10603 {
10604 array<EntityAI> subItemsExit = new array<EntityAI>;
10606 for (int i = 0; i < subItemsExit.Count(); i++)
10607 {
10610 }
10611 }
10612
10613 if (ownerPlayerNew)
10614 {
10615 array<EntityAI> subItemsEnter = new array<EntityAI>;
10617 for (int j = 0; j < subItemsEnter.Count(); j++)
10618 {
10621 }
10622 }
10623 }
10624 else if (ownerPlayerNew != null)
10625 {
10626 PlayerBase nplayer;
10627 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10628 {
10629 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10631 for (int k = 0; k < subItemsUpdate.Count(); k++)
10632 {
10634 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10635 }
10636 }
10637 }
10638
10639 if (old_owner)
10640 old_owner.OnChildItemRemoved(this);
10641 if (new_owner)
10642 new_owner.OnChildItemReceived(this);
10643 }
10644
10645
10647 {
10648 super.EEDelete(parent);
10649 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10650 if (player)
10651 {
10653
10654 if (player.IsAlive())
10655 {
10656 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10657 if (r_index >= 0)
10658 {
10659 InventoryLocation r_il = new InventoryLocation;
10660 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10661
10662 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10665 {
10666 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10667 }
10669 {
10670 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10671 }
10672
10673 }
10674
10675 player.RemoveQuickBarEntityShortcut(this);
10676 }
10677 }
10678 }
10679
10681 {
10682 super.EEKilled(killer);
10683
10686 {
10687 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10688 {
10689 if (IsMagazine())
10690 {
10691 if (Magazine.Cast(this).GetAmmoCount() > 0)
10692 {
10694 }
10695 }
10696 else
10697 {
10699 }
10700 }
10701 }
10702 }
10703
10705 {
10706 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10707
10708 super.OnWasAttached(parent, slot_id);
10709
10712
10714 }
10715
10717 {
10718 super.OnWasDetached(parent, slot_id);
10719
10722 }
10723
10725 {
10726 int idx;
10729
10730 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10731 if (inventory_slots.Count() < 1)
10732 {
10733 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10734 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10735 }
10736 else
10737 {
10738 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10739 }
10740
10741 idx = inventory_slots.Find(slot);
10742 if (idx < 0)
10743 return "";
10744
10745 return attach_types.Get(idx);
10746 }
10747
10749 {
10750 int idx = -1;
10751 string slot;
10752
10755
10756 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10757 if (inventory_slots.Count() < 1)
10758 {
10759 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10760 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10761 }
10762 else
10763 {
10764 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10765 if (detach_types.Count() < 1)
10766 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10767 }
10768
10769 for (int i = 0; i < inventory_slots.Count(); i++)
10770 {
10771 slot = inventory_slots.Get(i);
10772 }
10773
10774 if (slot != "")
10775 {
10776 if (detach_types.Count() == 1)
10777 idx = 0;
10778 else
10779 idx = inventory_slots.Find(slot);
10780 }
10781 if (idx < 0)
10782 return "";
10783
10784 return detach_types.Get(idx);
10785 }
10786
10788 {
10789
10791
10792
10793 float min_time = 1;
10794 float max_time = 3;
10795 float delay = Math.RandomFloat(min_time, max_time);
10796
10797 explode_timer.Run(delay, this, "DoAmmoExplosion");
10798 }
10799
10801 {
10802 Magazine magazine = Magazine.Cast(this);
10803 int pop_sounds_count = 6;
10804 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10805
10806
10807 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10808 string sound_name = pop_sounds[ sound_idx ];
10810
10811
10812 magazine.ServerAddAmmoCount(-1);
10813
10814
10815 float min_temp_to_explode = 100;
10816
10817 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10818 {
10820 }
10821 }
10822
10823
10824 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10825 {
10826 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10827
10828 const int CHANCE_DAMAGE_CARGO = 4;
10829 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10830 const int CHANCE_DAMAGE_NOTHING = 2;
10831
10833 {
10834 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10835 int chances;
10836 int rnd;
10837
10838 if (GetInventory().GetCargo())
10839 {
10840 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10841 rnd = Math.RandomInt(0,chances);
10842
10843 if (rnd < CHANCE_DAMAGE_CARGO)
10844 {
10846 }
10847 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10848 {
10850 }
10851 }
10852 else
10853 {
10854 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10855 rnd = Math.RandomInt(0,chances);
10856
10857 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10858 {
10860 }
10861 }
10862 }
10863 }
10864
10866 {
10867 if (GetInventory().GetCargo())
10868 {
10869 int item_count = GetInventory().GetCargo().GetItemCount();
10870 if (item_count > 0)
10871 {
10872 int random_pick = Math.RandomInt(0, item_count);
10874 if (!item.IsExplosive())
10875 {
10876 item.AddHealth("","",damage);
10877 return true;
10878 }
10879 }
10880 }
10881 return false;
10882 }
10883
10885 {
10886 int attachment_count = GetInventory().AttachmentCount();
10887 if (attachment_count > 0)
10888 {
10889 int random_pick = Math.RandomInt(0, attachment_count);
10890 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10891 if (!attachment.IsExplosive())
10892 {
10893 attachment.AddHealth("","",damage);
10894 return true;
10895 }
10896 }
10897 return false;
10898 }
10899
10901 {
10903 }
10904
10906 {
10908 return GetInventory().CanRemoveEntity();
10909
10910 return false;
10911 }
10912
10914 {
10916 return;
10917
10919 {
10920 if (ScriptInputUserData.CanStoreInputUserData())
10921 {
10922 ScriptInputUserData ctx = new ScriptInputUserData;
10927 ctx.
Write(destination_entity);
10929 ctx.
Write(slot_id);
10931 }
10932 }
10933 else if (!
GetGame().IsMultiplayer())
10934 {
10936 }
10937 }
10938
10940 {
10942 return;
10943
10944 float split_quantity_new;
10948 InventoryLocation loc = new InventoryLocation;
10949
10950 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10951 {
10953 split_quantity_new = stack_max;
10954 else
10956
10957 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10958 if (new_item)
10959 {
10960 new_item.SetResultOfSplit(true);
10961 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10963 new_item.SetQuantity(split_quantity_new);
10964 }
10965 }
10966 else if (destination_entity && slot_id == -1)
10967 {
10968 if (quantity > stack_max)
10969 split_quantity_new = stack_max;
10970 else
10971 split_quantity_new = quantity;
10972
10974 {
10977 }
10978
10979 if (new_item)
10980 {
10981 new_item.SetResultOfSplit(true);
10982 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10984 new_item.SetQuantity(split_quantity_new);
10985 }
10986 }
10987 else
10988 {
10989 if (stack_max != 0)
10990 {
10992 {
10994 }
10995
10996 if (split_quantity_new == 0)
10997 {
10998 if (!
GetGame().IsMultiplayer())
10999 player.PhysicalPredictiveDropItem(this);
11000 else
11001 player.ServerDropEntity(this);
11002 return;
11003 }
11004
11006
11007 if (new_item)
11008 {
11009 new_item.SetResultOfSplit(true);
11010 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11012 new_item.SetQuantity(stack_max);
11013 new_item.PlaceOnSurface();
11014 }
11015 }
11016 }
11017 }
11018
11020 {
11022 return;
11023
11024 float split_quantity_new;
11028 InventoryLocation loc = new InventoryLocation;
11029
11030 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11031 {
11033 split_quantity_new = stack_max;
11034 else
11036
11037 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11038 if (new_item)
11039 {
11040 new_item.SetResultOfSplit(true);
11041 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11043 new_item.SetQuantity(split_quantity_new);
11044 }
11045 }
11046 else if (destination_entity && slot_id == -1)
11047 {
11048 if (quantity > stack_max)
11049 split_quantity_new = stack_max;
11050 else
11051 split_quantity_new = quantity;
11052
11054 {
11057 }
11058
11059 if (new_item)
11060 {
11061 new_item.SetResultOfSplit(true);
11062 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11064 new_item.SetQuantity(split_quantity_new);
11065 }
11066 }
11067 else
11068 {
11069 if (stack_max != 0)
11070 {
11072 {
11074 }
11075
11077
11078 if (new_item)
11079 {
11080 new_item.SetResultOfSplit(true);
11081 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11083 new_item.SetQuantity(stack_max);
11084 new_item.PlaceOnSurface();
11085 }
11086 }
11087 }
11088 }
11089
11091 {
11093 return;
11094
11096 {
11097 if (ScriptInputUserData.CanStoreInputUserData())
11098 {
11099 ScriptInputUserData ctx = new ScriptInputUserData;
11104 dst.WriteToContext(ctx);
11106 }
11107 }
11108 else if (!
GetGame().IsMultiplayer())
11109 {
11111 }
11112 }
11113
11115 {
11117 return;
11118
11120 {
11121 if (ScriptInputUserData.CanStoreInputUserData())
11122 {
11123 ScriptInputUserData ctx = new ScriptInputUserData;
11128 ctx.
Write(destination_entity);
11134 }
11135 }
11136 else if (!
GetGame().IsMultiplayer())
11137 {
11139 }
11140 }
11141
11143 {
11145 }
11146
11148 {
11150 return this;
11151
11153 float split_quantity_new;
11155 if (dst.IsValid())
11156 {
11157 int slot_id = dst.GetSlot();
11159
11160 if (quantity > stack_max)
11161 split_quantity_new = stack_max;
11162 else
11163 split_quantity_new = quantity;
11164
11166
11167 if (new_item)
11168 {
11169 new_item.SetResultOfSplit(true);
11170 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11173 }
11174
11175 return new_item;
11176 }
11177
11178 return null;
11179 }
11180
11182 {
11184 return;
11185
11187 float split_quantity_new;
11189 if (destination_entity)
11190 {
11192 if (quantity > stackable)
11193 split_quantity_new = stackable;
11194 else
11195 split_quantity_new = quantity;
11196
11197 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11198 if (new_item)
11199 {
11200 new_item.SetResultOfSplit(true);
11201 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11203 new_item.SetQuantity(split_quantity_new);
11204 }
11205 }
11206 }
11207
11209 {
11211 return;
11212
11214 {
11215 if (ScriptInputUserData.CanStoreInputUserData())
11216 {
11217 ScriptInputUserData ctx = new ScriptInputUserData;
11222 ItemBase destination_entity =
this;
11223 ctx.
Write(destination_entity);
11227 }
11228 }
11229 else if (!
GetGame().IsMultiplayer())
11230 {
11232 }
11233 }
11234
11236 {
11238 return;
11239
11241 float split_quantity_new;
11243 if (player)
11244 {
11246 if (quantity > stackable)
11247 split_quantity_new = stackable;
11248 else
11249 split_quantity_new = quantity;
11250
11251 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11252 new_item =
ItemBase.Cast(in_hands);
11253 if (new_item)
11254 {
11255 new_item.SetResultOfSplit(true);
11256 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11258 new_item.SetQuantity(split_quantity_new);
11259 }
11260 }
11261 }
11262
11264 {
11266 return;
11267
11269 float split_quantity_new = Math.Floor(quantity * 0.5);
11270
11272
11273 if (new_item)
11274 {
11275 if (new_item.GetQuantityMax() < split_quantity_new)
11276 {
11277 split_quantity_new = new_item.GetQuantityMax();
11278 }
11279
11280 new_item.SetResultOfSplit(true);
11281 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11282
11284 {
11287 }
11288 else
11289 {
11292 }
11293 }
11294 }
11295
11297 {
11299 return;
11300
11302 float split_quantity_new = Math.Floor(quantity / 2);
11303
11304 InventoryLocation invloc = new InventoryLocation;
11306
11308 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11309
11310 if (new_item)
11311 {
11312 if (new_item.GetQuantityMax() < split_quantity_new)
11313 {
11314 split_quantity_new = new_item.GetQuantityMax();
11315 }
11317 {
11320 }
11321 else
11322 {
11325 }
11326 }
11327 }
11328
11331 {
11332 SetWeightDirty();
11334
11335 if (parent)
11336 parent.OnAttachmentQuantityChangedEx(this, delta);
11337
11339 {
11341 {
11343 }
11345 {
11346 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11348 }
11349 }
11350
11351 }
11352
11355 {
11356
11357 }
11358
11361 {
11363 }
11364
11366 {
11367 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11368
11370 {
11371 if (newLevel == GameConstants.STATE_RUINED)
11372 {
11374 EntityAI parent = GetHierarchyParent();
11375 if (parent && parent.IsFireplace())
11376 {
11377 CargoBase cargo = GetInventory().GetCargo();
11378 if (cargo)
11379 {
11381 {
11383 }
11384 }
11385 }
11386 }
11387
11389 {
11390
11392 return;
11393 }
11394
11395 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11396 {
11398 }
11399 }
11400 }
11401
11402
11404 {
11405 super.OnRightClick();
11406
11408 {
11410 {
11411 if (ScriptInputUserData.CanStoreInputUserData())
11412 {
11413 vector m4[4];
11415
11416 EntityAI root = GetHierarchyRoot();
11417
11418 InventoryLocation dst = new InventoryLocation;
11420 {
11421 if (root)
11422 {
11423 root.GetTransform(m4);
11425 }
11426 else
11427 GetInventory().GetCurrentInventoryLocation(dst);
11428 }
11429 else
11430 {
11432
11433
11434 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11435 {
11436 if (root)
11437 {
11438 root.GetTransform(m4);
11440 }
11441 else
11442 GetInventory().GetCurrentInventoryLocation(dst);
11443 }
11444 else
11445 {
11446 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11447 }
11448 }
11449
11450 ScriptInputUserData ctx = new ScriptInputUserData;
11458 }
11459 }
11460 else if (!
GetGame().IsMultiplayer())
11461 {
11463 }
11464 }
11465 }
11466
11467 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11468 {
11469
11470 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11471 return false;
11472
11473 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11474 return false;
11475
11476
11478 return false;
11479
11480
11481 Magazine mag = Magazine.Cast(this);
11482 if (mag)
11483 {
11484 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11485 return false;
11486
11487 if (stack_max_limit)
11488 {
11489 Magazine other_mag = Magazine.Cast(other_item);
11490 if (other_item)
11491 {
11492 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11493 return false;
11494 }
11495
11496 }
11497 }
11498 else
11499 {
11500
11502 return false;
11503
11505 return false;
11506 }
11507
11508 PlayerBase player = null;
11509 if (CastTo(player, GetHierarchyRootPlayer()))
11510 {
11511 if (player.GetInventory().HasAttachment(this))
11512 return false;
11513
11514 if (player.IsItemsToDelete())
11515 return false;
11516 }
11517
11518 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11519 return false;
11520
11521 int slotID;
11523 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11524 return false;
11525
11526 return true;
11527 }
11528
11530 {
11532 }
11533
11535 {
11536 return m_IsResultOfSplit;
11537 }
11538
11540 {
11541 m_IsResultOfSplit = value;
11542 }
11543
11545 {
11547 }
11548
11550 {
11551 float other_item_quantity = other_item.GetQuantity();
11552 float this_free_space;
11553
11555
11557
11558 if (other_item_quantity > this_free_space)
11559 {
11560 return this_free_space;
11561 }
11562 else
11563 {
11564 return other_item_quantity;
11565 }
11566 }
11567
11569 {
11571 }
11572
11574 {
11576 return;
11577
11578 if (!IsMagazine() && other_item)
11579 {
11581 if (quantity_used != 0)
11582 {
11583 float hp1 = GetHealth01("","");
11584 float hp2 = other_item.GetHealth01("","");
11585 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11586 hpResult = hpResult / (
GetQuantity() + quantity_used);
11587
11588 hpResult *= GetMaxHealth();
11589 Math.Round(hpResult);
11590 SetHealth("", "Health", hpResult);
11591
11593 other_item.AddQuantity(-quantity_used);
11594 }
11595 }
11597 }
11598
11600 {
11601 #ifdef SERVER
11602 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11603 GetHierarchyParent().IncreaseLifetimeUp();
11604 #endif
11605 };
11606
11608 {
11609 PlayerBase p = PlayerBase.Cast(player);
11610
11611 array<int> recipesIds = p.m_Recipes;
11612 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11613 if (moduleRecipesManager)
11614 {
11615 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11616 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11617 }
11618
11619 for (int i = 0;i < recipesIds.Count(); i++)
11620 {
11621 int key = recipesIds.Get(i);
11622 string recipeName = moduleRecipesManager.GetRecipeName(key);
11624 }
11625 }
11626
11627
11628 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11629 {
11630 super.GetDebugActions(outputList);
11631
11632
11637
11638
11642
11646
11647
11650
11651
11653 {
11656 }
11657
11659
11662
11666 }
11667
11668
11669
11670
11672 {
11673 super.OnAction(action_id, player, ctx);
11674 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11675 {
11676 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11677 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11678 PlayerBase p = PlayerBase.Cast(player);
11679 if (
EActions.RECIPES_RANGE_START < 1000)
11680 {
11681 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11682 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11683 }
11684 }
11685 #ifndef SERVER
11686 else if (action_id ==
EActions.WATCH_PLAYER)
11687 {
11688 PluginDeveloper.SetDeveloperItemClientEx(player);
11689 }
11690 #endif
11692 {
11693 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11694 {
11695 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11696 OnDebugButtonPressServer(id + 1);
11697 }
11698
11699 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11700 {
11701 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11703 }
11704
11705 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11706 {
11707 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11709 }
11710
11711 else if (action_id ==
EActions.ADD_QUANTITY)
11712 {
11713 if (IsMagazine())
11714 {
11715 Magazine mag = Magazine.Cast(this);
11716 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11717 }
11718 else
11719 {
11721 }
11722
11723 if (m_EM)
11724 {
11725 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11726 }
11727
11728 }
11729
11730 else if (action_id ==
EActions.REMOVE_QUANTITY)
11731 {
11732 if (IsMagazine())
11733 {
11734 Magazine mag2 = Magazine.Cast(this);
11735 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11736 }
11737 else
11738 {
11740 }
11741 if (m_EM)
11742 {
11743 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11744 }
11745
11746 }
11747
11748 else if (action_id ==
EActions.SET_QUANTITY_0)
11749 {
11751
11752 if (m_EM)
11753 {
11754 m_EM.SetEnergy(0);
11755 }
11756 }
11757
11758 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11759 {
11761
11762 if (m_EM)
11763 {
11764 m_EM.SetEnergy(m_EM.GetEnergyMax());
11765 }
11766 }
11767
11768 else if (action_id ==
EActions.ADD_HEALTH)
11769 {
11770 AddHealth("","",GetMaxHealth("","Health")/5);
11771 }
11772 else if (action_id ==
EActions.REMOVE_HEALTH)
11773 {
11774 AddHealth("","",-GetMaxHealth("","Health")/5);
11775 }
11776 else if (action_id ==
EActions.DESTROY_HEALTH)
11777 {
11778 SetHealth01("","",0);
11779 }
11780 else if (action_id ==
EActions.WATCH_ITEM)
11781 {
11783 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11784 #ifdef DEVELOPER
11785 SetDebugDeveloper_item(this);
11786 #endif
11787 }
11788
11789 else if (action_id ==
EActions.ADD_TEMPERATURE)
11790 {
11791 AddTemperature(20);
11792
11793 }
11794
11795 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11796 {
11797 AddTemperature(-20);
11798
11799 }
11800
11801 else if (action_id ==
EActions.FLIP_FROZEN)
11802 {
11803 SetFrozen(!GetIsFrozen());
11804
11805 }
11806
11807 else if (action_id ==
EActions.ADD_WETNESS)
11808 {
11810
11811 }
11812
11813 else if (action_id ==
EActions.REMOVE_WETNESS)
11814 {
11816
11817 }
11818
11819 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11820 {
11823
11824
11825 }
11826
11827 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11828 {
11831 }
11832
11833 else if (action_id ==
EActions.MAKE_SPECIAL)
11834 {
11835 auto debugParams = DebugSpawnParams.WithPlayer(player);
11836 OnDebugSpawnEx(debugParams);
11837 }
11838
11839 else if (action_id ==
EActions.DELETE)
11840 {
11841 Delete();
11842 }
11843
11844 }
11845
11846
11847 return false;
11848 }
11849
11850
11851
11852
11856
11859
11860
11861
11863 {
11864 return false;
11865 }
11866
11867
11869 {
11870 return true;
11871 }
11872
11873
11875 {
11876 return true;
11877 }
11878
11879
11880
11882 {
11883 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11885 }
11886
11889 {
11890 return null;
11891 }
11892
11894 {
11895 return false;
11896 }
11897
11899 {
11900 return false;
11901 }
11902
11906
11907
11909 {
11910 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11911 return module_repairing.CanRepair(this, item_repair_kit);
11912 }
11913
11914
11915 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11916 {
11917 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11918 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11919 }
11920
11921
11923 {
11924
11925
11926
11927
11928
11929
11930
11931
11932 return 1;
11933 }
11934
11935
11936
11938 {
11940 }
11941
11942
11943
11945 {
11947 }
11948
11949
11958 {
11959 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11960
11961 if (player)
11962 {
11963 player.MessageStatus(text);
11964 }
11965 }
11966
11967
11976 {
11977 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11978
11979 if (player)
11980 {
11981 player.MessageAction(text);
11982 }
11983 }
11984
11985
11994 {
11995 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11996
11997 if (player)
11998 {
11999 player.MessageFriendly(text);
12000 }
12001 }
12002
12003
12012 {
12013 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12014
12015 if (player)
12016 {
12017 player.MessageImportant(text);
12018 }
12019 }
12020
12022 {
12023 return true;
12024 }
12025
12026
12027 override bool KindOf(
string tag)
12028 {
12029 bool found = false;
12030 string item_name = this.
GetType();
12033
12034 int array_size = item_tag_array.Count();
12035 for (int i = 0; i < array_size; i++)
12036 {
12037 if (item_tag_array.Get(i) == tag)
12038 {
12039 found = true;
12040 break;
12041 }
12042 }
12043 return found;
12044 }
12045
12046
12048 {
12049
12050 super.OnRPC(sender, rpc_type,ctx);
12051
12052
12053 switch (rpc_type)
12054 {
12055 #ifndef SERVER
12056 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12057 Param2<bool, string> p = new Param2<bool, string>(false, "");
12058
12060 return;
12061
12062 bool play = p.param1;
12063 string soundSet = p.param2;
12064
12065 if (play)
12066 {
12068 {
12070 {
12072 }
12073 }
12074 else
12075 {
12077 }
12078 }
12079 else
12080 {
12082 }
12083
12084 break;
12085 #endif
12086
12087 }
12088
12090 {
12092 }
12093 }
12094
12095
12096
12097
12099 {
12100 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12101 return plugin.GetID(
name);
12102 }
12103
12105 {
12106 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12107 return plugin.GetName(id);
12108 }
12109
12112 {
12113
12114
12115 int varFlags;
12116 if (!ctx.
Read(varFlags))
12117 return;
12118
12119 if (varFlags & ItemVariableFlags.FLOAT)
12120 {
12122 }
12123 }
12124
12126 {
12127
12128 super.SerializeNumericalVars(floats_out);
12129
12130
12131
12133 {
12135 }
12136
12138 {
12140 }
12141
12143 {
12145 }
12146
12148 {
12153 }
12154
12156 {
12158 }
12159 }
12160
12162 {
12163
12164 super.DeSerializeNumericalVars(floats);
12165
12166
12167 int index = 0;
12168 int mask = Math.Round(floats.Get(index));
12169
12170 index++;
12171
12173 {
12175 {
12177 }
12178 else
12179 {
12180 float quantity = floats.Get(index);
12181 SetQuantity(quantity,
true,
false,
false,
false);
12182 }
12183 index++;
12184 }
12185
12187 {
12188 float wet = floats.Get(index);
12190 index++;
12191 }
12192
12194 {
12195 int liquidtype = Math.Round(floats.Get(index));
12197 index++;
12198 }
12199
12201 {
12203 index++;
12205 index++;
12207 index++;
12209 index++;
12210 }
12211
12213 {
12214 int cleanness = Math.Round(floats.Get(index));
12216 index++;
12217 }
12218 }
12219
12221 {
12222 super.WriteVarsToCTX(ctx);
12223
12224
12226 {
12228 }
12229
12231 {
12233 }
12234
12236 {
12238 }
12239
12241 {
12242 int r,g,b,a;
12248 }
12249
12251 {
12253 }
12254 }
12255
12257 {
12258 if (!super.ReadVarsFromCTX(ctx,version))
12259 return false;
12260
12261 int intValue;
12262 float value;
12263
12264 if (version < 140)
12265 {
12266 if (!ctx.
Read(intValue))
12267 return false;
12268
12269 m_VariablesMask = intValue;
12270 }
12271
12273 {
12274 if (!ctx.
Read(value))
12275 return false;
12276
12278 {
12280 }
12281 else
12282 {
12284 }
12285 }
12286
12287 if (version < 140)
12288 {
12290 {
12291 if (!ctx.
Read(value))
12292 return false;
12293 SetTemperatureDirect(value);
12294 }
12295 }
12296
12298 {
12299 if (!ctx.
Read(value))
12300 return false;
12302 }
12303
12305 {
12306 if (!ctx.
Read(intValue))
12307 return false;
12309 }
12310
12312 {
12313 int r,g,b,a;
12315 return false;
12317 return false;
12319 return false;
12321 return false;
12322
12324 }
12325
12327 {
12328 if (!ctx.
Read(intValue))
12329 return false;
12331 }
12332
12333 if (version >= 138 && version < 140)
12334 {
12336 {
12337 if (!ctx.
Read(intValue))
12338 return false;
12339 SetFrozen(intValue);
12340 }
12341 }
12342
12343 return true;
12344 }
12345
12346
12348 {
12351 {
12353 }
12354
12355 if (!super.OnStoreLoad(ctx, version))
12356 {
12358 return false;
12359 }
12360
12361 if (version >= 114)
12362 {
12363 bool hasQuickBarIndexSaved;
12364
12365 if (!ctx.
Read(hasQuickBarIndexSaved))
12366 {
12368 return false;
12369 }
12370
12371 if (hasQuickBarIndexSaved)
12372 {
12373 int itmQBIndex;
12374
12375
12376 if (!ctx.
Read(itmQBIndex))
12377 {
12379 return false;
12380 }
12381
12382 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12383 if (itmQBIndex != -1 && parentPlayer)
12384 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12385 }
12386 }
12387 else
12388 {
12389
12390 PlayerBase player;
12391 int itemQBIndex;
12392 if (version ==
int.
MAX)
12393 {
12394 if (!ctx.
Read(itemQBIndex))
12395 {
12397 return false;
12398 }
12399 }
12400 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12401 {
12402
12403 if (!ctx.
Read(itemQBIndex))
12404 {
12406 return false;
12407 }
12408 if (itemQBIndex != -1 && player)
12409 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12410 }
12411 }
12412
12413 if (version < 140)
12414 {
12415
12416 if (!LoadVariables(ctx, version))
12417 {
12419 return false;
12420 }
12421 }
12422
12423
12425 {
12427 return false;
12428 }
12429 if (version >= 132)
12430 {
12432 if (raib)
12433 {
12435 {
12437 return false;
12438 }
12439 }
12440 }
12441
12443 return true;
12444 }
12445
12446
12447
12449 {
12450 super.OnStoreSave(ctx);
12451
12452 PlayerBase player;
12453 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12454 {
12456
12457 int itemQBIndex = -1;
12458 itemQBIndex = player.FindQuickBarEntityIndex(this);
12459 ctx.
Write(itemQBIndex);
12460 }
12461 else
12462 {
12464 }
12465
12467
12469 if (raib)
12470 {
12472 }
12473 }
12474
12475
12477 {
12478 super.AfterStoreLoad();
12479
12481 {
12483 }
12484
12486 {
12489 }
12490 }
12491
12493 {
12494 super.EEOnAfterLoad();
12495
12497 {
12499 }
12500
12503 }
12504
12506 {
12507 return false;
12508 }
12509
12510
12511
12513 {
12515 {
12516 #ifdef PLATFORM_CONSOLE
12517
12519 {
12521 if (menu)
12522 {
12524 }
12525 }
12526 #endif
12527 }
12528
12530 {
12533 }
12534
12536 {
12537 SetWeightDirty();
12539 }
12541 {
12544 }
12545
12547 {
12550 }
12552 {
12555 }
12556
12557 super.OnVariablesSynchronized();
12558 }
12559
12560
12561
12563 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12564 {
12565 if (!IsServerCheck(allow_client))
12566 return false;
12567
12569 return false;
12570
12573
12574 if (value <= (min + 0.001))
12575 value = min;
12576
12577 if (value == min)
12578 {
12579 if (destroy_config)
12580 {
12581 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12582 if (dstr)
12583 {
12585 this.Delete();
12586 return true;
12587 }
12588 }
12589 else if (destroy_forced)
12590 {
12592 this.Delete();
12593 return true;
12594 }
12595
12597 }
12598
12601
12603 {
12605
12606 if (delta)
12608 }
12609
12611
12612 return false;
12613 }
12614
12615
12617 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12618 {
12620 }
12621
12623 {
12626 }
12627
12629 {
12632 }
12633
12636 {
12637 float value_clamped = Math.Clamp(value, 0, 1);
12639 SetQuantity(result, destroy_config, destroy_forced);
12640 }
12641
12642
12645 {
12647 }
12648
12650 {
12652 }
12653
12654
12655
12656
12657
12658
12659
12660
12661
12662
12664 {
12665 int slot = -1;
12666 if (GetInventory())
12667 {
12668 InventoryLocation il = new InventoryLocation;
12669 GetInventory().GetCurrentInventoryLocation(il);
12671 }
12672
12674 }
12675
12677 {
12678 float quantity_max = 0;
12679
12681 {
12682 if (attSlotID != -1)
12683 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12684
12685 if (quantity_max <= 0)
12687 }
12688
12689 if (quantity_max <= 0)
12691
12692 return quantity_max;
12693 }
12694
12696 {
12698 }
12699
12701 {
12703 }
12704
12705
12707 {
12709 }
12710
12712 {
12714 }
12715
12717 {
12719 }
12720
12721
12723 {
12724
12725 float weightEx = GetWeightEx();
12726 float special = GetInventoryAndCargoWeight();
12727 return weightEx - special;
12728 }
12729
12730
12732 {
12734 }
12735
12737 {
12739 {
12740 #ifdef DEVELOPER
12741 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12742 {
12743 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12745 }
12746 #endif
12747
12748 return GetQuantity() * GetConfigWeightModified();
12749 }
12750 else if (HasEnergyManager())
12751 {
12752 #ifdef DEVELOPER
12753 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12754 {
12755 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12756 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12757 }
12758 #endif
12759 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12760 }
12761 else
12762 {
12763 #ifdef DEVELOPER
12764 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12765 {
12766 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12767 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12768 }
12769 #endif
12770 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12771 }
12772 }
12773
12776 {
12777 int item_count = 0;
12779
12780 if (GetInventory().GetCargo() != NULL)
12781 {
12782 item_count = GetInventory().GetCargo().GetItemCount();
12783 }
12784
12785 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12786 {
12787 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12788 if (item)
12789 item_count += item.GetNumberOfItems();
12790 }
12791 return item_count;
12792 }
12793
12796 {
12797 float weight = 0;
12798 float wetness = 1;
12799 if (include_wetness)
12802 {
12803 weight = wetness * m_ConfigWeight;
12804 }
12806 {
12807 weight = 1;
12808 }
12809 return weight;
12810 }
12811
12812
12813
12815 {
12816 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12817 {
12818 GameInventory inv = GetInventory();
12819 array<EntityAI> items = new array<EntityAI>;
12821 for (int i = 0; i < items.Count(); i++)
12822 {
12824 if (item)
12825 {
12827 }
12828 }
12829 }
12830 }
12831
12832
12833
12834
12836 {
12837 float energy = 0;
12838 if (HasEnergyManager())
12839 {
12840 energy = GetCompEM().GetEnergy();
12841 }
12842 return energy;
12843 }
12844
12845
12847 {
12848 super.OnEnergyConsumed();
12849
12851 }
12852
12854 {
12855 super.OnEnergyAdded();
12856
12858 }
12859
12860
12862 {
12863 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12864 {
12866 {
12867 float energy_0to1 = GetCompEM().GetEnergy0To1();
12869 }
12870 }
12871 }
12872
12873
12875 {
12876 return ConfigGetFloat("heatIsolation");
12877 }
12878
12880 {
12882 }
12883
12885 {
12886 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12887 if (
GetGame().ConfigIsExisting(paramPath))
12889
12890 return 0.0;
12891 }
12892
12894 {
12895 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12896 if (
GetGame().ConfigIsExisting(paramPath))
12898
12899 return 0.0;
12900 }
12901
12902 override void SetWet(
float value,
bool allow_client =
false)
12903 {
12904 if (!IsServerCheck(allow_client))
12905 return;
12906
12909
12911
12912 m_VarWet = Math.Clamp(value, min, max);
12913
12915 {
12918 }
12919 }
12920
12921 override void AddWet(
float value)
12922 {
12924 }
12925
12927 {
12929 }
12930
12932 {
12934 }
12935
12937 {
12939 }
12940
12942 {
12944 }
12945
12947 {
12949 }
12950
12951 override void OnWetChanged(
float newVal,
float oldVal)
12952 {
12955 if (newLevel != oldLevel)
12956 {
12958 }
12959 }
12960
12962 {
12963 SetWeightDirty();
12964 }
12965
12967 {
12968 return GetWetLevelInternal(
m_VarWet);
12969 }
12970
12971
12972
12974 {
12976 }
12977
12979 {
12981 }
12982
12984 {
12986 }
12987
12989 {
12991 }
12992
12993
12994
12996 {
12997 if (ConfigIsExisting("itemModelLength"))
12998 {
12999 return ConfigGetFloat("itemModelLength");
13000 }
13001 return 0;
13002 }
13003
13005 {
13006 if (ConfigIsExisting("itemAttachOffset"))
13007 {
13008 return ConfigGetFloat("itemAttachOffset");
13009 }
13010 return 0;
13011 }
13012
13013 override void SetCleanness(
int value,
bool allow_client =
false)
13014 {
13015 if (!IsServerCheck(allow_client))
13016 return;
13017
13019
13021
13024 }
13025
13027 {
13029 }
13030
13032 {
13033 return true;
13034 }
13035
13036
13037
13038
13040 {
13042 }
13043
13045 {
13047 }
13048
13049
13050
13051
13052 override void SetColor(
int r,
int g,
int b,
int a)
13053 {
13059 }
13061 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13062 {
13067 }
13068
13070 {
13072 }
13073
13076 {
13077 int r,g,b,a;
13079 r = r/255;
13080 g = g/255;
13081 b = b/255;
13082 a = a/255;
13083 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13084 }
13085
13086
13087
13088 override void SetLiquidType(
int value,
bool allow_client =
false)
13089 {
13090 if (!IsServerCheck(allow_client))
13091 return;
13092
13097 }
13098
13100 {
13101 return ConfigGetInt("varLiquidTypeInit");
13102 }
13103
13105 {
13107 }
13108
13110 {
13112 SetFrozen(false);
13113 }
13114
13117 {
13118 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13119 }
13120
13121
13124 {
13125 PlayerBase nplayer;
13126 if (PlayerBase.CastTo(nplayer, player))
13127 {
13129
13130 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13131 }
13132 }
13133
13134
13137 {
13138 PlayerBase nplayer;
13139 if (PlayerBase.CastTo(nplayer,player))
13140 {
13141
13142 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13143
13144 }
13145
13146
13147 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13148
13149
13150 if (HasEnergyManager())
13151 {
13152 GetCompEM().UpdatePlugState();
13153 }
13154 }
13155
13156
13158 {
13159 super.OnPlacementStarted(player);
13160
13162 }
13163
13164 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13165 {
13167 {
13168 m_AdminLog.OnPlacementComplete(player,
this);
13169 }
13170
13171 super.OnPlacementComplete(player, position, orientation);
13172 }
13173
13174
13175
13176
13177
13179 {
13181 {
13182 return true;
13183 }
13184 else
13185 {
13186 return false;
13187 }
13188 }
13189
13190
13192 {
13194 {
13196 }
13197 }
13198
13199
13201 {
13203 }
13204
13206 {
13208 }
13209
13210 override void InsertAgent(
int agent,
float count = 1)
13211 {
13212 if (count < 1)
13213 return;
13214
13216 }
13217
13220 {
13222 }
13223
13224
13226 {
13228 }
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13272 {
13274 return false;
13275 return true;
13276 }
13277
13279 {
13280
13282 }
13283
13284
13287 {
13288 super.CheckForRoofLimited(timeTresholdMS);
13289
13291 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13292 {
13293 m_PreviousRoofTestTime = time;
13294 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13295 }
13296 }
13297
13298
13300 {
13302 {
13303 return 0;
13304 }
13305
13306 if (GetInventory().GetAttachmentSlotsCount() != 0)
13307 {
13308 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13309 if (filter)
13310 return filter.GetProtectionLevel(type, false, system);
13311 else
13312 return 0;
13313 }
13314
13315 string subclassPath, entryName;
13316
13317 switch (type)
13318 {
13320 entryName = "biological";
13321 break;
13323 entryName = "chemical";
13324 break;
13325 default:
13326 entryName = "biological";
13327 break;
13328 }
13329
13330 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13331
13333 }
13334
13335
13336
13339 {
13340 if (!IsMagazine())
13342
13344 }
13345
13346
13347
13348
13349
13354 {
13355 return true;
13356 }
13357
13359 {
13361 }
13362
13363
13364
13365
13366
13368 {
13369 if (parent)
13370 {
13371 if (parent.IsInherited(DayZInfected))
13372 return true;
13373
13374 if (!parent.IsRuined())
13375 return true;
13376 }
13377
13378 return true;
13379 }
13380
13382 {
13383 if (!super.CanPutAsAttachment(parent))
13384 {
13385 return false;
13386 }
13387
13388 if (!IsRuined() && !parent.IsRuined())
13389 {
13390 return true;
13391 }
13392
13393 return false;
13394 }
13395
13397 {
13398
13399
13400
13401
13402 return super.CanReceiveItemIntoCargo(item);
13403 }
13404
13406 {
13407
13408
13409
13410
13411 GameInventory attachmentInv = attachment.GetInventory();
13413 {
13414 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13415 return false;
13416 }
13417
13418 InventoryLocation loc = new InventoryLocation();
13419 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13420 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13421 return false;
13422
13423 return super.CanReceiveAttachment(attachment, slotId);
13424 }
13425
13427 {
13428 if (!super.CanReleaseAttachment(attachment))
13429 return false;
13430
13431 return GetInventory().AreChildrenAccessible();
13432 }
13433
13434
13435
13436
13437
13438
13439
13440
13441
13442
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13455 {
13456 int id = muzzle_owner.GetMuzzleID();
13457 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13458
13459 if (WPOF_array)
13460 {
13461 for (int i = 0; i < WPOF_array.Count(); i++)
13462 {
13463 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13464
13465 if (WPOF)
13466 {
13467 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13468 }
13469 }
13470 }
13471 }
13472
13473
13475 {
13476 int id = muzzle_owner.GetMuzzleID();
13478
13479 if (WPOBE_array)
13480 {
13481 for (int i = 0; i < WPOBE_array.Count(); i++)
13482 {
13483 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13484
13485 if (WPOBE)
13486 {
13487 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13488 }
13489 }
13490 }
13491 }
13492
13493
13495 {
13496 int id = muzzle_owner.GetMuzzleID();
13497 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13498
13499 if (WPOOH_array)
13500 {
13501 for (int i = 0; i < WPOOH_array.Count(); i++)
13502 {
13503 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13504
13505 if (WPOOH)
13506 {
13507 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13508 }
13509 }
13510 }
13511 }
13512
13513
13515 {
13516 int id = muzzle_owner.GetMuzzleID();
13517 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13518
13519 if (WPOOH_array)
13520 {
13521 for (int i = 0; i < WPOOH_array.Count(); i++)
13522 {
13523 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13524
13525 if (WPOOH)
13526 {
13527 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13528 }
13529 }
13530 }
13531 }
13532
13533
13535 {
13536 int id = muzzle_owner.GetMuzzleID();
13537 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13538
13539 if (WPOOH_array)
13540 {
13541 for (int i = 0; i < WPOOH_array.Count(); i++)
13542 {
13543 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13544
13545 if (WPOOH)
13546 {
13547 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13548 }
13549 }
13550 }
13551 }
13552
13553
13554
13556 {
13558 {
13559 return true;
13560 }
13561
13562 return false;
13563 }
13564
13566 {
13568 {
13569 return true;
13570 }
13571
13572 return false;
13573 }
13574
13576 {
13578 {
13579 return true;
13580 }
13581
13582 return false;
13583 }
13584
13586 {
13587 return false;
13588 }
13589
13592 {
13593 return UATimeSpent.DEFAULT_DEPLOY;
13594 }
13595
13596
13597
13598
13600 {
13602 SetSynchDirty();
13603 }
13604
13606 {
13608 }
13609
13610
13612 {
13613 return false;
13614 }
13615
13618 {
13619 string att_type = "None";
13620
13621 if (ConfigIsExisting("soundAttType"))
13622 {
13623 att_type = ConfigGetString("soundAttType");
13624 }
13625
13627 }
13628
13630 {
13632 }
13633
13634
13635
13636
13637
13641
13643 {
13646
13648 }
13649
13650
13652 {
13654 return;
13655
13657
13660
13663
13664 SoundParameters params = new SoundParameters();
13668 }
13669
13670
13672 {
13674 return;
13675
13677 SetSynchDirty();
13678
13681 }
13682
13683
13685 {
13687 return;
13688
13690 SetSynchDirty();
13691
13694 }
13695
13697 {
13699 }
13700
13702 {
13704 }
13705
13708 {
13709 if (!
GetGame().IsDedicatedServer())
13710 {
13711 if (ConfigIsExisting("attachSoundSet"))
13712 {
13713 string cfg_path = "";
13714 string soundset = "";
13715 string type_name =
GetType();
13716
13719 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13720 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13721
13722 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13723 {
13724 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13725 {
13726 if (cfg_slot_array[i] == slot_type)
13727 {
13728 soundset = cfg_soundset_array[i];
13729 break;
13730 }
13731 }
13732 }
13733
13734 if (soundset != "")
13735 {
13736 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13738 }
13739 }
13740 }
13741 }
13742
13744 {
13745
13746 }
13747
13748 void OnApply(PlayerBase player);
13749
13751 {
13752 return 1.0;
13753 };
13754
13756 {
13758 }
13759
13761 {
13763 }
13764
13766
13768 {
13769 SetDynamicPhysicsLifeTime(0.01);
13771 }
13772
13774 {
13775 array<string> zone_names = new array<string>;
13776 GetDamageZones(zone_names);
13777 for (int i = 0; i < zone_names.Count(); i++)
13778 {
13779 SetHealthMax(zone_names.Get(i),"Health");
13780 }
13781 SetHealthMax("","Health");
13782 }
13783
13786 {
13787 float global_health = GetHealth01("","Health");
13788 array<string> zones = new array<string>;
13789 GetDamageZones(zones);
13790
13791 for (int i = 0; i < zones.Count(); i++)
13792 {
13793 SetHealth01(zones.Get(i),"Health",global_health);
13794 }
13795 }
13796
13799 {
13800 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13801 }
13802
13804 {
13805 if (!hasRootAsPlayer)
13806 {
13807 if (refParentIB)
13808 {
13809
13810 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13811 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13812
13813 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13814 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13815
13818 }
13819 else
13820 {
13821
13824 }
13825 }
13826 }
13827
13829 {
13831 {
13832 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13833 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13834 {
13835 float heatPermCoef = 1.0;
13837 while (ent)
13838 {
13839 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13840 ent = ent.GetHierarchyParent();
13841 }
13842
13843 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13844 }
13845 }
13846 }
13847
13849 {
13850
13851 EntityAI parent = GetHierarchyParent();
13852 if (!parent)
13853 {
13854 hasParent = false;
13855 hasRootAsPlayer = false;
13856 }
13857 else
13858 {
13859 hasParent = true;
13860 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13861 refParentIB =
ItemBase.Cast(parent);
13862 }
13863 }
13864
13865 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13866 {
13867
13868 }
13869
13871 {
13872
13873 return false;
13874 }
13875
13877 {
13878
13879
13880 return false;
13881 }
13882
13884 {
13885
13886 return false;
13887 }
13888
13891 {
13892 return !GetIsFrozen() &&
IsOpen();
13893 }
13894
13896 {
13897 bool hasParent = false, hasRootAsPlayer = false;
13899
13900 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13901 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13902
13903 if (wwtu || foodDecay)
13904 {
13908
13909 if (processWetness || processTemperature || processDecay)
13910 {
13912
13913 if (processWetness)
13914 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13915
13916 if (processTemperature)
13918
13919 if (processDecay)
13920 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13921 }
13922 }
13923 }
13924
13927 {
13929 }
13930
13932 {
13935
13936 return super.GetTemperatureFreezeThreshold();
13937 }
13938
13940 {
13943
13944 return super.GetTemperatureThawThreshold();
13945 }
13946
13948 {
13951
13952 return super.GetItemOverheatThreshold();
13953 }
13954
13956 {
13958 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13959
13960 return super.GetTemperatureFreezeTime();
13961 }
13962
13964 {
13966 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13967
13968 return super.GetTemperatureThawTime();
13969 }
13970
13975
13977 {
13978 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13979 }
13980
13982 {
13983 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13984 }
13985
13988 {
13990 }
13991
13993 {
13995 }
13996
13998 {
14000 }
14001
14004 {
14005 return null;
14006 }
14007
14010 {
14011 return false;
14012 }
14013
14015 {
14017 {
14020 if (!trg)
14021 {
14023 explosive = this;
14024 }
14025
14026 explosive.PairRemote(trg);
14028
14029 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14030 trg.SetPersistentPairID(persistentID);
14031 explosive.SetPersistentPairID(persistentID);
14032
14033 return true;
14034 }
14035 return false;
14036 }
14037
14040 {
14041 float ret = 1.0;
14044 ret *= GetHealth01();
14045
14046 return ret;
14047 }
14048
14049 #ifdef DEVELOPER
14050 override void SetDebugItem()
14051 {
14052 super.SetDebugItem();
14053 _itemBase = this;
14054 }
14055
14057 {
14058 string text = super.GetDebugText();
14059
14061 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14062
14063 return text;
14064 }
14065 #endif
14066
14068 {
14069 return true;
14070 }
14071
14073
14075
14077 {
14080 }
14081
14082
14090
14106}
14107
14109{
14111 if (entity)
14112 {
14113 bool is_item = entity.IsInherited(
ItemBase);
14114 if (is_item && full_quantity)
14115 {
14118 }
14119 }
14120 else
14121 {
14123 return NULL;
14124 }
14125 return entity;
14126}
14127
14129{
14130 if (item)
14131 {
14132 if (health > 0)
14133 item.SetHealth("", "", health);
14134
14135 if (item.CanHaveTemperature())
14136 {
14138 if (item.CanFreeze())
14139 item.SetFrozen(false);
14140 }
14141
14142 if (item.HasEnergyManager())
14143 {
14144 if (quantity >= 0)
14145 {
14146 item.GetCompEM().SetEnergy0To1(quantity);
14147 }
14148 else
14149 {
14151 }
14152 }
14153 else if (item.IsMagazine())
14154 {
14155 Magazine mag = Magazine.Cast(item);
14156 if (quantity >= 0)
14157 {
14158 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14159 }
14160 else
14161 {
14163 }
14164
14165 }
14166 else
14167 {
14168 if (quantity >= 0)
14169 {
14170 item.SetQuantityNormalized(quantity, false);
14171 }
14172 else
14173 {
14175 }
14176
14177 }
14178 }
14179}
14180
14181#ifdef DEVELOPER
14183#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.