9363{
9365 {
9366 return true;
9367 }
9368};
9369
9371{
9372
9373};
9374
9375
9376
9378{
9382
9384
9387
9388
9389
9390
9391
9400
9406
9411
9416
9437 protected bool m_IsResultOfSplit
9438
9440
9445
9446
9447
9449
9453
9454
9455
9457
9460
9461
9462
9468
9469
9477
9480
9481
9483
9484
9486
9487
9492
9493
9498
9500
9501
9503
9504
9506 {
9511
9512 if (!
g_Game.IsDedicatedServer())
9513 {
9515 {
9517
9519 {
9521 }
9522 }
9523
9526 }
9527
9528 m_OldLocation = null;
9529
9531 {
9533 }
9534
9535 if (ConfigIsExisting("headSelectionsToHide"))
9536 {
9539 }
9540
9542 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9543 {
9545 }
9546
9548
9549 m_IsResultOfSplit = false;
9550
9552 }
9553
9555 {
9556 super.InitItemVariables();
9557
9563 m_Count = ConfigGetInt(
"count");
9564
9567
9572
9575
9580
9592
9596
9597
9600 if (ConfigIsExisting("canBeSplit"))
9601 {
9604 }
9605
9607 if (ConfigIsExisting("itemBehaviour"))
9609
9610
9613 RegisterNetSyncVariableInt("m_VarLiquidType");
9614 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9615
9616 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9617 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9618 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9619
9620 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9621 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9622 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9623 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9624
9625 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9626 RegisterNetSyncVariableBool("m_IsTakeable");
9627 RegisterNetSyncVariableBool("m_IsHologram");
9628
9631 {
9634 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9635 }
9636
9638
9640 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9642
9644 }
9645
9647 {
9649 }
9650
9652 {
9655 {
9660 }
9661 }
9662
9663 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9664 {
9666 {
9669 }
9670
9672 }
9673
9675 {
9681 }
9682
9684
9686 {
9688
9689 if (!action)
9690 {
9691 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9692 return;
9693 }
9694
9696 if (!ai)
9697 {
9699 return;
9700 }
9701
9703 if (!action_array)
9704 {
9705 action_array = new array<ActionBase_Basic>;
9707 }
9708 if (LogManager.IsActionLogEnable())
9709 {
9710 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9711 }
9712
9713 if (action_array.Find(action) != -1)
9714 {
9715 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9716 }
9717 else
9718 {
9719 action_array.Insert(action);
9720 }
9721 }
9722
9724 {
9725 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9726 ActionBase action = player.GetActionManager().GetAction(actionName);
9729
9730 if (action_array)
9731 {
9732 action_array.RemoveItem(action);
9733 }
9734 }
9735
9736
9737
9739 {
9740 ActionOverrideData overrideData = new ActionOverrideData();
9744
9746 if (!actionMap)
9747 {
9750 }
9751
9752 actionMap.Insert(this.
Type(), overrideData);
9753
9754 }
9755
9757
9759
9760
9762 {
9765
9768
9769 string config_to_search = "CfgVehicles";
9770 string muzzle_owner_config;
9771
9773 {
9774 if (IsInherited(Weapon))
9775 config_to_search = "CfgWeapons";
9776
9777 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9778
9779 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9780
9781 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9782
9783 if (config_OnFire_subclass_count > 0)
9784 {
9785 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9786
9787 for (int i = 0; i < config_OnFire_subclass_count; i++)
9788 {
9789 string particle_class = "";
9790 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9791 string config_OnFire_entry = config_OnFire_class + particle_class;
9792 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9793 WPOF_array.Insert(WPOF);
9794 }
9795
9796
9798 }
9799 }
9800
9802 {
9803 config_to_search = "CfgWeapons";
9804 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9805
9806 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9807
9808 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9809
9810 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9811 {
9812 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9813
9814 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9815 {
9816 string particle_class2 = "";
9817 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9818 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9819 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9820 WPOBE_array.Insert(WPOBE);
9821 }
9822
9823
9825 }
9826 }
9827 }
9828
9829
9831 {
9834
9836 {
9837 string config_to_search = "CfgVehicles";
9838
9839 if (IsInherited(Weapon))
9840 config_to_search = "CfgWeapons";
9841
9842 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9843 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9844
9845 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9846 {
9847
9849
9851 {
9853 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9855 return;
9856 }
9857
9860
9861
9862
9863 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9864 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9865
9866 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9867 {
9868 string particle_class = "";
9869 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9870 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9871 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9872
9873 if (entry_type == CT_CLASS)
9874 {
9875 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9876 WPOOH_array.Insert(WPOF);
9877 }
9878 }
9879
9880
9882 }
9883 }
9884 }
9885
9887 {
9889 }
9890
9892 {
9894 {
9896
9899
9902
9903 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9904 }
9905 }
9906
9908 {
9910 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9911
9913 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9914
9916 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9917
9919 {
9921 }
9922 }
9923
9925 {
9927 }
9928
9930 {
9933 else
9935
9937 {
9940 }
9941 else
9942 {
9945
9948 }
9949
9951 }
9952
9954 {
9956 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9957 }
9958
9960 {
9962 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9964 }
9965
9967 {
9969 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9970 }
9971
9973 {
9976
9977 OverheatingParticle OP = new OverheatingParticle();
9982
9984 }
9985
9987 {
9990
9991 return -1;
9992 }
9993
9995 {
9997 {
10000
10001 for (int i = count; i > 0; --i)
10002 {
10003 int id = i - 1;
10006
10009
10010 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
10011 {
10012 if (p)
10013 {
10016 }
10017 }
10018 }
10019 }
10020 }
10021
10023 {
10025 {
10027 {
10028 int id = i - 1;
10030
10031 if (OP)
10032 {
10034
10035 if (p)
10036 {
10038 }
10039
10040 delete OP;
10041 }
10042 }
10043
10046 }
10047 }
10048
10051 {
10052 return 0.0;
10053 }
10054
10055
10057 {
10058 return 250;
10059 }
10060
10062 {
10063 return 0;
10064 }
10065
10068 {
10070 return true;
10071
10072 return false;
10073 }
10074
10077 {
10080
10082 {
10084 }
10085 else
10086 {
10087
10089 }
10090
10092 }
10093
10100 {
10101 return -1;
10102 }
10103
10104
10105
10106
10108 {
10110 {
10111 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10112 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10113
10114 if (r_index >= 0)
10115 {
10116 InventoryLocation r_il = new InventoryLocation;
10117 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10118
10119 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10122 {
10123 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10124 }
10126 {
10127 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10128 }
10129
10130 }
10131
10132 player.GetHumanInventory().ClearUserReservedLocation(this);
10133 }
10134
10137 }
10138
10139
10140
10141
10143 {
10144 return ItemBase.m_DebugActionsMask;
10145 }
10146
10148 {
10149 return ItemBase.m_DebugActionsMask & mask;
10150 }
10151
10153 {
10154 ItemBase.m_DebugActionsMask = mask;
10155 }
10156
10158 {
10159 ItemBase.m_DebugActionsMask |= mask;
10160 }
10161
10163 {
10164 ItemBase.m_DebugActionsMask &= ~mask;
10165 }
10166
10168 {
10170 {
10172 }
10173 else
10174 {
10176 }
10177 }
10178
10179
10181 {
10182 if (GetEconomyProfile())
10183 {
10184 float q_max = GetEconomyProfile().GetQuantityMax();
10185 if (q_max > 0)
10186 {
10187 float q_min = GetEconomyProfile().GetQuantityMin();
10188 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10189
10191 {
10192 ComponentEnergyManager comp = GetCompEM();
10194 {
10196 }
10197 }
10199 {
10201
10202 }
10203
10204 }
10205 }
10206 }
10207
10210 {
10211 EntityAI parent = GetHierarchyParent();
10212
10213 if (parent)
10214 {
10215 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10216 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10217 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10218 }
10219 }
10220
10223 {
10224 EntityAI parent = GetHierarchyParent();
10225
10226 if (parent)
10227 {
10228 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10229 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10230 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10231 }
10232 }
10233
10235 {
10236
10237
10238
10239
10241
10243 {
10244 if (ScriptInputUserData.CanStoreInputUserData())
10245 {
10246 ScriptInputUserData ctx = new ScriptInputUserData;
10252 ctx.
Write(use_stack_max);
10255
10257 {
10258 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10259 }
10260 }
10261 }
10262 else if (!
g_Game.IsMultiplayer())
10263 {
10265 }
10266 }
10267
10269 {
10271 }
10272
10274 {
10276 }
10277
10279 {
10281 }
10282
10284 {
10285
10286 return false;
10287 }
10288
10290 {
10291 return false;
10292 }
10293
10297 {
10298 return false;
10299 }
10300
10302 {
10303 return "";
10304 }
10305
10307
10309 {
10310 return false;
10311 }
10312
10314 {
10315 return true;
10316 }
10317
10318
10319
10321 {
10322 return true;
10323 }
10324
10326 {
10327 return true;
10328 }
10329
10331 {
10332 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10334 }
10335
10337 {
10339 }
10340
10342 {
10344 if (!is_being_placed)
10346 SetSynchDirty();
10347 }
10348
10349
10351
10353 {
10355 }
10356
10358 {
10360 }
10361
10363 {
10364 return 1;
10365 }
10366
10368 {
10369 return false;
10370 }
10371
10373 {
10375 SetSynchDirty();
10376 }
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402
10403
10404
10405
10406
10407
10408
10409
10410
10411
10413 {
10414 super.OnMovedInsideCargo(container);
10415
10416 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10417 }
10418
10419 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10420 {
10421 super.EEItemLocationChanged(oldLoc, newLoc);
10422
10423 PlayerBase newPlayer = null;
10424 PlayerBase oldPlayer = null;
10425
10426 if (newLoc.GetParent())
10427 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10428
10429 if (oldLoc.GetParent())
10430 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10431
10433 {
10434 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10435
10436 if (rIndex >= 0)
10437 {
10438 InventoryLocation rIl = new InventoryLocation;
10439 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10440
10441 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10444 {
10445 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10446 }
10448 {
10450 }
10451
10452 }
10453 }
10454
10456 {
10457 if (newPlayer)
10458 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10459
10460 if (newPlayer == oldPlayer)
10461 {
10462 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10463 {
10465 {
10466 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10467 {
10468 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10469 }
10470 }
10471 else
10472 {
10473 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10474 }
10475 }
10476
10477 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10478 {
10479 int type = oldLoc.GetType();
10481 {
10482 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10483 }
10485 {
10486 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10487 }
10488 }
10489 if (!m_OldLocation)
10490 {
10491 m_OldLocation = new InventoryLocation;
10492 }
10493 m_OldLocation.Copy(oldLoc);
10494 }
10495 else
10496 {
10497 if (m_OldLocation)
10498 {
10499 m_OldLocation.Reset();
10500 }
10501 }
10502
10503 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10504 }
10505 else
10506 {
10507 if (newPlayer)
10508 {
10509 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10510 if (resIndex >= 0)
10511 {
10512 InventoryLocation il = new InventoryLocation;
10513 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10515 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10518 {
10519 il.
GetParent().GetOnReleaseLock().Invoke(it);
10520 }
10522 {
10524 }
10525
10526 }
10527 }
10529 {
10530
10532 }
10533
10534 if (m_OldLocation)
10535 {
10536 m_OldLocation.Reset();
10537 }
10538 }
10539
10541 {
10542 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10543 }
10544
10546 {
10547 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10548 }
10549 }
10550
10551 override void EOnContact(IEntity other, Contact extra)
10552 {
10554 {
10555 int liquidType = -1;
10557 if (impactSpeed > 0.0)
10558 {
10560 #ifndef SERVER
10562 #else
10564 SetSynchDirty();
10565 #endif
10567 }
10568 }
10569
10570 #ifdef SERVER
10571 if (GetCompEM() && GetCompEM().IsPlugged())
10572 {
10573 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10574 GetCompEM().UnplugThis();
10575 }
10576 #endif
10577 }
10578
10580
10582 {
10584 }
10585
10587 {
10588
10589 }
10590
10592 {
10593 super.OnItemLocationChanged(old_owner, new_owner);
10594
10595 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10596 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10597
10598 if (!relatedPlayer && playerNew)
10599 relatedPlayer = playerNew;
10600
10601 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10602 {
10604 if (actionMgr)
10605 {
10606 ActionBase currentAction = actionMgr.GetRunningAction();
10607 if (currentAction)
10609 }
10610 }
10611
10612 Man ownerPlayerOld = null;
10613 Man ownerPlayerNew = null;
10614
10615 if (old_owner)
10616 {
10617 if (old_owner.
IsMan())
10618 {
10619 ownerPlayerOld = Man.Cast(old_owner);
10620 }
10621 else
10622 {
10623 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10624 }
10625 }
10626 else
10627 {
10629 {
10631
10632 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10633 {
10634 GetCompEM().UnplugThis();
10635 }
10636 }
10637 }
10638
10639 if (new_owner)
10640 {
10641 if (new_owner.
IsMan())
10642 {
10643 ownerPlayerNew = Man.Cast(new_owner);
10644 }
10645 else
10646 {
10647 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10648 }
10649 }
10650
10651 if (ownerPlayerOld != ownerPlayerNew)
10652 {
10653 if (ownerPlayerOld)
10654 {
10655 array<EntityAI> subItemsExit = new array<EntityAI>;
10657 for (int i = 0; i < subItemsExit.Count(); i++)
10658 {
10661 }
10662 }
10663
10664 if (ownerPlayerNew)
10665 {
10666 array<EntityAI> subItemsEnter = new array<EntityAI>;
10668 for (int j = 0; j < subItemsEnter.Count(); j++)
10669 {
10672 }
10673 }
10674 }
10675 else if (ownerPlayerNew != null)
10676 {
10677 PlayerBase nplayer;
10678 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10679 {
10680 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10682 for (int k = 0; k < subItemsUpdate.Count(); k++)
10683 {
10685 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10686 }
10687 }
10688 }
10689
10690 if (old_owner)
10691 old_owner.OnChildItemRemoved(this);
10692 if (new_owner)
10693 new_owner.OnChildItemReceived(this);
10694 }
10695
10696
10698 {
10699 super.EEDelete(parent);
10700 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10701 if (player)
10702 {
10704
10705 if (player.IsAlive())
10706 {
10707 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10708 if (r_index >= 0)
10709 {
10710 InventoryLocation r_il = new InventoryLocation;
10711 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10712
10713 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10716 {
10717 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10718 }
10720 {
10721 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10722 }
10723
10724 }
10725
10726 player.RemoveQuickBarEntityShortcut(this);
10727 }
10728 }
10729 }
10730
10732 {
10733 super.EEKilled(killer);
10734
10737 {
10738 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10739 {
10740 if (IsMagazine())
10741 {
10742 if (Magazine.Cast(this).GetAmmoCount() > 0)
10743 {
10745 }
10746 }
10747 else
10748 {
10750 }
10751 }
10752 }
10753 }
10754
10756 {
10757 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10758
10759 super.OnWasAttached(parent, slot_id);
10760
10763
10766 }
10767
10769 {
10770 super.OnWasDetached(parent, slot_id);
10771
10774
10777 }
10778
10780 {
10781 int idx;
10784
10785 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10786 if (inventory_slots.Count() < 1)
10787 {
10788 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10789 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10790 }
10791 else
10792 {
10793 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10794 }
10795
10796 idx = inventory_slots.Find(slot);
10797 if (idx < 0)
10798 return "";
10799
10800 return attach_types.Get(idx);
10801 }
10802
10804 {
10805 int idx = -1;
10806 string slot;
10807
10810
10811 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10812 if (inventory_slots.Count() < 1)
10813 {
10814 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10815 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10816 }
10817 else
10818 {
10819 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10820 if (detach_types.Count() < 1)
10821 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10822 }
10823
10824 for (int i = 0; i < inventory_slots.Count(); i++)
10825 {
10826 slot = inventory_slots.Get(i);
10827 }
10828
10829 if (slot != "")
10830 {
10831 if (detach_types.Count() == 1)
10832 idx = 0;
10833 else
10834 idx = inventory_slots.Find(slot);
10835 }
10836 if (idx < 0)
10837 return "";
10838
10839 return detach_types.Get(idx);
10840 }
10841
10843 {
10844
10846
10847
10848 float min_time = 1;
10849 float max_time = 3;
10850 float delay = Math.RandomFloat(min_time, max_time);
10851
10852 explode_timer.Run(delay, this, "DoAmmoExplosion");
10853 }
10854
10856 {
10857 Magazine magazine = Magazine.Cast(this);
10858 int pop_sounds_count = 6;
10859 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10860
10861
10862 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10863 string sound_name = pop_sounds[ sound_idx ];
10864 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10865
10866
10867 magazine.ServerAddAmmoCount(-1);
10868
10869
10870 float min_temp_to_explode = 100;
10871
10872 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10873 {
10875 }
10876 }
10877
10878
10879 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10880 {
10881 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10882
10883 const int CHANCE_DAMAGE_CARGO = 4;
10884 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10885 const int CHANCE_DAMAGE_NOTHING = 2;
10886
10888 {
10889 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10890 int chances;
10891 int rnd;
10892
10893 if (GetInventory().GetCargo())
10894 {
10895 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10896 rnd = Math.RandomInt(0,chances);
10897
10898 if (rnd < CHANCE_DAMAGE_CARGO)
10899 {
10901 }
10902 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10903 {
10905 }
10906 }
10907 else
10908 {
10909 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10910 rnd = Math.RandomInt(0,chances);
10911
10912 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10913 {
10915 }
10916 }
10917 }
10918 }
10919
10921 {
10922 CargoBase cargo = GetInventory().GetCargo();
10923 if (cargo)
10924 {
10926 if (item_count > 0)
10927 {
10928 int random_pick = Math.RandomInt(0, item_count);
10930 if (!item.IsExplosive())
10931 {
10932 item.AddHealth("","",damage);
10933 return true;
10934 }
10935 }
10936 }
10937 return false;
10938 }
10939
10941 {
10942 GameInventory inventory = GetInventory();
10944 if (attachment_count > 0)
10945 {
10946 int random_pick = Math.RandomInt(0, attachment_count);
10948 if (!attachment.IsExplosive())
10949 {
10950 attachment.AddHealth("","",damage);
10951 return true;
10952 }
10953 }
10954 return false;
10955 }
10956
10958 {
10960 }
10961
10963 {
10965 return GetInventory().CanRemoveEntity();
10966
10967 return false;
10968 }
10969
10971 {
10972
10974 return false;
10975
10976
10978 return false;
10979
10980
10981
10983 if (delta == 0)
10984 return false;
10985
10986
10987 return true;
10988 }
10989
10991 {
10993 {
10994 if (ScriptInputUserData.CanStoreInputUserData())
10995 {
10996 ScriptInputUserData ctx = new ScriptInputUserData;
11001 ctx.
Write(destination_entity);
11003 ctx.
Write(slot_id);
11005 }
11006 }
11007 else if (!
g_Game.IsMultiplayer())
11008 {
11010 }
11011 }
11012
11014 {
11015 float split_quantity_new;
11019 InventoryLocation loc = new InventoryLocation;
11020
11021 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11022 {
11024 split_quantity_new = stack_max;
11025 else
11027
11029 {
11030 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11031 if (new_item)
11032 {
11033 new_item.SetResultOfSplit(true);
11034 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11036 new_item.
SetQuantity(split_quantity_new,
false,
true);
11037 }
11038 }
11039 }
11040 else if (destination_entity && slot_id == -1)
11041 {
11042 if (quantity > stack_max)
11043 split_quantity_new = stack_max;
11044 else
11045 split_quantity_new = quantity;
11046
11048 {
11049 GameInventory destinationInventory = destination_entity.GetInventory();
11051 {
11054 }
11055
11056 if (new_item)
11057 {
11058 new_item.SetResultOfSplit(true);
11059 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11061 new_item.
SetQuantity(split_quantity_new,
false,
true);
11062 }
11063 }
11064 }
11065 else
11066 {
11067 if (stack_max != 0)
11068 {
11070 {
11072 }
11073
11074 if (split_quantity_new == 0)
11075 {
11076 if (!
g_Game.IsMultiplayer())
11077 player.PhysicalPredictiveDropItem(this);
11078 else
11079 player.ServerDropEntity(this);
11080 return;
11081 }
11082
11084 {
11086
11087 if (new_item)
11088 {
11089 new_item.SetResultOfSplit(true);
11090 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11093 new_item.PlaceOnSurface();
11094 }
11095 }
11096 }
11097 }
11098 }
11099
11101 {
11102 float split_quantity_new;
11106 InventoryLocation loc = new InventoryLocation;
11107
11108 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11109 {
11111 split_quantity_new = stack_max;
11112 else
11114
11116 {
11117 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11118 if (new_item)
11119 {
11120 new_item.SetResultOfSplit(true);
11121 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11123 new_item.
SetQuantity(split_quantity_new,
false,
true);
11124 }
11125 }
11126 }
11127 else if (destination_entity && slot_id == -1)
11128 {
11129 if (quantity > stack_max)
11130 split_quantity_new = stack_max;
11131 else
11132 split_quantity_new = quantity;
11133
11135 {
11136 GameInventory destinationInventory = destination_entity.GetInventory();
11138 {
11141 }
11142
11143 if (new_item)
11144 {
11145 new_item.SetResultOfSplit(true);
11146 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11148 new_item.
SetQuantity(split_quantity_new,
false,
true);
11149 }
11150 }
11151 }
11152 else
11153 {
11154 if (stack_max != 0)
11155 {
11157 {
11159 }
11160
11162 {
11164
11165 if (new_item)
11166 {
11167 new_item.SetResultOfSplit(true);
11168 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11171 new_item.PlaceOnSurface();
11172 }
11173 }
11174 }
11175 }
11176 }
11177
11179 {
11181 {
11182 if (ScriptInputUserData.CanStoreInputUserData())
11183 {
11184 ScriptInputUserData ctx = new ScriptInputUserData;
11189 dst.WriteToContext(ctx);
11191 }
11192 }
11193 else if (!
g_Game.IsMultiplayer())
11194 {
11196 }
11197 }
11198
11200 {
11202 {
11203 if (ScriptInputUserData.CanStoreInputUserData())
11204 {
11205 ScriptInputUserData ctx = new ScriptInputUserData;
11210 ctx.
Write(destination_entity);
11216 }
11217 }
11218 else if (!
g_Game.IsMultiplayer())
11219 {
11221 }
11222 }
11223
11225 {
11227 }
11228
11230 {
11232 float split_quantity_new;
11234 if (dst.IsValid())
11235 {
11236 int slot_id = dst.GetSlot();
11238
11239 if (quantity > stack_max)
11240 split_quantity_new = stack_max;
11241 else
11242 split_quantity_new = quantity;
11243
11245 {
11247
11248 if (new_item)
11249 {
11250 new_item.SetResultOfSplit(true);
11251 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11253 new_item.
SetQuantity(split_quantity_new,
false,
true);
11254 }
11255
11256 return new_item;
11257 }
11258 }
11259
11260 return null;
11261 }
11262
11264 {
11266 float split_quantity_new;
11268 if (destination_entity)
11269 {
11271 if (quantity > stackable)
11272 split_quantity_new = stackable;
11273 else
11274 split_quantity_new = quantity;
11275
11277 {
11278 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11279 if (new_item)
11280 {
11281 new_item.SetResultOfSplit(true);
11282 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11284 new_item.
SetQuantity(split_quantity_new,
false,
true);
11285 }
11286 }
11287 }
11288 }
11289
11291 {
11293 {
11294 if (ScriptInputUserData.CanStoreInputUserData())
11295 {
11296 ScriptInputUserData ctx = new ScriptInputUserData;
11301 ItemBase destination_entity =
this;
11302 ctx.
Write(destination_entity);
11306 }
11307 }
11308 else if (!
g_Game.IsMultiplayer())
11309 {
11311 }
11312 }
11313
11315 {
11317 float split_quantity_new;
11319 if (player)
11320 {
11322 if (quantity > stackable)
11323 split_quantity_new = stackable;
11324 else
11325 split_quantity_new = quantity;
11326
11328 {
11329 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11330 new_item =
ItemBase.Cast(in_hands);
11331 if (new_item)
11332 {
11333 new_item.SetResultOfSplit(true);
11334 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11336 new_item.SetQuantity(split_quantity_new, false, true);
11337 }
11338 }
11339 }
11340 }
11341
11343 {
11345 float split_quantity_new = Math.Floor(quantity * 0.5);
11346
11348 return;
11349
11351
11352 if (new_item)
11353 {
11354 if (new_item.GetQuantityMax() < split_quantity_new)
11355 {
11356 split_quantity_new = new_item.GetQuantityMax();
11357 }
11358
11359 new_item.SetResultOfSplit(true);
11360 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11361
11363 {
11366 }
11367 else
11368 {
11370 new_item.
SetQuantity(split_quantity_new,
false,
true);
11371 }
11372 }
11373 }
11374
11376 {
11378 float split_quantity_new = Math.Floor(quantity / 2);
11379
11381 return;
11382
11383 InventoryLocation invloc = new InventoryLocation;
11385
11387 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11388
11389 if (new_item)
11390 {
11391 if (new_item.GetQuantityMax() < split_quantity_new)
11392 {
11393 split_quantity_new = new_item.GetQuantityMax();
11394 }
11396 {
11399 }
11400 else if (split_quantity_new > 1)
11401 {
11403 new_item.
SetQuantity(split_quantity_new,
false,
true);
11404 }
11405 }
11406 }
11407
11410 {
11411 SetWeightDirty();
11413
11414 if (parent)
11415 parent.OnAttachmentQuantityChangedEx(this, delta);
11416
11418 {
11420 {
11422 }
11424 {
11425 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11427 }
11428 }
11429 }
11430
11433 {
11434
11435 }
11436
11439 {
11441 }
11442
11444 {
11445 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11446
11448 {
11449 if (newLevel == GameConstants.STATE_RUINED)
11450 {
11452 EntityAI parent = GetHierarchyParent();
11453 if (parent && parent.IsFireplace())
11454 {
11455 CargoBase cargo = GetInventory().GetCargo();
11456 if (cargo)
11457 {
11459 {
11461 }
11462 }
11463 }
11464 }
11465
11467 {
11468
11470 return;
11471 }
11472
11473 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11474 {
11476 }
11477 }
11478 }
11479
11480
11482 {
11483 super.OnRightClick();
11484
11486 {
11488 {
11489 if (ScriptInputUserData.CanStoreInputUserData())
11490 {
11491 EntityAI root = GetHierarchyRoot();
11492 Man playerOwner = GetHierarchyRootPlayer();
11493 InventoryLocation dst = new InventoryLocation;
11494
11495
11496 if (!playerOwner && root && root == this)
11497 {
11499 }
11500 else
11501 {
11502
11503 GetInventory().GetCurrentInventoryLocation(dst);
11505 {
11506 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11508 {
11510 }
11511 else
11512 {
11514
11515
11516 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11517 {
11519 }
11520 else
11521 {
11522 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11523 }
11524 }
11525 }
11526 }
11527
11528 ScriptInputUserData ctx = new ScriptInputUserData;
11536 }
11537 }
11538 else if (!
g_Game.IsMultiplayer())
11539 {
11541 }
11542 }
11543 }
11544
11546 {
11547 if (root)
11548 {
11549 vector m4[4];
11550 root.GetTransform(m4);
11551 dst.SetGround(this, m4);
11552 }
11553 else
11554 {
11555 GetInventory().GetCurrentInventoryLocation(dst);
11556 }
11557 }
11558
11559 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11560 {
11561
11562 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11563 return false;
11564
11565 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11566 return false;
11567
11568
11570 return false;
11571
11572
11573 Magazine mag = Magazine.Cast(this);
11574 if (mag)
11575 {
11576 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11577 return false;
11578
11579 if (stack_max_limit)
11580 {
11581 Magazine other_mag = Magazine.Cast(other_item);
11582 if (other_item)
11583 {
11584 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11585 return false;
11586 }
11587
11588 }
11589 }
11590 else
11591 {
11592
11594 return false;
11595
11597 return false;
11598 }
11599
11600 PlayerBase player = null;
11601 if (CastTo(player, GetHierarchyRootPlayer()))
11602 {
11603 if (player.GetInventory().HasAttachment(this))
11604 return false;
11605
11606 if (player.IsItemsToDelete())
11607 return false;
11608 }
11609
11610 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11611 return false;
11612
11613 int slotID;
11615 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11616 return false;
11617
11618 return true;
11619 }
11620
11622 {
11624 }
11625
11627 {
11628 return m_IsResultOfSplit;
11629 }
11630
11632 {
11633 m_IsResultOfSplit = value;
11634 }
11635
11637 {
11639 }
11640
11642 {
11643 float other_item_quantity = other_item.GetQuantity();
11644 float this_free_space;
11645
11647
11649
11650 if (other_item_quantity > this_free_space)
11651 {
11652 return this_free_space;
11653 }
11654 else
11655 {
11656 return other_item_quantity;
11657 }
11658 }
11659
11661 {
11663 }
11664
11666 {
11668 return;
11669
11670 if (!IsMagazine() && other_item)
11671 {
11673 if (quantity_used != 0)
11674 {
11675 float hp1 = GetHealth01("","");
11676 float hp2 = other_item.GetHealth01("","");
11677 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11678 hpResult = hpResult / (
GetQuantity() + quantity_used);
11679
11680 hpResult *= GetMaxHealth();
11681 Math.Round(hpResult);
11682 SetHealth("", "Health", hpResult);
11683
11685 other_item.AddQuantity(-quantity_used);
11686 }
11687 }
11689 }
11690
11692 {
11693 #ifdef SERVER
11694 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11695 GetHierarchyParent().IncreaseLifetimeUp();
11696 #endif
11697 };
11698
11700 {
11701 PlayerBase p = PlayerBase.Cast(player);
11702
11703 array<int> recipesIds = p.m_Recipes;
11704 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11705 if (moduleRecipesManager)
11706 {
11707 EntityAI itemInHands = player.GetEntityInHands();
11708 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11709 }
11710
11711 for (int i = 0;i < recipesIds.Count(); i++)
11712 {
11713 int key = recipesIds.Get(i);
11714 string recipeName = moduleRecipesManager.GetRecipeName(key);
11716 }
11717 }
11718
11719
11720 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11721 {
11722 super.GetDebugActions(outputList);
11723
11724
11730
11731
11736
11741
11742
11746
11747
11749 {
11753 }
11754
11757
11758
11762
11764
11765 InventoryLocation loc = new InventoryLocation();
11766 GetInventory().GetCurrentInventoryLocation(loc);
11768 {
11769 if (Gizmo_IsSupported())
11772 }
11773
11775 }
11776
11777
11778
11779
11781 {
11782 super.OnAction(action_id, player, ctx);
11783
11785 {
11786 switch (action_id)
11787 {
11791 return true;
11795 return true;
11796 }
11797 }
11798
11800 {
11801 switch (action_id)
11802 {
11804 Delete();
11805 return true;
11806 }
11807 }
11808
11809 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11810 {
11811 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11812 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11813 PlayerBase p = PlayerBase.Cast(player);
11814 if (
EActions.RECIPES_RANGE_START < 1000)
11815 {
11816 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11817 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11818 }
11819 }
11820 #ifndef SERVER
11821 else if (action_id ==
EActions.WATCH_PLAYER)
11822 {
11823 PluginDeveloper.SetDeveloperItemClientEx(player);
11824 }
11825 #endif
11827 {
11828 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11829 {
11830 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11831 OnDebugButtonPressServer(id + 1);
11832 }
11833
11834 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11835 {
11836 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11838 }
11839
11840 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11841 {
11842 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11844 }
11845
11846 else if (action_id ==
EActions.ADD_QUANTITY)
11847 {
11848 if (IsMagazine())
11849 {
11850 Magazine mag = Magazine.Cast(this);
11851 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11852 }
11853 else
11854 {
11856 }
11857
11858 if (m_EM)
11859 {
11860 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11861 }
11862
11863 }
11864
11865 else if (action_id ==
EActions.REMOVE_QUANTITY)
11866 {
11867 if (IsMagazine())
11868 {
11869 Magazine mag2 = Magazine.Cast(this);
11870 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11871 }
11872 else
11873 {
11875 }
11876 if (m_EM)
11877 {
11878 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11879 }
11880
11881 }
11882
11883 else if (action_id ==
EActions.SET_QUANTITY_0)
11884 {
11886
11887 if (m_EM)
11888 {
11889 m_EM.SetEnergy(0);
11890 }
11891 }
11892
11893 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11894 {
11896
11897 if (m_EM)
11898 {
11899 m_EM.SetEnergy(m_EM.GetEnergyMax());
11900 }
11901 }
11902
11903 else if (action_id ==
EActions.ADD_HEALTH)
11904 {
11905 AddHealth("","",GetMaxHealth("","Health")/5);
11906 }
11907 else if (action_id ==
EActions.REMOVE_HEALTH)
11908 {
11909 AddHealth("","",-GetMaxHealth("","Health")/5);
11910 }
11911 else if (action_id ==
EActions.DESTROY_HEALTH)
11912 {
11913 SetHealth01("","",0);
11914 }
11915 else if (action_id ==
EActions.WATCH_ITEM)
11916 {
11918 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11919 #ifdef DEVELOPER
11920 SetDebugDeveloper_item(this);
11921 #endif
11922 }
11923
11924 else if (action_id ==
EActions.ADD_TEMPERATURE)
11925 {
11926 AddTemperature(20);
11927
11928 }
11929
11930 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11931 {
11932 AddTemperature(-20);
11933
11934 }
11935
11936 else if (action_id ==
EActions.FLIP_FROZEN)
11937 {
11938 SetFrozen(!GetIsFrozen());
11939
11940 }
11941
11942 else if (action_id ==
EActions.ADD_WETNESS)
11943 {
11945
11946 }
11947
11948 else if (action_id ==
EActions.REMOVE_WETNESS)
11949 {
11951
11952 }
11953
11954 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11955 {
11958
11959
11960 }
11961
11962 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11963 {
11966 }
11967
11968 else if (action_id ==
EActions.MAKE_SPECIAL)
11969 {
11970 auto debugParams = DebugSpawnParams.WithPlayer(player);
11971 OnDebugSpawnEx(debugParams);
11972 }
11973
11974 }
11975
11976
11977 return false;
11978 }
11979
11980
11981
11982
11986
11989
11990
11991
11993 {
11994 return false;
11995 }
11996
11997
11999 {
12000 return true;
12001 }
12002
12003
12005 {
12006 return true;
12007 }
12008
12009
12010
12012 {
12013 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
12014 return g_Game.ConfigIsExisting(config_path);
12015 }
12016
12019 {
12020 return null;
12021 }
12022
12024 {
12025 return false;
12026 }
12027
12029 {
12030 return false;
12031 }
12032
12036
12037
12039 {
12040 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12041 return module_repairing.CanRepair(this, item_repair_kit);
12042 }
12043
12044
12045 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
12046 {
12047 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
12048 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
12049 }
12050
12051
12053 {
12054
12055
12056
12057
12058
12059
12060
12061
12062 return 1;
12063 }
12064
12065
12066
12068 {
12070 }
12071
12072
12073
12075 {
12077 }
12078
12079
12088 {
12089 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12090
12091 if (player)
12092 {
12093 player.MessageStatus(text);
12094 }
12095 }
12096
12097
12106 {
12107 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12108
12109 if (player)
12110 {
12111 player.MessageAction(text);
12112 }
12113 }
12114
12115
12124 {
12125 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12126
12127 if (player)
12128 {
12129 player.MessageFriendly(text);
12130 }
12131 }
12132
12133
12142 {
12143 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12144
12145 if (player)
12146 {
12147 player.MessageImportant(text);
12148 }
12149 }
12150
12152 {
12153 return true;
12154 }
12155
12156
12157 override bool KindOf(
string tag)
12158 {
12159 bool found = false;
12160 string item_name = this.
GetType();
12162 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12163
12164 int array_size = item_tag_array.Count();
12165 for (int i = 0; i < array_size; i++)
12166 {
12167 if (item_tag_array.Get(i) == tag)
12168 {
12169 found = true;
12170 break;
12171 }
12172 }
12173 return found;
12174 }
12175
12176
12178 {
12179
12180 super.OnRPC(sender, rpc_type,ctx);
12181
12182
12183 switch (rpc_type)
12184 {
12185 #ifndef SERVER
12186 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12187 Param2<bool, string> p = new Param2<bool, string>(false, "");
12188
12190 return;
12191
12192 bool play = p.param1;
12193 string soundSet = p.param2;
12194
12195 if (play)
12196 {
12198 {
12200 {
12202 }
12203 }
12204 else
12205 {
12207 }
12208 }
12209 else
12210 {
12212 }
12213
12214 break;
12215 #endif
12216
12217 }
12218
12220 {
12222 }
12223 }
12224
12225
12226
12227
12229 {
12230 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12231 return plugin.GetID(
name);
12232 }
12233
12235 {
12236 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12237 return plugin.GetName(id);
12238 }
12239
12242 {
12243
12244
12245 int varFlags;
12246 if (!ctx.
Read(varFlags))
12247 return;
12248
12249 if (varFlags & ItemVariableFlags.FLOAT)
12250 {
12252 }
12253 }
12254
12256 {
12257
12258 super.SerializeNumericalVars(floats_out);
12259
12260
12261
12263 {
12265 }
12266
12268 {
12270 }
12271
12273 {
12275 }
12276
12278 {
12283 }
12284
12286 {
12288 }
12289 }
12290
12292 {
12293
12294 super.DeSerializeNumericalVars(floats);
12295
12296
12297 int index = 0;
12298 int mask = Math.Round(floats.Get(index));
12299
12300 index++;
12301
12303 {
12305 {
12307 }
12308 else
12309 {
12310 float quantity = floats.Get(index);
12311 SetQuantity(quantity,
true,
false,
false,
false);
12312 }
12313 index++;
12314 }
12315
12317 {
12318 float wet = floats.Get(index);
12320 index++;
12321 }
12322
12324 {
12325 int liquidtype = Math.Round(floats.Get(index));
12327 index++;
12328 }
12329
12331 {
12333 index++;
12335 index++;
12337 index++;
12339 index++;
12340 }
12341
12343 {
12344 int cleanness = Math.Round(floats.Get(index));
12346 index++;
12347 }
12348 }
12349
12351 {
12352 super.WriteVarsToCTX(ctx);
12353
12354
12356 {
12358 }
12359
12361 {
12363 }
12364
12366 {
12368 }
12369
12371 {
12372 int r,g,b,a;
12378 }
12379
12381 {
12383 }
12384 }
12385
12387 {
12388 if (!super.ReadVarsFromCTX(ctx,version))
12389 return false;
12390
12391 int intValue;
12392 float value;
12393
12394 if (version < 140)
12395 {
12396 if (!ctx.
Read(intValue))
12397 return false;
12398
12399 m_VariablesMask = intValue;
12400 }
12401
12403 {
12404 if (!ctx.
Read(value))
12405 return false;
12406
12408 {
12410 }
12411 else
12412 {
12414 }
12415 }
12416
12417 if (version < 140)
12418 {
12420 {
12421 if (!ctx.
Read(value))
12422 return false;
12423 SetTemperatureDirect(value);
12424 }
12425 }
12426
12428 {
12429 if (!ctx.
Read(value))
12430 return false;
12432 }
12433
12435 {
12436 if (!ctx.
Read(intValue))
12437 return false;
12439 }
12440
12442 {
12443 int r,g,b,a;
12445 return false;
12447 return false;
12449 return false;
12451 return false;
12452
12454 }
12455
12457 {
12458 if (!ctx.
Read(intValue))
12459 return false;
12461 }
12462
12463 if (version >= 138 && version < 140)
12464 {
12466 {
12467 if (!ctx.
Read(intValue))
12468 return false;
12469 SetFrozen(intValue);
12470 }
12471 }
12472
12473 return true;
12474 }
12475
12476
12478 {
12481 {
12483 }
12484
12485 if (!super.OnStoreLoad(ctx, version))
12486 {
12488 return false;
12489 }
12490
12491 if (version >= 114)
12492 {
12493 bool hasQuickBarIndexSaved;
12494
12495 if (!ctx.
Read(hasQuickBarIndexSaved))
12496 {
12498 return false;
12499 }
12500
12501 if (hasQuickBarIndexSaved)
12502 {
12503 int itmQBIndex;
12504
12505
12506 if (!ctx.
Read(itmQBIndex))
12507 {
12509 return false;
12510 }
12511
12512 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12513 if (itmQBIndex != -1 && parentPlayer)
12514 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12515 }
12516 }
12517 else
12518 {
12519
12520 PlayerBase player;
12521 int itemQBIndex;
12522 if (version ==
int.
MAX)
12523 {
12524 if (!ctx.
Read(itemQBIndex))
12525 {
12527 return false;
12528 }
12529 }
12530 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12531 {
12532
12533 if (!ctx.
Read(itemQBIndex))
12534 {
12536 return false;
12537 }
12538 if (itemQBIndex != -1 && player)
12539 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12540 }
12541 }
12542
12543 if (version < 140)
12544 {
12545
12546 if (!LoadVariables(ctx, version))
12547 {
12549 return false;
12550 }
12551 }
12552
12553
12555 {
12557 return false;
12558 }
12559 if (version >= 132)
12560 {
12562 if (raib)
12563 {
12565 {
12567 return false;
12568 }
12569 }
12570 }
12571
12573 return true;
12574 }
12575
12576
12577
12579 {
12580 super.OnStoreSave(ctx);
12581
12582 PlayerBase player;
12583 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12584 {
12586
12587 int itemQBIndex = -1;
12588 itemQBIndex = player.FindQuickBarEntityIndex(this);
12589 ctx.
Write(itemQBIndex);
12590 }
12591 else
12592 {
12594 }
12595
12597
12599 if (raib)
12600 {
12602 }
12603 }
12604
12605
12607 {
12608 super.AfterStoreLoad();
12609
12611 {
12613 }
12614
12616 {
12619 }
12620 }
12621
12623 {
12624 super.EEOnAfterLoad();
12625
12627 {
12629 }
12630
12633 }
12634
12636 {
12637 return false;
12638 }
12639
12640
12641
12643 {
12645 {
12646 #ifdef PLATFORM_CONSOLE
12647
12649 {
12651 if (menu)
12652 {
12654 }
12655 }
12656 #endif
12657 }
12658
12660 {
12663 }
12664
12666 {
12667 SetWeightDirty();
12669 }
12671 {
12674 }
12675
12677 {
12680
12683 }
12685 {
12689 }
12690
12691 super.OnVariablesSynchronized();
12692 }
12693
12694
12695
12697 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12698 {
12699 if (!IsServerCheck(allow_client))
12700 return false;
12701
12703 return false;
12704
12707
12708 if (value <= (min + 0.001))
12709 value = min;
12710
12711 if (value == min)
12712 {
12713 if (destroy_config)
12714 {
12715 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12716 if (dstr)
12717 {
12719 this.Delete();
12720 return true;
12721 }
12722 }
12723 else if (destroy_forced)
12724 {
12726 this.Delete();
12727 return true;
12728 }
12729
12731 }
12732
12735
12737 {
12738 EntityAI parent = GetHierarchyRoot();
12739 InventoryLocation iLoc = new InventoryLocation();
12740 GetInventory().GetCurrentInventoryLocation(iLoc);
12742 {
12743 int iLocSlot = iLoc.
GetSlot();
12745 {
12747 }
12749 {
12751 }
12752 }
12753 }
12754
12756 {
12758
12759 if (delta)
12761 }
12762
12764
12765 return false;
12766 }
12767
12768
12770 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12771 {
12773 }
12774
12776 {
12779 }
12780
12782 {
12785 }
12786
12788 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12789 {
12790 float value_clamped = Math.Clamp(value, 0, 1);
12792 SetQuantity(result, destroy_config, destroy_forced);
12793 }
12794
12795
12798 {
12800 }
12801
12803 {
12805 }
12806
12807
12808
12809
12810
12811
12812
12813
12814
12815
12817 {
12818 int slot = -1;
12819 GameInventory inventory = GetInventory();
12820 if (inventory)
12821 {
12822 InventoryLocation il = new InventoryLocation;
12825 }
12826
12828 }
12829
12831 {
12832 float quantity_max = 0;
12833
12835 {
12836 if (attSlotID != -1)
12837 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12838
12839 if (quantity_max <= 0)
12841 }
12842
12843 if (quantity_max <= 0)
12845
12846 return quantity_max;
12847 }
12848
12850 {
12852 }
12853
12855 {
12857 }
12858
12859
12861 {
12863 }
12864
12866 {
12868 }
12869
12871 {
12873 }
12874
12875
12877 {
12878
12879 float weightEx = GetWeightEx();
12880 float special = GetInventoryAndCargoWeight();
12881 return weightEx - special;
12882 }
12883
12884
12886 {
12888 }
12889
12891 {
12893 {
12894 #ifdef DEVELOPER
12895 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12896 {
12897 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12899 }
12900 #endif
12901
12902 return GetQuantity() * GetConfigWeightModified();
12903 }
12904 else if (HasEnergyManager())
12905 {
12906 #ifdef DEVELOPER
12907 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12908 {
12909 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12910 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12911 }
12912 #endif
12913 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12914 }
12915 else
12916 {
12917 #ifdef DEVELOPER
12918 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12919 {
12920 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12921 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12922 }
12923 #endif
12924 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12925 }
12926 }
12927
12930 {
12931 int item_count = 0;
12933
12934 GameInventory inventory = GetInventory();
12935 CargoBase cargo = inventory.
GetCargo();
12936 if (cargo != NULL)
12937 {
12939 }
12940
12942 for (int i = 0; i < nAttachments; ++i)
12943 {
12945 if (item)
12946 item_count += item.GetNumberOfItems();
12947 }
12948 return item_count;
12949 }
12950
12953 {
12954 float weight = 0;
12955 float wetness = 1;
12956 if (include_wetness)
12959 {
12960 weight = wetness * m_ConfigWeight;
12961 }
12963 {
12964 weight = 1;
12965 }
12966 return weight;
12967 }
12968
12969
12970
12972 {
12973 GameInventory inventory = GetInventory();
12974 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12975 {
12976 array<EntityAI> items = new array<EntityAI>;
12978 for (int i = 0; i < items.Count(); ++i)
12979 {
12981 if (item)
12982 {
12983 g_Game.ObjectDelete(item);
12984 }
12985 }
12986 }
12987 }
12988
12989
12990
12991
12993 {
12994 float energy = 0;
12995 if (HasEnergyManager())
12996 {
12997 energy = GetCompEM().GetEnergy();
12998 }
12999 return energy;
13000 }
13001
13002
13004 {
13005 super.OnEnergyConsumed();
13006
13008 }
13009
13011 {
13012 super.OnEnergyAdded();
13013
13015 }
13016
13017
13019 {
13020 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
13021 {
13023 {
13024 float energy_0to1 = GetCompEM().GetEnergy0To1();
13026 }
13027 }
13028 }
13029
13030
13032 {
13033 return ConfigGetFloat("heatIsolation");
13034 }
13035
13037 {
13039 }
13040
13042 {
13043 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
13044 if (
g_Game.ConfigIsExisting(paramPath))
13045 return g_Game.ConfigGetFloat(paramPath);
13046
13047 return 0.0;
13048 }
13049
13051 {
13052 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
13053 if (
g_Game.ConfigIsExisting(paramPath))
13054 return g_Game.ConfigGetFloat(paramPath);
13055
13056 return 0.0;
13057 }
13058
13059 override void SetWet(
float value,
bool allow_client =
false)
13060 {
13061 if (!IsServerCheck(allow_client))
13062 return;
13063
13066
13068
13069 m_VarWet = Math.Clamp(value, min, max);
13070
13072 {
13075 }
13076 }
13077
13078 override void AddWet(
float value)
13079 {
13081 }
13082
13084 {
13086 }
13087
13089 {
13091 }
13092
13094 {
13096 }
13097
13099 {
13101 }
13102
13104 {
13106 }
13107
13108 override void OnWetChanged(
float newVal,
float oldVal)
13109 {
13112 if (newLevel != oldLevel)
13113 {
13115 }
13116 }
13117
13119 {
13120 SetWeightDirty();
13121 }
13122
13124 {
13125 return GetWetLevelInternal(
m_VarWet);
13126 }
13127
13128
13129
13131 {
13133 }
13134
13136 {
13138 }
13139
13141 {
13143 }
13144
13146 {
13148 }
13149
13150
13151
13153 {
13154 if (ConfigIsExisting("itemModelLength"))
13155 {
13156 return ConfigGetFloat("itemModelLength");
13157 }
13158 return 0;
13159 }
13160
13162 {
13163 if (ConfigIsExisting("itemAttachOffset"))
13164 {
13165 return ConfigGetFloat("itemAttachOffset");
13166 }
13167 return 0;
13168 }
13169
13170 override void SetCleanness(
int value,
bool allow_client =
false)
13171 {
13172 if (!IsServerCheck(allow_client))
13173 return;
13174
13176
13178
13181 }
13182
13184 {
13186 }
13187
13189 {
13190 return true;
13191 }
13192
13193
13194
13195
13197 {
13199 }
13200
13202 {
13204 }
13205
13206
13207
13208
13209 override void SetColor(
int r,
int g,
int b,
int a)
13210 {
13216 }
13218 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13219 {
13224 }
13225
13227 {
13229 }
13230
13233 {
13234 int r,g,b,a;
13236 r = r/255;
13237 g = g/255;
13238 b = b/255;
13239 a = a/255;
13240 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13241 }
13242
13243
13244
13245 override void SetLiquidType(
int value,
bool allow_client =
false)
13246 {
13247 if (!IsServerCheck(allow_client))
13248 return;
13249
13254 }
13255
13257 {
13258 return ConfigGetInt("varLiquidTypeInit");
13259 }
13260
13262 {
13264 }
13265
13267 {
13269 SetFrozen(false);
13270 }
13271
13274 {
13275 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13276 }
13277
13278
13281 {
13282 PlayerBase nplayer;
13283 if (PlayerBase.CastTo(nplayer, player))
13284 {
13286 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13287 }
13288 }
13289
13290
13293 {
13294 PlayerBase nplayer;
13295 if (PlayerBase.CastTo(nplayer,player))
13296 {
13297 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13298 }
13299
13300 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13301
13302 if (HasEnergyManager())
13303 {
13304 GetCompEM().UpdatePlugState();
13305 }
13306 }
13307
13308
13310 {
13311 super.OnPlacementStarted(player);
13312
13314 }
13315
13316 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13317 {
13319 {
13320 m_AdminLog.OnPlacementComplete(player,
this);
13321 }
13322
13323 super.OnPlacementComplete(player, position, orientation);
13324 }
13325
13326
13327
13328
13329
13331 {
13333 {
13334 return true;
13335 }
13336 else
13337 {
13338 return false;
13339 }
13340 }
13341
13342
13344 {
13346 {
13348 }
13349 }
13350
13351
13353 {
13355 }
13356
13358 {
13360 }
13361
13362 override void InsertAgent(
int agent,
float count = 1)
13363 {
13364 if (count < 1)
13365 return;
13366
13368 }
13369
13372 {
13374 }
13375
13376
13378 {
13380 }
13381
13382
13383
13384
13385
13386
13387
13388
13389
13390
13391
13392
13393
13394
13395
13396
13397
13398
13399
13400
13401
13402
13403
13404
13405
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13424 {
13426 return false;
13427 return true;
13428 }
13429
13431 {
13432
13434 }
13435
13436
13439 {
13440 super.CheckForRoofLimited(timeTresholdMS);
13441
13442 float time =
g_Game.GetTime();
13443 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13444 {
13445 m_PreviousRoofTestTime = time;
13446 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13447 }
13448 }
13449
13450
13452 {
13454 {
13455 return 0;
13456 }
13457
13458 if (GetInventory().GetAttachmentSlotsCount() != 0)
13459 {
13460 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13461 if (filter)
13462 return filter.GetProtectionLevel(type, false, system);
13463 else
13464 return 0;
13465 }
13466
13467 string subclassPath, entryName;
13468
13469 switch (type)
13470 {
13472 entryName = "biological";
13473 break;
13475 entryName = "chemical";
13476 break;
13477 default:
13478 entryName = "biological";
13479 break;
13480 }
13481
13482 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13483
13484 return g_Game.ConfigGetFloat(subclassPath + entryName);
13485 }
13486
13487
13488
13491 {
13492 if (!IsMagazine())
13494
13496 }
13497
13498
13499
13500
13501
13506 {
13507 return true;
13508 }
13509
13511 {
13513 }
13514
13515
13516
13517
13518
13520 {
13521 if (parent)
13522 {
13523 if (parent.IsInherited(DayZInfected))
13524 return true;
13525
13526 if (!parent.IsRuined())
13527 return true;
13528 }
13529
13530 return true;
13531 }
13532
13534 {
13535 if (!super.CanPutAsAttachment(parent))
13536 {
13537 return false;
13538 }
13539
13540 if (!IsRuined() && !parent.IsRuined())
13541 {
13542 return true;
13543 }
13544
13545 return false;
13546 }
13547
13549 {
13550
13551
13552
13553
13554 return super.CanReceiveItemIntoCargo(item);
13555 }
13556
13558 {
13559
13560
13561
13562
13563 GameInventory attachmentInv = attachment.GetInventory();
13565 {
13566 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13567 return false;
13568 }
13569
13570 InventoryLocation loc = new InventoryLocation();
13571 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13572 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13573 return false;
13574
13575 return super.CanReceiveAttachment(attachment, slotId);
13576 }
13577
13579 {
13580 if (!super.CanReleaseAttachment(attachment))
13581 return false;
13582
13583 return GetInventory().AreChildrenAccessible();
13584 }
13585
13586
13587
13588
13589
13590
13591
13592
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13607 {
13608 int id = muzzle_owner.GetMuzzleID();
13609 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13610
13611 if (WPOF_array)
13612 {
13613 for (int i = 0; i < WPOF_array.Count(); i++)
13614 {
13615 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13616
13617 if (WPOF)
13618 {
13619 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13620 }
13621 }
13622 }
13623 }
13624
13625
13627 {
13628 int id = muzzle_owner.GetMuzzleID();
13630
13631 if (WPOBE_array)
13632 {
13633 for (int i = 0; i < WPOBE_array.Count(); i++)
13634 {
13635 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13636
13637 if (WPOBE)
13638 {
13639 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13640 }
13641 }
13642 }
13643 }
13644
13645
13647 {
13648 int id = muzzle_owner.GetMuzzleID();
13649 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13650
13651 if (WPOOH_array)
13652 {
13653 for (int i = 0; i < WPOOH_array.Count(); i++)
13654 {
13655 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13656
13657 if (WPOOH)
13658 {
13659 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13660 }
13661 }
13662 }
13663 }
13664
13665
13667 {
13668 int id = muzzle_owner.GetMuzzleID();
13669 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13670
13671 if (WPOOH_array)
13672 {
13673 for (int i = 0; i < WPOOH_array.Count(); i++)
13674 {
13675 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13676
13677 if (WPOOH)
13678 {
13679 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13680 }
13681 }
13682 }
13683 }
13684
13685
13687 {
13688 int id = muzzle_owner.GetMuzzleID();
13689 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13690
13691 if (WPOOH_array)
13692 {
13693 for (int i = 0; i < WPOOH_array.Count(); i++)
13694 {
13695 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13696
13697 if (WPOOH)
13698 {
13699 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13700 }
13701 }
13702 }
13703 }
13704
13705
13706
13708 {
13710 {
13711 return true;
13712 }
13713
13714 return false;
13715 }
13716
13718 {
13720 {
13721 return true;
13722 }
13723
13724 return false;
13725 }
13726
13728 {
13730 {
13731 return true;
13732 }
13733
13734 return false;
13735 }
13736
13738 {
13739 return false;
13740 }
13741
13744 {
13745 return UATimeSpent.DEFAULT_DEPLOY;
13746 }
13747
13748
13749
13750
13752 {
13754 SetSynchDirty();
13755 }
13756
13758 {
13760 }
13761
13762
13764 {
13765 return false;
13766 }
13767
13770 {
13771 string att_type = "None";
13772
13773 if (ConfigIsExisting("soundAttType"))
13774 {
13775 att_type = ConfigGetString("soundAttType");
13776 }
13777
13779 }
13780
13782 {
13784 }
13785
13786
13787
13788
13789
13795
13797 {
13800
13802 }
13803
13804
13806 {
13808 return;
13809
13811
13814
13817
13818 SoundParameters params = new SoundParameters();
13822 }
13823
13824
13826 {
13828 {
13831
13832 SetSynchDirty();
13833
13836 }
13837 }
13838
13840 {
13842 }
13843
13844
13846 {
13848 return;
13849
13851 SetSynchDirty();
13852
13855 }
13856
13858 {
13861 }
13862
13864 {
13866 }
13867
13868 void OnApply(PlayerBase player);
13869
13871 {
13872 return 1.0;
13873 };
13874
13876 {
13878 }
13879
13881 {
13883 }
13884
13886
13888 {
13889 SetDynamicPhysicsLifeTime(0.01);
13891 }
13892
13894 {
13895 array<string> zone_names = new array<string>;
13896 GetDamageZones(zone_names);
13897 for (int i = 0; i < zone_names.Count(); i++)
13898 {
13899 SetHealthMax(zone_names.Get(i),"Health");
13900 }
13901 SetHealthMax("","Health");
13902 }
13903
13906 {
13907 float global_health = GetHealth01("","Health");
13908 array<string> zones = new array<string>;
13909 GetDamageZones(zones);
13910
13911 for (int i = 0; i < zones.Count(); i++)
13912 {
13913 SetHealth01(zones.Get(i),"Health",global_health);
13914 }
13915 }
13916
13919 {
13920 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13921 }
13922
13924 {
13925 if (!hasRootAsPlayer)
13926 {
13927 if (refParentIB)
13928 {
13929
13930 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13931 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13932
13933 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13934 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13935
13938 }
13939 else
13940 {
13941
13944 }
13945 }
13946 }
13947
13949 {
13951 {
13952 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13953 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13954 {
13955 float heatPermCoef = 1.0;
13957 while (ent)
13958 {
13959 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13960 ent = ent.GetHierarchyParent();
13961 }
13962
13963 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13964 }
13965 }
13966 }
13967
13969 {
13970
13971 EntityAI parent = GetHierarchyParent();
13972 if (!parent)
13973 {
13974 hasParent = false;
13975 hasRootAsPlayer = false;
13976 }
13977 else
13978 {
13979 hasParent = true;
13980 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13981 refParentIB =
ItemBase.Cast(parent);
13982 }
13983 }
13984
13985 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13986 {
13987
13988 }
13989
13991 {
13992
13993 return false;
13994 }
13995
13997 {
13998
13999
14000 return false;
14001 }
14002
14004 {
14005
14006 return false;
14007 }
14008
14011 {
14012 return !GetIsFrozen() &&
IsOpen();
14013 }
14014
14016 {
14017 bool hasParent = false, hasRootAsPlayer = false;
14019
14020 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
14021 bool foodDecay =
g_Game.IsFoodDecayEnabled();
14022
14023 if (wwtu || foodDecay)
14024 {
14028
14029 if (processWetness || processTemperature || processDecay)
14030 {
14032
14033 if (processWetness)
14034 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
14035
14036 if (processTemperature)
14038
14039 if (processDecay)
14040 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
14041 }
14042 }
14043 }
14044
14047 {
14049 }
14050
14052 {
14055
14056 return super.GetTemperatureFreezeThreshold();
14057 }
14058
14060 {
14063
14064 return super.GetTemperatureThawThreshold();
14065 }
14066
14068 {
14071
14072 return super.GetItemOverheatThreshold();
14073 }
14074
14076 {
14078 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14079
14080 return super.GetTemperatureFreezeTime();
14081 }
14082
14084 {
14086 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14087
14088 return super.GetTemperatureThawTime();
14089 }
14090
14095
14097 {
14098 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14099 }
14100
14102 {
14103 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14104 }
14105
14108 {
14110 }
14111
14113 {
14115 }
14116
14118 {
14120 }
14121
14124 {
14125 return null;
14126 }
14127
14130 {
14131 return false;
14132 }
14133
14135 {
14137 {
14140 if (!trg)
14141 {
14143 explosive = this;
14144 }
14145
14146 explosive.PairRemote(trg);
14148
14149 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14150 trg.SetPersistentPairID(persistentID);
14151 explosive.SetPersistentPairID(persistentID);
14152
14153 return true;
14154 }
14155 return false;
14156 }
14157
14160 {
14161 float ret = 1.0;
14164 ret *= GetHealth01();
14165
14166 return ret;
14167 }
14168
14169 #ifdef DEVELOPER
14170 override void SetDebugItem()
14171 {
14172 super.SetDebugItem();
14173 _itemBase = this;
14174 }
14175
14177 {
14178 string text = super.GetDebugText();
14179
14181 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14182
14183 return text;
14184 }
14185 #endif
14186
14188 {
14189 return true;
14190 }
14191
14193
14195
14197 {
14200 }
14201
14202
14210
14226
14227 [
Obsolete(
"Use ItemSoundHandler instead")]
14230 {
14231 if (!
g_Game.IsDedicatedServer())
14232 {
14233 if (ConfigIsExisting("attachSoundSet"))
14234 {
14235 string cfg_path = "";
14236 string soundset = "";
14237 string type_name =
GetType();
14238
14241 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14242 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14243
14244 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14245 {
14246 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14247 {
14248 if (cfg_slot_array[i] == slot_type)
14249 {
14250 soundset = cfg_soundset_array[i];
14251 break;
14252 }
14253 }
14254 }
14255
14256 if (soundset != "")
14257 {
14258 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14260 }
14261 }
14262 }
14263 }
14264
14266}
14267
14269{
14271 if (entity)
14272 {
14273 bool is_item = entity.IsInherited(
ItemBase);
14274 if (is_item && full_quantity)
14275 {
14278 }
14279 }
14280 else
14281 {
14283 return NULL;
14284 }
14285 return entity;
14286}
14287
14289{
14290 if (item)
14291 {
14292 if (health > 0)
14293 item.SetHealth("", "", health);
14294
14295 if (item.CanHaveTemperature())
14296 {
14298 if (item.CanFreeze())
14299 item.SetFrozen(false);
14300 }
14301
14302 if (item.HasEnergyManager())
14303 {
14304 if (quantity >= 0)
14305 {
14306 item.GetCompEM().SetEnergy0To1(quantity);
14307 }
14308 else
14309 {
14311 }
14312 }
14313 else if (item.IsMagazine())
14314 {
14315 Magazine mag = Magazine.Cast(item);
14316 if (quantity >= 0)
14317 {
14318 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14319 }
14320 else
14321 {
14323 }
14324
14325 }
14326 else
14327 {
14328 if (quantity >= 0)
14329 {
14330 item.SetQuantityNormalized(quantity, false);
14331 }
14332 else
14333 {
14335 }
14336
14337 }
14338 }
14339}
14340
14341#ifdef DEVELOPER
14343#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
void Obsolete(string msg="")
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
vector GetPosition()
Get the world position of the Effect.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.