9301{
9303 {
9304 return true;
9305 }
9306};
9307
9309{
9310
9311};
9312
9313
9314
9316{
9320
9322
9325
9326
9327
9328
9329
9338
9344
9349
9354
9375 protected bool m_IsResultOfSplit
9376
9378
9383
9384
9385
9387
9391
9392
9393
9395
9398
9399
9400
9406
9407
9415
9418
9419
9421
9422
9424
9425
9430
9431
9436
9438
9439
9441
9442
9444 {
9449
9450 if (!
g_Game.IsDedicatedServer())
9451 {
9453 {
9455
9457 {
9459 }
9460 }
9461
9464 }
9465
9466 m_OldLocation = null;
9467
9469 {
9471 }
9472
9473 if (ConfigIsExisting("headSelectionsToHide"))
9474 {
9477 }
9478
9480 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9481 {
9483 }
9484
9486
9487 m_IsResultOfSplit = false;
9488
9490 }
9491
9493 {
9494 super.InitItemVariables();
9495
9501 m_Count = ConfigGetInt(
"count");
9502
9505
9510
9513
9518
9530
9534
9535
9538 if (ConfigIsExisting("canBeSplit"))
9539 {
9542 }
9543
9545 if (ConfigIsExisting("itemBehaviour"))
9547
9548
9551 RegisterNetSyncVariableInt("m_VarLiquidType");
9552 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9553
9554 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9555 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9556 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9557
9558 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9559 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9560 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9561 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9562
9563 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9564 RegisterNetSyncVariableBool("m_IsTakeable");
9565 RegisterNetSyncVariableBool("m_IsHologram");
9566
9569 {
9572 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9573 }
9574
9576
9578 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9580
9582 }
9583
9585 {
9587 }
9588
9590 {
9593 {
9598 }
9599 }
9600
9601 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9602 {
9604 {
9607 }
9608
9610 }
9611
9613 {
9619 }
9620
9622
9624 {
9626
9627 if (!action)
9628 {
9629 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9630 return;
9631 }
9632
9634 if (!ai)
9635 {
9637 return;
9638 }
9639
9641 if (!action_array)
9642 {
9643 action_array = new array<ActionBase_Basic>;
9645 }
9646 if (LogManager.IsActionLogEnable())
9647 {
9648 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9649 }
9650
9651 if (action_array.Find(action) != -1)
9652 {
9653 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9654 }
9655 else
9656 {
9657 action_array.Insert(action);
9658 }
9659 }
9660
9662 {
9663 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9664 ActionBase action = player.GetActionManager().GetAction(actionName);
9667
9668 if (action_array)
9669 {
9670 action_array.RemoveItem(action);
9671 }
9672 }
9673
9674
9675
9677 {
9678 ActionOverrideData overrideData = new ActionOverrideData();
9682
9684 if (!actionMap)
9685 {
9688 }
9689
9690 actionMap.Insert(this.
Type(), overrideData);
9691
9692 }
9693
9695
9697
9698
9700 {
9703
9706
9707 string config_to_search = "CfgVehicles";
9708 string muzzle_owner_config;
9709
9711 {
9712 if (IsInherited(Weapon))
9713 config_to_search = "CfgWeapons";
9714
9715 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9716
9717 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9718
9719 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9720
9721 if (config_OnFire_subclass_count > 0)
9722 {
9723 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9724
9725 for (int i = 0; i < config_OnFire_subclass_count; i++)
9726 {
9727 string particle_class = "";
9728 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9729 string config_OnFire_entry = config_OnFire_class + particle_class;
9730 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9731 WPOF_array.Insert(WPOF);
9732 }
9733
9734
9736 }
9737 }
9738
9740 {
9741 config_to_search = "CfgWeapons";
9742 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9743
9744 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9745
9746 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9747
9748 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9749 {
9750 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9751
9752 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9753 {
9754 string particle_class2 = "";
9755 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9756 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9757 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9758 WPOBE_array.Insert(WPOBE);
9759 }
9760
9761
9763 }
9764 }
9765 }
9766
9767
9769 {
9772
9774 {
9775 string config_to_search = "CfgVehicles";
9776
9777 if (IsInherited(Weapon))
9778 config_to_search = "CfgWeapons";
9779
9780 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9781 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9782
9783 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9784 {
9785
9787
9789 {
9791 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9793 return;
9794 }
9795
9798
9799
9800
9801 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9802 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9803
9804 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9805 {
9806 string particle_class = "";
9807 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9808 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9809 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9810
9811 if (entry_type == CT_CLASS)
9812 {
9813 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9814 WPOOH_array.Insert(WPOF);
9815 }
9816 }
9817
9818
9820 }
9821 }
9822 }
9823
9825 {
9827 }
9828
9830 {
9832 {
9834
9837
9840
9841 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9842 }
9843 }
9844
9846 {
9848 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9849
9851 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9852
9854 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9855
9857 {
9859 }
9860 }
9861
9863 {
9865 }
9866
9868 {
9871 else
9873
9875 {
9878 }
9879 else
9880 {
9883
9886 }
9887
9889 }
9890
9892 {
9894 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9895 }
9896
9898 {
9900 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9902 }
9903
9905 {
9907 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9908 }
9909
9911 {
9914
9915 OverheatingParticle OP = new OverheatingParticle();
9920
9922 }
9923
9925 {
9928
9929 return -1;
9930 }
9931
9933 {
9935 {
9938
9939 for (int i = count; i > 0; --i)
9940 {
9941 int id = i - 1;
9944
9947
9948 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9949 {
9950 if (p)
9951 {
9954 }
9955 }
9956 }
9957 }
9958 }
9959
9961 {
9963 {
9965 {
9966 int id = i - 1;
9968
9969 if (OP)
9970 {
9972
9973 if (p)
9974 {
9976 }
9977
9978 delete OP;
9979 }
9980 }
9981
9984 }
9985 }
9986
9989 {
9990 return 0.0;
9991 }
9992
9993
9995 {
9996 return 250;
9997 }
9998
10000 {
10001 return 0;
10002 }
10003
10006 {
10008 return true;
10009
10010 return false;
10011 }
10012
10015 {
10018
10020 {
10022 }
10023 else
10024 {
10025
10027 }
10028
10030 }
10031
10038 {
10039 return -1;
10040 }
10041
10042
10043
10044
10046 {
10048 {
10049 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10050 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10051
10052 if (r_index >= 0)
10053 {
10054 InventoryLocation r_il = new InventoryLocation;
10055 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10056
10057 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10060 {
10061 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10062 }
10064 {
10065 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10066 }
10067
10068 }
10069
10070 player.GetHumanInventory().ClearUserReservedLocation(this);
10071 }
10072
10075 }
10076
10077
10078
10079
10081 {
10082 return ItemBase.m_DebugActionsMask;
10083 }
10084
10086 {
10087 return ItemBase.m_DebugActionsMask & mask;
10088 }
10089
10091 {
10092 ItemBase.m_DebugActionsMask = mask;
10093 }
10094
10096 {
10097 ItemBase.m_DebugActionsMask |= mask;
10098 }
10099
10101 {
10102 ItemBase.m_DebugActionsMask &= ~mask;
10103 }
10104
10106 {
10108 {
10110 }
10111 else
10112 {
10114 }
10115 }
10116
10117
10119 {
10120 if (GetEconomyProfile())
10121 {
10122 float q_max = GetEconomyProfile().GetQuantityMax();
10123 if (q_max > 0)
10124 {
10125 float q_min = GetEconomyProfile().GetQuantityMin();
10126 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10127
10129 {
10130 ComponentEnergyManager comp = GetCompEM();
10132 {
10134 }
10135 }
10137 {
10139
10140 }
10141
10142 }
10143 }
10144 }
10145
10148 {
10149 EntityAI parent = GetHierarchyParent();
10150
10151 if (parent)
10152 {
10153 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10154 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10155 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10156 }
10157 }
10158
10161 {
10162 EntityAI parent = GetHierarchyParent();
10163
10164 if (parent)
10165 {
10166 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10167 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10168 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10169 }
10170 }
10171
10173 {
10174
10175
10176
10177
10179
10181 {
10182 if (ScriptInputUserData.CanStoreInputUserData())
10183 {
10184 ScriptInputUserData ctx = new ScriptInputUserData;
10190 ctx.
Write(use_stack_max);
10193
10195 {
10196 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10197 }
10198 }
10199 }
10200 else if (!
g_Game.IsMultiplayer())
10201 {
10203 }
10204 }
10205
10207 {
10209 }
10210
10212 {
10214 }
10215
10217 {
10219 }
10220
10222 {
10223
10224 return false;
10225 }
10226
10228 {
10229 return false;
10230 }
10231
10235 {
10236 return false;
10237 }
10238
10240 {
10241 return "";
10242 }
10243
10245
10247 {
10248 return false;
10249 }
10250
10252 {
10253 return true;
10254 }
10255
10256
10257
10259 {
10260 return true;
10261 }
10262
10264 {
10265 return true;
10266 }
10267
10269 {
10270 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10272 }
10273
10275 {
10277 }
10278
10280 {
10282 if (!is_being_placed)
10284 SetSynchDirty();
10285 }
10286
10287
10289
10291 {
10293 }
10294
10296 {
10298 }
10299
10301 {
10302 return 1;
10303 }
10304
10306 {
10307 return false;
10308 }
10309
10311 {
10313 SetSynchDirty();
10314 }
10315
10316
10317
10318
10319
10320
10321
10322
10323
10324
10325
10326
10327
10328
10329
10330
10331
10332
10333
10334
10335
10336
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10351 {
10352 super.OnMovedInsideCargo(container);
10353
10354 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10355 }
10356
10357 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10358 {
10359 super.EEItemLocationChanged(oldLoc, newLoc);
10360
10361 PlayerBase newPlayer = null;
10362 PlayerBase oldPlayer = null;
10363
10364 if (newLoc.GetParent())
10365 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10366
10367 if (oldLoc.GetParent())
10368 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10369
10371 {
10372 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10373
10374 if (rIndex >= 0)
10375 {
10376 InventoryLocation rIl = new InventoryLocation;
10377 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10378
10379 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10382 {
10383 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10384 }
10386 {
10388 }
10389
10390 }
10391 }
10392
10394 {
10395 if (newPlayer)
10396 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10397
10398 if (newPlayer == oldPlayer)
10399 {
10400 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10401 {
10403 {
10404 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10405 {
10406 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10407 }
10408 }
10409 else
10410 {
10411 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10412 }
10413 }
10414
10415 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10416 {
10417 int type = oldLoc.GetType();
10419 {
10420 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10421 }
10423 {
10424 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10425 }
10426 }
10427 if (!m_OldLocation)
10428 {
10429 m_OldLocation = new InventoryLocation;
10430 }
10431 m_OldLocation.Copy(oldLoc);
10432 }
10433 else
10434 {
10435 if (m_OldLocation)
10436 {
10437 m_OldLocation.Reset();
10438 }
10439 }
10440
10441 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10442 }
10443 else
10444 {
10445 if (newPlayer)
10446 {
10447 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10448 if (resIndex >= 0)
10449 {
10450 InventoryLocation il = new InventoryLocation;
10451 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10453 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10456 {
10457 il.
GetParent().GetOnReleaseLock().Invoke(it);
10458 }
10460 {
10462 }
10463
10464 }
10465 }
10467 {
10468
10470 }
10471
10472 if (m_OldLocation)
10473 {
10474 m_OldLocation.Reset();
10475 }
10476 }
10477
10479 {
10480 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10481 }
10482
10484 {
10485 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10486 }
10487 }
10488
10489 override void EOnContact(IEntity other, Contact extra)
10490 {
10492 {
10493 int liquidType = -1;
10495 if (impactSpeed > 0.0)
10496 {
10498 #ifndef SERVER
10500 #else
10502 SetSynchDirty();
10503 #endif
10505 }
10506 }
10507
10508 #ifdef SERVER
10509 if (GetCompEM() && GetCompEM().IsPlugged())
10510 {
10511 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10512 GetCompEM().UnplugThis();
10513 }
10514 #endif
10515 }
10516
10518
10520 {
10522 }
10523
10525 {
10526
10527 }
10528
10530 {
10531 super.OnItemLocationChanged(old_owner, new_owner);
10532
10533 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10534 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10535
10536 if (!relatedPlayer && playerNew)
10537 relatedPlayer = playerNew;
10538
10539 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10540 {
10542 if (actionMgr)
10543 {
10544 ActionBase currentAction = actionMgr.GetRunningAction();
10545 if (currentAction)
10547 }
10548 }
10549
10550 Man ownerPlayerOld = null;
10551 Man ownerPlayerNew = null;
10552
10553 if (old_owner)
10554 {
10555 if (old_owner.
IsMan())
10556 {
10557 ownerPlayerOld = Man.Cast(old_owner);
10558 }
10559 else
10560 {
10561 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10562 }
10563 }
10564 else
10565 {
10567 {
10569
10570 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10571 {
10572 GetCompEM().UnplugThis();
10573 }
10574 }
10575 }
10576
10577 if (new_owner)
10578 {
10579 if (new_owner.
IsMan())
10580 {
10581 ownerPlayerNew = Man.Cast(new_owner);
10582 }
10583 else
10584 {
10585 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10586 }
10587 }
10588
10589 if (ownerPlayerOld != ownerPlayerNew)
10590 {
10591 if (ownerPlayerOld)
10592 {
10593 array<EntityAI> subItemsExit = new array<EntityAI>;
10595 for (int i = 0; i < subItemsExit.Count(); i++)
10596 {
10599 }
10600 }
10601
10602 if (ownerPlayerNew)
10603 {
10604 array<EntityAI> subItemsEnter = new array<EntityAI>;
10606 for (int j = 0; j < subItemsEnter.Count(); j++)
10607 {
10610 }
10611 }
10612 }
10613 else if (ownerPlayerNew != null)
10614 {
10615 PlayerBase nplayer;
10616 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10617 {
10618 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10620 for (int k = 0; k < subItemsUpdate.Count(); k++)
10621 {
10623 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10624 }
10625 }
10626 }
10627
10628 if (old_owner)
10629 old_owner.OnChildItemRemoved(this);
10630 if (new_owner)
10631 new_owner.OnChildItemReceived(this);
10632 }
10633
10634
10636 {
10637 super.EEDelete(parent);
10638 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10639 if (player)
10640 {
10642
10643 if (player.IsAlive())
10644 {
10645 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10646 if (r_index >= 0)
10647 {
10648 InventoryLocation r_il = new InventoryLocation;
10649 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10650
10651 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10654 {
10655 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10656 }
10658 {
10659 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10660 }
10661
10662 }
10663
10664 player.RemoveQuickBarEntityShortcut(this);
10665 }
10666 }
10667 }
10668
10670 {
10671 super.EEKilled(killer);
10672
10675 {
10676 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10677 {
10678 if (IsMagazine())
10679 {
10680 if (Magazine.Cast(this).GetAmmoCount() > 0)
10681 {
10683 }
10684 }
10685 else
10686 {
10688 }
10689 }
10690 }
10691 }
10692
10694 {
10695 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10696
10697 super.OnWasAttached(parent, slot_id);
10698
10701
10704 }
10705
10707 {
10708 super.OnWasDetached(parent, slot_id);
10709
10712
10715 }
10716
10718 {
10719 int idx;
10722
10723 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10724 if (inventory_slots.Count() < 1)
10725 {
10726 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10727 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10728 }
10729 else
10730 {
10731 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10732 }
10733
10734 idx = inventory_slots.Find(slot);
10735 if (idx < 0)
10736 return "";
10737
10738 return attach_types.Get(idx);
10739 }
10740
10742 {
10743 int idx = -1;
10744 string slot;
10745
10748
10749 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10750 if (inventory_slots.Count() < 1)
10751 {
10752 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10753 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10754 }
10755 else
10756 {
10757 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10758 if (detach_types.Count() < 1)
10759 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10760 }
10761
10762 for (int i = 0; i < inventory_slots.Count(); i++)
10763 {
10764 slot = inventory_slots.Get(i);
10765 }
10766
10767 if (slot != "")
10768 {
10769 if (detach_types.Count() == 1)
10770 idx = 0;
10771 else
10772 idx = inventory_slots.Find(slot);
10773 }
10774 if (idx < 0)
10775 return "";
10776
10777 return detach_types.Get(idx);
10778 }
10779
10781 {
10782
10784
10785
10786 float min_time = 1;
10787 float max_time = 3;
10788 float delay = Math.RandomFloat(min_time, max_time);
10789
10790 explode_timer.Run(delay, this, "DoAmmoExplosion");
10791 }
10792
10794 {
10795 Magazine magazine = Magazine.Cast(this);
10796 int pop_sounds_count = 6;
10797 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10798
10799
10800 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10801 string sound_name = pop_sounds[ sound_idx ];
10802 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10803
10804
10805 magazine.ServerAddAmmoCount(-1);
10806
10807
10808 float min_temp_to_explode = 100;
10809
10810 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10811 {
10813 }
10814 }
10815
10816
10817 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10818 {
10819 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10820
10821 const int CHANCE_DAMAGE_CARGO = 4;
10822 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10823 const int CHANCE_DAMAGE_NOTHING = 2;
10824
10826 {
10827 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10828 int chances;
10829 int rnd;
10830
10831 if (GetInventory().GetCargo())
10832 {
10833 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10834 rnd = Math.RandomInt(0,chances);
10835
10836 if (rnd < CHANCE_DAMAGE_CARGO)
10837 {
10839 }
10840 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10841 {
10843 }
10844 }
10845 else
10846 {
10847 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10848 rnd = Math.RandomInt(0,chances);
10849
10850 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10851 {
10853 }
10854 }
10855 }
10856 }
10857
10859 {
10860 CargoBase cargo = GetInventory().GetCargo();
10861 if (cargo)
10862 {
10864 if (item_count > 0)
10865 {
10866 int random_pick = Math.RandomInt(0, item_count);
10868 if (!item.IsExplosive())
10869 {
10870 item.AddHealth("","",damage);
10871 return true;
10872 }
10873 }
10874 }
10875 return false;
10876 }
10877
10879 {
10880 GameInventory inventory = GetInventory();
10882 if (attachment_count > 0)
10883 {
10884 int random_pick = Math.RandomInt(0, attachment_count);
10886 if (!attachment.IsExplosive())
10887 {
10888 attachment.AddHealth("","",damage);
10889 return true;
10890 }
10891 }
10892 return false;
10893 }
10894
10896 {
10898 }
10899
10901 {
10903 return GetInventory().CanRemoveEntity();
10904
10905 return false;
10906 }
10907
10909 {
10910
10912 return false;
10913
10914
10916 return false;
10917
10918
10919
10921 if (delta == 0)
10922 return false;
10923
10924
10925 return true;
10926 }
10927
10929 {
10931 {
10932 if (ScriptInputUserData.CanStoreInputUserData())
10933 {
10934 ScriptInputUserData ctx = new ScriptInputUserData;
10939 ctx.
Write(destination_entity);
10941 ctx.
Write(slot_id);
10943 }
10944 }
10945 else if (!
g_Game.IsMultiplayer())
10946 {
10948 }
10949 }
10950
10952 {
10953 float split_quantity_new;
10957 InventoryLocation loc = new InventoryLocation;
10958
10959 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10960 {
10962 split_quantity_new = stack_max;
10963 else
10965
10967 {
10968 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10969 if (new_item)
10970 {
10971 new_item.SetResultOfSplit(true);
10972 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10974 new_item.
SetQuantity(split_quantity_new,
false,
true);
10975 }
10976 }
10977 }
10978 else if (destination_entity && slot_id == -1)
10979 {
10980 if (quantity > stack_max)
10981 split_quantity_new = stack_max;
10982 else
10983 split_quantity_new = quantity;
10984
10986 {
10987 GameInventory destinationInventory = destination_entity.GetInventory();
10989 {
10992 }
10993
10994 if (new_item)
10995 {
10996 new_item.SetResultOfSplit(true);
10997 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10999 new_item.
SetQuantity(split_quantity_new,
false,
true);
11000 }
11001 }
11002 }
11003 else
11004 {
11005 if (stack_max != 0)
11006 {
11008 {
11010 }
11011
11012 if (split_quantity_new == 0)
11013 {
11014 if (!
g_Game.IsMultiplayer())
11015 player.PhysicalPredictiveDropItem(this);
11016 else
11017 player.ServerDropEntity(this);
11018 return;
11019 }
11020
11022 {
11024
11025 if (new_item)
11026 {
11027 new_item.SetResultOfSplit(true);
11028 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11031 new_item.PlaceOnSurface();
11032 }
11033 }
11034 }
11035 }
11036 }
11037
11039 {
11040 float split_quantity_new;
11044 InventoryLocation loc = new InventoryLocation;
11045
11046 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11047 {
11049 split_quantity_new = stack_max;
11050 else
11052
11054 {
11055 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
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 if (destination_entity && slot_id == -1)
11066 {
11067 if (quantity > stack_max)
11068 split_quantity_new = stack_max;
11069 else
11070 split_quantity_new = quantity;
11071
11073 {
11074 GameInventory destinationInventory = destination_entity.GetInventory();
11076 {
11079 }
11080
11081 if (new_item)
11082 {
11083 new_item.SetResultOfSplit(true);
11084 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11086 new_item.
SetQuantity(split_quantity_new,
false,
true);
11087 }
11088 }
11089 }
11090 else
11091 {
11092 if (stack_max != 0)
11093 {
11095 {
11097 }
11098
11100 {
11102
11103 if (new_item)
11104 {
11105 new_item.SetResultOfSplit(true);
11106 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11109 new_item.PlaceOnSurface();
11110 }
11111 }
11112 }
11113 }
11114 }
11115
11117 {
11119 {
11120 if (ScriptInputUserData.CanStoreInputUserData())
11121 {
11122 ScriptInputUserData ctx = new ScriptInputUserData;
11127 dst.WriteToContext(ctx);
11129 }
11130 }
11131 else if (!
g_Game.IsMultiplayer())
11132 {
11134 }
11135 }
11136
11138 {
11140 {
11141 if (ScriptInputUserData.CanStoreInputUserData())
11142 {
11143 ScriptInputUserData ctx = new ScriptInputUserData;
11148 ctx.
Write(destination_entity);
11154 }
11155 }
11156 else if (!
g_Game.IsMultiplayer())
11157 {
11159 }
11160 }
11161
11163 {
11165 }
11166
11168 {
11170 float split_quantity_new;
11172 if (dst.IsValid())
11173 {
11174 int slot_id = dst.GetSlot();
11176
11177 if (quantity > stack_max)
11178 split_quantity_new = stack_max;
11179 else
11180 split_quantity_new = quantity;
11181
11183 {
11185
11186 if (new_item)
11187 {
11188 new_item.SetResultOfSplit(true);
11189 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11191 new_item.
SetQuantity(split_quantity_new,
false,
true);
11192 }
11193
11194 return new_item;
11195 }
11196 }
11197
11198 return null;
11199 }
11200
11202 {
11204 float split_quantity_new;
11206 if (destination_entity)
11207 {
11209 if (quantity > stackable)
11210 split_quantity_new = stackable;
11211 else
11212 split_quantity_new = quantity;
11213
11215 {
11216 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11217 if (new_item)
11218 {
11219 new_item.SetResultOfSplit(true);
11220 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11222 new_item.
SetQuantity(split_quantity_new,
false,
true);
11223 }
11224 }
11225 }
11226 }
11227
11229 {
11231 {
11232 if (ScriptInputUserData.CanStoreInputUserData())
11233 {
11234 ScriptInputUserData ctx = new ScriptInputUserData;
11239 ItemBase destination_entity =
this;
11240 ctx.
Write(destination_entity);
11244 }
11245 }
11246 else if (!
g_Game.IsMultiplayer())
11247 {
11249 }
11250 }
11251
11253 {
11255 float split_quantity_new;
11257 if (player)
11258 {
11260 if (quantity > stackable)
11261 split_quantity_new = stackable;
11262 else
11263 split_quantity_new = quantity;
11264
11266 {
11267 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11268 new_item =
ItemBase.Cast(in_hands);
11269 if (new_item)
11270 {
11271 new_item.SetResultOfSplit(true);
11272 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11274 new_item.SetQuantity(split_quantity_new, false, true);
11275 }
11276 }
11277 }
11278 }
11279
11281 {
11283 float split_quantity_new = Math.Floor(quantity * 0.5);
11284
11286 return;
11287
11289
11290 if (new_item)
11291 {
11292 if (new_item.GetQuantityMax() < split_quantity_new)
11293 {
11294 split_quantity_new = new_item.GetQuantityMax();
11295 }
11296
11297 new_item.SetResultOfSplit(true);
11298 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11299
11301 {
11304 }
11305 else
11306 {
11308 new_item.
SetQuantity(split_quantity_new,
false,
true);
11309 }
11310 }
11311 }
11312
11314 {
11316 float split_quantity_new = Math.Floor(quantity / 2);
11317
11319 return;
11320
11321 InventoryLocation invloc = new InventoryLocation;
11323
11325 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11326
11327 if (new_item)
11328 {
11329 if (new_item.GetQuantityMax() < split_quantity_new)
11330 {
11331 split_quantity_new = new_item.GetQuantityMax();
11332 }
11334 {
11337 }
11338 else if (split_quantity_new > 1)
11339 {
11341 new_item.
SetQuantity(split_quantity_new,
false,
true);
11342 }
11343 }
11344 }
11345
11348 {
11349 SetWeightDirty();
11351
11352 if (parent)
11353 parent.OnAttachmentQuantityChangedEx(this, delta);
11354
11356 {
11358 {
11360 }
11362 {
11363 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11365 }
11366 }
11367 }
11368
11371 {
11372
11373 }
11374
11377 {
11379 }
11380
11382 {
11383 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11384
11386 {
11387 if (newLevel == GameConstants.STATE_RUINED)
11388 {
11390 EntityAI parent = GetHierarchyParent();
11391 if (parent && parent.IsFireplace())
11392 {
11393 CargoBase cargo = GetInventory().GetCargo();
11394 if (cargo)
11395 {
11397 {
11399 }
11400 }
11401 }
11402 }
11403
11405 {
11406
11408 return;
11409 }
11410
11411 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11412 {
11414 }
11415 }
11416 }
11417
11418
11420 {
11421 super.OnRightClick();
11422
11424 {
11426 {
11427 if (ScriptInputUserData.CanStoreInputUserData())
11428 {
11429 EntityAI root = GetHierarchyRoot();
11430 Man playerOwner = GetHierarchyRootPlayer();
11431 InventoryLocation dst = new InventoryLocation;
11432
11433
11434 if (!playerOwner && root && root == this)
11435 {
11437 }
11438 else
11439 {
11440
11441 GetInventory().GetCurrentInventoryLocation(dst);
11443 {
11444 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11446 {
11448 }
11449 else
11450 {
11452
11453
11454 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11455 {
11457 }
11458 else
11459 {
11460 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11461 }
11462 }
11463 }
11464 }
11465
11466 ScriptInputUserData ctx = new ScriptInputUserData;
11474 }
11475 }
11476 else if (!
g_Game.IsMultiplayer())
11477 {
11479 }
11480 }
11481 }
11482
11484 {
11485 if (root)
11486 {
11487 vector m4[4];
11488 root.GetTransform(m4);
11489 dst.SetGround(this, m4);
11490 }
11491 else
11492 {
11493 GetInventory().GetCurrentInventoryLocation(dst);
11494 }
11495 }
11496
11497 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11498 {
11499
11500 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11501 return false;
11502
11503 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11504 return false;
11505
11506
11508 return false;
11509
11510
11511 Magazine mag = Magazine.Cast(this);
11512 if (mag)
11513 {
11514 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11515 return false;
11516
11517 if (stack_max_limit)
11518 {
11519 Magazine other_mag = Magazine.Cast(other_item);
11520 if (other_item)
11521 {
11522 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11523 return false;
11524 }
11525
11526 }
11527 }
11528 else
11529 {
11530
11532 return false;
11533
11535 return false;
11536 }
11537
11538 PlayerBase player = null;
11539 if (CastTo(player, GetHierarchyRootPlayer()))
11540 {
11541 if (player.GetInventory().HasAttachment(this))
11542 return false;
11543
11544 if (player.IsItemsToDelete())
11545 return false;
11546 }
11547
11548 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11549 return false;
11550
11551 int slotID;
11553 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11554 return false;
11555
11556 return true;
11557 }
11558
11560 {
11562 }
11563
11565 {
11566 return m_IsResultOfSplit;
11567 }
11568
11570 {
11571 m_IsResultOfSplit = value;
11572 }
11573
11575 {
11577 }
11578
11580 {
11581 float other_item_quantity = other_item.GetQuantity();
11582 float this_free_space;
11583
11585
11587
11588 if (other_item_quantity > this_free_space)
11589 {
11590 return this_free_space;
11591 }
11592 else
11593 {
11594 return other_item_quantity;
11595 }
11596 }
11597
11599 {
11601 }
11602
11604 {
11606 return;
11607
11608 if (!IsMagazine() && other_item)
11609 {
11611 if (quantity_used != 0)
11612 {
11613 float hp1 = GetHealth01("","");
11614 float hp2 = other_item.GetHealth01("","");
11615 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11616 hpResult = hpResult / (
GetQuantity() + quantity_used);
11617
11618 hpResult *= GetMaxHealth();
11619 Math.Round(hpResult);
11620 SetHealth("", "Health", hpResult);
11621
11623 other_item.AddQuantity(-quantity_used);
11624 }
11625 }
11627 }
11628
11630 {
11631 #ifdef SERVER
11632 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11633 GetHierarchyParent().IncreaseLifetimeUp();
11634 #endif
11635 };
11636
11638 {
11639 PlayerBase p = PlayerBase.Cast(player);
11640
11641 array<int> recipesIds = p.m_Recipes;
11642 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11643 if (moduleRecipesManager)
11644 {
11645 EntityAI itemInHands = player.GetEntityInHands();
11646 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11647 }
11648
11649 for (int i = 0;i < recipesIds.Count(); i++)
11650 {
11651 int key = recipesIds.Get(i);
11652 string recipeName = moduleRecipesManager.GetRecipeName(key);
11654 }
11655 }
11656
11657
11658 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11659 {
11660 super.GetDebugActions(outputList);
11661
11662
11668
11669
11674
11679
11680
11684
11685
11687 {
11691 }
11692
11695
11696
11700
11702
11703 InventoryLocation loc = new InventoryLocation();
11704 GetInventory().GetCurrentInventoryLocation(loc);
11706 {
11707 if (Gizmo_IsSupported())
11710 }
11711
11713 }
11714
11715
11716
11717
11719 {
11720 super.OnAction(action_id, player, ctx);
11721
11723 {
11724 switch (action_id)
11725 {
11729 return true;
11733 return true;
11734 }
11735 }
11736
11738 {
11739 switch (action_id)
11740 {
11742 Delete();
11743 return true;
11744 }
11745 }
11746
11747 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11748 {
11749 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11750 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11751 PlayerBase p = PlayerBase.Cast(player);
11752 if (
EActions.RECIPES_RANGE_START < 1000)
11753 {
11754 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11755 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11756 }
11757 }
11758 #ifndef SERVER
11759 else if (action_id ==
EActions.WATCH_PLAYER)
11760 {
11761 PluginDeveloper.SetDeveloperItemClientEx(player);
11762 }
11763 #endif
11765 {
11766 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11767 {
11768 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11769 OnDebugButtonPressServer(id + 1);
11770 }
11771
11772 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11773 {
11774 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11776 }
11777
11778 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11779 {
11780 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11782 }
11783
11784 else if (action_id ==
EActions.ADD_QUANTITY)
11785 {
11786 if (IsMagazine())
11787 {
11788 Magazine mag = Magazine.Cast(this);
11789 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11790 }
11791 else
11792 {
11794 }
11795
11796 if (m_EM)
11797 {
11798 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11799 }
11800
11801 }
11802
11803 else if (action_id ==
EActions.REMOVE_QUANTITY)
11804 {
11805 if (IsMagazine())
11806 {
11807 Magazine mag2 = Magazine.Cast(this);
11808 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11809 }
11810 else
11811 {
11813 }
11814 if (m_EM)
11815 {
11816 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11817 }
11818
11819 }
11820
11821 else if (action_id ==
EActions.SET_QUANTITY_0)
11822 {
11824
11825 if (m_EM)
11826 {
11827 m_EM.SetEnergy(0);
11828 }
11829 }
11830
11831 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11832 {
11834
11835 if (m_EM)
11836 {
11837 m_EM.SetEnergy(m_EM.GetEnergyMax());
11838 }
11839 }
11840
11841 else if (action_id ==
EActions.ADD_HEALTH)
11842 {
11843 AddHealth("","",GetMaxHealth("","Health")/5);
11844 }
11845 else if (action_id ==
EActions.REMOVE_HEALTH)
11846 {
11847 AddHealth("","",-GetMaxHealth("","Health")/5);
11848 }
11849 else if (action_id ==
EActions.DESTROY_HEALTH)
11850 {
11851 SetHealth01("","",0);
11852 }
11853 else if (action_id ==
EActions.WATCH_ITEM)
11854 {
11856 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11857 #ifdef DEVELOPER
11858 SetDebugDeveloper_item(this);
11859 #endif
11860 }
11861
11862 else if (action_id ==
EActions.ADD_TEMPERATURE)
11863 {
11864 AddTemperature(20);
11865
11866 }
11867
11868 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11869 {
11870 AddTemperature(-20);
11871
11872 }
11873
11874 else if (action_id ==
EActions.FLIP_FROZEN)
11875 {
11876 SetFrozen(!GetIsFrozen());
11877
11878 }
11879
11880 else if (action_id ==
EActions.ADD_WETNESS)
11881 {
11883
11884 }
11885
11886 else if (action_id ==
EActions.REMOVE_WETNESS)
11887 {
11889
11890 }
11891
11892 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11893 {
11896
11897
11898 }
11899
11900 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11901 {
11904 }
11905
11906 else if (action_id ==
EActions.MAKE_SPECIAL)
11907 {
11908 auto debugParams = DebugSpawnParams.WithPlayer(player);
11909 OnDebugSpawnEx(debugParams);
11910 }
11911
11912 }
11913
11914
11915 return false;
11916 }
11917
11918
11919
11920
11924
11927
11928
11929
11931 {
11932 return false;
11933 }
11934
11935
11937 {
11938 return true;
11939 }
11940
11941
11943 {
11944 return true;
11945 }
11946
11947
11948
11950 {
11951 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11952 return g_Game.ConfigIsExisting(config_path);
11953 }
11954
11957 {
11958 return null;
11959 }
11960
11962 {
11963 return false;
11964 }
11965
11967 {
11968 return false;
11969 }
11970
11974
11975
11977 {
11978 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11979 return module_repairing.CanRepair(this, item_repair_kit);
11980 }
11981
11982
11983 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11984 {
11985 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11986 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11987 }
11988
11989
11991 {
11992
11993
11994
11995
11996
11997
11998
11999
12000 return 1;
12001 }
12002
12003
12004
12006 {
12008 }
12009
12010
12011
12013 {
12015 }
12016
12017
12026 {
12027 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12028
12029 if (player)
12030 {
12031 player.MessageStatus(text);
12032 }
12033 }
12034
12035
12044 {
12045 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12046
12047 if (player)
12048 {
12049 player.MessageAction(text);
12050 }
12051 }
12052
12053
12062 {
12063 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12064
12065 if (player)
12066 {
12067 player.MessageFriendly(text);
12068 }
12069 }
12070
12071
12080 {
12081 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12082
12083 if (player)
12084 {
12085 player.MessageImportant(text);
12086 }
12087 }
12088
12090 {
12091 return true;
12092 }
12093
12094
12095 override bool KindOf(
string tag)
12096 {
12097 bool found = false;
12098 string item_name = this.
GetType();
12100 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12101
12102 int array_size = item_tag_array.Count();
12103 for (int i = 0; i < array_size; i++)
12104 {
12105 if (item_tag_array.Get(i) == tag)
12106 {
12107 found = true;
12108 break;
12109 }
12110 }
12111 return found;
12112 }
12113
12114
12116 {
12117
12118 super.OnRPC(sender, rpc_type,ctx);
12119
12120
12121 switch (rpc_type)
12122 {
12123 #ifndef SERVER
12124 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12125 Param2<bool, string> p = new Param2<bool, string>(false, "");
12126
12128 return;
12129
12130 bool play = p.param1;
12131 string soundSet = p.param2;
12132
12133 if (play)
12134 {
12136 {
12138 {
12140 }
12141 }
12142 else
12143 {
12145 }
12146 }
12147 else
12148 {
12150 }
12151
12152 break;
12153 #endif
12154
12155 }
12156
12158 {
12160 }
12161 }
12162
12163
12164
12165
12167 {
12168 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12169 return plugin.GetID(
name);
12170 }
12171
12173 {
12174 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12175 return plugin.GetName(id);
12176 }
12177
12180 {
12181
12182
12183 int varFlags;
12184 if (!ctx.
Read(varFlags))
12185 return;
12186
12187 if (varFlags & ItemVariableFlags.FLOAT)
12188 {
12190 }
12191 }
12192
12194 {
12195
12196 super.SerializeNumericalVars(floats_out);
12197
12198
12199
12201 {
12203 }
12204
12206 {
12208 }
12209
12211 {
12213 }
12214
12216 {
12221 }
12222
12224 {
12226 }
12227 }
12228
12230 {
12231
12232 super.DeSerializeNumericalVars(floats);
12233
12234
12235 int index = 0;
12236 int mask = Math.Round(floats.Get(index));
12237
12238 index++;
12239
12241 {
12243 {
12245 }
12246 else
12247 {
12248 float quantity = floats.Get(index);
12249 SetQuantity(quantity,
true,
false,
false,
false);
12250 }
12251 index++;
12252 }
12253
12255 {
12256 float wet = floats.Get(index);
12258 index++;
12259 }
12260
12262 {
12263 int liquidtype = Math.Round(floats.Get(index));
12265 index++;
12266 }
12267
12269 {
12271 index++;
12273 index++;
12275 index++;
12277 index++;
12278 }
12279
12281 {
12282 int cleanness = Math.Round(floats.Get(index));
12284 index++;
12285 }
12286 }
12287
12289 {
12290 super.WriteVarsToCTX(ctx);
12291
12292
12294 {
12296 }
12297
12299 {
12301 }
12302
12304 {
12306 }
12307
12309 {
12310 int r,g,b,a;
12316 }
12317
12319 {
12321 }
12322 }
12323
12325 {
12326 if (!super.ReadVarsFromCTX(ctx,version))
12327 return false;
12328
12329 int intValue;
12330 float value;
12331
12332 if (version < 140)
12333 {
12334 if (!ctx.
Read(intValue))
12335 return false;
12336
12337 m_VariablesMask = intValue;
12338 }
12339
12341 {
12342 if (!ctx.
Read(value))
12343 return false;
12344
12346 {
12348 }
12349 else
12350 {
12352 }
12353 }
12354
12355 if (version < 140)
12356 {
12358 {
12359 if (!ctx.
Read(value))
12360 return false;
12361 SetTemperatureDirect(value);
12362 }
12363 }
12364
12366 {
12367 if (!ctx.
Read(value))
12368 return false;
12370 }
12371
12373 {
12374 if (!ctx.
Read(intValue))
12375 return false;
12377 }
12378
12380 {
12381 int r,g,b,a;
12383 return false;
12385 return false;
12387 return false;
12389 return false;
12390
12392 }
12393
12395 {
12396 if (!ctx.
Read(intValue))
12397 return false;
12399 }
12400
12401 if (version >= 138 && version < 140)
12402 {
12404 {
12405 if (!ctx.
Read(intValue))
12406 return false;
12407 SetFrozen(intValue);
12408 }
12409 }
12410
12411 return true;
12412 }
12413
12414
12416 {
12419 {
12421 }
12422
12423 if (!super.OnStoreLoad(ctx, version))
12424 {
12426 return false;
12427 }
12428
12429 if (version >= 114)
12430 {
12431 bool hasQuickBarIndexSaved;
12432
12433 if (!ctx.
Read(hasQuickBarIndexSaved))
12434 {
12436 return false;
12437 }
12438
12439 if (hasQuickBarIndexSaved)
12440 {
12441 int itmQBIndex;
12442
12443
12444 if (!ctx.
Read(itmQBIndex))
12445 {
12447 return false;
12448 }
12449
12450 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12451 if (itmQBIndex != -1 && parentPlayer)
12452 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12453 }
12454 }
12455 else
12456 {
12457
12458 PlayerBase player;
12459 int itemQBIndex;
12460 if (version ==
int.
MAX)
12461 {
12462 if (!ctx.
Read(itemQBIndex))
12463 {
12465 return false;
12466 }
12467 }
12468 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12469 {
12470
12471 if (!ctx.
Read(itemQBIndex))
12472 {
12474 return false;
12475 }
12476 if (itemQBIndex != -1 && player)
12477 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12478 }
12479 }
12480
12481 if (version < 140)
12482 {
12483
12484 if (!LoadVariables(ctx, version))
12485 {
12487 return false;
12488 }
12489 }
12490
12491
12493 {
12495 return false;
12496 }
12497 if (version >= 132)
12498 {
12500 if (raib)
12501 {
12503 {
12505 return false;
12506 }
12507 }
12508 }
12509
12511 return true;
12512 }
12513
12514
12515
12517 {
12518 super.OnStoreSave(ctx);
12519
12520 PlayerBase player;
12521 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12522 {
12524
12525 int itemQBIndex = -1;
12526 itemQBIndex = player.FindQuickBarEntityIndex(this);
12527 ctx.
Write(itemQBIndex);
12528 }
12529 else
12530 {
12532 }
12533
12535
12537 if (raib)
12538 {
12540 }
12541 }
12542
12543
12545 {
12546 super.AfterStoreLoad();
12547
12549 {
12551 }
12552
12554 {
12557 }
12558 }
12559
12561 {
12562 super.EEOnAfterLoad();
12563
12565 {
12567 }
12568
12571 }
12572
12574 {
12575 return false;
12576 }
12577
12578
12579
12581 {
12583 {
12584 #ifdef PLATFORM_CONSOLE
12585
12587 {
12589 if (menu)
12590 {
12592 }
12593 }
12594 #endif
12595 }
12596
12598 {
12601 }
12602
12604 {
12605 SetWeightDirty();
12607 }
12609 {
12612 }
12613
12615 {
12618
12621 }
12623 {
12627 }
12628
12629 super.OnVariablesSynchronized();
12630 }
12631
12632
12633
12635 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12636 {
12637 if (!IsServerCheck(allow_client))
12638 return false;
12639
12641 return false;
12642
12645
12646 if (value <= (min + 0.001))
12647 value = min;
12648
12649 if (value == min)
12650 {
12651 if (destroy_config)
12652 {
12653 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12654 if (dstr)
12655 {
12657 this.Delete();
12658 return true;
12659 }
12660 }
12661 else if (destroy_forced)
12662 {
12664 this.Delete();
12665 return true;
12666 }
12667
12669 }
12670
12673
12675 {
12676 EntityAI parent = GetHierarchyRoot();
12677 InventoryLocation iLoc = new InventoryLocation();
12678 GetInventory().GetCurrentInventoryLocation(iLoc);
12680 {
12681 int iLocSlot = iLoc.
GetSlot();
12683 {
12685 }
12687 {
12689 }
12690 }
12691 }
12692
12694 {
12696
12697 if (delta)
12699 }
12700
12702
12703 return false;
12704 }
12705
12706
12708 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12709 {
12711 }
12712
12714 {
12717 }
12718
12720 {
12723 }
12724
12726 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12727 {
12728 float value_clamped = Math.Clamp(value, 0, 1);
12730 SetQuantity(result, destroy_config, destroy_forced);
12731 }
12732
12733
12736 {
12738 }
12739
12741 {
12743 }
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12755 {
12756 int slot = -1;
12757 GameInventory inventory = GetInventory();
12758 if (inventory)
12759 {
12760 InventoryLocation il = new InventoryLocation;
12763 }
12764
12766 }
12767
12769 {
12770 float quantity_max = 0;
12771
12773 {
12774 if (attSlotID != -1)
12775 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12776
12777 if (quantity_max <= 0)
12779 }
12780
12781 if (quantity_max <= 0)
12783
12784 return quantity_max;
12785 }
12786
12788 {
12790 }
12791
12793 {
12795 }
12796
12797
12799 {
12801 }
12802
12804 {
12806 }
12807
12809 {
12811 }
12812
12813
12815 {
12816
12817 float weightEx = GetWeightEx();
12818 float special = GetInventoryAndCargoWeight();
12819 return weightEx - special;
12820 }
12821
12822
12824 {
12826 }
12827
12829 {
12831 {
12832 #ifdef DEVELOPER
12833 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12834 {
12835 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12837 }
12838 #endif
12839
12840 return GetQuantity() * GetConfigWeightModified();
12841 }
12842 else if (HasEnergyManager())
12843 {
12844 #ifdef DEVELOPER
12845 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12846 {
12847 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12848 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12849 }
12850 #endif
12851 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12852 }
12853 else
12854 {
12855 #ifdef DEVELOPER
12856 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12857 {
12858 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12859 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12860 }
12861 #endif
12862 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12863 }
12864 }
12865
12868 {
12869 int item_count = 0;
12871
12872 GameInventory inventory = GetInventory();
12873 CargoBase cargo = inventory.
GetCargo();
12874 if (cargo != NULL)
12875 {
12877 }
12878
12880 for (int i = 0; i < nAttachments; ++i)
12881 {
12883 if (item)
12884 item_count += item.GetNumberOfItems();
12885 }
12886 return item_count;
12887 }
12888
12891 {
12892 float weight = 0;
12893 float wetness = 1;
12894 if (include_wetness)
12897 {
12898 weight = wetness * m_ConfigWeight;
12899 }
12901 {
12902 weight = 1;
12903 }
12904 return weight;
12905 }
12906
12907
12908
12910 {
12911 GameInventory inventory = GetInventory();
12912 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12913 {
12914 array<EntityAI> items = new array<EntityAI>;
12916 for (int i = 0; i < items.Count(); ++i)
12917 {
12919 if (item)
12920 {
12921 g_Game.ObjectDelete(item);
12922 }
12923 }
12924 }
12925 }
12926
12927
12928
12929
12931 {
12932 float energy = 0;
12933 if (HasEnergyManager())
12934 {
12935 energy = GetCompEM().GetEnergy();
12936 }
12937 return energy;
12938 }
12939
12940
12942 {
12943 super.OnEnergyConsumed();
12944
12946 }
12947
12949 {
12950 super.OnEnergyAdded();
12951
12953 }
12954
12955
12957 {
12958 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12959 {
12961 {
12962 float energy_0to1 = GetCompEM().GetEnergy0To1();
12964 }
12965 }
12966 }
12967
12968
12970 {
12971 return ConfigGetFloat("heatIsolation");
12972 }
12973
12975 {
12977 }
12978
12980 {
12981 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12982 if (
g_Game.ConfigIsExisting(paramPath))
12983 return g_Game.ConfigGetFloat(paramPath);
12984
12985 return 0.0;
12986 }
12987
12989 {
12990 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12991 if (
g_Game.ConfigIsExisting(paramPath))
12992 return g_Game.ConfigGetFloat(paramPath);
12993
12994 return 0.0;
12995 }
12996
12997 override void SetWet(
float value,
bool allow_client =
false)
12998 {
12999 if (!IsServerCheck(allow_client))
13000 return;
13001
13004
13006
13007 m_VarWet = Math.Clamp(value, min, max);
13008
13010 {
13013 }
13014 }
13015
13016 override void AddWet(
float value)
13017 {
13019 }
13020
13022 {
13024 }
13025
13027 {
13029 }
13030
13032 {
13034 }
13035
13037 {
13039 }
13040
13042 {
13044 }
13045
13046 override void OnWetChanged(
float newVal,
float oldVal)
13047 {
13050 if (newLevel != oldLevel)
13051 {
13053 }
13054 }
13055
13057 {
13058 SetWeightDirty();
13059 }
13060
13062 {
13063 return GetWetLevelInternal(
m_VarWet);
13064 }
13065
13066
13067
13069 {
13071 }
13072
13074 {
13076 }
13077
13079 {
13081 }
13082
13084 {
13086 }
13087
13088
13089
13091 {
13092 if (ConfigIsExisting("itemModelLength"))
13093 {
13094 return ConfigGetFloat("itemModelLength");
13095 }
13096 return 0;
13097 }
13098
13100 {
13101 if (ConfigIsExisting("itemAttachOffset"))
13102 {
13103 return ConfigGetFloat("itemAttachOffset");
13104 }
13105 return 0;
13106 }
13107
13108 override void SetCleanness(
int value,
bool allow_client =
false)
13109 {
13110 if (!IsServerCheck(allow_client))
13111 return;
13112
13114
13116
13119 }
13120
13122 {
13124 }
13125
13127 {
13128 return true;
13129 }
13130
13131
13132
13133
13135 {
13137 }
13138
13140 {
13142 }
13143
13144
13145
13146
13147 override void SetColor(
int r,
int g,
int b,
int a)
13148 {
13154 }
13156 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13157 {
13162 }
13163
13165 {
13167 }
13168
13171 {
13172 int r,g,b,a;
13174 r = r/255;
13175 g = g/255;
13176 b = b/255;
13177 a = a/255;
13178 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13179 }
13180
13181
13182
13183 override void SetLiquidType(
int value,
bool allow_client =
false)
13184 {
13185 if (!IsServerCheck(allow_client))
13186 return;
13187
13192 }
13193
13195 {
13196 return ConfigGetInt("varLiquidTypeInit");
13197 }
13198
13200 {
13202 }
13203
13205 {
13207 SetFrozen(false);
13208 }
13209
13212 {
13213 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13214 }
13215
13216
13219 {
13220 PlayerBase nplayer;
13221 if (PlayerBase.CastTo(nplayer, player))
13222 {
13224 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13225 }
13226 }
13227
13228
13231 {
13232 PlayerBase nplayer;
13233 if (PlayerBase.CastTo(nplayer,player))
13234 {
13235 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13236 }
13237
13238 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13239
13240 if (HasEnergyManager())
13241 {
13242 GetCompEM().UpdatePlugState();
13243 }
13244 }
13245
13246
13248 {
13249 super.OnPlacementStarted(player);
13250
13252 }
13253
13254 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13255 {
13257 {
13258 m_AdminLog.OnPlacementComplete(player,
this);
13259 }
13260
13261 super.OnPlacementComplete(player, position, orientation);
13262 }
13263
13264
13265
13266
13267
13269 {
13271 {
13272 return true;
13273 }
13274 else
13275 {
13276 return false;
13277 }
13278 }
13279
13280
13282 {
13284 {
13286 }
13287 }
13288
13289
13291 {
13293 }
13294
13296 {
13298 }
13299
13300 override void InsertAgent(
int agent,
float count = 1)
13301 {
13302 if (count < 1)
13303 return;
13304
13306 }
13307
13310 {
13312 }
13313
13314
13316 {
13318 }
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13348
13349
13350
13351
13352
13353
13354
13355
13356
13357
13358
13359
13360
13362 {
13364 return false;
13365 return true;
13366 }
13367
13369 {
13370
13372 }
13373
13374
13377 {
13378 super.CheckForRoofLimited(timeTresholdMS);
13379
13380 float time =
g_Game.GetTime();
13381 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13382 {
13383 m_PreviousRoofTestTime = time;
13384 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13385 }
13386 }
13387
13388
13390 {
13392 {
13393 return 0;
13394 }
13395
13396 if (GetInventory().GetAttachmentSlotsCount() != 0)
13397 {
13398 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13399 if (filter)
13400 return filter.GetProtectionLevel(type, false, system);
13401 else
13402 return 0;
13403 }
13404
13405 string subclassPath, entryName;
13406
13407 switch (type)
13408 {
13410 entryName = "biological";
13411 break;
13413 entryName = "chemical";
13414 break;
13415 default:
13416 entryName = "biological";
13417 break;
13418 }
13419
13420 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13421
13422 return g_Game.ConfigGetFloat(subclassPath + entryName);
13423 }
13424
13425
13426
13429 {
13430 if (!IsMagazine())
13432
13434 }
13435
13436
13437
13438
13439
13444 {
13445 return true;
13446 }
13447
13449 {
13451 }
13452
13453
13454
13455
13456
13458 {
13459 if (parent)
13460 {
13461 if (parent.IsInherited(DayZInfected))
13462 return true;
13463
13464 if (!parent.IsRuined())
13465 return true;
13466 }
13467
13468 return true;
13469 }
13470
13472 {
13473 if (!super.CanPutAsAttachment(parent))
13474 {
13475 return false;
13476 }
13477
13478 if (!IsRuined() && !parent.IsRuined())
13479 {
13480 return true;
13481 }
13482
13483 return false;
13484 }
13485
13487 {
13488
13489
13490
13491
13492 return super.CanReceiveItemIntoCargo(item);
13493 }
13494
13496 {
13497
13498
13499
13500
13501 GameInventory attachmentInv = attachment.GetInventory();
13503 {
13504 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13505 return false;
13506 }
13507
13508 InventoryLocation loc = new InventoryLocation();
13509 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13510 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13511 return false;
13512
13513 return super.CanReceiveAttachment(attachment, slotId);
13514 }
13515
13517 {
13518 if (!super.CanReleaseAttachment(attachment))
13519 return false;
13520
13521 return GetInventory().AreChildrenAccessible();
13522 }
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543
13545 {
13546 int id = muzzle_owner.GetMuzzleID();
13547 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13548
13549 if (WPOF_array)
13550 {
13551 for (int i = 0; i < WPOF_array.Count(); i++)
13552 {
13553 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13554
13555 if (WPOF)
13556 {
13557 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13558 }
13559 }
13560 }
13561 }
13562
13563
13565 {
13566 int id = muzzle_owner.GetMuzzleID();
13568
13569 if (WPOBE_array)
13570 {
13571 for (int i = 0; i < WPOBE_array.Count(); i++)
13572 {
13573 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13574
13575 if (WPOBE)
13576 {
13577 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13578 }
13579 }
13580 }
13581 }
13582
13583
13585 {
13586 int id = muzzle_owner.GetMuzzleID();
13587 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13588
13589 if (WPOOH_array)
13590 {
13591 for (int i = 0; i < WPOOH_array.Count(); i++)
13592 {
13593 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13594
13595 if (WPOOH)
13596 {
13597 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13598 }
13599 }
13600 }
13601 }
13602
13603
13605 {
13606 int id = muzzle_owner.GetMuzzleID();
13607 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13608
13609 if (WPOOH_array)
13610 {
13611 for (int i = 0; i < WPOOH_array.Count(); i++)
13612 {
13613 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13614
13615 if (WPOOH)
13616 {
13617 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13618 }
13619 }
13620 }
13621 }
13622
13623
13625 {
13626 int id = muzzle_owner.GetMuzzleID();
13627 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13628
13629 if (WPOOH_array)
13630 {
13631 for (int i = 0; i < WPOOH_array.Count(); i++)
13632 {
13633 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13634
13635 if (WPOOH)
13636 {
13637 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13638 }
13639 }
13640 }
13641 }
13642
13643
13644
13646 {
13648 {
13649 return true;
13650 }
13651
13652 return false;
13653 }
13654
13656 {
13658 {
13659 return true;
13660 }
13661
13662 return false;
13663 }
13664
13666 {
13668 {
13669 return true;
13670 }
13671
13672 return false;
13673 }
13674
13676 {
13677 return false;
13678 }
13679
13682 {
13683 return UATimeSpent.DEFAULT_DEPLOY;
13684 }
13685
13686
13687
13688
13690 {
13692 SetSynchDirty();
13693 }
13694
13696 {
13698 }
13699
13700
13702 {
13703 return false;
13704 }
13705
13708 {
13709 string att_type = "None";
13710
13711 if (ConfigIsExisting("soundAttType"))
13712 {
13713 att_type = ConfigGetString("soundAttType");
13714 }
13715
13717 }
13718
13720 {
13722 }
13723
13724
13725
13726
13727
13733
13735 {
13738
13740 }
13741
13742
13744 {
13746 return;
13747
13749
13752
13755
13756 SoundParameters params = new SoundParameters();
13760 }
13761
13762
13764 {
13766 {
13769
13770 SetSynchDirty();
13771
13774 }
13775 }
13776
13778 {
13780 }
13781
13782
13784 {
13786 return;
13787
13789 SetSynchDirty();
13790
13793 }
13794
13796 {
13799 }
13800
13802 {
13804 }
13805
13806 void OnApply(PlayerBase player);
13807
13809 {
13810 return 1.0;
13811 };
13812
13814 {
13816 }
13817
13819 {
13821 }
13822
13824
13826 {
13827 SetDynamicPhysicsLifeTime(0.01);
13829 }
13830
13832 {
13833 array<string> zone_names = new array<string>;
13834 GetDamageZones(zone_names);
13835 for (int i = 0; i < zone_names.Count(); i++)
13836 {
13837 SetHealthMax(zone_names.Get(i),"Health");
13838 }
13839 SetHealthMax("","Health");
13840 }
13841
13844 {
13845 float global_health = GetHealth01("","Health");
13846 array<string> zones = new array<string>;
13847 GetDamageZones(zones);
13848
13849 for (int i = 0; i < zones.Count(); i++)
13850 {
13851 SetHealth01(zones.Get(i),"Health",global_health);
13852 }
13853 }
13854
13857 {
13858 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13859 }
13860
13862 {
13863 if (!hasRootAsPlayer)
13864 {
13865 if (refParentIB)
13866 {
13867
13868 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13869 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13870
13871 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13872 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13873
13876 }
13877 else
13878 {
13879
13882 }
13883 }
13884 }
13885
13887 {
13889 {
13890 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13891 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13892 {
13893 float heatPermCoef = 1.0;
13895 while (ent)
13896 {
13897 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13898 ent = ent.GetHierarchyParent();
13899 }
13900
13901 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13902 }
13903 }
13904 }
13905
13907 {
13908
13909 EntityAI parent = GetHierarchyParent();
13910 if (!parent)
13911 {
13912 hasParent = false;
13913 hasRootAsPlayer = false;
13914 }
13915 else
13916 {
13917 hasParent = true;
13918 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13919 refParentIB =
ItemBase.Cast(parent);
13920 }
13921 }
13922
13923 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13924 {
13925
13926 }
13927
13929 {
13930
13931 return false;
13932 }
13933
13935 {
13936
13937
13938 return false;
13939 }
13940
13942 {
13943
13944 return false;
13945 }
13946
13949 {
13950 return !GetIsFrozen() &&
IsOpen();
13951 }
13952
13954 {
13955 bool hasParent = false, hasRootAsPlayer = false;
13957
13958 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13959 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13960
13961 if (wwtu || foodDecay)
13962 {
13966
13967 if (processWetness || processTemperature || processDecay)
13968 {
13970
13971 if (processWetness)
13972 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13973
13974 if (processTemperature)
13976
13977 if (processDecay)
13978 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13979 }
13980 }
13981 }
13982
13985 {
13987 }
13988
13990 {
13993
13994 return super.GetTemperatureFreezeThreshold();
13995 }
13996
13998 {
14001
14002 return super.GetTemperatureThawThreshold();
14003 }
14004
14006 {
14009
14010 return super.GetItemOverheatThreshold();
14011 }
14012
14014 {
14016 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
14017
14018 return super.GetTemperatureFreezeTime();
14019 }
14020
14022 {
14024 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
14025
14026 return super.GetTemperatureThawTime();
14027 }
14028
14033
14035 {
14036 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14037 }
14038
14040 {
14041 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14042 }
14043
14046 {
14048 }
14049
14051 {
14053 }
14054
14056 {
14058 }
14059
14062 {
14063 return null;
14064 }
14065
14068 {
14069 return false;
14070 }
14071
14073 {
14075 {
14078 if (!trg)
14079 {
14081 explosive = this;
14082 }
14083
14084 explosive.PairRemote(trg);
14086
14087 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14088 trg.SetPersistentPairID(persistentID);
14089 explosive.SetPersistentPairID(persistentID);
14090
14091 return true;
14092 }
14093 return false;
14094 }
14095
14098 {
14099 float ret = 1.0;
14102 ret *= GetHealth01();
14103
14104 return ret;
14105 }
14106
14107 #ifdef DEVELOPER
14108 override void SetDebugItem()
14109 {
14110 super.SetDebugItem();
14111 _itemBase = this;
14112 }
14113
14115 {
14116 string text = super.GetDebugText();
14117
14119 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14120
14121 return text;
14122 }
14123 #endif
14124
14126 {
14127 return true;
14128 }
14129
14131
14133
14135 {
14138 }
14139
14140
14148
14164
14165 [
Obsolete(
"Use ItemSoundHandler instead")]
14168 {
14169 if (!
g_Game.IsDedicatedServer())
14170 {
14171 if (ConfigIsExisting("attachSoundSet"))
14172 {
14173 string cfg_path = "";
14174 string soundset = "";
14175 string type_name =
GetType();
14176
14179 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14180 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14181
14182 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14183 {
14184 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14185 {
14186 if (cfg_slot_array[i] == slot_type)
14187 {
14188 soundset = cfg_soundset_array[i];
14189 break;
14190 }
14191 }
14192 }
14193
14194 if (soundset != "")
14195 {
14196 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14198 }
14199 }
14200 }
14201 }
14202
14204}
14205
14207{
14209 if (entity)
14210 {
14211 bool is_item = entity.IsInherited(
ItemBase);
14212 if (is_item && full_quantity)
14213 {
14216 }
14217 }
14218 else
14219 {
14221 return NULL;
14222 }
14223 return entity;
14224}
14225
14227{
14228 if (item)
14229 {
14230 if (health > 0)
14231 item.SetHealth("", "", health);
14232
14233 if (item.CanHaveTemperature())
14234 {
14236 if (item.CanFreeze())
14237 item.SetFrozen(false);
14238 }
14239
14240 if (item.HasEnergyManager())
14241 {
14242 if (quantity >= 0)
14243 {
14244 item.GetCompEM().SetEnergy0To1(quantity);
14245 }
14246 else
14247 {
14249 }
14250 }
14251 else if (item.IsMagazine())
14252 {
14253 Magazine mag = Magazine.Cast(item);
14254 if (quantity >= 0)
14255 {
14256 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14257 }
14258 else
14259 {
14261 }
14262
14263 }
14264 else
14265 {
14266 if (quantity >= 0)
14267 {
14268 item.SetQuantityNormalized(quantity, false);
14269 }
14270 else
14271 {
14273 }
14274
14275 }
14276 }
14277}
14278
14279#ifdef DEVELOPER
14281#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
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.