9233{
9235 {
9236 return true;
9237 }
9238};
9239
9240
9241
9243{
9247
9249
9252
9253
9254
9255
9256
9265
9271
9276
9281
9302 protected bool m_IsResultOfSplit
9303
9305
9310
9311
9312
9314
9318
9319
9320
9322
9325
9326
9327
9333
9334
9342
9345
9346
9348
9349
9351
9352
9357
9358
9363
9364
9366
9367
9369 {
9374
9375 if (!
GetGame().IsDedicatedServer())
9376 {
9378 {
9380
9382 {
9384 }
9385 }
9386
9389 }
9390
9391 m_OldLocation = null;
9392
9394 {
9396 }
9397
9398 if (ConfigIsExisting("headSelectionsToHide"))
9399 {
9402 }
9403
9405 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9406 {
9408 }
9409
9411
9412 m_IsResultOfSplit = false;
9413
9415 }
9416
9418 {
9419 super.InitItemVariables();
9420
9426 m_Count = ConfigGetInt(
"count");
9427
9430
9435
9438
9443
9455
9459
9460
9463 if (ConfigIsExisting("canBeSplit"))
9464 {
9467 }
9468
9470 if (ConfigIsExisting("itemBehaviour"))
9472
9473
9476 RegisterNetSyncVariableInt("m_VarLiquidType");
9477 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9478
9479 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9480 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9481 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9482
9483 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9484 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9485 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9486 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9487
9488 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9489 RegisterNetSyncVariableBool("m_IsTakeable");
9490 RegisterNetSyncVariableBool("m_IsHologram");
9491
9494 {
9497 }
9498
9500
9502 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9504
9505 }
9506
9508 {
9510 }
9511
9513 {
9516 {
9521 }
9522 }
9523
9524 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9525 {
9527 {
9530 }
9531
9533 }
9534
9536 {
9542 }
9543
9545
9547 {
9549
9550 if (!action)
9551 {
9552 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9553 return;
9554 }
9555
9557 if (!ai)
9558 {
9560 return;
9561 }
9562
9564 if (!action_array)
9565 {
9566 action_array = new array<ActionBase_Basic>;
9568 }
9569 if (LogManager.IsActionLogEnable())
9570 {
9571 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9572 }
9573
9574 if (action_array.Find(action) != -1)
9575 {
9576 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9577 }
9578 else
9579 {
9580 action_array.Insert(action);
9581 }
9582 }
9583
9585 {
9587 ActionBase action = player.GetActionManager().GetAction(actionName);
9590
9591 if (action_array)
9592 {
9593 action_array.RemoveItem(action);
9594 }
9595 }
9596
9597
9598
9600 {
9601 ActionOverrideData overrideData = new ActionOverrideData();
9605
9607 if (!actionMap)
9608 {
9611 }
9612
9613 actionMap.Insert(this.
Type(), overrideData);
9614
9615 }
9616
9618
9620
9621
9623 {
9626
9629
9630 string config_to_search = "CfgVehicles";
9631 string muzzle_owner_config;
9632
9634 {
9635 if (IsInherited(Weapon))
9636 config_to_search = "CfgWeapons";
9637
9638 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9639
9640 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9641
9643
9644 if (config_OnFire_subclass_count > 0)
9645 {
9646 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9647
9648 for (int i = 0; i < config_OnFire_subclass_count; i++)
9649 {
9650 string particle_class = "";
9652 string config_OnFire_entry = config_OnFire_class + particle_class;
9653 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9654 WPOF_array.Insert(WPOF);
9655 }
9656
9657
9659 }
9660 }
9661
9663 {
9664 config_to_search = "CfgWeapons";
9665 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9666
9667 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9668
9670
9671 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9672 {
9673 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9674
9675 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9676 {
9677 string particle_class2 = "";
9679 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9680 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9681 WPOBE_array.Insert(WPOBE);
9682 }
9683
9684
9686 }
9687 }
9688 }
9689
9690
9692 {
9695
9697 {
9698 string config_to_search = "CfgVehicles";
9699
9700 if (IsInherited(Weapon))
9701 config_to_search = "CfgWeapons";
9702
9703 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9704 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9705
9706 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9707 {
9708
9710
9712 {
9714 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9716 return;
9717 }
9718
9721
9722
9723
9725 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9726
9727 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9728 {
9729 string particle_class = "";
9731 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9733
9734 if (entry_type == CT_CLASS)
9735 {
9736 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9737 WPOOH_array.Insert(WPOF);
9738 }
9739 }
9740
9741
9743 }
9744 }
9745 }
9746
9748 {
9750 }
9751
9753 {
9755 {
9757
9760
9763
9764 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9765 }
9766 }
9767
9769 {
9771 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9772
9774 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9775
9777 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9778
9780 {
9782 }
9783 }
9784
9786 {
9788 }
9789
9791 {
9794 else
9796
9798 {
9801 }
9802 else
9803 {
9806
9809 }
9810
9812 }
9813
9815 {
9817 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9818 }
9819
9821 {
9823 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9825 }
9826
9828 {
9830 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9831 }
9832
9834 {
9837
9838 OverheatingParticle OP = new OverheatingParticle();
9843
9845 }
9846
9848 {
9851
9852 return -1;
9853 }
9854
9856 {
9858 {
9861
9862 for (int i = count; i > 0; --i)
9863 {
9864 int id = i - 1;
9867
9870
9871 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9872 {
9873 if (p)
9874 {
9877 }
9878 }
9879 }
9880 }
9881 }
9882
9884 {
9886 {
9888 {
9889 int id = i - 1;
9891
9892 if (OP)
9893 {
9895
9896 if (p)
9897 {
9899 }
9900
9901 delete OP;
9902 }
9903 }
9904
9907 }
9908 }
9909
9912 {
9913 return 0.0;
9914 }
9915
9916
9918 {
9919 return 250;
9920 }
9921
9923 {
9924 return 0;
9925 }
9926
9929 {
9931 return true;
9932
9933 return false;
9934 }
9935
9938 {
9941
9943 {
9945 }
9946 else
9947 {
9948
9950 }
9951
9953 }
9954
9961 {
9962 return -1;
9963 }
9964
9965
9966
9967
9969 {
9971 {
9973 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9974
9975 if (r_index >= 0)
9976 {
9977 InventoryLocation r_il = new InventoryLocation;
9978 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9979
9980 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9983 {
9984 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9985 }
9987 {
9988 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9989 }
9990
9991 }
9992
9993 player.GetHumanInventory().ClearUserReservedLocation(this);
9994 }
9995
9998 }
9999
10000
10001
10002
10004 {
10005 return ItemBase.m_DebugActionsMask;
10006 }
10007
10009 {
10010 return ItemBase.m_DebugActionsMask & mask;
10011 }
10012
10014 {
10015 ItemBase.m_DebugActionsMask = mask;
10016 }
10017
10019 {
10020 ItemBase.m_DebugActionsMask |= mask;
10021 }
10022
10024 {
10025 ItemBase.m_DebugActionsMask &= ~mask;
10026 }
10027
10029 {
10031 {
10033 }
10034 else
10035 {
10037 }
10038 }
10039
10040
10042 {
10043 if (GetEconomyProfile())
10044 {
10045 float q_max = GetEconomyProfile().GetQuantityMax();
10046 if (q_max > 0)
10047 {
10048 float q_min = GetEconomyProfile().GetQuantityMin();
10049 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10050
10052 {
10053 ComponentEnergyManager comp = GetCompEM();
10055 {
10057 }
10058 }
10060 {
10062
10063 }
10064
10065 }
10066 }
10067 }
10068
10071 {
10072 EntityAI parent = GetHierarchyParent();
10073
10074 if (parent)
10075 {
10076 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10077 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10078 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10079 }
10080 }
10081
10084 {
10085 EntityAI parent = GetHierarchyParent();
10086
10087 if (parent)
10088 {
10089 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10090 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10091 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10092 }
10093 }
10094
10096 {
10097
10098
10099
10100
10102
10104 {
10105 if (ScriptInputUserData.CanStoreInputUserData())
10106 {
10107 ScriptInputUserData ctx = new ScriptInputUserData;
10113 ctx.
Write(use_stack_max);
10116
10118 {
10119 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10120 }
10121 }
10122 }
10123 else if (!
GetGame().IsMultiplayer())
10124 {
10126 }
10127 }
10128
10130 {
10132 }
10133
10135 {
10137 }
10138
10140 {
10142 }
10143
10145 {
10146
10147 return false;
10148 }
10149
10151 {
10152 return false;
10153 }
10154
10158 {
10159 return false;
10160 }
10161
10163 {
10164 return "";
10165 }
10166
10168
10170 {
10171 return false;
10172 }
10173
10175 {
10176 return true;
10177 }
10178
10179
10180
10182 {
10183 return true;
10184 }
10185
10187 {
10188 return true;
10189 }
10190
10192 {
10193 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10195 }
10196
10198 {
10200 }
10201
10203 {
10205 if (!is_being_placed)
10207 SetSynchDirty();
10208 }
10209
10210
10212
10214 {
10216 }
10217
10219 {
10221 }
10222
10224 {
10225 return 1;
10226 }
10227
10229 {
10230 return false;
10231 }
10232
10234 {
10236 SetSynchDirty();
10237 }
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10274 {
10275 super.OnMovedInsideCargo(container);
10276
10277 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10278 }
10279
10280 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10281 {
10282 super.EEItemLocationChanged(oldLoc,newLoc);
10283
10284 PlayerBase new_player = null;
10285 PlayerBase old_player = null;
10286
10287 if (newLoc.GetParent())
10288 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10289
10290 if (oldLoc.GetParent())
10291 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10292
10294 {
10295 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10296
10297 if (r_index >= 0)
10298 {
10299 InventoryLocation r_il = new InventoryLocation;
10300 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10301
10302 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10305 {
10306 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10307 }
10309 {
10310 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10311 }
10312
10313 }
10314 }
10315
10317 {
10318 if (new_player)
10319 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10320
10321 if (new_player == old_player)
10322 {
10323
10324 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10325 {
10327 {
10328 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10329 {
10330 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10331 }
10332 }
10333 else
10334 {
10335 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10336 }
10337 }
10338
10339 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10340 {
10341 int type = oldLoc.GetType();
10343 {
10344 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10345 }
10347 {
10348 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10349 }
10350 }
10351 if (!m_OldLocation)
10352 {
10353 m_OldLocation = new InventoryLocation;
10354 }
10355 m_OldLocation.Copy(oldLoc);
10356 }
10357 else
10358 {
10359 if (m_OldLocation)
10360 {
10361 m_OldLocation.Reset();
10362 }
10363 }
10364
10366 }
10367 else
10368 {
10369 if (new_player)
10370 {
10371 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10372 if (res_index >= 0)
10373 {
10374 InventoryLocation il = new InventoryLocation;
10375 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10377 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10380 {
10381 il.
GetParent().GetOnReleaseLock().Invoke(it);
10382 }
10384 {
10386 }
10387
10388 }
10389 }
10391 {
10392
10394 }
10395
10396 if (m_OldLocation)
10397 {
10398 m_OldLocation.Reset();
10399 }
10400 }
10401 }
10402
10403 override void EOnContact(IEntity other, Contact extra)
10404 {
10406 {
10407 int liquidType = -1;
10409 if (impactSpeed > 0.0)
10410 {
10412 #ifndef SERVER
10414 #else
10416 SetSynchDirty();
10417 #endif
10419 }
10420 }
10421
10422 #ifdef SERVER
10423 if (GetCompEM() && GetCompEM().IsPlugged())
10424 {
10425 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10426 GetCompEM().UnplugThis();
10427 }
10428 #endif
10429 }
10430
10432
10434 {
10436 }
10437
10439 {
10440
10441 }
10442
10444 {
10445 super.OnItemLocationChanged(old_owner, new_owner);
10446
10447 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10448 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10449
10450 if (!relatedPlayer && playerNew)
10451 relatedPlayer = playerNew;
10452
10453 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10454 {
10456 if (actionMgr)
10457 {
10458 ActionBase currentAction = actionMgr.GetRunningAction();
10459 if (currentAction)
10461 }
10462 }
10463
10464 Man ownerPlayerOld = null;
10465 Man ownerPlayerNew = null;
10466
10467 if (old_owner)
10468 {
10469 if (old_owner.
IsMan())
10470 {
10471 ownerPlayerOld = Man.Cast(old_owner);
10472 }
10473 else
10474 {
10475 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10476 }
10477 }
10478 else
10479 {
10481 {
10483
10484 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10485 {
10486 GetCompEM().UnplugThis();
10487 }
10488 }
10489 }
10490
10491 if (new_owner)
10492 {
10493 if (new_owner.
IsMan())
10494 {
10495 ownerPlayerNew = Man.Cast(new_owner);
10496 }
10497 else
10498 {
10499 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10500 }
10501 }
10502
10503 if (ownerPlayerOld != ownerPlayerNew)
10504 {
10505 if (ownerPlayerOld)
10506 {
10507 array<EntityAI> subItemsExit = new array<EntityAI>;
10509 for (int i = 0; i < subItemsExit.Count(); i++)
10510 {
10513 }
10514 }
10515
10516 if (ownerPlayerNew)
10517 {
10518 array<EntityAI> subItemsEnter = new array<EntityAI>;
10520 for (int j = 0; j < subItemsEnter.Count(); j++)
10521 {
10524 }
10525 }
10526 }
10527 else if (ownerPlayerNew != null)
10528 {
10529 PlayerBase nplayer;
10530 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10531 {
10532 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10534 for (int k = 0; k < subItemsUpdate.Count(); k++)
10535 {
10537 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10538 }
10539 }
10540 }
10541
10542 if (old_owner)
10543 old_owner.OnChildItemRemoved(this);
10544 if (new_owner)
10545 new_owner.OnChildItemReceived(this);
10546 }
10547
10548
10550 {
10551 super.EEDelete(parent);
10552 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10553 if (player)
10554 {
10556
10557 if (player.IsAlive())
10558 {
10559 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10560 if (r_index >= 0)
10561 {
10562 InventoryLocation r_il = new InventoryLocation;
10563 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10564
10565 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10568 {
10569 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10570 }
10572 {
10573 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10574 }
10575
10576 }
10577
10578 player.RemoveQuickBarEntityShortcut(this);
10579 }
10580 }
10581 }
10582
10584 {
10585 super.EEKilled(killer);
10586
10589 {
10590 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10591 {
10592 if (IsMagazine())
10593 {
10594 if (Magazine.Cast(this).GetAmmoCount() > 0)
10595 {
10597 }
10598 }
10599 else
10600 {
10602 }
10603 }
10604 }
10605 }
10606
10608 {
10609 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10610
10611 super.OnWasAttached(parent, slot_id);
10612
10615
10617 }
10618
10620 {
10621 super.OnWasDetached(parent, slot_id);
10622
10625 }
10626
10628 {
10629 int idx;
10632
10633 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10634 if (inventory_slots.Count() < 1)
10635 {
10636 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10637 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10638 }
10639 else
10640 {
10641 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10642 }
10643
10644 idx = inventory_slots.Find(slot);
10645 if (idx < 0)
10646 return "";
10647
10648 return attach_types.Get(idx);
10649 }
10650
10652 {
10653 int idx = -1;
10654 string slot;
10655
10658
10659 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10660 if (inventory_slots.Count() < 1)
10661 {
10662 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10663 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10664 }
10665 else
10666 {
10667 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10668 if (detach_types.Count() < 1)
10669 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10670 }
10671
10672 for (int i = 0; i < inventory_slots.Count(); i++)
10673 {
10674 slot = inventory_slots.Get(i);
10675 }
10676
10677 if (slot != "")
10678 {
10679 if (detach_types.Count() == 1)
10680 idx = 0;
10681 else
10682 idx = inventory_slots.Find(slot);
10683 }
10684 if (idx < 0)
10685 return "";
10686
10687 return detach_types.Get(idx);
10688 }
10689
10691 {
10692
10694
10695
10696 float min_time = 1;
10697 float max_time = 3;
10698 float delay = Math.RandomFloat(min_time, max_time);
10699
10700 explode_timer.Run(delay, this, "DoAmmoExplosion");
10701 }
10702
10704 {
10705 Magazine magazine = Magazine.Cast(this);
10706 int pop_sounds_count = 6;
10707 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10708
10709
10710 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10711 string sound_name = pop_sounds[ sound_idx ];
10713
10714
10715 magazine.ServerAddAmmoCount(-1);
10716
10717
10718 float min_temp_to_explode = 100;
10719
10720 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10721 {
10723 }
10724 }
10725
10726
10727 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10728 {
10729 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10730
10731 const int CHANCE_DAMAGE_CARGO = 4;
10732 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10733 const int CHANCE_DAMAGE_NOTHING = 2;
10734
10736 {
10737 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10738 int chances;
10739 int rnd;
10740
10741 if (GetInventory().GetCargo())
10742 {
10743 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10744 rnd = Math.RandomInt(0,chances);
10745
10746 if (rnd < CHANCE_DAMAGE_CARGO)
10747 {
10749 }
10750 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10751 {
10753 }
10754 }
10755 else
10756 {
10757 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10758 rnd = Math.RandomInt(0,chances);
10759
10760 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10761 {
10763 }
10764 }
10765 }
10766 }
10767
10769 {
10770 if (GetInventory().GetCargo())
10771 {
10772 int item_count = GetInventory().GetCargo().GetItemCount();
10773 if (item_count > 0)
10774 {
10775 int random_pick = Math.RandomInt(0, item_count);
10777 if (!item.IsExplosive())
10778 {
10779 item.AddHealth("","",damage);
10780 return true;
10781 }
10782 }
10783 }
10784 return false;
10785 }
10786
10788 {
10789 int attachment_count = GetInventory().AttachmentCount();
10790 if (attachment_count > 0)
10791 {
10792 int random_pick = Math.RandomInt(0, attachment_count);
10793 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10794 if (!attachment.IsExplosive())
10795 {
10796 attachment.AddHealth("","",damage);
10797 return true;
10798 }
10799 }
10800 return false;
10801 }
10802
10804 {
10806 }
10807
10809 {
10811 return GetInventory().CanRemoveEntity();
10812
10813 return false;
10814 }
10815
10817 {
10818
10820 return false;
10821
10822
10824 return false;
10825
10826
10827
10829 if (delta == 0)
10830 return false;
10831
10832
10833 return true;
10834 }
10835
10837 {
10839 {
10840 if (ScriptInputUserData.CanStoreInputUserData())
10841 {
10842 ScriptInputUserData ctx = new ScriptInputUserData;
10847 ctx.
Write(destination_entity);
10849 ctx.
Write(slot_id);
10851 }
10852 }
10853 else if (!
GetGame().IsMultiplayer())
10854 {
10856 }
10857 }
10858
10860 {
10861 float split_quantity_new;
10865 InventoryLocation loc = new InventoryLocation;
10866
10867 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10868 {
10870 split_quantity_new = stack_max;
10871 else
10873
10875 {
10876 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10877 if (new_item)
10878 {
10879 new_item.SetResultOfSplit(true);
10880 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10882 new_item.
SetQuantity(split_quantity_new,
false,
true);
10883 }
10884 }
10885 }
10886 else if (destination_entity && slot_id == -1)
10887 {
10888 if (quantity > stack_max)
10889 split_quantity_new = stack_max;
10890 else
10891 split_quantity_new = quantity;
10892
10894 {
10896 {
10899 }
10900
10901 if (new_item)
10902 {
10903 new_item.SetResultOfSplit(true);
10904 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10906 new_item.
SetQuantity(split_quantity_new,
false,
true);
10907 }
10908 }
10909 }
10910 else
10911 {
10912 if (stack_max != 0)
10913 {
10915 {
10917 }
10918
10919 if (split_quantity_new == 0)
10920 {
10921 if (!
GetGame().IsMultiplayer())
10922 player.PhysicalPredictiveDropItem(this);
10923 else
10924 player.ServerDropEntity(this);
10925 return;
10926 }
10927
10929 {
10931
10932 if (new_item)
10933 {
10934 new_item.SetResultOfSplit(true);
10935 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10938 new_item.PlaceOnSurface();
10939 }
10940 }
10941 }
10942 }
10943 }
10944
10946 {
10947 float split_quantity_new;
10951 InventoryLocation loc = new InventoryLocation;
10952
10953 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10954 {
10956 split_quantity_new = stack_max;
10957 else
10959
10961 {
10962 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10963 if (new_item)
10964 {
10965 new_item.SetResultOfSplit(true);
10966 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10968 new_item.
SetQuantity(split_quantity_new,
false,
true);
10969 }
10970 }
10971 }
10972 else if (destination_entity && slot_id == -1)
10973 {
10974 if (quantity > stack_max)
10975 split_quantity_new = stack_max;
10976 else
10977 split_quantity_new = quantity;
10978
10980 {
10982 {
10985 }
10986
10987 if (new_item)
10988 {
10989 new_item.SetResultOfSplit(true);
10990 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10992 new_item.
SetQuantity(split_quantity_new,
false,
true);
10993 }
10994 }
10995 }
10996 else
10997 {
10998 if (stack_max != 0)
10999 {
11001 {
11003 }
11004
11006 {
11008
11009 if (new_item)
11010 {
11011 new_item.SetResultOfSplit(true);
11012 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11015 new_item.PlaceOnSurface();
11016 }
11017 }
11018 }
11019 }
11020 }
11021
11023 {
11025 {
11026 if (ScriptInputUserData.CanStoreInputUserData())
11027 {
11028 ScriptInputUserData ctx = new ScriptInputUserData;
11033 dst.WriteToContext(ctx);
11035 }
11036 }
11037 else if (!
GetGame().IsMultiplayer())
11038 {
11040 }
11041 }
11042
11044 {
11046 {
11047 if (ScriptInputUserData.CanStoreInputUserData())
11048 {
11049 ScriptInputUserData ctx = new ScriptInputUserData;
11054 ctx.
Write(destination_entity);
11060 }
11061 }
11062 else if (!
GetGame().IsMultiplayer())
11063 {
11065 }
11066 }
11067
11069 {
11071 }
11072
11074 {
11076 float split_quantity_new;
11078 if (dst.IsValid())
11079 {
11080 int slot_id = dst.GetSlot();
11082
11083 if (quantity > stack_max)
11084 split_quantity_new = stack_max;
11085 else
11086 split_quantity_new = quantity;
11087
11089 {
11091
11092 if (new_item)
11093 {
11094 new_item.SetResultOfSplit(true);
11095 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11097 new_item.
SetQuantity(split_quantity_new,
false,
true);
11098 }
11099
11100 return new_item;
11101 }
11102 }
11103
11104 return null;
11105 }
11106
11108 {
11110 float split_quantity_new;
11112 if (destination_entity)
11113 {
11115 if (quantity > stackable)
11116 split_quantity_new = stackable;
11117 else
11118 split_quantity_new = quantity;
11119
11121 {
11122 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11123 if (new_item)
11124 {
11125 new_item.SetResultOfSplit(true);
11126 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11128 new_item.
SetQuantity(split_quantity_new,
false,
true);
11129 }
11130 }
11131 }
11132 }
11133
11135 {
11137 {
11138 if (ScriptInputUserData.CanStoreInputUserData())
11139 {
11140 ScriptInputUserData ctx = new ScriptInputUserData;
11145 ItemBase destination_entity =
this;
11146 ctx.
Write(destination_entity);
11150 }
11151 }
11152 else if (!
GetGame().IsMultiplayer())
11153 {
11155 }
11156 }
11157
11159 {
11161 float split_quantity_new;
11163 if (player)
11164 {
11166 if (quantity > stackable)
11167 split_quantity_new = stackable;
11168 else
11169 split_quantity_new = quantity;
11170
11172 {
11173 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11174 new_item =
ItemBase.Cast(in_hands);
11175 if (new_item)
11176 {
11177 new_item.SetResultOfSplit(true);
11178 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11180 new_item.SetQuantity(split_quantity_new, false, true);
11181 }
11182 }
11183 }
11184 }
11185
11187 {
11189 float split_quantity_new = Math.Floor(quantity * 0.5);
11190
11192 return;
11193
11195
11196 if (new_item)
11197 {
11198 if (new_item.GetQuantityMax() < split_quantity_new)
11199 {
11200 split_quantity_new = new_item.GetQuantityMax();
11201 }
11202
11203 new_item.SetResultOfSplit(true);
11204 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11205
11207 {
11210 }
11211 else
11212 {
11214 new_item.
SetQuantity(split_quantity_new,
false,
true);
11215 }
11216 }
11217 }
11218
11220 {
11222 float split_quantity_new = Math.Floor(quantity / 2);
11223
11225 return;
11226
11227 InventoryLocation invloc = new InventoryLocation;
11229
11231 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11232
11233 if (new_item)
11234 {
11235 if (new_item.GetQuantityMax() < split_quantity_new)
11236 {
11237 split_quantity_new = new_item.GetQuantityMax();
11238 }
11240 {
11243 }
11244 else if (split_quantity_new > 1)
11245 {
11247 new_item.
SetQuantity(split_quantity_new,
false,
true);
11248 }
11249 }
11250 }
11251
11254 {
11255 SetWeightDirty();
11257
11258 if (parent)
11259 parent.OnAttachmentQuantityChangedEx(this, delta);
11260
11262 {
11264 {
11266 }
11268 {
11269 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11271 }
11272 }
11273
11274 }
11275
11278 {
11279
11280 }
11281
11284 {
11286 }
11287
11289 {
11290 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11291
11293 {
11294 if (newLevel == GameConstants.STATE_RUINED)
11295 {
11297 EntityAI parent = GetHierarchyParent();
11298 if (parent && parent.IsFireplace())
11299 {
11300 CargoBase cargo = GetInventory().GetCargo();
11301 if (cargo)
11302 {
11304 {
11306 }
11307 }
11308 }
11309 }
11310
11312 {
11313
11315 return;
11316 }
11317
11318 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11319 {
11321 }
11322 }
11323 }
11324
11325
11327 {
11328 super.OnRightClick();
11329
11331 {
11333 {
11334 if (ScriptInputUserData.CanStoreInputUserData())
11335 {
11336 EntityAI root = GetHierarchyRoot();
11337 Man playerOwner = GetHierarchyRootPlayer();
11338 InventoryLocation dst = new InventoryLocation;
11339
11340
11341 if (!playerOwner && root && root == this)
11342 {
11344 }
11345 else
11346 {
11347
11348 GetInventory().GetCurrentInventoryLocation(dst);
11350 {
11353 {
11355 }
11356 else
11357 {
11359
11360
11361 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11362 {
11364 }
11365 else
11366 {
11367 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11368 }
11369 }
11370 }
11371 }
11372
11373 ScriptInputUserData ctx = new ScriptInputUserData;
11381 }
11382 }
11383 else if (!
GetGame().IsMultiplayer())
11384 {
11386 }
11387 }
11388 }
11389
11391 {
11392 if (root)
11393 {
11394 vector m4[4];
11395 root.GetTransform(m4);
11396 dst.SetGround(this, m4);
11397 }
11398 else
11399 {
11400 GetInventory().GetCurrentInventoryLocation(dst);
11401 }
11402 }
11403
11404 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11405 {
11406
11407 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11408 return false;
11409
11410 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11411 return false;
11412
11413
11415 return false;
11416
11417
11418 Magazine mag = Magazine.Cast(this);
11419 if (mag)
11420 {
11421 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11422 return false;
11423
11424 if (stack_max_limit)
11425 {
11426 Magazine other_mag = Magazine.Cast(other_item);
11427 if (other_item)
11428 {
11429 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11430 return false;
11431 }
11432
11433 }
11434 }
11435 else
11436 {
11437
11439 return false;
11440
11442 return false;
11443 }
11444
11445 PlayerBase player = null;
11446 if (CastTo(player, GetHierarchyRootPlayer()))
11447 {
11448 if (player.GetInventory().HasAttachment(this))
11449 return false;
11450
11451 if (player.IsItemsToDelete())
11452 return false;
11453 }
11454
11455 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11456 return false;
11457
11458 int slotID;
11460 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11461 return false;
11462
11463 return true;
11464 }
11465
11467 {
11469 }
11470
11472 {
11473 return m_IsResultOfSplit;
11474 }
11475
11477 {
11478 m_IsResultOfSplit = value;
11479 }
11480
11482 {
11484 }
11485
11487 {
11488 float other_item_quantity = other_item.GetQuantity();
11489 float this_free_space;
11490
11492
11494
11495 if (other_item_quantity > this_free_space)
11496 {
11497 return this_free_space;
11498 }
11499 else
11500 {
11501 return other_item_quantity;
11502 }
11503 }
11504
11506 {
11508 }
11509
11511 {
11513 return;
11514
11515 if (!IsMagazine() && other_item)
11516 {
11518 if (quantity_used != 0)
11519 {
11520 float hp1 = GetHealth01("","");
11521 float hp2 = other_item.GetHealth01("","");
11522 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11523 hpResult = hpResult / (
GetQuantity() + quantity_used);
11524
11525 hpResult *= GetMaxHealth();
11526 Math.Round(hpResult);
11527 SetHealth("", "Health", hpResult);
11528
11530 other_item.AddQuantity(-quantity_used);
11531 }
11532 }
11534 }
11535
11537 {
11538 #ifdef SERVER
11539 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11540 GetHierarchyParent().IncreaseLifetimeUp();
11541 #endif
11542 };
11543
11545 {
11546 PlayerBase p = PlayerBase.Cast(player);
11547
11548 array<int> recipesIds = p.m_Recipes;
11549 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11550 if (moduleRecipesManager)
11551 {
11552 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11553 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11554 }
11555
11556 for (int i = 0;i < recipesIds.Count(); i++)
11557 {
11558 int key = recipesIds.Get(i);
11559 string recipeName = moduleRecipesManager.GetRecipeName(key);
11561 }
11562 }
11563
11564
11565 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11566 {
11567 super.GetDebugActions(outputList);
11568
11569
11575
11576
11581
11586
11587
11591
11592
11594 {
11598 }
11599
11602
11603
11607
11609
11610 InventoryLocation loc = new InventoryLocation();
11611 GetInventory().GetCurrentInventoryLocation(loc);
11613 {
11614 if (Gizmo_IsSupported())
11617 }
11618
11620 }
11621
11622
11623
11624
11626 {
11627 super.OnAction(action_id, player, ctx);
11628
11630 {
11631 switch (action_id)
11632 {
11635 return true;
11638 return true;
11639 }
11640 }
11641
11643 {
11644 switch (action_id)
11645 {
11647 Delete();
11648 return true;
11649 }
11650 }
11651
11652 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11653 {
11654 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11655 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11656 PlayerBase p = PlayerBase.Cast(player);
11657 if (
EActions.RECIPES_RANGE_START < 1000)
11658 {
11659 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11660 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11661 }
11662 }
11663 #ifndef SERVER
11664 else if (action_id ==
EActions.WATCH_PLAYER)
11665 {
11666 PluginDeveloper.SetDeveloperItemClientEx(player);
11667 }
11668 #endif
11670 {
11671 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11672 {
11673 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11674 OnDebugButtonPressServer(id + 1);
11675 }
11676
11677 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11678 {
11679 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11681 }
11682
11683 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11684 {
11685 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11687 }
11688
11689 else if (action_id ==
EActions.ADD_QUANTITY)
11690 {
11691 if (IsMagazine())
11692 {
11693 Magazine mag = Magazine.Cast(this);
11694 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11695 }
11696 else
11697 {
11699 }
11700
11701 if (m_EM)
11702 {
11703 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11704 }
11705
11706 }
11707
11708 else if (action_id ==
EActions.REMOVE_QUANTITY)
11709 {
11710 if (IsMagazine())
11711 {
11712 Magazine mag2 = Magazine.Cast(this);
11713 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11714 }
11715 else
11716 {
11718 }
11719 if (m_EM)
11720 {
11721 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11722 }
11723
11724 }
11725
11726 else if (action_id ==
EActions.SET_QUANTITY_0)
11727 {
11729
11730 if (m_EM)
11731 {
11732 m_EM.SetEnergy(0);
11733 }
11734 }
11735
11736 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11737 {
11739
11740 if (m_EM)
11741 {
11742 m_EM.SetEnergy(m_EM.GetEnergyMax());
11743 }
11744 }
11745
11746 else if (action_id ==
EActions.ADD_HEALTH)
11747 {
11748 AddHealth("","",GetMaxHealth("","Health")/5);
11749 }
11750 else if (action_id ==
EActions.REMOVE_HEALTH)
11751 {
11752 AddHealth("","",-GetMaxHealth("","Health")/5);
11753 }
11754 else if (action_id ==
EActions.DESTROY_HEALTH)
11755 {
11756 SetHealth01("","",0);
11757 }
11758 else if (action_id ==
EActions.WATCH_ITEM)
11759 {
11761 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11762 #ifdef DEVELOPER
11763 SetDebugDeveloper_item(this);
11764 #endif
11765 }
11766
11767 else if (action_id ==
EActions.ADD_TEMPERATURE)
11768 {
11769 AddTemperature(20);
11770
11771 }
11772
11773 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11774 {
11775 AddTemperature(-20);
11776
11777 }
11778
11779 else if (action_id ==
EActions.FLIP_FROZEN)
11780 {
11781 SetFrozen(!GetIsFrozen());
11782
11783 }
11784
11785 else if (action_id ==
EActions.ADD_WETNESS)
11786 {
11788
11789 }
11790
11791 else if (action_id ==
EActions.REMOVE_WETNESS)
11792 {
11794
11795 }
11796
11797 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11798 {
11801
11802
11803 }
11804
11805 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11806 {
11809 }
11810
11811 else if (action_id ==
EActions.MAKE_SPECIAL)
11812 {
11813 auto debugParams = DebugSpawnParams.WithPlayer(player);
11814 OnDebugSpawnEx(debugParams);
11815 }
11816
11817 }
11818
11819
11820 return false;
11821 }
11822
11823
11824
11825
11829
11832
11833
11834
11836 {
11837 return false;
11838 }
11839
11840
11842 {
11843 return true;
11844 }
11845
11846
11848 {
11849 return true;
11850 }
11851
11852
11853
11855 {
11856 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11858 }
11859
11862 {
11863 return null;
11864 }
11865
11867 {
11868 return false;
11869 }
11870
11872 {
11873 return false;
11874 }
11875
11879
11880
11882 {
11883 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11884 return module_repairing.CanRepair(this, item_repair_kit);
11885 }
11886
11887
11888 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11889 {
11890 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11891 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11892 }
11893
11894
11896 {
11897
11898
11899
11900
11901
11902
11903
11904
11905 return 1;
11906 }
11907
11908
11909
11911 {
11913 }
11914
11915
11916
11918 {
11920 }
11921
11922
11931 {
11932 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11933
11934 if (player)
11935 {
11936 player.MessageStatus(text);
11937 }
11938 }
11939
11940
11949 {
11950 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11951
11952 if (player)
11953 {
11954 player.MessageAction(text);
11955 }
11956 }
11957
11958
11967 {
11968 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11969
11970 if (player)
11971 {
11972 player.MessageFriendly(text);
11973 }
11974 }
11975
11976
11985 {
11986 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11987
11988 if (player)
11989 {
11990 player.MessageImportant(text);
11991 }
11992 }
11993
11995 {
11996 return true;
11997 }
11998
11999
12000 override bool KindOf(
string tag)
12001 {
12002 bool found = false;
12003 string item_name = this.
GetType();
12006
12007 int array_size = item_tag_array.Count();
12008 for (int i = 0; i < array_size; i++)
12009 {
12010 if (item_tag_array.Get(i) == tag)
12011 {
12012 found = true;
12013 break;
12014 }
12015 }
12016 return found;
12017 }
12018
12019
12021 {
12022
12023 super.OnRPC(sender, rpc_type,ctx);
12024
12025
12026 switch (rpc_type)
12027 {
12028 #ifndef SERVER
12029 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12030 Param2<bool, string> p = new Param2<bool, string>(false, "");
12031
12033 return;
12034
12035 bool play = p.param1;
12036 string soundSet = p.param2;
12037
12038 if (play)
12039 {
12041 {
12043 {
12045 }
12046 }
12047 else
12048 {
12050 }
12051 }
12052 else
12053 {
12055 }
12056
12057 break;
12058 #endif
12059
12060 }
12061
12063 {
12065 }
12066 }
12067
12068
12069
12070
12072 {
12073 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12074 return plugin.GetID(
name);
12075 }
12076
12078 {
12079 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12080 return plugin.GetName(id);
12081 }
12082
12085 {
12086
12087
12088 int varFlags;
12089 if (!ctx.
Read(varFlags))
12090 return;
12091
12092 if (varFlags & ItemVariableFlags.FLOAT)
12093 {
12095 }
12096 }
12097
12099 {
12100
12101 super.SerializeNumericalVars(floats_out);
12102
12103
12104
12106 {
12108 }
12109
12111 {
12113 }
12114
12116 {
12118 }
12119
12121 {
12126 }
12127
12129 {
12131 }
12132 }
12133
12135 {
12136
12137 super.DeSerializeNumericalVars(floats);
12138
12139
12140 int index = 0;
12141 int mask = Math.Round(floats.Get(index));
12142
12143 index++;
12144
12146 {
12148 {
12150 }
12151 else
12152 {
12153 float quantity = floats.Get(index);
12154 SetQuantity(quantity,
true,
false,
false,
false);
12155 }
12156 index++;
12157 }
12158
12160 {
12161 float wet = floats.Get(index);
12163 index++;
12164 }
12165
12167 {
12168 int liquidtype = Math.Round(floats.Get(index));
12170 index++;
12171 }
12172
12174 {
12176 index++;
12178 index++;
12180 index++;
12182 index++;
12183 }
12184
12186 {
12187 int cleanness = Math.Round(floats.Get(index));
12189 index++;
12190 }
12191 }
12192
12194 {
12195 super.WriteVarsToCTX(ctx);
12196
12197
12199 {
12201 }
12202
12204 {
12206 }
12207
12209 {
12211 }
12212
12214 {
12215 int r,g,b,a;
12221 }
12222
12224 {
12226 }
12227 }
12228
12230 {
12231 if (!super.ReadVarsFromCTX(ctx,version))
12232 return false;
12233
12234 int intValue;
12235 float value;
12236
12237 if (version < 140)
12238 {
12239 if (!ctx.
Read(intValue))
12240 return false;
12241
12242 m_VariablesMask = intValue;
12243 }
12244
12246 {
12247 if (!ctx.
Read(value))
12248 return false;
12249
12251 {
12253 }
12254 else
12255 {
12257 }
12258 }
12259
12260 if (version < 140)
12261 {
12263 {
12264 if (!ctx.
Read(value))
12265 return false;
12266 SetTemperatureDirect(value);
12267 }
12268 }
12269
12271 {
12272 if (!ctx.
Read(value))
12273 return false;
12275 }
12276
12278 {
12279 if (!ctx.
Read(intValue))
12280 return false;
12282 }
12283
12285 {
12286 int r,g,b,a;
12288 return false;
12290 return false;
12292 return false;
12294 return false;
12295
12297 }
12298
12300 {
12301 if (!ctx.
Read(intValue))
12302 return false;
12304 }
12305
12306 if (version >= 138 && version < 140)
12307 {
12309 {
12310 if (!ctx.
Read(intValue))
12311 return false;
12312 SetFrozen(intValue);
12313 }
12314 }
12315
12316 return true;
12317 }
12318
12319
12321 {
12324 {
12326 }
12327
12328 if (!super.OnStoreLoad(ctx, version))
12329 {
12331 return false;
12332 }
12333
12334 if (version >= 114)
12335 {
12336 bool hasQuickBarIndexSaved;
12337
12338 if (!ctx.
Read(hasQuickBarIndexSaved))
12339 {
12341 return false;
12342 }
12343
12344 if (hasQuickBarIndexSaved)
12345 {
12346 int itmQBIndex;
12347
12348
12349 if (!ctx.
Read(itmQBIndex))
12350 {
12352 return false;
12353 }
12354
12355 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12356 if (itmQBIndex != -1 && parentPlayer)
12357 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12358 }
12359 }
12360 else
12361 {
12362
12363 PlayerBase player;
12364 int itemQBIndex;
12365 if (version ==
int.
MAX)
12366 {
12367 if (!ctx.
Read(itemQBIndex))
12368 {
12370 return false;
12371 }
12372 }
12373 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12374 {
12375
12376 if (!ctx.
Read(itemQBIndex))
12377 {
12379 return false;
12380 }
12381 if (itemQBIndex != -1 && player)
12382 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12383 }
12384 }
12385
12386 if (version < 140)
12387 {
12388
12389 if (!LoadVariables(ctx, version))
12390 {
12392 return false;
12393 }
12394 }
12395
12396
12398 {
12400 return false;
12401 }
12402 if (version >= 132)
12403 {
12405 if (raib)
12406 {
12408 {
12410 return false;
12411 }
12412 }
12413 }
12414
12416 return true;
12417 }
12418
12419
12420
12422 {
12423 super.OnStoreSave(ctx);
12424
12425 PlayerBase player;
12426 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12427 {
12429
12430 int itemQBIndex = -1;
12431 itemQBIndex = player.FindQuickBarEntityIndex(this);
12432 ctx.
Write(itemQBIndex);
12433 }
12434 else
12435 {
12437 }
12438
12440
12442 if (raib)
12443 {
12445 }
12446 }
12447
12448
12450 {
12451 super.AfterStoreLoad();
12452
12454 {
12456 }
12457
12459 {
12462 }
12463 }
12464
12466 {
12467 super.EEOnAfterLoad();
12468
12470 {
12472 }
12473
12476 }
12477
12479 {
12480 return false;
12481 }
12482
12483
12484
12486 {
12488 {
12489 #ifdef PLATFORM_CONSOLE
12490
12492 {
12494 if (menu)
12495 {
12497 }
12498 }
12499 #endif
12500 }
12501
12503 {
12506 }
12507
12509 {
12510 SetWeightDirty();
12512 }
12514 {
12517 }
12518
12520 {
12523 }
12525 {
12528 }
12529
12530 super.OnVariablesSynchronized();
12531 }
12532
12533
12534
12536 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12537 {
12538 if (!IsServerCheck(allow_client))
12539 return false;
12540
12542 return false;
12543
12546
12547 if (value <= (min + 0.001))
12548 value = min;
12549
12550 if (value == min)
12551 {
12552 if (destroy_config)
12553 {
12554 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12555 if (dstr)
12556 {
12558 this.Delete();
12559 return true;
12560 }
12561 }
12562 else if (destroy_forced)
12563 {
12565 this.Delete();
12566 return true;
12567 }
12568
12570 }
12571
12574
12576 {
12578
12579 if (delta)
12581 }
12582
12584
12585 return false;
12586 }
12587
12588
12590 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12591 {
12593 }
12594
12596 {
12599 }
12600
12602 {
12605 }
12606
12608 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12609 {
12610 float value_clamped = Math.Clamp(value, 0, 1);
12612 SetQuantity(result, destroy_config, destroy_forced);
12613 }
12614
12615
12618 {
12620 }
12621
12623 {
12625 }
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12637 {
12638 int slot = -1;
12639 if (GetInventory())
12640 {
12641 InventoryLocation il = new InventoryLocation;
12642 GetInventory().GetCurrentInventoryLocation(il);
12644 }
12645
12647 }
12648
12650 {
12651 float quantity_max = 0;
12652
12654 {
12655 if (attSlotID != -1)
12656 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12657
12658 if (quantity_max <= 0)
12660 }
12661
12662 if (quantity_max <= 0)
12664
12665 return quantity_max;
12666 }
12667
12669 {
12671 }
12672
12674 {
12676 }
12677
12678
12680 {
12682 }
12683
12685 {
12687 }
12688
12690 {
12692 }
12693
12694
12696 {
12697
12698 float weightEx = GetWeightEx();
12699 float special = GetInventoryAndCargoWeight();
12700 return weightEx - special;
12701 }
12702
12703
12705 {
12707 }
12708
12710 {
12712 {
12713 #ifdef DEVELOPER
12714 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12715 {
12716 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12718 }
12719 #endif
12720
12721 return GetQuantity() * GetConfigWeightModified();
12722 }
12723 else if (HasEnergyManager())
12724 {
12725 #ifdef DEVELOPER
12726 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12727 {
12728 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12729 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12730 }
12731 #endif
12732 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12733 }
12734 else
12735 {
12736 #ifdef DEVELOPER
12737 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12738 {
12739 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12740 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12741 }
12742 #endif
12743 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12744 }
12745 }
12746
12749 {
12750 int item_count = 0;
12752
12753 if (GetInventory().GetCargo() != NULL)
12754 {
12755 item_count = GetInventory().GetCargo().GetItemCount();
12756 }
12757
12758 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12759 {
12760 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12761 if (item)
12762 item_count += item.GetNumberOfItems();
12763 }
12764 return item_count;
12765 }
12766
12769 {
12770 float weight = 0;
12771 float wetness = 1;
12772 if (include_wetness)
12775 {
12776 weight = wetness * m_ConfigWeight;
12777 }
12779 {
12780 weight = 1;
12781 }
12782 return weight;
12783 }
12784
12785
12786
12788 {
12789 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12790 {
12791 GameInventory inv = GetInventory();
12792 array<EntityAI> items = new array<EntityAI>;
12794 for (int i = 0; i < items.Count(); i++)
12795 {
12797 if (item)
12798 {
12800 }
12801 }
12802 }
12803 }
12804
12805
12806
12807
12809 {
12810 float energy = 0;
12811 if (HasEnergyManager())
12812 {
12813 energy = GetCompEM().GetEnergy();
12814 }
12815 return energy;
12816 }
12817
12818
12820 {
12821 super.OnEnergyConsumed();
12822
12824 }
12825
12827 {
12828 super.OnEnergyAdded();
12829
12831 }
12832
12833
12835 {
12836 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12837 {
12839 {
12840 float energy_0to1 = GetCompEM().GetEnergy0To1();
12842 }
12843 }
12844 }
12845
12846
12848 {
12849 return ConfigGetFloat("heatIsolation");
12850 }
12851
12853 {
12855 }
12856
12858 {
12859 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12860 if (
GetGame().ConfigIsExisting(paramPath))
12862
12863 return 0.0;
12864 }
12865
12867 {
12868 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12869 if (
GetGame().ConfigIsExisting(paramPath))
12871
12872 return 0.0;
12873 }
12874
12875 override void SetWet(
float value,
bool allow_client =
false)
12876 {
12877 if (!IsServerCheck(allow_client))
12878 return;
12879
12882
12884
12885 m_VarWet = Math.Clamp(value, min, max);
12886
12888 {
12891 }
12892 }
12893
12894 override void AddWet(
float value)
12895 {
12897 }
12898
12900 {
12902 }
12903
12905 {
12907 }
12908
12910 {
12912 }
12913
12915 {
12917 }
12918
12920 {
12922 }
12923
12924 override void OnWetChanged(
float newVal,
float oldVal)
12925 {
12928 if (newLevel != oldLevel)
12929 {
12931 }
12932 }
12933
12935 {
12936 SetWeightDirty();
12937 }
12938
12940 {
12941 return GetWetLevelInternal(
m_VarWet);
12942 }
12943
12944
12945
12947 {
12949 }
12950
12952 {
12954 }
12955
12957 {
12959 }
12960
12962 {
12964 }
12965
12966
12967
12969 {
12970 if (ConfigIsExisting("itemModelLength"))
12971 {
12972 return ConfigGetFloat("itemModelLength");
12973 }
12974 return 0;
12975 }
12976
12978 {
12979 if (ConfigIsExisting("itemAttachOffset"))
12980 {
12981 return ConfigGetFloat("itemAttachOffset");
12982 }
12983 return 0;
12984 }
12985
12986 override void SetCleanness(
int value,
bool allow_client =
false)
12987 {
12988 if (!IsServerCheck(allow_client))
12989 return;
12990
12992
12994
12997 }
12998
13000 {
13002 }
13003
13005 {
13006 return true;
13007 }
13008
13009
13010
13011
13013 {
13015 }
13016
13018 {
13020 }
13021
13022
13023
13024
13025 override void SetColor(
int r,
int g,
int b,
int a)
13026 {
13032 }
13034 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13035 {
13040 }
13041
13043 {
13045 }
13046
13049 {
13050 int r,g,b,a;
13052 r = r/255;
13053 g = g/255;
13054 b = b/255;
13055 a = a/255;
13056 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13057 }
13058
13059
13060
13061 override void SetLiquidType(
int value,
bool allow_client =
false)
13062 {
13063 if (!IsServerCheck(allow_client))
13064 return;
13065
13070 }
13071
13073 {
13074 return ConfigGetInt("varLiquidTypeInit");
13075 }
13076
13078 {
13080 }
13081
13083 {
13085 SetFrozen(false);
13086 }
13087
13090 {
13091 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13092 }
13093
13094
13097 {
13098 PlayerBase nplayer;
13099 if (PlayerBase.CastTo(nplayer, player))
13100 {
13102
13103 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13104 }
13105 }
13106
13107
13110 {
13111 PlayerBase nplayer;
13112 if (PlayerBase.CastTo(nplayer,player))
13113 {
13114
13115 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13116
13117 }
13118
13119
13120 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13121
13122
13123 if (HasEnergyManager())
13124 {
13125 GetCompEM().UpdatePlugState();
13126 }
13127 }
13128
13129
13131 {
13132 super.OnPlacementStarted(player);
13133
13135 }
13136
13137 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13138 {
13140 {
13141 m_AdminLog.OnPlacementComplete(player,
this);
13142 }
13143
13144 super.OnPlacementComplete(player, position, orientation);
13145 }
13146
13147
13148
13149
13150
13152 {
13154 {
13155 return true;
13156 }
13157 else
13158 {
13159 return false;
13160 }
13161 }
13162
13163
13165 {
13167 {
13169 }
13170 }
13171
13172
13174 {
13176 }
13177
13179 {
13181 }
13182
13183 override void InsertAgent(
int agent,
float count = 1)
13184 {
13185 if (count < 1)
13186 return;
13187
13189 }
13190
13193 {
13195 }
13196
13197
13199 {
13201 }
13202
13203
13204
13205
13206
13207
13208
13209
13210
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13245 {
13247 return false;
13248 return true;
13249 }
13250
13252 {
13253
13255 }
13256
13257
13260 {
13261 super.CheckForRoofLimited(timeTresholdMS);
13262
13264 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13265 {
13266 m_PreviousRoofTestTime = time;
13267 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13268 }
13269 }
13270
13271
13273 {
13275 {
13276 return 0;
13277 }
13278
13279 if (GetInventory().GetAttachmentSlotsCount() != 0)
13280 {
13281 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13282 if (filter)
13283 return filter.GetProtectionLevel(type, false, system);
13284 else
13285 return 0;
13286 }
13287
13288 string subclassPath, entryName;
13289
13290 switch (type)
13291 {
13293 entryName = "biological";
13294 break;
13296 entryName = "chemical";
13297 break;
13298 default:
13299 entryName = "biological";
13300 break;
13301 }
13302
13303 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13304
13306 }
13307
13308
13309
13312 {
13313 if (!IsMagazine())
13315
13317 }
13318
13319
13320
13321
13322
13327 {
13328 return true;
13329 }
13330
13332 {
13334 }
13335
13336
13337
13338
13339
13341 {
13342 if (parent)
13343 {
13344 if (parent.IsInherited(DayZInfected))
13345 return true;
13346
13347 if (!parent.IsRuined())
13348 return true;
13349 }
13350
13351 return true;
13352 }
13353
13355 {
13356 if (!super.CanPutAsAttachment(parent))
13357 {
13358 return false;
13359 }
13360
13361 if (!IsRuined() && !parent.IsRuined())
13362 {
13363 return true;
13364 }
13365
13366 return false;
13367 }
13368
13370 {
13371
13372
13373
13374
13375 return super.CanReceiveItemIntoCargo(item);
13376 }
13377
13379 {
13380
13381
13382
13383
13384 GameInventory attachmentInv = attachment.GetInventory();
13386 {
13387 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13388 return false;
13389 }
13390
13391 InventoryLocation loc = new InventoryLocation();
13392 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13393 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13394 return false;
13395
13396 return super.CanReceiveAttachment(attachment, slotId);
13397 }
13398
13400 {
13401 if (!super.CanReleaseAttachment(attachment))
13402 return false;
13403
13404 return GetInventory().AreChildrenAccessible();
13405 }
13406
13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13428 {
13429 int id = muzzle_owner.GetMuzzleID();
13430 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13431
13432 if (WPOF_array)
13433 {
13434 for (int i = 0; i < WPOF_array.Count(); i++)
13435 {
13436 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13437
13438 if (WPOF)
13439 {
13440 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13441 }
13442 }
13443 }
13444 }
13445
13446
13448 {
13449 int id = muzzle_owner.GetMuzzleID();
13451
13452 if (WPOBE_array)
13453 {
13454 for (int i = 0; i < WPOBE_array.Count(); i++)
13455 {
13456 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13457
13458 if (WPOBE)
13459 {
13460 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13461 }
13462 }
13463 }
13464 }
13465
13466
13468 {
13469 int id = muzzle_owner.GetMuzzleID();
13470 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13471
13472 if (WPOOH_array)
13473 {
13474 for (int i = 0; i < WPOOH_array.Count(); i++)
13475 {
13476 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13477
13478 if (WPOOH)
13479 {
13480 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13481 }
13482 }
13483 }
13484 }
13485
13486
13488 {
13489 int id = muzzle_owner.GetMuzzleID();
13490 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13491
13492 if (WPOOH_array)
13493 {
13494 for (int i = 0; i < WPOOH_array.Count(); i++)
13495 {
13496 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13497
13498 if (WPOOH)
13499 {
13500 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13501 }
13502 }
13503 }
13504 }
13505
13506
13508 {
13509 int id = muzzle_owner.GetMuzzleID();
13510 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13511
13512 if (WPOOH_array)
13513 {
13514 for (int i = 0; i < WPOOH_array.Count(); i++)
13515 {
13516 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13517
13518 if (WPOOH)
13519 {
13520 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13521 }
13522 }
13523 }
13524 }
13525
13526
13527
13529 {
13531 {
13532 return true;
13533 }
13534
13535 return false;
13536 }
13537
13539 {
13541 {
13542 return true;
13543 }
13544
13545 return false;
13546 }
13547
13549 {
13551 {
13552 return true;
13553 }
13554
13555 return false;
13556 }
13557
13559 {
13560 return false;
13561 }
13562
13565 {
13566 return UATimeSpent.DEFAULT_DEPLOY;
13567 }
13568
13569
13570
13571
13573 {
13575 SetSynchDirty();
13576 }
13577
13579 {
13581 }
13582
13583
13585 {
13586 return false;
13587 }
13588
13591 {
13592 string att_type = "None";
13593
13594 if (ConfigIsExisting("soundAttType"))
13595 {
13596 att_type = ConfigGetString("soundAttType");
13597 }
13598
13600 }
13601
13603 {
13605 }
13606
13607
13608
13609
13610
13616
13618 {
13621
13623 }
13624
13625
13627 {
13629 return;
13630
13632
13635
13638
13639 SoundParameters params = new SoundParameters();
13643 }
13644
13645
13647 {
13649 return;
13650
13652 SetSynchDirty();
13653
13656 }
13657
13658
13660 {
13662 return;
13663
13665 SetSynchDirty();
13666
13669 }
13670
13672 {
13674 }
13675
13677 {
13679 }
13680
13683 {
13684 if (!
GetGame().IsDedicatedServer())
13685 {
13686 if (ConfigIsExisting("attachSoundSet"))
13687 {
13688 string cfg_path = "";
13689 string soundset = "";
13690 string type_name =
GetType();
13691
13694 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13695 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13696
13697 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13698 {
13699 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13700 {
13701 if (cfg_slot_array[i] == slot_type)
13702 {
13703 soundset = cfg_soundset_array[i];
13704 break;
13705 }
13706 }
13707 }
13708
13709 if (soundset != "")
13710 {
13711 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13713 }
13714 }
13715 }
13716 }
13717
13719 {
13720
13721 }
13722
13723 void OnApply(PlayerBase player);
13724
13726 {
13727 return 1.0;
13728 };
13729
13731 {
13733 }
13734
13736 {
13738 }
13739
13741
13743 {
13744 SetDynamicPhysicsLifeTime(0.01);
13746 }
13747
13749 {
13750 array<string> zone_names = new array<string>;
13751 GetDamageZones(zone_names);
13752 for (int i = 0; i < zone_names.Count(); i++)
13753 {
13754 SetHealthMax(zone_names.Get(i),"Health");
13755 }
13756 SetHealthMax("","Health");
13757 }
13758
13761 {
13762 float global_health = GetHealth01("","Health");
13763 array<string> zones = new array<string>;
13764 GetDamageZones(zones);
13765
13766 for (int i = 0; i < zones.Count(); i++)
13767 {
13768 SetHealth01(zones.Get(i),"Health",global_health);
13769 }
13770 }
13771
13774 {
13775 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13776 }
13777
13779 {
13780 if (!hasRootAsPlayer)
13781 {
13782 if (refParentIB)
13783 {
13784
13785 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13786 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13787
13788 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13789 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13790
13793 }
13794 else
13795 {
13796
13799 }
13800 }
13801 }
13802
13804 {
13806 {
13807 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13808 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13809 {
13810 float heatPermCoef = 1.0;
13812 while (ent)
13813 {
13814 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13815 ent = ent.GetHierarchyParent();
13816 }
13817
13818 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13819 }
13820 }
13821 }
13822
13824 {
13825
13826 EntityAI parent = GetHierarchyParent();
13827 if (!parent)
13828 {
13829 hasParent = false;
13830 hasRootAsPlayer = false;
13831 }
13832 else
13833 {
13834 hasParent = true;
13835 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13836 refParentIB =
ItemBase.Cast(parent);
13837 }
13838 }
13839
13840 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13841 {
13842
13843 }
13844
13846 {
13847
13848 return false;
13849 }
13850
13852 {
13853
13854
13855 return false;
13856 }
13857
13859 {
13860
13861 return false;
13862 }
13863
13866 {
13867 return !GetIsFrozen() &&
IsOpen();
13868 }
13869
13871 {
13872 bool hasParent = false, hasRootAsPlayer = false;
13874
13875 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13876 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13877
13878 if (wwtu || foodDecay)
13879 {
13883
13884 if (processWetness || processTemperature || processDecay)
13885 {
13887
13888 if (processWetness)
13889 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13890
13891 if (processTemperature)
13893
13894 if (processDecay)
13895 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13896 }
13897 }
13898 }
13899
13902 {
13904 }
13905
13907 {
13910
13911 return super.GetTemperatureFreezeThreshold();
13912 }
13913
13915 {
13918
13919 return super.GetTemperatureThawThreshold();
13920 }
13921
13923 {
13926
13927 return super.GetItemOverheatThreshold();
13928 }
13929
13931 {
13933 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13934
13935 return super.GetTemperatureFreezeTime();
13936 }
13937
13939 {
13941 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13942
13943 return super.GetTemperatureThawTime();
13944 }
13945
13950
13952 {
13953 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13954 }
13955
13957 {
13958 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13959 }
13960
13963 {
13965 }
13966
13968 {
13970 }
13971
13973 {
13975 }
13976
13979 {
13980 return null;
13981 }
13982
13985 {
13986 return false;
13987 }
13988
13990 {
13992 {
13995 if (!trg)
13996 {
13998 explosive = this;
13999 }
14000
14001 explosive.PairRemote(trg);
14003
14004 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14005 trg.SetPersistentPairID(persistentID);
14006 explosive.SetPersistentPairID(persistentID);
14007
14008 return true;
14009 }
14010 return false;
14011 }
14012
14015 {
14016 float ret = 1.0;
14019 ret *= GetHealth01();
14020
14021 return ret;
14022 }
14023
14024 #ifdef DEVELOPER
14025 override void SetDebugItem()
14026 {
14027 super.SetDebugItem();
14028 _itemBase = this;
14029 }
14030
14032 {
14033 string text = super.GetDebugText();
14034
14036 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14037
14038 return text;
14039 }
14040 #endif
14041
14043 {
14044 return true;
14045 }
14046
14048
14050
14052 {
14055 }
14056
14057
14065
14081}
14082
14084{
14086 if (entity)
14087 {
14088 bool is_item = entity.IsInherited(
ItemBase);
14089 if (is_item && full_quantity)
14090 {
14093 }
14094 }
14095 else
14096 {
14098 return NULL;
14099 }
14100 return entity;
14101}
14102
14104{
14105 if (item)
14106 {
14107 if (health > 0)
14108 item.SetHealth("", "", health);
14109
14110 if (item.CanHaveTemperature())
14111 {
14113 if (item.CanFreeze())
14114 item.SetFrozen(false);
14115 }
14116
14117 if (item.HasEnergyManager())
14118 {
14119 if (quantity >= 0)
14120 {
14121 item.GetCompEM().SetEnergy0To1(quantity);
14122 }
14123 else
14124 {
14126 }
14127 }
14128 else if (item.IsMagazine())
14129 {
14130 Magazine mag = Magazine.Cast(item);
14131 if (quantity >= 0)
14132 {
14133 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14134 }
14135 else
14136 {
14138 }
14139
14140 }
14141 else
14142 {
14143 if (quantity >= 0)
14144 {
14145 item.SetQuantityNormalized(quantity, false);
14146 }
14147 else
14148 {
14150 }
14151
14152 }
14153 }
14154}
14155
14156#ifdef DEVELOPER
14158#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.