9275{
9277 {
9278 return true;
9279 }
9280};
9281
9283{
9284
9285};
9286
9287
9288
9290{
9294
9296
9299
9300
9301
9302
9303
9312
9318
9323
9328
9349 protected bool m_IsResultOfSplit
9350
9352
9357
9358
9359
9361
9365
9366
9367
9369
9372
9373
9374
9380
9381
9389
9392
9393
9395
9396
9398
9399
9404
9405
9410
9412
9413
9415
9416
9418 {
9423
9424 if (!
g_Game.IsDedicatedServer())
9425 {
9427 {
9429
9431 {
9433 }
9434 }
9435
9438 }
9439
9440 m_OldLocation = null;
9441
9443 {
9445 }
9446
9447 if (ConfigIsExisting("headSelectionsToHide"))
9448 {
9451 }
9452
9454 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9455 {
9457 }
9458
9460
9461 m_IsResultOfSplit = false;
9462
9464 }
9465
9467 {
9468 super.InitItemVariables();
9469
9475 m_Count = ConfigGetInt(
"count");
9476
9479
9484
9487
9492
9504
9508
9509
9512 if (ConfigIsExisting("canBeSplit"))
9513 {
9516 }
9517
9519 if (ConfigIsExisting("itemBehaviour"))
9521
9522
9525 RegisterNetSyncVariableInt("m_VarLiquidType");
9526 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9527
9528 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9529 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9530 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9531
9532 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9533 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9534 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9535 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9536
9537 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9538 RegisterNetSyncVariableBool("m_IsTakeable");
9539 RegisterNetSyncVariableBool("m_IsHologram");
9540
9543 {
9546 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9547 }
9548
9550
9552 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9554
9556 }
9557
9559 {
9561 }
9562
9564 {
9567 {
9572 }
9573 }
9574
9575 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9576 {
9578 {
9581 }
9582
9584 }
9585
9587 {
9593 }
9594
9596
9598 {
9600
9601 if (!action)
9602 {
9603 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9604 return;
9605 }
9606
9608 if (!ai)
9609 {
9611 return;
9612 }
9613
9615 if (!action_array)
9616 {
9617 action_array = new array<ActionBase_Basic>;
9619 }
9620 if (LogManager.IsActionLogEnable())
9621 {
9622 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9623 }
9624
9625 if (action_array.Find(action) != -1)
9626 {
9627 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9628 }
9629 else
9630 {
9631 action_array.Insert(action);
9632 }
9633 }
9634
9636 {
9637 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9638 ActionBase action = player.GetActionManager().GetAction(actionName);
9641
9642 if (action_array)
9643 {
9644 action_array.RemoveItem(action);
9645 }
9646 }
9647
9648
9649
9651 {
9652 ActionOverrideData overrideData = new ActionOverrideData();
9656
9658 if (!actionMap)
9659 {
9662 }
9663
9664 actionMap.Insert(this.
Type(), overrideData);
9665
9666 }
9667
9669
9671
9672
9674 {
9677
9680
9681 string config_to_search = "CfgVehicles";
9682 string muzzle_owner_config;
9683
9685 {
9686 if (IsInherited(Weapon))
9687 config_to_search = "CfgWeapons";
9688
9689 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9690
9691 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9692
9693 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9694
9695 if (config_OnFire_subclass_count > 0)
9696 {
9697 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9698
9699 for (int i = 0; i < config_OnFire_subclass_count; i++)
9700 {
9701 string particle_class = "";
9702 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9703 string config_OnFire_entry = config_OnFire_class + particle_class;
9704 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9705 WPOF_array.Insert(WPOF);
9706 }
9707
9708
9710 }
9711 }
9712
9714 {
9715 config_to_search = "CfgWeapons";
9716 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9717
9718 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9719
9720 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9721
9722 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9723 {
9724 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9725
9726 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9727 {
9728 string particle_class2 = "";
9729 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9730 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9731 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9732 WPOBE_array.Insert(WPOBE);
9733 }
9734
9735
9737 }
9738 }
9739 }
9740
9741
9743 {
9746
9748 {
9749 string config_to_search = "CfgVehicles";
9750
9751 if (IsInherited(Weapon))
9752 config_to_search = "CfgWeapons";
9753
9754 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9755 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9756
9757 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9758 {
9759
9761
9763 {
9765 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9767 return;
9768 }
9769
9772
9773
9774
9775 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9776 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9777
9778 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9779 {
9780 string particle_class = "";
9781 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9782 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9783 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9784
9785 if (entry_type == CT_CLASS)
9786 {
9787 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9788 WPOOH_array.Insert(WPOF);
9789 }
9790 }
9791
9792
9794 }
9795 }
9796 }
9797
9799 {
9801 }
9802
9804 {
9806 {
9808
9811
9814
9815 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9816 }
9817 }
9818
9820 {
9822 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9823
9825 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9826
9828 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9829
9831 {
9833 }
9834 }
9835
9837 {
9839 }
9840
9842 {
9845 else
9847
9849 {
9852 }
9853 else
9854 {
9857
9860 }
9861
9863 }
9864
9866 {
9868 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9869 }
9870
9872 {
9874 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9876 }
9877
9879 {
9881 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9882 }
9883
9885 {
9888
9889 OverheatingParticle OP = new OverheatingParticle();
9894
9896 }
9897
9899 {
9902
9903 return -1;
9904 }
9905
9907 {
9909 {
9912
9913 for (int i = count; i > 0; --i)
9914 {
9915 int id = i - 1;
9918
9921
9922 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9923 {
9924 if (p)
9925 {
9928 }
9929 }
9930 }
9931 }
9932 }
9933
9935 {
9937 {
9939 {
9940 int id = i - 1;
9942
9943 if (OP)
9944 {
9946
9947 if (p)
9948 {
9950 }
9951
9952 delete OP;
9953 }
9954 }
9955
9958 }
9959 }
9960
9963 {
9964 return 0.0;
9965 }
9966
9967
9969 {
9970 return 250;
9971 }
9972
9974 {
9975 return 0;
9976 }
9977
9980 {
9982 return true;
9983
9984 return false;
9985 }
9986
9989 {
9992
9994 {
9996 }
9997 else
9998 {
9999
10001 }
10002
10004 }
10005
10012 {
10013 return -1;
10014 }
10015
10016
10017
10018
10020 {
10022 {
10023 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10024 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10025
10026 if (r_index >= 0)
10027 {
10028 InventoryLocation r_il = new InventoryLocation;
10029 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10030
10031 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10034 {
10035 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10036 }
10038 {
10039 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10040 }
10041
10042 }
10043
10044 player.GetHumanInventory().ClearUserReservedLocation(this);
10045 }
10046
10049 }
10050
10051
10052
10053
10055 {
10056 return ItemBase.m_DebugActionsMask;
10057 }
10058
10060 {
10061 return ItemBase.m_DebugActionsMask & mask;
10062 }
10063
10065 {
10066 ItemBase.m_DebugActionsMask = mask;
10067 }
10068
10070 {
10071 ItemBase.m_DebugActionsMask |= mask;
10072 }
10073
10075 {
10076 ItemBase.m_DebugActionsMask &= ~mask;
10077 }
10078
10080 {
10082 {
10084 }
10085 else
10086 {
10088 }
10089 }
10090
10091
10093 {
10094 if (GetEconomyProfile())
10095 {
10096 float q_max = GetEconomyProfile().GetQuantityMax();
10097 if (q_max > 0)
10098 {
10099 float q_min = GetEconomyProfile().GetQuantityMin();
10100 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10101
10103 {
10104 ComponentEnergyManager comp = GetCompEM();
10106 {
10108 }
10109 }
10111 {
10113
10114 }
10115
10116 }
10117 }
10118 }
10119
10122 {
10123 EntityAI parent = GetHierarchyParent();
10124
10125 if (parent)
10126 {
10127 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10128 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10129 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10130 }
10131 }
10132
10135 {
10136 EntityAI parent = GetHierarchyParent();
10137
10138 if (parent)
10139 {
10140 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10141 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10142 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10143 }
10144 }
10145
10147 {
10148
10149
10150
10151
10153
10155 {
10156 if (ScriptInputUserData.CanStoreInputUserData())
10157 {
10158 ScriptInputUserData ctx = new ScriptInputUserData;
10164 ctx.
Write(use_stack_max);
10167
10169 {
10170 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10171 }
10172 }
10173 }
10174 else if (!
g_Game.IsMultiplayer())
10175 {
10177 }
10178 }
10179
10181 {
10183 }
10184
10186 {
10188 }
10189
10191 {
10193 }
10194
10196 {
10197
10198 return false;
10199 }
10200
10202 {
10203 return false;
10204 }
10205
10209 {
10210 return false;
10211 }
10212
10214 {
10215 return "";
10216 }
10217
10219
10221 {
10222 return false;
10223 }
10224
10226 {
10227 return true;
10228 }
10229
10230
10231
10233 {
10234 return true;
10235 }
10236
10238 {
10239 return true;
10240 }
10241
10243 {
10244 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10246 }
10247
10249 {
10251 }
10252
10254 {
10256 if (!is_being_placed)
10258 SetSynchDirty();
10259 }
10260
10261
10263
10265 {
10267 }
10268
10270 {
10272 }
10273
10275 {
10276 return 1;
10277 }
10278
10280 {
10281 return false;
10282 }
10283
10285 {
10287 SetSynchDirty();
10288 }
10289
10290
10291
10292
10293
10294
10295
10296
10297
10298
10299
10300
10301
10302
10303
10304
10305
10306
10307
10308
10309
10310
10311
10312
10313
10314
10315
10316
10317
10318
10319
10320
10321
10322
10323
10325 {
10326 super.OnMovedInsideCargo(container);
10327
10328 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10329 }
10330
10331 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10332 {
10333 super.EEItemLocationChanged(oldLoc, newLoc);
10334
10335 PlayerBase newPlayer = null;
10336 PlayerBase oldPlayer = null;
10337
10338 if (newLoc.GetParent())
10339 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10340
10341 if (oldLoc.GetParent())
10342 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10343
10345 {
10346 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10347
10348 if (rIndex >= 0)
10349 {
10350 InventoryLocation rIl = new InventoryLocation;
10351 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10352
10353 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10356 {
10357 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10358 }
10360 {
10362 }
10363
10364 }
10365 }
10366
10368 {
10369 if (newPlayer)
10370 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10371
10372 if (newPlayer == oldPlayer)
10373 {
10374 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10375 {
10377 {
10378 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10379 {
10380 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10381 }
10382 }
10383 else
10384 {
10385 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10386 }
10387 }
10388
10389 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10390 {
10391 int type = oldLoc.GetType();
10393 {
10394 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10395 }
10397 {
10398 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10399 }
10400 }
10401 if (!m_OldLocation)
10402 {
10403 m_OldLocation = new InventoryLocation;
10404 }
10405 m_OldLocation.Copy(oldLoc);
10406 }
10407 else
10408 {
10409 if (m_OldLocation)
10410 {
10411 m_OldLocation.Reset();
10412 }
10413 }
10414
10415 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10416 }
10417 else
10418 {
10419 if (newPlayer)
10420 {
10421 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10422 if (resIndex >= 0)
10423 {
10424 InventoryLocation il = new InventoryLocation;
10425 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10427 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10430 {
10431 il.
GetParent().GetOnReleaseLock().Invoke(it);
10432 }
10434 {
10436 }
10437
10438 }
10439 }
10441 {
10442
10444 }
10445
10446 if (m_OldLocation)
10447 {
10448 m_OldLocation.Reset();
10449 }
10450 }
10451
10453 {
10454 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10455 }
10456
10458 {
10459 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10460 }
10461 }
10462
10463 override void EOnContact(IEntity other, Contact extra)
10464 {
10466 {
10467 int liquidType = -1;
10469 if (impactSpeed > 0.0)
10470 {
10472 #ifndef SERVER
10474 #else
10476 SetSynchDirty();
10477 #endif
10479 }
10480 }
10481
10482 #ifdef SERVER
10483 if (GetCompEM() && GetCompEM().IsPlugged())
10484 {
10485 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10486 GetCompEM().UnplugThis();
10487 }
10488 #endif
10489 }
10490
10492
10494 {
10496 }
10497
10499 {
10500
10501 }
10502
10504 {
10505 super.OnItemLocationChanged(old_owner, new_owner);
10506
10507 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10508 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10509
10510 if (!relatedPlayer && playerNew)
10511 relatedPlayer = playerNew;
10512
10513 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10514 {
10516 if (actionMgr)
10517 {
10518 ActionBase currentAction = actionMgr.GetRunningAction();
10519 if (currentAction)
10521 }
10522 }
10523
10524 Man ownerPlayerOld = null;
10525 Man ownerPlayerNew = null;
10526
10527 if (old_owner)
10528 {
10529 if (old_owner.
IsMan())
10530 {
10531 ownerPlayerOld = Man.Cast(old_owner);
10532 }
10533 else
10534 {
10535 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10536 }
10537 }
10538 else
10539 {
10541 {
10543
10544 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10545 {
10546 GetCompEM().UnplugThis();
10547 }
10548 }
10549 }
10550
10551 if (new_owner)
10552 {
10553 if (new_owner.
IsMan())
10554 {
10555 ownerPlayerNew = Man.Cast(new_owner);
10556 }
10557 else
10558 {
10559 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10560 }
10561 }
10562
10563 if (ownerPlayerOld != ownerPlayerNew)
10564 {
10565 if (ownerPlayerOld)
10566 {
10567 array<EntityAI> subItemsExit = new array<EntityAI>;
10569 for (int i = 0; i < subItemsExit.Count(); i++)
10570 {
10573 }
10574 }
10575
10576 if (ownerPlayerNew)
10577 {
10578 array<EntityAI> subItemsEnter = new array<EntityAI>;
10580 for (int j = 0; j < subItemsEnter.Count(); j++)
10581 {
10584 }
10585 }
10586 }
10587 else if (ownerPlayerNew != null)
10588 {
10589 PlayerBase nplayer;
10590 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10591 {
10592 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10594 for (int k = 0; k < subItemsUpdate.Count(); k++)
10595 {
10597 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10598 }
10599 }
10600 }
10601
10602 if (old_owner)
10603 old_owner.OnChildItemRemoved(this);
10604 if (new_owner)
10605 new_owner.OnChildItemReceived(this);
10606 }
10607
10608
10610 {
10611 super.EEDelete(parent);
10612 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10613 if (player)
10614 {
10616
10617 if (player.IsAlive())
10618 {
10619 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10620 if (r_index >= 0)
10621 {
10622 InventoryLocation r_il = new InventoryLocation;
10623 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10624
10625 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10628 {
10629 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10630 }
10632 {
10633 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10634 }
10635
10636 }
10637
10638 player.RemoveQuickBarEntityShortcut(this);
10639 }
10640 }
10641 }
10642
10644 {
10645 super.EEKilled(killer);
10646
10649 {
10650 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10651 {
10652 if (IsMagazine())
10653 {
10654 if (Magazine.Cast(this).GetAmmoCount() > 0)
10655 {
10657 }
10658 }
10659 else
10660 {
10662 }
10663 }
10664 }
10665 }
10666
10668 {
10669 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10670
10671 super.OnWasAttached(parent, slot_id);
10672
10675
10678 }
10679
10681 {
10682 super.OnWasDetached(parent, slot_id);
10683
10686
10689 }
10690
10692 {
10693 int idx;
10696
10697 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10698 if (inventory_slots.Count() < 1)
10699 {
10700 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10701 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10702 }
10703 else
10704 {
10705 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10706 }
10707
10708 idx = inventory_slots.Find(slot);
10709 if (idx < 0)
10710 return "";
10711
10712 return attach_types.Get(idx);
10713 }
10714
10716 {
10717 int idx = -1;
10718 string slot;
10719
10722
10723 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10724 if (inventory_slots.Count() < 1)
10725 {
10726 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10727 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10728 }
10729 else
10730 {
10731 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10732 if (detach_types.Count() < 1)
10733 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10734 }
10735
10736 for (int i = 0; i < inventory_slots.Count(); i++)
10737 {
10738 slot = inventory_slots.Get(i);
10739 }
10740
10741 if (slot != "")
10742 {
10743 if (detach_types.Count() == 1)
10744 idx = 0;
10745 else
10746 idx = inventory_slots.Find(slot);
10747 }
10748 if (idx < 0)
10749 return "";
10750
10751 return detach_types.Get(idx);
10752 }
10753
10755 {
10756
10758
10759
10760 float min_time = 1;
10761 float max_time = 3;
10762 float delay = Math.RandomFloat(min_time, max_time);
10763
10764 explode_timer.Run(delay, this, "DoAmmoExplosion");
10765 }
10766
10768 {
10769 Magazine magazine = Magazine.Cast(this);
10770 int pop_sounds_count = 6;
10771 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10772
10773
10774 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10775 string sound_name = pop_sounds[ sound_idx ];
10776 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10777
10778
10779 magazine.ServerAddAmmoCount(-1);
10780
10781
10782 float min_temp_to_explode = 100;
10783
10784 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10785 {
10787 }
10788 }
10789
10790
10791 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10792 {
10793 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10794
10795 const int CHANCE_DAMAGE_CARGO = 4;
10796 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10797 const int CHANCE_DAMAGE_NOTHING = 2;
10798
10800 {
10801 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10802 int chances;
10803 int rnd;
10804
10805 if (GetInventory().GetCargo())
10806 {
10807 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10808 rnd = Math.RandomInt(0,chances);
10809
10810 if (rnd < CHANCE_DAMAGE_CARGO)
10811 {
10813 }
10814 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10815 {
10817 }
10818 }
10819 else
10820 {
10821 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10822 rnd = Math.RandomInt(0,chances);
10823
10824 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10825 {
10827 }
10828 }
10829 }
10830 }
10831
10833 {
10834 CargoBase cargo = GetInventory().GetCargo();
10835 if (cargo)
10836 {
10838 if (item_count > 0)
10839 {
10840 int random_pick = Math.RandomInt(0, item_count);
10842 if (!item.IsExplosive())
10843 {
10844 item.AddHealth("","",damage);
10845 return true;
10846 }
10847 }
10848 }
10849 return false;
10850 }
10851
10853 {
10854 GameInventory inventory = GetInventory();
10856 if (attachment_count > 0)
10857 {
10858 int random_pick = Math.RandomInt(0, attachment_count);
10860 if (!attachment.IsExplosive())
10861 {
10862 attachment.AddHealth("","",damage);
10863 return true;
10864 }
10865 }
10866 return false;
10867 }
10868
10870 {
10872 }
10873
10875 {
10877 return GetInventory().CanRemoveEntity();
10878
10879 return false;
10880 }
10881
10883 {
10884
10886 return false;
10887
10888
10890 return false;
10891
10892
10893
10895 if (delta == 0)
10896 return false;
10897
10898
10899 return true;
10900 }
10901
10903 {
10905 {
10906 if (ScriptInputUserData.CanStoreInputUserData())
10907 {
10908 ScriptInputUserData ctx = new ScriptInputUserData;
10913 ctx.
Write(destination_entity);
10915 ctx.
Write(slot_id);
10917 }
10918 }
10919 else if (!
g_Game.IsMultiplayer())
10920 {
10922 }
10923 }
10924
10926 {
10927 float split_quantity_new;
10931 InventoryLocation loc = new InventoryLocation;
10932
10933 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10934 {
10936 split_quantity_new = stack_max;
10937 else
10939
10941 {
10942 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10943 if (new_item)
10944 {
10945 new_item.SetResultOfSplit(true);
10946 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10948 new_item.
SetQuantity(split_quantity_new,
false,
true);
10949 }
10950 }
10951 }
10952 else if (destination_entity && slot_id == -1)
10953 {
10954 if (quantity > stack_max)
10955 split_quantity_new = stack_max;
10956 else
10957 split_quantity_new = quantity;
10958
10960 {
10961 GameInventory destinationInventory = destination_entity.GetInventory();
10963 {
10966 }
10967
10968 if (new_item)
10969 {
10970 new_item.SetResultOfSplit(true);
10971 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10973 new_item.
SetQuantity(split_quantity_new,
false,
true);
10974 }
10975 }
10976 }
10977 else
10978 {
10979 if (stack_max != 0)
10980 {
10982 {
10984 }
10985
10986 if (split_quantity_new == 0)
10987 {
10988 if (!
g_Game.IsMultiplayer())
10989 player.PhysicalPredictiveDropItem(this);
10990 else
10991 player.ServerDropEntity(this);
10992 return;
10993 }
10994
10996 {
10998
10999 if (new_item)
11000 {
11001 new_item.SetResultOfSplit(true);
11002 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11005 new_item.PlaceOnSurface();
11006 }
11007 }
11008 }
11009 }
11010 }
11011
11013 {
11014 float split_quantity_new;
11018 InventoryLocation loc = new InventoryLocation;
11019
11020 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
11021 {
11023 split_quantity_new = stack_max;
11024 else
11026
11028 {
11029 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
11030 if (new_item)
11031 {
11032 new_item.SetResultOfSplit(true);
11033 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11035 new_item.
SetQuantity(split_quantity_new,
false,
true);
11036 }
11037 }
11038 }
11039 else if (destination_entity && slot_id == -1)
11040 {
11041 if (quantity > stack_max)
11042 split_quantity_new = stack_max;
11043 else
11044 split_quantity_new = quantity;
11045
11047 {
11048 GameInventory destinationInventory = destination_entity.GetInventory();
11050 {
11053 }
11054
11055 if (new_item)
11056 {
11057 new_item.SetResultOfSplit(true);
11058 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11060 new_item.
SetQuantity(split_quantity_new,
false,
true);
11061 }
11062 }
11063 }
11064 else
11065 {
11066 if (stack_max != 0)
11067 {
11069 {
11071 }
11072
11074 {
11076
11077 if (new_item)
11078 {
11079 new_item.SetResultOfSplit(true);
11080 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11083 new_item.PlaceOnSurface();
11084 }
11085 }
11086 }
11087 }
11088 }
11089
11091 {
11093 {
11094 if (ScriptInputUserData.CanStoreInputUserData())
11095 {
11096 ScriptInputUserData ctx = new ScriptInputUserData;
11101 dst.WriteToContext(ctx);
11103 }
11104 }
11105 else if (!
g_Game.IsMultiplayer())
11106 {
11108 }
11109 }
11110
11112 {
11114 {
11115 if (ScriptInputUserData.CanStoreInputUserData())
11116 {
11117 ScriptInputUserData ctx = new ScriptInputUserData;
11122 ctx.
Write(destination_entity);
11128 }
11129 }
11130 else if (!
g_Game.IsMultiplayer())
11131 {
11133 }
11134 }
11135
11137 {
11139 }
11140
11142 {
11144 float split_quantity_new;
11146 if (dst.IsValid())
11147 {
11148 int slot_id = dst.GetSlot();
11150
11151 if (quantity > stack_max)
11152 split_quantity_new = stack_max;
11153 else
11154 split_quantity_new = quantity;
11155
11157 {
11159
11160 if (new_item)
11161 {
11162 new_item.SetResultOfSplit(true);
11163 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11165 new_item.
SetQuantity(split_quantity_new,
false,
true);
11166 }
11167
11168 return new_item;
11169 }
11170 }
11171
11172 return null;
11173 }
11174
11176 {
11178 float split_quantity_new;
11180 if (destination_entity)
11181 {
11183 if (quantity > stackable)
11184 split_quantity_new = stackable;
11185 else
11186 split_quantity_new = quantity;
11187
11189 {
11190 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11191 if (new_item)
11192 {
11193 new_item.SetResultOfSplit(true);
11194 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11196 new_item.
SetQuantity(split_quantity_new,
false,
true);
11197 }
11198 }
11199 }
11200 }
11201
11203 {
11205 {
11206 if (ScriptInputUserData.CanStoreInputUserData())
11207 {
11208 ScriptInputUserData ctx = new ScriptInputUserData;
11213 ItemBase destination_entity =
this;
11214 ctx.
Write(destination_entity);
11218 }
11219 }
11220 else if (!
g_Game.IsMultiplayer())
11221 {
11223 }
11224 }
11225
11227 {
11229 float split_quantity_new;
11231 if (player)
11232 {
11234 if (quantity > stackable)
11235 split_quantity_new = stackable;
11236 else
11237 split_quantity_new = quantity;
11238
11240 {
11241 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11242 new_item =
ItemBase.Cast(in_hands);
11243 if (new_item)
11244 {
11245 new_item.SetResultOfSplit(true);
11246 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11248 new_item.SetQuantity(split_quantity_new, false, true);
11249 }
11250 }
11251 }
11252 }
11253
11255 {
11257 float split_quantity_new = Math.Floor(quantity * 0.5);
11258
11260 return;
11261
11263
11264 if (new_item)
11265 {
11266 if (new_item.GetQuantityMax() < split_quantity_new)
11267 {
11268 split_quantity_new = new_item.GetQuantityMax();
11269 }
11270
11271 new_item.SetResultOfSplit(true);
11272 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11273
11275 {
11278 }
11279 else
11280 {
11282 new_item.
SetQuantity(split_quantity_new,
false,
true);
11283 }
11284 }
11285 }
11286
11288 {
11290 float split_quantity_new = Math.Floor(quantity / 2);
11291
11293 return;
11294
11295 InventoryLocation invloc = new InventoryLocation;
11297
11299 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11300
11301 if (new_item)
11302 {
11303 if (new_item.GetQuantityMax() < split_quantity_new)
11304 {
11305 split_quantity_new = new_item.GetQuantityMax();
11306 }
11308 {
11311 }
11312 else if (split_quantity_new > 1)
11313 {
11315 new_item.
SetQuantity(split_quantity_new,
false,
true);
11316 }
11317 }
11318 }
11319
11322 {
11323 SetWeightDirty();
11325
11326 if (parent)
11327 parent.OnAttachmentQuantityChangedEx(this, delta);
11328
11330 {
11332 {
11334 }
11336 {
11337 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11339 }
11340 }
11341 }
11342
11345 {
11346
11347 }
11348
11351 {
11353 }
11354
11356 {
11357 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11358
11360 {
11361 if (newLevel == GameConstants.STATE_RUINED)
11362 {
11364 EntityAI parent = GetHierarchyParent();
11365 if (parent && parent.IsFireplace())
11366 {
11367 CargoBase cargo = GetInventory().GetCargo();
11368 if (cargo)
11369 {
11371 {
11373 }
11374 }
11375 }
11376 }
11377
11379 {
11380
11382 return;
11383 }
11384
11385 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11386 {
11388 }
11389 }
11390 }
11391
11392
11394 {
11395 super.OnRightClick();
11396
11398 {
11400 {
11401 if (ScriptInputUserData.CanStoreInputUserData())
11402 {
11403 EntityAI root = GetHierarchyRoot();
11404 Man playerOwner = GetHierarchyRootPlayer();
11405 InventoryLocation dst = new InventoryLocation;
11406
11407
11408 if (!playerOwner && root && root == this)
11409 {
11411 }
11412 else
11413 {
11414
11415 GetInventory().GetCurrentInventoryLocation(dst);
11417 {
11418 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11420 {
11422 }
11423 else
11424 {
11426
11427
11428 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11429 {
11431 }
11432 else
11433 {
11434 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11435 }
11436 }
11437 }
11438 }
11439
11440 ScriptInputUserData ctx = new ScriptInputUserData;
11448 }
11449 }
11450 else if (!
g_Game.IsMultiplayer())
11451 {
11453 }
11454 }
11455 }
11456
11458 {
11459 if (root)
11460 {
11461 vector m4[4];
11462 root.GetTransform(m4);
11463 dst.SetGround(this, m4);
11464 }
11465 else
11466 {
11467 GetInventory().GetCurrentInventoryLocation(dst);
11468 }
11469 }
11470
11471 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11472 {
11473
11474 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11475 return false;
11476
11477 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11478 return false;
11479
11480
11482 return false;
11483
11484
11485 Magazine mag = Magazine.Cast(this);
11486 if (mag)
11487 {
11488 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11489 return false;
11490
11491 if (stack_max_limit)
11492 {
11493 Magazine other_mag = Magazine.Cast(other_item);
11494 if (other_item)
11495 {
11496 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11497 return false;
11498 }
11499
11500 }
11501 }
11502 else
11503 {
11504
11506 return false;
11507
11509 return false;
11510 }
11511
11512 PlayerBase player = null;
11513 if (CastTo(player, GetHierarchyRootPlayer()))
11514 {
11515 if (player.GetInventory().HasAttachment(this))
11516 return false;
11517
11518 if (player.IsItemsToDelete())
11519 return false;
11520 }
11521
11522 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11523 return false;
11524
11525 int slotID;
11527 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11528 return false;
11529
11530 return true;
11531 }
11532
11534 {
11536 }
11537
11539 {
11540 return m_IsResultOfSplit;
11541 }
11542
11544 {
11545 m_IsResultOfSplit = value;
11546 }
11547
11549 {
11551 }
11552
11554 {
11555 float other_item_quantity = other_item.GetQuantity();
11556 float this_free_space;
11557
11559
11561
11562 if (other_item_quantity > this_free_space)
11563 {
11564 return this_free_space;
11565 }
11566 else
11567 {
11568 return other_item_quantity;
11569 }
11570 }
11571
11573 {
11575 }
11576
11578 {
11580 return;
11581
11582 if (!IsMagazine() && other_item)
11583 {
11585 if (quantity_used != 0)
11586 {
11587 float hp1 = GetHealth01("","");
11588 float hp2 = other_item.GetHealth01("","");
11589 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11590 hpResult = hpResult / (
GetQuantity() + quantity_used);
11591
11592 hpResult *= GetMaxHealth();
11593 Math.Round(hpResult);
11594 SetHealth("", "Health", hpResult);
11595
11597 other_item.AddQuantity(-quantity_used);
11598 }
11599 }
11601 }
11602
11604 {
11605 #ifdef SERVER
11606 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11607 GetHierarchyParent().IncreaseLifetimeUp();
11608 #endif
11609 };
11610
11612 {
11613 PlayerBase p = PlayerBase.Cast(player);
11614
11615 array<int> recipesIds = p.m_Recipes;
11616 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11617 if (moduleRecipesManager)
11618 {
11619 EntityAI itemInHands = player.GetEntityInHands();
11620 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11621 }
11622
11623 for (int i = 0;i < recipesIds.Count(); i++)
11624 {
11625 int key = recipesIds.Get(i);
11626 string recipeName = moduleRecipesManager.GetRecipeName(key);
11628 }
11629 }
11630
11631
11632 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11633 {
11634 super.GetDebugActions(outputList);
11635
11636
11642
11643
11648
11653
11654
11658
11659
11661 {
11665 }
11666
11669
11670
11674
11676
11677 InventoryLocation loc = new InventoryLocation();
11678 GetInventory().GetCurrentInventoryLocation(loc);
11680 {
11681 if (Gizmo_IsSupported())
11684 }
11685
11687 }
11688
11689
11690
11691
11693 {
11694 super.OnAction(action_id, player, ctx);
11695
11697 {
11698 switch (action_id)
11699 {
11703 return true;
11707 return true;
11708 }
11709 }
11710
11712 {
11713 switch (action_id)
11714 {
11716 Delete();
11717 return true;
11718 }
11719 }
11720
11721 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11722 {
11723 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11724 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11725 PlayerBase p = PlayerBase.Cast(player);
11726 if (
EActions.RECIPES_RANGE_START < 1000)
11727 {
11728 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11729 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11730 }
11731 }
11732 #ifndef SERVER
11733 else if (action_id ==
EActions.WATCH_PLAYER)
11734 {
11735 PluginDeveloper.SetDeveloperItemClientEx(player);
11736 }
11737 #endif
11739 {
11740 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11741 {
11742 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11743 OnDebugButtonPressServer(id + 1);
11744 }
11745
11746 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11747 {
11748 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11750 }
11751
11752 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11753 {
11754 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11756 }
11757
11758 else if (action_id ==
EActions.ADD_QUANTITY)
11759 {
11760 if (IsMagazine())
11761 {
11762 Magazine mag = Magazine.Cast(this);
11763 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11764 }
11765 else
11766 {
11768 }
11769
11770 if (m_EM)
11771 {
11772 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11773 }
11774
11775 }
11776
11777 else if (action_id ==
EActions.REMOVE_QUANTITY)
11778 {
11779 if (IsMagazine())
11780 {
11781 Magazine mag2 = Magazine.Cast(this);
11782 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11783 }
11784 else
11785 {
11787 }
11788 if (m_EM)
11789 {
11790 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11791 }
11792
11793 }
11794
11795 else if (action_id ==
EActions.SET_QUANTITY_0)
11796 {
11798
11799 if (m_EM)
11800 {
11801 m_EM.SetEnergy(0);
11802 }
11803 }
11804
11805 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11806 {
11808
11809 if (m_EM)
11810 {
11811 m_EM.SetEnergy(m_EM.GetEnergyMax());
11812 }
11813 }
11814
11815 else if (action_id ==
EActions.ADD_HEALTH)
11816 {
11817 AddHealth("","",GetMaxHealth("","Health")/5);
11818 }
11819 else if (action_id ==
EActions.REMOVE_HEALTH)
11820 {
11821 AddHealth("","",-GetMaxHealth("","Health")/5);
11822 }
11823 else if (action_id ==
EActions.DESTROY_HEALTH)
11824 {
11825 SetHealth01("","",0);
11826 }
11827 else if (action_id ==
EActions.WATCH_ITEM)
11828 {
11830 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11831 #ifdef DEVELOPER
11832 SetDebugDeveloper_item(this);
11833 #endif
11834 }
11835
11836 else if (action_id ==
EActions.ADD_TEMPERATURE)
11837 {
11838 AddTemperature(20);
11839
11840 }
11841
11842 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11843 {
11844 AddTemperature(-20);
11845
11846 }
11847
11848 else if (action_id ==
EActions.FLIP_FROZEN)
11849 {
11850 SetFrozen(!GetIsFrozen());
11851
11852 }
11853
11854 else if (action_id ==
EActions.ADD_WETNESS)
11855 {
11857
11858 }
11859
11860 else if (action_id ==
EActions.REMOVE_WETNESS)
11861 {
11863
11864 }
11865
11866 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11867 {
11870
11871
11872 }
11873
11874 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11875 {
11878 }
11879
11880 else if (action_id ==
EActions.MAKE_SPECIAL)
11881 {
11882 auto debugParams = DebugSpawnParams.WithPlayer(player);
11883 OnDebugSpawnEx(debugParams);
11884 }
11885
11886 }
11887
11888
11889 return false;
11890 }
11891
11892
11893
11894
11898
11901
11902
11903
11905 {
11906 return false;
11907 }
11908
11909
11911 {
11912 return true;
11913 }
11914
11915
11917 {
11918 return true;
11919 }
11920
11921
11922
11924 {
11925 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11926 return g_Game.ConfigIsExisting(config_path);
11927 }
11928
11931 {
11932 return null;
11933 }
11934
11936 {
11937 return false;
11938 }
11939
11941 {
11942 return false;
11943 }
11944
11948
11949
11951 {
11952 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11953 return module_repairing.CanRepair(this, item_repair_kit);
11954 }
11955
11956
11957 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11958 {
11959 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11960 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11961 }
11962
11963
11965 {
11966
11967
11968
11969
11970
11971
11972
11973
11974 return 1;
11975 }
11976
11977
11978
11980 {
11982 }
11983
11984
11985
11987 {
11989 }
11990
11991
12000 {
12001 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12002
12003 if (player)
12004 {
12005 player.MessageStatus(text);
12006 }
12007 }
12008
12009
12018 {
12019 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12020
12021 if (player)
12022 {
12023 player.MessageAction(text);
12024 }
12025 }
12026
12027
12036 {
12037 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12038
12039 if (player)
12040 {
12041 player.MessageFriendly(text);
12042 }
12043 }
12044
12045
12054 {
12055 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12056
12057 if (player)
12058 {
12059 player.MessageImportant(text);
12060 }
12061 }
12062
12064 {
12065 return true;
12066 }
12067
12068
12069 override bool KindOf(
string tag)
12070 {
12071 bool found = false;
12072 string item_name = this.
GetType();
12074 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12075
12076 int array_size = item_tag_array.Count();
12077 for (int i = 0; i < array_size; i++)
12078 {
12079 if (item_tag_array.Get(i) == tag)
12080 {
12081 found = true;
12082 break;
12083 }
12084 }
12085 return found;
12086 }
12087
12088
12090 {
12091
12092 super.OnRPC(sender, rpc_type,ctx);
12093
12094
12095 switch (rpc_type)
12096 {
12097 #ifndef SERVER
12098 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12099 Param2<bool, string> p = new Param2<bool, string>(false, "");
12100
12102 return;
12103
12104 bool play = p.param1;
12105 string soundSet = p.param2;
12106
12107 if (play)
12108 {
12110 {
12112 {
12114 }
12115 }
12116 else
12117 {
12119 }
12120 }
12121 else
12122 {
12124 }
12125
12126 break;
12127 #endif
12128
12129 }
12130
12132 {
12134 }
12135 }
12136
12137
12138
12139
12141 {
12142 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12143 return plugin.GetID(
name);
12144 }
12145
12147 {
12148 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12149 return plugin.GetName(id);
12150 }
12151
12154 {
12155
12156
12157 int varFlags;
12158 if (!ctx.
Read(varFlags))
12159 return;
12160
12161 if (varFlags & ItemVariableFlags.FLOAT)
12162 {
12164 }
12165 }
12166
12168 {
12169
12170 super.SerializeNumericalVars(floats_out);
12171
12172
12173
12175 {
12177 }
12178
12180 {
12182 }
12183
12185 {
12187 }
12188
12190 {
12195 }
12196
12198 {
12200 }
12201 }
12202
12204 {
12205
12206 super.DeSerializeNumericalVars(floats);
12207
12208
12209 int index = 0;
12210 int mask = Math.Round(floats.Get(index));
12211
12212 index++;
12213
12215 {
12217 {
12219 }
12220 else
12221 {
12222 float quantity = floats.Get(index);
12223 SetQuantity(quantity,
true,
false,
false,
false);
12224 }
12225 index++;
12226 }
12227
12229 {
12230 float wet = floats.Get(index);
12232 index++;
12233 }
12234
12236 {
12237 int liquidtype = Math.Round(floats.Get(index));
12239 index++;
12240 }
12241
12243 {
12245 index++;
12247 index++;
12249 index++;
12251 index++;
12252 }
12253
12255 {
12256 int cleanness = Math.Round(floats.Get(index));
12258 index++;
12259 }
12260 }
12261
12263 {
12264 super.WriteVarsToCTX(ctx);
12265
12266
12268 {
12270 }
12271
12273 {
12275 }
12276
12278 {
12280 }
12281
12283 {
12284 int r,g,b,a;
12290 }
12291
12293 {
12295 }
12296 }
12297
12299 {
12300 if (!super.ReadVarsFromCTX(ctx,version))
12301 return false;
12302
12303 int intValue;
12304 float value;
12305
12306 if (version < 140)
12307 {
12308 if (!ctx.
Read(intValue))
12309 return false;
12310
12311 m_VariablesMask = intValue;
12312 }
12313
12315 {
12316 if (!ctx.
Read(value))
12317 return false;
12318
12320 {
12322 }
12323 else
12324 {
12326 }
12327 }
12328
12329 if (version < 140)
12330 {
12332 {
12333 if (!ctx.
Read(value))
12334 return false;
12335 SetTemperatureDirect(value);
12336 }
12337 }
12338
12340 {
12341 if (!ctx.
Read(value))
12342 return false;
12344 }
12345
12347 {
12348 if (!ctx.
Read(intValue))
12349 return false;
12351 }
12352
12354 {
12355 int r,g,b,a;
12357 return false;
12359 return false;
12361 return false;
12363 return false;
12364
12366 }
12367
12369 {
12370 if (!ctx.
Read(intValue))
12371 return false;
12373 }
12374
12375 if (version >= 138 && version < 140)
12376 {
12378 {
12379 if (!ctx.
Read(intValue))
12380 return false;
12381 SetFrozen(intValue);
12382 }
12383 }
12384
12385 return true;
12386 }
12387
12388
12390 {
12393 {
12395 }
12396
12397 if (!super.OnStoreLoad(ctx, version))
12398 {
12400 return false;
12401 }
12402
12403 if (version >= 114)
12404 {
12405 bool hasQuickBarIndexSaved;
12406
12407 if (!ctx.
Read(hasQuickBarIndexSaved))
12408 {
12410 return false;
12411 }
12412
12413 if (hasQuickBarIndexSaved)
12414 {
12415 int itmQBIndex;
12416
12417
12418 if (!ctx.
Read(itmQBIndex))
12419 {
12421 return false;
12422 }
12423
12424 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12425 if (itmQBIndex != -1 && parentPlayer)
12426 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12427 }
12428 }
12429 else
12430 {
12431
12432 PlayerBase player;
12433 int itemQBIndex;
12434 if (version ==
int.
MAX)
12435 {
12436 if (!ctx.
Read(itemQBIndex))
12437 {
12439 return false;
12440 }
12441 }
12442 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12443 {
12444
12445 if (!ctx.
Read(itemQBIndex))
12446 {
12448 return false;
12449 }
12450 if (itemQBIndex != -1 && player)
12451 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12452 }
12453 }
12454
12455 if (version < 140)
12456 {
12457
12458 if (!LoadVariables(ctx, version))
12459 {
12461 return false;
12462 }
12463 }
12464
12465
12467 {
12469 return false;
12470 }
12471 if (version >= 132)
12472 {
12474 if (raib)
12475 {
12477 {
12479 return false;
12480 }
12481 }
12482 }
12483
12485 return true;
12486 }
12487
12488
12489
12491 {
12492 super.OnStoreSave(ctx);
12493
12494 PlayerBase player;
12495 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12496 {
12498
12499 int itemQBIndex = -1;
12500 itemQBIndex = player.FindQuickBarEntityIndex(this);
12501 ctx.
Write(itemQBIndex);
12502 }
12503 else
12504 {
12506 }
12507
12509
12511 if (raib)
12512 {
12514 }
12515 }
12516
12517
12519 {
12520 super.AfterStoreLoad();
12521
12523 {
12525 }
12526
12528 {
12531 }
12532 }
12533
12535 {
12536 super.EEOnAfterLoad();
12537
12539 {
12541 }
12542
12545 }
12546
12548 {
12549 return false;
12550 }
12551
12552
12553
12555 {
12557 {
12558 #ifdef PLATFORM_CONSOLE
12559
12561 {
12563 if (menu)
12564 {
12566 }
12567 }
12568 #endif
12569 }
12570
12572 {
12575 }
12576
12578 {
12579 SetWeightDirty();
12581 }
12583 {
12586 }
12587
12589 {
12592
12595 }
12597 {
12601 }
12602
12603 super.OnVariablesSynchronized();
12604 }
12605
12606
12607
12609 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12610 {
12611 if (!IsServerCheck(allow_client))
12612 return false;
12613
12615 return false;
12616
12619
12620 if (value <= (min + 0.001))
12621 value = min;
12622
12623 if (value == min)
12624 {
12625 if (destroy_config)
12626 {
12627 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12628 if (dstr)
12629 {
12631 this.Delete();
12632 return true;
12633 }
12634 }
12635 else if (destroy_forced)
12636 {
12638 this.Delete();
12639 return true;
12640 }
12641
12643 }
12644
12647
12649 {
12650 EntityAI parent = GetHierarchyRoot();
12651 InventoryLocation iLoc = new InventoryLocation();
12652 GetInventory().GetCurrentInventoryLocation(iLoc);
12654 {
12655 int iLocSlot = iLoc.
GetSlot();
12657 {
12659 }
12661 {
12663 }
12664 }
12665 }
12666
12668 {
12670
12671 if (delta)
12673 }
12674
12676
12677 return false;
12678 }
12679
12680
12682 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12683 {
12685 }
12686
12688 {
12691 }
12692
12694 {
12697 }
12698
12700 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12701 {
12702 float value_clamped = Math.Clamp(value, 0, 1);
12704 SetQuantity(result, destroy_config, destroy_forced);
12705 }
12706
12707
12710 {
12712 }
12713
12715 {
12717 }
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12729 {
12730 int slot = -1;
12731 GameInventory inventory = GetInventory();
12732 if (inventory)
12733 {
12734 InventoryLocation il = new InventoryLocation;
12737 }
12738
12740 }
12741
12743 {
12744 float quantity_max = 0;
12745
12747 {
12748 if (attSlotID != -1)
12749 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12750
12751 if (quantity_max <= 0)
12753 }
12754
12755 if (quantity_max <= 0)
12757
12758 return quantity_max;
12759 }
12760
12762 {
12764 }
12765
12767 {
12769 }
12770
12771
12773 {
12775 }
12776
12778 {
12780 }
12781
12783 {
12785 }
12786
12787
12789 {
12790
12791 float weightEx = GetWeightEx();
12792 float special = GetInventoryAndCargoWeight();
12793 return weightEx - special;
12794 }
12795
12796
12798 {
12800 }
12801
12803 {
12805 {
12806 #ifdef DEVELOPER
12807 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12808 {
12809 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12811 }
12812 #endif
12813
12814 return GetQuantity() * GetConfigWeightModified();
12815 }
12816 else if (HasEnergyManager())
12817 {
12818 #ifdef DEVELOPER
12819 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12820 {
12821 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12822 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12823 }
12824 #endif
12825 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12826 }
12827 else
12828 {
12829 #ifdef DEVELOPER
12830 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12831 {
12832 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12833 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12834 }
12835 #endif
12836 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12837 }
12838 }
12839
12842 {
12843 int item_count = 0;
12845
12846 GameInventory inventory = GetInventory();
12847 CargoBase cargo = inventory.
GetCargo();
12848 if (cargo != NULL)
12849 {
12851 }
12852
12854 for (int i = 0; i < nAttachments; ++i)
12855 {
12857 if (item)
12858 item_count += item.GetNumberOfItems();
12859 }
12860 return item_count;
12861 }
12862
12865 {
12866 float weight = 0;
12867 float wetness = 1;
12868 if (include_wetness)
12871 {
12872 weight = wetness * m_ConfigWeight;
12873 }
12875 {
12876 weight = 1;
12877 }
12878 return weight;
12879 }
12880
12881
12882
12884 {
12885 GameInventory inventory = GetInventory();
12886 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12887 {
12888 array<EntityAI> items = new array<EntityAI>;
12890 for (int i = 0; i < items.Count(); ++i)
12891 {
12893 if (item)
12894 {
12895 g_Game.ObjectDelete(item);
12896 }
12897 }
12898 }
12899 }
12900
12901
12902
12903
12905 {
12906 float energy = 0;
12907 if (HasEnergyManager())
12908 {
12909 energy = GetCompEM().GetEnergy();
12910 }
12911 return energy;
12912 }
12913
12914
12916 {
12917 super.OnEnergyConsumed();
12918
12920 }
12921
12923 {
12924 super.OnEnergyAdded();
12925
12927 }
12928
12929
12931 {
12932 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12933 {
12935 {
12936 float energy_0to1 = GetCompEM().GetEnergy0To1();
12938 }
12939 }
12940 }
12941
12942
12944 {
12945 return ConfigGetFloat("heatIsolation");
12946 }
12947
12949 {
12951 }
12952
12954 {
12955 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12956 if (
g_Game.ConfigIsExisting(paramPath))
12957 return g_Game.ConfigGetFloat(paramPath);
12958
12959 return 0.0;
12960 }
12961
12963 {
12964 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12965 if (
g_Game.ConfigIsExisting(paramPath))
12966 return g_Game.ConfigGetFloat(paramPath);
12967
12968 return 0.0;
12969 }
12970
12971 override void SetWet(
float value,
bool allow_client =
false)
12972 {
12973 if (!IsServerCheck(allow_client))
12974 return;
12975
12978
12980
12981 m_VarWet = Math.Clamp(value, min, max);
12982
12984 {
12987 }
12988 }
12989
12990 override void AddWet(
float value)
12991 {
12993 }
12994
12996 {
12998 }
12999
13001 {
13003 }
13004
13006 {
13008 }
13009
13011 {
13013 }
13014
13016 {
13018 }
13019
13020 override void OnWetChanged(
float newVal,
float oldVal)
13021 {
13024 if (newLevel != oldLevel)
13025 {
13027 }
13028 }
13029
13031 {
13032 SetWeightDirty();
13033 }
13034
13036 {
13037 return GetWetLevelInternal(
m_VarWet);
13038 }
13039
13040
13041
13043 {
13045 }
13046
13048 {
13050 }
13051
13053 {
13055 }
13056
13058 {
13060 }
13061
13062
13063
13065 {
13066 if (ConfigIsExisting("itemModelLength"))
13067 {
13068 return ConfigGetFloat("itemModelLength");
13069 }
13070 return 0;
13071 }
13072
13074 {
13075 if (ConfigIsExisting("itemAttachOffset"))
13076 {
13077 return ConfigGetFloat("itemAttachOffset");
13078 }
13079 return 0;
13080 }
13081
13082 override void SetCleanness(
int value,
bool allow_client =
false)
13083 {
13084 if (!IsServerCheck(allow_client))
13085 return;
13086
13088
13090
13093 }
13094
13096 {
13098 }
13099
13101 {
13102 return true;
13103 }
13104
13105
13106
13107
13109 {
13111 }
13112
13114 {
13116 }
13117
13118
13119
13120
13121 override void SetColor(
int r,
int g,
int b,
int a)
13122 {
13128 }
13130 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13131 {
13136 }
13137
13139 {
13141 }
13142
13145 {
13146 int r,g,b,a;
13148 r = r/255;
13149 g = g/255;
13150 b = b/255;
13151 a = a/255;
13152 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13153 }
13154
13155
13156
13157 override void SetLiquidType(
int value,
bool allow_client =
false)
13158 {
13159 if (!IsServerCheck(allow_client))
13160 return;
13161
13166 }
13167
13169 {
13170 return ConfigGetInt("varLiquidTypeInit");
13171 }
13172
13174 {
13176 }
13177
13179 {
13181 SetFrozen(false);
13182 }
13183
13186 {
13187 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13188 }
13189
13190
13193 {
13194 PlayerBase nplayer;
13195 if (PlayerBase.CastTo(nplayer, player))
13196 {
13198 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13199 }
13200 }
13201
13202
13205 {
13206 PlayerBase nplayer;
13207 if (PlayerBase.CastTo(nplayer,player))
13208 {
13209 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13210 }
13211
13212 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13213
13214 if (HasEnergyManager())
13215 {
13216 GetCompEM().UpdatePlugState();
13217 }
13218 }
13219
13220
13222 {
13223 super.OnPlacementStarted(player);
13224
13226 }
13227
13228 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13229 {
13231 {
13232 m_AdminLog.OnPlacementComplete(player,
this);
13233 }
13234
13235 super.OnPlacementComplete(player, position, orientation);
13236 }
13237
13238
13239
13240
13241
13243 {
13245 {
13246 return true;
13247 }
13248 else
13249 {
13250 return false;
13251 }
13252 }
13253
13254
13256 {
13258 {
13260 }
13261 }
13262
13263
13265 {
13267 }
13268
13270 {
13272 }
13273
13274 override void InsertAgent(
int agent,
float count = 1)
13275 {
13276 if (count < 1)
13277 return;
13278
13280 }
13281
13284 {
13286 }
13287
13288
13290 {
13292 }
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13336 {
13338 return false;
13339 return true;
13340 }
13341
13343 {
13344
13346 }
13347
13348
13351 {
13352 super.CheckForRoofLimited(timeTresholdMS);
13353
13354 float time =
g_Game.GetTime();
13355 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13356 {
13357 m_PreviousRoofTestTime = time;
13358 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13359 }
13360 }
13361
13362
13364 {
13366 {
13367 return 0;
13368 }
13369
13370 if (GetInventory().GetAttachmentSlotsCount() != 0)
13371 {
13372 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13373 if (filter)
13374 return filter.GetProtectionLevel(type, false, system);
13375 else
13376 return 0;
13377 }
13378
13379 string subclassPath, entryName;
13380
13381 switch (type)
13382 {
13384 entryName = "biological";
13385 break;
13387 entryName = "chemical";
13388 break;
13389 default:
13390 entryName = "biological";
13391 break;
13392 }
13393
13394 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13395
13396 return g_Game.ConfigGetFloat(subclassPath + entryName);
13397 }
13398
13399
13400
13403 {
13404 if (!IsMagazine())
13406
13408 }
13409
13410
13411
13412
13413
13418 {
13419 return true;
13420 }
13421
13423 {
13425 }
13426
13427
13428
13429
13430
13432 {
13433 if (parent)
13434 {
13435 if (parent.IsInherited(DayZInfected))
13436 return true;
13437
13438 if (!parent.IsRuined())
13439 return true;
13440 }
13441
13442 return true;
13443 }
13444
13446 {
13447 if (!super.CanPutAsAttachment(parent))
13448 {
13449 return false;
13450 }
13451
13452 if (!IsRuined() && !parent.IsRuined())
13453 {
13454 return true;
13455 }
13456
13457 return false;
13458 }
13459
13461 {
13462
13463
13464
13465
13466 return super.CanReceiveItemIntoCargo(item);
13467 }
13468
13470 {
13471
13472
13473
13474
13475 GameInventory attachmentInv = attachment.GetInventory();
13477 {
13478 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13479 return false;
13480 }
13481
13482 InventoryLocation loc = new InventoryLocation();
13483 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13484 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13485 return false;
13486
13487 return super.CanReceiveAttachment(attachment, slotId);
13488 }
13489
13491 {
13492 if (!super.CanReleaseAttachment(attachment))
13493 return false;
13494
13495 return GetInventory().AreChildrenAccessible();
13496 }
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13519 {
13520 int id = muzzle_owner.GetMuzzleID();
13521 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13522
13523 if (WPOF_array)
13524 {
13525 for (int i = 0; i < WPOF_array.Count(); i++)
13526 {
13527 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13528
13529 if (WPOF)
13530 {
13531 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13532 }
13533 }
13534 }
13535 }
13536
13537
13539 {
13540 int id = muzzle_owner.GetMuzzleID();
13542
13543 if (WPOBE_array)
13544 {
13545 for (int i = 0; i < WPOBE_array.Count(); i++)
13546 {
13547 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13548
13549 if (WPOBE)
13550 {
13551 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13552 }
13553 }
13554 }
13555 }
13556
13557
13559 {
13560 int id = muzzle_owner.GetMuzzleID();
13561 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13562
13563 if (WPOOH_array)
13564 {
13565 for (int i = 0; i < WPOOH_array.Count(); i++)
13566 {
13567 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13568
13569 if (WPOOH)
13570 {
13571 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13572 }
13573 }
13574 }
13575 }
13576
13577
13579 {
13580 int id = muzzle_owner.GetMuzzleID();
13581 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13582
13583 if (WPOOH_array)
13584 {
13585 for (int i = 0; i < WPOOH_array.Count(); i++)
13586 {
13587 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13588
13589 if (WPOOH)
13590 {
13591 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13592 }
13593 }
13594 }
13595 }
13596
13597
13599 {
13600 int id = muzzle_owner.GetMuzzleID();
13601 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13602
13603 if (WPOOH_array)
13604 {
13605 for (int i = 0; i < WPOOH_array.Count(); i++)
13606 {
13607 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13608
13609 if (WPOOH)
13610 {
13611 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13612 }
13613 }
13614 }
13615 }
13616
13617
13618
13620 {
13622 {
13623 return true;
13624 }
13625
13626 return false;
13627 }
13628
13630 {
13632 {
13633 return true;
13634 }
13635
13636 return false;
13637 }
13638
13640 {
13642 {
13643 return true;
13644 }
13645
13646 return false;
13647 }
13648
13650 {
13651 return false;
13652 }
13653
13656 {
13657 return UATimeSpent.DEFAULT_DEPLOY;
13658 }
13659
13660
13661
13662
13664 {
13666 SetSynchDirty();
13667 }
13668
13670 {
13672 }
13673
13674
13676 {
13677 return false;
13678 }
13679
13682 {
13683 string att_type = "None";
13684
13685 if (ConfigIsExisting("soundAttType"))
13686 {
13687 att_type = ConfigGetString("soundAttType");
13688 }
13689
13691 }
13692
13694 {
13696 }
13697
13698
13699
13700
13701
13707
13709 {
13712
13714 }
13715
13716
13718 {
13720 return;
13721
13723
13726
13729
13730 SoundParameters params = new SoundParameters();
13734 }
13735
13736
13738 {
13740 {
13743
13744 SetSynchDirty();
13745
13748 }
13749 }
13750
13752 {
13754 }
13755
13756
13758 {
13760 return;
13761
13763 SetSynchDirty();
13764
13767 }
13768
13770 {
13773 }
13774
13776 {
13778 }
13779
13780 void OnApply(PlayerBase player);
13781
13783 {
13784 return 1.0;
13785 };
13786
13788 {
13790 }
13791
13793 {
13795 }
13796
13798
13800 {
13801 SetDynamicPhysicsLifeTime(0.01);
13803 }
13804
13806 {
13807 array<string> zone_names = new array<string>;
13808 GetDamageZones(zone_names);
13809 for (int i = 0; i < zone_names.Count(); i++)
13810 {
13811 SetHealthMax(zone_names.Get(i),"Health");
13812 }
13813 SetHealthMax("","Health");
13814 }
13815
13818 {
13819 float global_health = GetHealth01("","Health");
13820 array<string> zones = new array<string>;
13821 GetDamageZones(zones);
13822
13823 for (int i = 0; i < zones.Count(); i++)
13824 {
13825 SetHealth01(zones.Get(i),"Health",global_health);
13826 }
13827 }
13828
13831 {
13832 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13833 }
13834
13836 {
13837 if (!hasRootAsPlayer)
13838 {
13839 if (refParentIB)
13840 {
13841
13842 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13843 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13844
13845 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13846 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13847
13850 }
13851 else
13852 {
13853
13856 }
13857 }
13858 }
13859
13861 {
13863 {
13864 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13865 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13866 {
13867 float heatPermCoef = 1.0;
13869 while (ent)
13870 {
13871 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13872 ent = ent.GetHierarchyParent();
13873 }
13874
13875 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13876 }
13877 }
13878 }
13879
13881 {
13882
13883 EntityAI parent = GetHierarchyParent();
13884 if (!parent)
13885 {
13886 hasParent = false;
13887 hasRootAsPlayer = false;
13888 }
13889 else
13890 {
13891 hasParent = true;
13892 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13893 refParentIB =
ItemBase.Cast(parent);
13894 }
13895 }
13896
13897 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13898 {
13899
13900 }
13901
13903 {
13904
13905 return false;
13906 }
13907
13909 {
13910
13911
13912 return false;
13913 }
13914
13916 {
13917
13918 return false;
13919 }
13920
13923 {
13924 return !GetIsFrozen() &&
IsOpen();
13925 }
13926
13928 {
13929 bool hasParent = false, hasRootAsPlayer = false;
13931
13932 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13933 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13934
13935 if (wwtu || foodDecay)
13936 {
13940
13941 if (processWetness || processTemperature || processDecay)
13942 {
13944
13945 if (processWetness)
13946 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13947
13948 if (processTemperature)
13950
13951 if (processDecay)
13952 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13953 }
13954 }
13955 }
13956
13959 {
13961 }
13962
13964 {
13967
13968 return super.GetTemperatureFreezeThreshold();
13969 }
13970
13972 {
13975
13976 return super.GetTemperatureThawThreshold();
13977 }
13978
13980 {
13983
13984 return super.GetItemOverheatThreshold();
13985 }
13986
13988 {
13990 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13991
13992 return super.GetTemperatureFreezeTime();
13993 }
13994
13996 {
13998 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13999
14000 return super.GetTemperatureThawTime();
14001 }
14002
14007
14009 {
14010 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
14011 }
14012
14014 {
14015 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
14016 }
14017
14020 {
14022 }
14023
14025 {
14027 }
14028
14030 {
14032 }
14033
14036 {
14037 return null;
14038 }
14039
14042 {
14043 return false;
14044 }
14045
14047 {
14049 {
14052 if (!trg)
14053 {
14055 explosive = this;
14056 }
14057
14058 explosive.PairRemote(trg);
14060
14061 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14062 trg.SetPersistentPairID(persistentID);
14063 explosive.SetPersistentPairID(persistentID);
14064
14065 return true;
14066 }
14067 return false;
14068 }
14069
14072 {
14073 float ret = 1.0;
14076 ret *= GetHealth01();
14077
14078 return ret;
14079 }
14080
14081 #ifdef DEVELOPER
14082 override void SetDebugItem()
14083 {
14084 super.SetDebugItem();
14085 _itemBase = this;
14086 }
14087
14089 {
14090 string text = super.GetDebugText();
14091
14093 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14094
14095 return text;
14096 }
14097 #endif
14098
14100 {
14101 return true;
14102 }
14103
14105
14107
14109 {
14112 }
14113
14114
14122
14138
14139 [
Obsolete(
"Use ItemSoundHandler instead")]
14142 {
14143 if (!
g_Game.IsDedicatedServer())
14144 {
14145 if (ConfigIsExisting("attachSoundSet"))
14146 {
14147 string cfg_path = "";
14148 string soundset = "";
14149 string type_name =
GetType();
14150
14153 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14154 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14155
14156 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14157 {
14158 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14159 {
14160 if (cfg_slot_array[i] == slot_type)
14161 {
14162 soundset = cfg_soundset_array[i];
14163 break;
14164 }
14165 }
14166 }
14167
14168 if (soundset != "")
14169 {
14170 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14172 }
14173 }
14174 }
14175 }
14176
14178}
14179
14181{
14183 if (entity)
14184 {
14185 bool is_item = entity.IsInherited(
ItemBase);
14186 if (is_item && full_quantity)
14187 {
14190 }
14191 }
14192 else
14193 {
14195 return NULL;
14196 }
14197 return entity;
14198}
14199
14201{
14202 if (item)
14203 {
14204 if (health > 0)
14205 item.SetHealth("", "", health);
14206
14207 if (item.CanHaveTemperature())
14208 {
14210 if (item.CanFreeze())
14211 item.SetFrozen(false);
14212 }
14213
14214 if (item.HasEnergyManager())
14215 {
14216 if (quantity >= 0)
14217 {
14218 item.GetCompEM().SetEnergy0To1(quantity);
14219 }
14220 else
14221 {
14223 }
14224 }
14225 else if (item.IsMagazine())
14226 {
14227 Magazine mag = Magazine.Cast(item);
14228 if (quantity >= 0)
14229 {
14230 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14231 }
14232 else
14233 {
14235 }
14236
14237 }
14238 else
14239 {
14240 if (quantity >= 0)
14241 {
14242 item.SetQuantityNormalized(quantity, false);
14243 }
14244 else
14245 {
14247 }
14248
14249 }
14250 }
14251}
14252
14253#ifdef DEVELOPER
14255#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.