9190{
9192 {
9193 return true;
9194 }
9195};
9196
9197
9198
9200{
9204
9206
9209
9210
9211
9212
9213
9222
9228
9233
9238
9259 protected bool m_IsResultOfSplit
9260
9262
9267
9268
9269
9271
9275
9276
9277
9279
9282
9283
9284
9290
9291
9299
9302
9303
9305
9306
9308
9309
9314
9315
9320
9321
9323
9324
9326 {
9331
9332 if (!
GetGame().IsDedicatedServer())
9333 {
9335 {
9337
9339 {
9341 }
9342 }
9343
9346 }
9347
9348 m_OldLocation = null;
9349
9351 {
9353 }
9354
9355 if (ConfigIsExisting("headSelectionsToHide"))
9356 {
9359 }
9360
9362 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9363 {
9365 }
9366
9368
9369 m_IsResultOfSplit = false;
9370
9372 }
9373
9375 {
9376 super.InitItemVariables();
9377
9383 m_Count = ConfigGetInt(
"count");
9384
9387
9392
9395
9400
9412
9416
9417
9420 if (ConfigIsExisting("canBeSplit"))
9421 {
9424 }
9425
9427 if (ConfigIsExisting("itemBehaviour"))
9429
9430
9433 RegisterNetSyncVariableInt("m_VarLiquidType");
9434 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9435
9436 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9437 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9438 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9439
9440 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9441 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9442 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9443 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9444
9445 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9446 RegisterNetSyncVariableBool("m_IsTakeable");
9447 RegisterNetSyncVariableBool("m_IsHologram");
9448
9451 {
9454 }
9455
9457
9459 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9461
9462 }
9463
9465 {
9467 }
9468
9470 {
9473 {
9478 }
9479 }
9480
9481 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9482 {
9484 {
9487 }
9488
9490 }
9491
9493 {
9499 }
9500
9502
9504 {
9506
9507 if (!action)
9508 {
9509 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9510 return;
9511 }
9512
9514 if (!ai)
9515 {
9517 return;
9518 }
9519
9521 if (!action_array)
9522 {
9523 action_array = new array<ActionBase_Basic>;
9525 }
9526 if (LogManager.IsActionLogEnable())
9527 {
9528 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9529 }
9530
9531 if (action_array.Find(action) != -1)
9532 {
9533 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9534 }
9535 else
9536 {
9537 action_array.Insert(action);
9538 }
9539 }
9540
9542 {
9544 ActionBase action = player.GetActionManager().GetAction(actionName);
9547
9548 if (action_array)
9549 {
9550 action_array.RemoveItem(action);
9551 }
9552 }
9553
9554
9555
9557 {
9558 ActionOverrideData overrideData = new ActionOverrideData();
9562
9564 if (!actionMap)
9565 {
9568 }
9569
9570 actionMap.Insert(this.
Type(), overrideData);
9571
9572 }
9573
9575
9577
9578
9580 {
9583
9586
9587 string config_to_search = "CfgVehicles";
9588 string muzzle_owner_config;
9589
9591 {
9592 if (IsInherited(Weapon))
9593 config_to_search = "CfgWeapons";
9594
9595 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9596
9597 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9598
9600
9601 if (config_OnFire_subclass_count > 0)
9602 {
9603 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9604
9605 for (int i = 0; i < config_OnFire_subclass_count; i++)
9606 {
9607 string particle_class = "";
9609 string config_OnFire_entry = config_OnFire_class + particle_class;
9610 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9611 WPOF_array.Insert(WPOF);
9612 }
9613
9614
9616 }
9617 }
9618
9620 {
9621 config_to_search = "CfgWeapons";
9622 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9623
9624 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9625
9627
9628 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9629 {
9630 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9631
9632 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9633 {
9634 string particle_class2 = "";
9636 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9637 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9638 WPOBE_array.Insert(WPOBE);
9639 }
9640
9641
9643 }
9644 }
9645 }
9646
9647
9649 {
9652
9654 {
9655 string config_to_search = "CfgVehicles";
9656
9657 if (IsInherited(Weapon))
9658 config_to_search = "CfgWeapons";
9659
9660 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9661 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9662
9663 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9664 {
9665
9667
9669 {
9671 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9673 return;
9674 }
9675
9678
9679
9680
9682 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9683
9684 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9685 {
9686 string particle_class = "";
9688 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9690
9691 if (entry_type == CT_CLASS)
9692 {
9693 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9694 WPOOH_array.Insert(WPOF);
9695 }
9696 }
9697
9698
9700 }
9701 }
9702 }
9703
9705 {
9707 }
9708
9710 {
9712 {
9714
9717
9720
9721 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9722 }
9723 }
9724
9726 {
9728 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9729
9731 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9732
9734 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9735
9737 {
9739 }
9740 }
9741
9743 {
9745 }
9746
9748 {
9751 else
9753
9755 {
9758 }
9759 else
9760 {
9763
9766 }
9767
9769 }
9770
9772 {
9774 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9775 }
9776
9778 {
9780 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9782 }
9783
9785 {
9787 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9788 }
9789
9791 {
9794
9795 OverheatingParticle OP = new OverheatingParticle();
9800
9802 }
9803
9805 {
9808
9809 return -1;
9810 }
9811
9813 {
9815 {
9818
9819 for (int i = count; i > 0; --i)
9820 {
9821 int id = i - 1;
9824
9827
9828 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9829 {
9830 if (p)
9831 {
9834 }
9835 }
9836 }
9837 }
9838 }
9839
9841 {
9843 {
9845 {
9846 int id = i - 1;
9848
9849 if (OP)
9850 {
9852
9853 if (p)
9854 {
9856 }
9857
9858 delete OP;
9859 }
9860 }
9861
9864 }
9865 }
9866
9869 {
9870 return 0.0;
9871 }
9872
9873
9875 {
9876 return 250;
9877 }
9878
9880 {
9881 return 0;
9882 }
9883
9886 {
9888 return true;
9889
9890 return false;
9891 }
9892
9895 {
9898
9900 {
9902 }
9903 else
9904 {
9905
9907 }
9908
9910 }
9911
9918 {
9919 return -1;
9920 }
9921
9922
9923
9924
9926 {
9928 {
9930 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9931
9932 if (r_index >= 0)
9933 {
9934 InventoryLocation r_il = new InventoryLocation;
9935 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9936
9937 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9940 {
9941 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9942 }
9944 {
9945 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9946 }
9947
9948 }
9949
9950 player.GetHumanInventory().ClearUserReservedLocation(this);
9951 }
9952
9955 }
9956
9957
9958
9959
9961 {
9962 return ItemBase.m_DebugActionsMask;
9963 }
9964
9966 {
9967 return ItemBase.m_DebugActionsMask & mask;
9968 }
9969
9971 {
9972 ItemBase.m_DebugActionsMask = mask;
9973 }
9974
9976 {
9977 ItemBase.m_DebugActionsMask |= mask;
9978 }
9979
9981 {
9982 ItemBase.m_DebugActionsMask &= ~mask;
9983 }
9984
9986 {
9988 {
9990 }
9991 else
9992 {
9994 }
9995 }
9996
9997
9999 {
10000 if (GetEconomyProfile())
10001 {
10002 float q_max = GetEconomyProfile().GetQuantityMax();
10003 if (q_max > 0)
10004 {
10005 float q_min = GetEconomyProfile().GetQuantityMin();
10006 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10007
10009 {
10010 ComponentEnergyManager comp = GetCompEM();
10012 {
10014 }
10015 }
10017 {
10019
10020 }
10021
10022 }
10023 }
10024 }
10025
10028 {
10029 EntityAI parent = GetHierarchyParent();
10030
10031 if (parent)
10032 {
10033 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10034 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10035 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10036 }
10037 }
10038
10041 {
10042 EntityAI parent = GetHierarchyParent();
10043
10044 if (parent)
10045 {
10046 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10047 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10048 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10049 }
10050 }
10051
10053 {
10054
10055
10056
10057
10059
10061 {
10062 if (ScriptInputUserData.CanStoreInputUserData())
10063 {
10064 ScriptInputUserData ctx = new ScriptInputUserData;
10070 ctx.
Write(use_stack_max);
10073
10075 {
10076 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10077 }
10078 }
10079 }
10080 else if (!
GetGame().IsMultiplayer())
10081 {
10083 }
10084 }
10085
10087 {
10089 }
10090
10092 {
10094 }
10095
10097 {
10099 }
10100
10102 {
10103
10104 return false;
10105 }
10106
10108 {
10109 return false;
10110 }
10111
10115 {
10116 return false;
10117 }
10118
10120 {
10121 return "";
10122 }
10123
10125
10127 {
10128 return false;
10129 }
10130
10132 {
10133 return true;
10134 }
10135
10136
10137
10139 {
10140 return true;
10141 }
10142
10144 {
10145 return true;
10146 }
10147
10149 {
10150 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10152 }
10153
10155 {
10157 }
10158
10160 {
10162 if (!is_being_placed)
10164 SetSynchDirty();
10165 }
10166
10167
10169
10171 {
10173 }
10174
10176 {
10178 }
10179
10181 {
10182 return 1;
10183 }
10184
10186 {
10187 return false;
10188 }
10189
10191 {
10193 SetSynchDirty();
10194 }
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10231 {
10232 super.OnMovedInsideCargo(container);
10233
10234 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10235 }
10236
10237 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10238 {
10239 super.EEItemLocationChanged(oldLoc,newLoc);
10240
10241 PlayerBase new_player = null;
10242 PlayerBase old_player = null;
10243
10244 if (newLoc.GetParent())
10245 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10246
10247 if (oldLoc.GetParent())
10248 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10249
10251 {
10252 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10253
10254 if (r_index >= 0)
10255 {
10256 InventoryLocation r_il = new InventoryLocation;
10257 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10258
10259 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10262 {
10263 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10264 }
10266 {
10267 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10268 }
10269
10270 }
10271 }
10272
10274 {
10275 if (new_player)
10276 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10277
10278 if (new_player == old_player)
10279 {
10280
10281 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10282 {
10284 {
10285 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10286 {
10287 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10288 }
10289 }
10290 else
10291 {
10292 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10293 }
10294 }
10295
10296 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10297 {
10298 int type = oldLoc.GetType();
10300 {
10301 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10302 }
10304 {
10305 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10306 }
10307 }
10308 if (!m_OldLocation)
10309 {
10310 m_OldLocation = new InventoryLocation;
10311 }
10312 m_OldLocation.Copy(oldLoc);
10313 }
10314 else
10315 {
10316 if (m_OldLocation)
10317 {
10318 m_OldLocation.Reset();
10319 }
10320 }
10321
10323 }
10324 else
10325 {
10326 if (new_player)
10327 {
10328 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10329 if (res_index >= 0)
10330 {
10331 InventoryLocation il = new InventoryLocation;
10332 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10334 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10337 {
10338 il.
GetParent().GetOnReleaseLock().Invoke(it);
10339 }
10341 {
10343 }
10344
10345 }
10346 }
10348 {
10349
10351 }
10352
10353 if (m_OldLocation)
10354 {
10355 m_OldLocation.Reset();
10356 }
10357 }
10358 }
10359
10360 override void EOnContact(IEntity other, Contact extra)
10361 {
10363 {
10364 int liquidType = -1;
10366 if (impactSpeed > 0.0)
10367 {
10369 #ifndef SERVER
10371 #else
10373 SetSynchDirty();
10374 #endif
10376 }
10377 }
10378
10379 #ifdef SERVER
10380 if (GetCompEM() && GetCompEM().IsPlugged())
10381 {
10382 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10383 GetCompEM().UnplugThis();
10384 }
10385 #endif
10386 }
10387
10389
10391 {
10393 }
10394
10396 {
10397
10398 }
10399
10401 {
10402 super.OnItemLocationChanged(old_owner, new_owner);
10403
10404 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10405 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10406
10407 if (!relatedPlayer && playerNew)
10408 relatedPlayer = playerNew;
10409
10410 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10411 {
10413 if (actionMgr)
10414 {
10415 ActionBase currentAction = actionMgr.GetRunningAction();
10416 if (currentAction)
10418 }
10419 }
10420
10421 Man ownerPlayerOld = null;
10422 Man ownerPlayerNew = null;
10423
10424 if (old_owner)
10425 {
10426 if (old_owner.
IsMan())
10427 {
10428 ownerPlayerOld = Man.Cast(old_owner);
10429 }
10430 else
10431 {
10432 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10433 }
10434 }
10435 else
10436 {
10438 {
10440
10441 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10442 {
10443 GetCompEM().UnplugThis();
10444 }
10445 }
10446 }
10447
10448 if (new_owner)
10449 {
10450 if (new_owner.
IsMan())
10451 {
10452 ownerPlayerNew = Man.Cast(new_owner);
10453 }
10454 else
10455 {
10456 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10457 }
10458 }
10459
10460 if (ownerPlayerOld != ownerPlayerNew)
10461 {
10462 if (ownerPlayerOld)
10463 {
10464 array<EntityAI> subItemsExit = new array<EntityAI>;
10466 for (int i = 0; i < subItemsExit.Count(); i++)
10467 {
10470 }
10471 }
10472
10473 if (ownerPlayerNew)
10474 {
10475 array<EntityAI> subItemsEnter = new array<EntityAI>;
10477 for (int j = 0; j < subItemsEnter.Count(); j++)
10478 {
10481 }
10482 }
10483 }
10484 else if (ownerPlayerNew != null)
10485 {
10486 PlayerBase nplayer;
10487 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10488 {
10489 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10491 for (int k = 0; k < subItemsUpdate.Count(); k++)
10492 {
10494 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10495 }
10496 }
10497 }
10498
10499 if (old_owner)
10500 old_owner.OnChildItemRemoved(this);
10501 if (new_owner)
10502 new_owner.OnChildItemReceived(this);
10503 }
10504
10505
10507 {
10508 super.EEDelete(parent);
10509 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10510 if (player)
10511 {
10513
10514 if (player.IsAlive())
10515 {
10516 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10517 if (r_index >= 0)
10518 {
10519 InventoryLocation r_il = new InventoryLocation;
10520 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10521
10522 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10525 {
10526 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10527 }
10529 {
10530 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10531 }
10532
10533 }
10534
10535 player.RemoveQuickBarEntityShortcut(this);
10536 }
10537 }
10538 }
10539
10541 {
10542 super.EEKilled(killer);
10543
10546 {
10547 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10548 {
10549 if (IsMagazine())
10550 {
10551 if (Magazine.Cast(this).GetAmmoCount() > 0)
10552 {
10554 }
10555 }
10556 else
10557 {
10559 }
10560 }
10561 }
10562 }
10563
10565 {
10566 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10567
10568 super.OnWasAttached(parent, slot_id);
10569
10572
10574 }
10575
10577 {
10578 super.OnWasDetached(parent, slot_id);
10579
10582 }
10583
10585 {
10586 int idx;
10589
10590 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10591 if (inventory_slots.Count() < 1)
10592 {
10593 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10594 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10595 }
10596 else
10597 {
10598 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10599 }
10600
10601 idx = inventory_slots.Find(slot);
10602 if (idx < 0)
10603 return "";
10604
10605 return attach_types.Get(idx);
10606 }
10607
10609 {
10610 int idx = -1;
10611 string slot;
10612
10615
10616 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10617 if (inventory_slots.Count() < 1)
10618 {
10619 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10620 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10621 }
10622 else
10623 {
10624 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10625 if (detach_types.Count() < 1)
10626 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10627 }
10628
10629 for (int i = 0; i < inventory_slots.Count(); i++)
10630 {
10631 slot = inventory_slots.Get(i);
10632 }
10633
10634 if (slot != "")
10635 {
10636 if (detach_types.Count() == 1)
10637 idx = 0;
10638 else
10639 idx = inventory_slots.Find(slot);
10640 }
10641 if (idx < 0)
10642 return "";
10643
10644 return detach_types.Get(idx);
10645 }
10646
10648 {
10649
10651
10652
10653 float min_time = 1;
10654 float max_time = 3;
10655 float delay = Math.RandomFloat(min_time, max_time);
10656
10657 explode_timer.Run(delay, this, "DoAmmoExplosion");
10658 }
10659
10661 {
10662 Magazine magazine = Magazine.Cast(this);
10663 int pop_sounds_count = 6;
10664 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10665
10666
10667 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10668 string sound_name = pop_sounds[ sound_idx ];
10670
10671
10672 magazine.ServerAddAmmoCount(-1);
10673
10674
10675 float min_temp_to_explode = 100;
10676
10677 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10678 {
10680 }
10681 }
10682
10683
10684 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10685 {
10686 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10687
10688 const int CHANCE_DAMAGE_CARGO = 4;
10689 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10690 const int CHANCE_DAMAGE_NOTHING = 2;
10691
10693 {
10694 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10695 int chances;
10696 int rnd;
10697
10698 if (GetInventory().GetCargo())
10699 {
10700 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10701 rnd = Math.RandomInt(0,chances);
10702
10703 if (rnd < CHANCE_DAMAGE_CARGO)
10704 {
10706 }
10707 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10708 {
10710 }
10711 }
10712 else
10713 {
10714 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10715 rnd = Math.RandomInt(0,chances);
10716
10717 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10718 {
10720 }
10721 }
10722 }
10723 }
10724
10726 {
10727 if (GetInventory().GetCargo())
10728 {
10729 int item_count = GetInventory().GetCargo().GetItemCount();
10730 if (item_count > 0)
10731 {
10732 int random_pick = Math.RandomInt(0, item_count);
10734 if (!item.IsExplosive())
10735 {
10736 item.AddHealth("","",damage);
10737 return true;
10738 }
10739 }
10740 }
10741 return false;
10742 }
10743
10745 {
10746 int attachment_count = GetInventory().AttachmentCount();
10747 if (attachment_count > 0)
10748 {
10749 int random_pick = Math.RandomInt(0, attachment_count);
10750 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10751 if (!attachment.IsExplosive())
10752 {
10753 attachment.AddHealth("","",damage);
10754 return true;
10755 }
10756 }
10757 return false;
10758 }
10759
10761 {
10763 }
10764
10766 {
10768 return GetInventory().CanRemoveEntity();
10769
10770 return false;
10771 }
10772
10774 {
10776 return;
10777
10779 {
10780 if (ScriptInputUserData.CanStoreInputUserData())
10781 {
10782 ScriptInputUserData ctx = new ScriptInputUserData;
10787 ctx.
Write(destination_entity);
10789 ctx.
Write(slot_id);
10791 }
10792 }
10793 else if (!
GetGame().IsMultiplayer())
10794 {
10796 }
10797 }
10798
10800 {
10802 return;
10803
10804 float split_quantity_new;
10808 InventoryLocation loc = new InventoryLocation;
10809
10810 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10811 {
10813 split_quantity_new = stack_max;
10814 else
10816
10817 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10818 if (new_item)
10819 {
10820 new_item.SetResultOfSplit(true);
10821 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10823 new_item.SetQuantity(split_quantity_new);
10824 }
10825 }
10826 else if (destination_entity && slot_id == -1)
10827 {
10828 if (quantity > stack_max)
10829 split_quantity_new = stack_max;
10830 else
10831 split_quantity_new = quantity;
10832
10834 {
10837 }
10838
10839 if (new_item)
10840 {
10841 new_item.SetResultOfSplit(true);
10842 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10844 new_item.SetQuantity(split_quantity_new);
10845 }
10846 }
10847 else
10848 {
10849 if (stack_max != 0)
10850 {
10852 {
10854 }
10855
10856 if (split_quantity_new == 0)
10857 {
10858 if (!
GetGame().IsMultiplayer())
10859 player.PhysicalPredictiveDropItem(this);
10860 else
10861 player.ServerDropEntity(this);
10862 return;
10863 }
10864
10866
10867 if (new_item)
10868 {
10869 new_item.SetResultOfSplit(true);
10870 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10872 new_item.SetQuantity(stack_max);
10873 new_item.PlaceOnSurface();
10874 }
10875 }
10876 }
10877 }
10878
10880 {
10882 return;
10883
10884 float split_quantity_new;
10888 InventoryLocation loc = new InventoryLocation;
10889
10890 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10891 {
10893 split_quantity_new = stack_max;
10894 else
10896
10897 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10898 if (new_item)
10899 {
10900 new_item.SetResultOfSplit(true);
10901 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10903 new_item.SetQuantity(split_quantity_new);
10904 }
10905 }
10906 else if (destination_entity && slot_id == -1)
10907 {
10908 if (quantity > stack_max)
10909 split_quantity_new = stack_max;
10910 else
10911 split_quantity_new = quantity;
10912
10914 {
10917 }
10918
10919 if (new_item)
10920 {
10921 new_item.SetResultOfSplit(true);
10922 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10924 new_item.SetQuantity(split_quantity_new);
10925 }
10926 }
10927 else
10928 {
10929 if (stack_max != 0)
10930 {
10932 {
10934 }
10935
10937
10938 if (new_item)
10939 {
10940 new_item.SetResultOfSplit(true);
10941 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10943 new_item.SetQuantity(stack_max);
10944 new_item.PlaceOnSurface();
10945 }
10946 }
10947 }
10948 }
10949
10951 {
10953 return;
10954
10956 {
10957 if (ScriptInputUserData.CanStoreInputUserData())
10958 {
10959 ScriptInputUserData ctx = new ScriptInputUserData;
10964 dst.WriteToContext(ctx);
10966 }
10967 }
10968 else if (!
GetGame().IsMultiplayer())
10969 {
10971 }
10972 }
10973
10975 {
10977 return;
10978
10980 {
10981 if (ScriptInputUserData.CanStoreInputUserData())
10982 {
10983 ScriptInputUserData ctx = new ScriptInputUserData;
10988 ctx.
Write(destination_entity);
10994 }
10995 }
10996 else if (!
GetGame().IsMultiplayer())
10997 {
10999 }
11000 }
11001
11003 {
11005 }
11006
11008 {
11010 return this;
11011
11013 float split_quantity_new;
11015 if (dst.IsValid())
11016 {
11017 int slot_id = dst.GetSlot();
11019
11020 if (quantity > stack_max)
11021 split_quantity_new = stack_max;
11022 else
11023 split_quantity_new = quantity;
11024
11026
11027 if (new_item)
11028 {
11029 new_item.SetResultOfSplit(true);
11030 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11033 }
11034
11035 return new_item;
11036 }
11037
11038 return null;
11039 }
11040
11042 {
11044 return;
11045
11047 float split_quantity_new;
11049 if (destination_entity)
11050 {
11052 if (quantity > stackable)
11053 split_quantity_new = stackable;
11054 else
11055 split_quantity_new = quantity;
11056
11057 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11058 if (new_item)
11059 {
11060 new_item.SetResultOfSplit(true);
11061 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11063 new_item.SetQuantity(split_quantity_new);
11064 }
11065 }
11066 }
11067
11069 {
11071 return;
11072
11074 {
11075 if (ScriptInputUserData.CanStoreInputUserData())
11076 {
11077 ScriptInputUserData ctx = new ScriptInputUserData;
11082 ItemBase destination_entity =
this;
11083 ctx.
Write(destination_entity);
11087 }
11088 }
11089 else if (!
GetGame().IsMultiplayer())
11090 {
11092 }
11093 }
11094
11096 {
11098 return;
11099
11101 float split_quantity_new;
11103 if (player)
11104 {
11106 if (quantity > stackable)
11107 split_quantity_new = stackable;
11108 else
11109 split_quantity_new = quantity;
11110
11111 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11112 new_item =
ItemBase.Cast(in_hands);
11113 if (new_item)
11114 {
11115 new_item.SetResultOfSplit(true);
11116 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11118 new_item.SetQuantity(split_quantity_new);
11119 }
11120 }
11121 }
11122
11124 {
11126 return;
11127
11129 float split_quantity_new = Math.Floor(quantity * 0.5);
11130
11132
11133 if (new_item)
11134 {
11135 if (new_item.GetQuantityMax() < split_quantity_new)
11136 {
11137 split_quantity_new = new_item.GetQuantityMax();
11138 }
11139
11140 new_item.SetResultOfSplit(true);
11141 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11142
11144 {
11147 }
11148 else
11149 {
11152 }
11153 }
11154 }
11155
11157 {
11159 return;
11160
11162 float split_quantity_new = Math.Floor(quantity / 2);
11163
11164 InventoryLocation invloc = new InventoryLocation;
11166
11168 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11169
11170 if (new_item)
11171 {
11172 if (new_item.GetQuantityMax() < split_quantity_new)
11173 {
11174 split_quantity_new = new_item.GetQuantityMax();
11175 }
11177 {
11180 }
11181 else
11182 {
11185 }
11186 }
11187 }
11188
11191 {
11192 SetWeightDirty();
11194
11195 if (parent)
11196 parent.OnAttachmentQuantityChangedEx(this, delta);
11197
11199 {
11201 {
11203 }
11205 {
11206 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11208 }
11209 }
11210
11211 }
11212
11215 {
11216
11217 }
11218
11221 {
11223 }
11224
11226 {
11227 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11228
11230 {
11231 if (newLevel == GameConstants.STATE_RUINED)
11232 {
11234 EntityAI parent = GetHierarchyParent();
11235 if (parent && parent.IsFireplace())
11236 {
11237 CargoBase cargo = GetInventory().GetCargo();
11238 if (cargo)
11239 {
11241 {
11243 }
11244 }
11245 }
11246 }
11247
11249 {
11250
11252 return;
11253 }
11254
11255 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11256 {
11258 }
11259 }
11260 }
11261
11262
11264 {
11265 super.OnRightClick();
11266
11268 {
11270 {
11271 if (ScriptInputUserData.CanStoreInputUserData())
11272 {
11273 vector m4[4];
11275
11276 EntityAI root = GetHierarchyRoot();
11277
11278 InventoryLocation dst = new InventoryLocation;
11280 {
11281 if (root)
11282 {
11283 root.GetTransform(m4);
11285 }
11286 else
11287 GetInventory().GetCurrentInventoryLocation(dst);
11288 }
11289 else
11290 {
11292
11293
11294 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11295 {
11296 if (root)
11297 {
11298 root.GetTransform(m4);
11300 }
11301 else
11302 GetInventory().GetCurrentInventoryLocation(dst);
11303 }
11304 else
11305 {
11306 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11307 }
11308 }
11309
11310 ScriptInputUserData ctx = new ScriptInputUserData;
11318 }
11319 }
11320 else if (!
GetGame().IsMultiplayer())
11321 {
11323 }
11324 }
11325 }
11326
11327 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11328 {
11329
11330 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11331 return false;
11332
11333 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11334 return false;
11335
11336
11338 return false;
11339
11340
11341 Magazine mag = Magazine.Cast(this);
11342 if (mag)
11343 {
11344 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11345 return false;
11346
11347 if (stack_max_limit)
11348 {
11349 Magazine other_mag = Magazine.Cast(other_item);
11350 if (other_item)
11351 {
11352 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11353 return false;
11354 }
11355
11356 }
11357 }
11358 else
11359 {
11360
11362 return false;
11363
11365 return false;
11366 }
11367
11368 PlayerBase player = null;
11369 if (CastTo(player, GetHierarchyRootPlayer()))
11370 {
11371 if (player.GetInventory().HasAttachment(this))
11372 return false;
11373
11374 if (player.IsItemsToDelete())
11375 return false;
11376 }
11377
11378 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11379 return false;
11380
11381 int slotID;
11383 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11384 return false;
11385
11386 return true;
11387 }
11388
11390 {
11392 }
11393
11395 {
11396 return m_IsResultOfSplit;
11397 }
11398
11400 {
11401 m_IsResultOfSplit = value;
11402 }
11403
11405 {
11407 }
11408
11410 {
11411 float other_item_quantity = other_item.GetQuantity();
11412 float this_free_space;
11413
11415
11417
11418 if (other_item_quantity > this_free_space)
11419 {
11420 return this_free_space;
11421 }
11422 else
11423 {
11424 return other_item_quantity;
11425 }
11426 }
11427
11429 {
11431 }
11432
11434 {
11436 return;
11437
11438 if (!IsMagazine() && other_item)
11439 {
11441 if (quantity_used != 0)
11442 {
11443 float hp1 = GetHealth01("","");
11444 float hp2 = other_item.GetHealth01("","");
11445 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11446 hpResult = hpResult / (
GetQuantity() + quantity_used);
11447
11448 hpResult *= GetMaxHealth();
11449 Math.Round(hpResult);
11450 SetHealth("", "Health", hpResult);
11451
11453 other_item.AddQuantity(-quantity_used);
11454 }
11455 }
11457 }
11458
11460 {
11461 #ifdef SERVER
11462 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11463 GetHierarchyParent().IncreaseLifetimeUp();
11464 #endif
11465 };
11466
11468 {
11469 PlayerBase p = PlayerBase.Cast(player);
11470
11471 array<int> recipesIds = p.m_Recipes;
11472 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11473 if (moduleRecipesManager)
11474 {
11475 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11476 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11477 }
11478
11479 for (int i = 0;i < recipesIds.Count(); i++)
11480 {
11481 int key = recipesIds.Get(i);
11482 string recipeName = moduleRecipesManager.GetRecipeName(key);
11484 }
11485 }
11486
11487
11488 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11489 {
11490 super.GetDebugActions(outputList);
11491
11492
11497
11498
11502
11506
11507
11510
11511
11513 {
11516 }
11517
11519
11522
11526 }
11527
11528
11529
11530
11532 {
11533 super.OnAction(action_id, player, ctx);
11534 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11535 {
11536 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11537 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11538 PlayerBase p = PlayerBase.Cast(player);
11539 if (
EActions.RECIPES_RANGE_START < 1000)
11540 {
11541 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11542 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11543 }
11544 }
11545 #ifndef SERVER
11546 else if (action_id ==
EActions.WATCH_PLAYER)
11547 {
11548 PluginDeveloper.SetDeveloperItemClientEx(player);
11549 }
11550 #endif
11552 {
11553 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11554 {
11555 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11556 OnDebugButtonPressServer(id + 1);
11557 }
11558
11559 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11560 {
11561 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11563 }
11564
11565 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11566 {
11567 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11569 }
11570
11571 else if (action_id ==
EActions.ADD_QUANTITY)
11572 {
11573 if (IsMagazine())
11574 {
11575 Magazine mag = Magazine.Cast(this);
11576 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11577 }
11578 else
11579 {
11581 }
11582
11583 if (m_EM)
11584 {
11585 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11586 }
11587
11588 }
11589
11590 else if (action_id ==
EActions.REMOVE_QUANTITY)
11591 {
11592 if (IsMagazine())
11593 {
11594 Magazine mag2 = Magazine.Cast(this);
11595 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11596 }
11597 else
11598 {
11600 }
11601 if (m_EM)
11602 {
11603 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11604 }
11605
11606 }
11607
11608 else if (action_id ==
EActions.SET_QUANTITY_0)
11609 {
11611
11612 if (m_EM)
11613 {
11614 m_EM.SetEnergy(0);
11615 }
11616 }
11617
11618 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11619 {
11621
11622 if (m_EM)
11623 {
11624 m_EM.SetEnergy(m_EM.GetEnergyMax());
11625 }
11626 }
11627
11628 else if (action_id ==
EActions.ADD_HEALTH)
11629 {
11630 AddHealth("","",GetMaxHealth("","Health")/5);
11631 }
11632 else if (action_id ==
EActions.REMOVE_HEALTH)
11633 {
11634 AddHealth("","",-GetMaxHealth("","Health")/5);
11635 }
11636 else if (action_id ==
EActions.DESTROY_HEALTH)
11637 {
11638 SetHealth01("","",0);
11639 }
11640 else if (action_id ==
EActions.WATCH_ITEM)
11641 {
11643 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11644 #ifdef DEVELOPER
11645 SetDebugDeveloper_item(this);
11646 #endif
11647 }
11648
11649 else if (action_id ==
EActions.ADD_TEMPERATURE)
11650 {
11651 AddTemperature(20);
11652
11653 }
11654
11655 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11656 {
11657 AddTemperature(-20);
11658
11659 }
11660
11661 else if (action_id ==
EActions.FLIP_FROZEN)
11662 {
11663 SetFrozen(!GetIsFrozen());
11664
11665 }
11666
11667 else if (action_id ==
EActions.ADD_WETNESS)
11668 {
11670
11671 }
11672
11673 else if (action_id ==
EActions.REMOVE_WETNESS)
11674 {
11676
11677 }
11678
11679 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11680 {
11683
11684
11685 }
11686
11687 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11688 {
11691 }
11692
11693 else if (action_id ==
EActions.MAKE_SPECIAL)
11694 {
11695 auto debugParams = DebugSpawnParams.WithPlayer(player);
11696 OnDebugSpawnEx(debugParams);
11697 }
11698
11699 else if (action_id ==
EActions.DELETE)
11700 {
11701 Delete();
11702 }
11703
11704 }
11705
11706
11707 return false;
11708 }
11709
11710
11711
11712
11716
11719
11720
11721
11723 {
11724 return false;
11725 }
11726
11727
11729 {
11730 return true;
11731 }
11732
11733
11735 {
11736 return true;
11737 }
11738
11739
11740
11742 {
11743 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11745 }
11746
11749 {
11750 return null;
11751 }
11752
11754 {
11755 return false;
11756 }
11757
11759 {
11760 return false;
11761 }
11762
11766
11767
11769 {
11770 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11771 return module_repairing.CanRepair(this, item_repair_kit);
11772 }
11773
11774
11775 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11776 {
11777 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11778 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11779 }
11780
11781
11783 {
11784
11785
11786
11787
11788
11789
11790
11791
11792 return 1;
11793 }
11794
11795
11796
11798 {
11800 }
11801
11802
11803
11805 {
11807 }
11808
11809
11818 {
11819 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11820
11821 if (player)
11822 {
11823 player.MessageStatus(text);
11824 }
11825 }
11826
11827
11836 {
11837 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11838
11839 if (player)
11840 {
11841 player.MessageAction(text);
11842 }
11843 }
11844
11845
11854 {
11855 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11856
11857 if (player)
11858 {
11859 player.MessageFriendly(text);
11860 }
11861 }
11862
11863
11872 {
11873 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11874
11875 if (player)
11876 {
11877 player.MessageImportant(text);
11878 }
11879 }
11880
11882 {
11883 return true;
11884 }
11885
11886
11887 override bool KindOf(
string tag)
11888 {
11889 bool found = false;
11890 string item_name = this.
GetType();
11893
11894 int array_size = item_tag_array.Count();
11895 for (int i = 0; i < array_size; i++)
11896 {
11897 if (item_tag_array.Get(i) == tag)
11898 {
11899 found = true;
11900 break;
11901 }
11902 }
11903 return found;
11904 }
11905
11906
11908 {
11909
11910 super.OnRPC(sender, rpc_type,ctx);
11911
11912
11913 switch (rpc_type)
11914 {
11915 #ifndef SERVER
11916 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11917 Param2<bool, string> p = new Param2<bool, string>(false, "");
11918
11920 return;
11921
11922 bool play = p.param1;
11923 string soundSet = p.param2;
11924
11925 if (play)
11926 {
11928 {
11930 {
11932 }
11933 }
11934 else
11935 {
11937 }
11938 }
11939 else
11940 {
11942 }
11943
11944 break;
11945 #endif
11946
11947 }
11948
11950 {
11952 }
11953 }
11954
11955
11956
11957
11959 {
11960 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11961 return plugin.GetID(
name);
11962 }
11963
11965 {
11966 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11967 return plugin.GetName(id);
11968 }
11969
11972 {
11973
11974
11975 int varFlags;
11976 if (!ctx.
Read(varFlags))
11977 return;
11978
11979 if (varFlags & ItemVariableFlags.FLOAT)
11980 {
11982 }
11983 }
11984
11986 {
11987
11988 super.SerializeNumericalVars(floats_out);
11989
11990
11991
11993 {
11995 }
11996
11998 {
12000 }
12001
12003 {
12005 }
12006
12008 {
12013 }
12014
12016 {
12018 }
12019 }
12020
12022 {
12023
12024 super.DeSerializeNumericalVars(floats);
12025
12026
12027 int index = 0;
12028 int mask = Math.Round(floats.Get(index));
12029
12030 index++;
12031
12033 {
12035 {
12037 }
12038 else
12039 {
12040 float quantity = floats.Get(index);
12041 SetQuantity(quantity,
true,
false,
false,
false);
12042 }
12043 index++;
12044 }
12045
12047 {
12048 float wet = floats.Get(index);
12050 index++;
12051 }
12052
12054 {
12055 int liquidtype = Math.Round(floats.Get(index));
12057 index++;
12058 }
12059
12061 {
12063 index++;
12065 index++;
12067 index++;
12069 index++;
12070 }
12071
12073 {
12074 int cleanness = Math.Round(floats.Get(index));
12076 index++;
12077 }
12078 }
12079
12081 {
12082 super.WriteVarsToCTX(ctx);
12083
12084
12086 {
12088 }
12089
12091 {
12093 }
12094
12096 {
12098 }
12099
12101 {
12102 int r,g,b,a;
12108 }
12109
12111 {
12113 }
12114 }
12115
12117 {
12118 if (!super.ReadVarsFromCTX(ctx,version))
12119 return false;
12120
12121 int intValue;
12122 float value;
12123
12124 if (version < 140)
12125 {
12126 if (!ctx.
Read(intValue))
12127 return false;
12128
12129 m_VariablesMask = intValue;
12130 }
12131
12133 {
12134 if (!ctx.
Read(value))
12135 return false;
12136
12138 {
12140 }
12141 else
12142 {
12144 }
12145 }
12146
12147 if (version < 140)
12148 {
12150 {
12151 if (!ctx.
Read(value))
12152 return false;
12153 SetTemperatureDirect(value);
12154 }
12155 }
12156
12158 {
12159 if (!ctx.
Read(value))
12160 return false;
12162 }
12163
12165 {
12166 if (!ctx.
Read(intValue))
12167 return false;
12169 }
12170
12172 {
12173 int r,g,b,a;
12175 return false;
12177 return false;
12179 return false;
12181 return false;
12182
12184 }
12185
12187 {
12188 if (!ctx.
Read(intValue))
12189 return false;
12191 }
12192
12193 if (version >= 138 && version < 140)
12194 {
12196 {
12197 if (!ctx.
Read(intValue))
12198 return false;
12199 SetFrozen(intValue);
12200 }
12201 }
12202
12203 return true;
12204 }
12205
12206
12208 {
12211 {
12213 }
12214
12215 if (!super.OnStoreLoad(ctx, version))
12216 {
12218 return false;
12219 }
12220
12221 if (version >= 114)
12222 {
12223 bool hasQuickBarIndexSaved;
12224
12225 if (!ctx.
Read(hasQuickBarIndexSaved))
12226 {
12228 return false;
12229 }
12230
12231 if (hasQuickBarIndexSaved)
12232 {
12233 int itmQBIndex;
12234
12235
12236 if (!ctx.
Read(itmQBIndex))
12237 {
12239 return false;
12240 }
12241
12242 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12243 if (itmQBIndex != -1 && parentPlayer)
12244 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12245 }
12246 }
12247 else
12248 {
12249
12250 PlayerBase player;
12251 int itemQBIndex;
12252 if (version ==
int.
MAX)
12253 {
12254 if (!ctx.
Read(itemQBIndex))
12255 {
12257 return false;
12258 }
12259 }
12260 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12261 {
12262
12263 if (!ctx.
Read(itemQBIndex))
12264 {
12266 return false;
12267 }
12268 if (itemQBIndex != -1 && player)
12269 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12270 }
12271 }
12272
12273 if (version < 140)
12274 {
12275
12276 if (!LoadVariables(ctx, version))
12277 {
12279 return false;
12280 }
12281 }
12282
12283
12285 {
12287 return false;
12288 }
12289 if (version >= 132)
12290 {
12292 if (raib)
12293 {
12295 {
12297 return false;
12298 }
12299 }
12300 }
12301
12303 return true;
12304 }
12305
12306
12307
12309 {
12310 super.OnStoreSave(ctx);
12311
12312 PlayerBase player;
12313 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12314 {
12316
12317 int itemQBIndex = -1;
12318 itemQBIndex = player.FindQuickBarEntityIndex(this);
12319 ctx.
Write(itemQBIndex);
12320 }
12321 else
12322 {
12324 }
12325
12327
12329 if (raib)
12330 {
12332 }
12333 }
12334
12335
12337 {
12338 super.AfterStoreLoad();
12339
12341 {
12343 }
12344
12346 {
12349 }
12350 }
12351
12353 {
12354 super.EEOnAfterLoad();
12355
12357 {
12359 }
12360
12363 }
12364
12366 {
12367 return false;
12368 }
12369
12370
12371
12373 {
12375 {
12376 #ifdef PLATFORM_CONSOLE
12377
12379 {
12381 if (menu)
12382 {
12384 }
12385 }
12386 #endif
12387 }
12388
12390 {
12393 }
12394
12396 {
12397 SetWeightDirty();
12399 }
12401 {
12404 }
12405
12407 {
12410 }
12412 {
12415 }
12416
12417 super.OnVariablesSynchronized();
12418 }
12419
12420
12421
12423 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12424 {
12425 if (!IsServerCheck(allow_client))
12426 return false;
12427
12429 return false;
12430
12433
12434 if (value <= (min + 0.001))
12435 value = min;
12436
12437 if (value == min)
12438 {
12439 if (destroy_config)
12440 {
12441 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12442 if (dstr)
12443 {
12445 this.Delete();
12446 return true;
12447 }
12448 }
12449 else if (destroy_forced)
12450 {
12452 this.Delete();
12453 return true;
12454 }
12455
12457 }
12458
12461
12463 {
12465
12466 if (delta)
12468 }
12469
12471
12472 return false;
12473 }
12474
12475
12477 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12478 {
12480 }
12481
12483 {
12486 }
12487
12489 {
12492 }
12493
12496 {
12497 float value_clamped = Math.Clamp(value, 0, 1);
12499 SetQuantity(result, destroy_config, destroy_forced);
12500 }
12501
12502
12505 {
12507 }
12508
12510 {
12512 }
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12524 {
12525 int slot = -1;
12526 if (GetInventory())
12527 {
12528 InventoryLocation il = new InventoryLocation;
12529 GetInventory().GetCurrentInventoryLocation(il);
12531 }
12532
12534 }
12535
12537 {
12538 float quantity_max = 0;
12539
12541 {
12542 if (attSlotID != -1)
12543 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12544
12545 if (quantity_max <= 0)
12547 }
12548
12549 if (quantity_max <= 0)
12551
12552 return quantity_max;
12553 }
12554
12556 {
12558 }
12559
12561 {
12563 }
12564
12565
12567 {
12569 }
12570
12572 {
12574 }
12575
12577 {
12579 }
12580
12581
12583 {
12584
12585 float weightEx = GetWeightEx();
12586 float special = GetInventoryAndCargoWeight();
12587 return weightEx - special;
12588 }
12589
12590
12592 {
12594 }
12595
12597 {
12599 {
12600 #ifdef DEVELOPER
12601 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12602 {
12603 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12605 }
12606 #endif
12607
12608 return GetQuantity() * GetConfigWeightModified();
12609 }
12610 else if (HasEnergyManager())
12611 {
12612 #ifdef DEVELOPER
12613 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12614 {
12615 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12616 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12617 }
12618 #endif
12619 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12620 }
12621 else
12622 {
12623 #ifdef DEVELOPER
12624 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12625 {
12626 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12627 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12628 }
12629 #endif
12630 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12631 }
12632 }
12633
12636 {
12637 int item_count = 0;
12639
12640 if (GetInventory().GetCargo() != NULL)
12641 {
12642 item_count = GetInventory().GetCargo().GetItemCount();
12643 }
12644
12645 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12646 {
12647 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12648 if (item)
12649 item_count += item.GetNumberOfItems();
12650 }
12651 return item_count;
12652 }
12653
12656 {
12657 float weight = 0;
12658 float wetness = 1;
12659 if (include_wetness)
12662 {
12663 weight = wetness * m_ConfigWeight;
12664 }
12666 {
12667 weight = 1;
12668 }
12669 return weight;
12670 }
12671
12672
12673
12675 {
12676 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12677 {
12678 GameInventory inv = GetInventory();
12679 array<EntityAI> items = new array<EntityAI>;
12681 for (int i = 0; i < items.Count(); i++)
12682 {
12684 if (item)
12685 {
12687 }
12688 }
12689 }
12690 }
12691
12692
12693
12694
12696 {
12697 float energy = 0;
12698 if (HasEnergyManager())
12699 {
12700 energy = GetCompEM().GetEnergy();
12701 }
12702 return energy;
12703 }
12704
12705
12707 {
12708 super.OnEnergyConsumed();
12709
12711 }
12712
12714 {
12715 super.OnEnergyAdded();
12716
12718 }
12719
12720
12722 {
12723 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12724 {
12726 {
12727 float energy_0to1 = GetCompEM().GetEnergy0To1();
12729 }
12730 }
12731 }
12732
12733
12735 {
12736 return ConfigGetFloat("heatIsolation");
12737 }
12738
12740 {
12742 }
12743
12745 {
12746 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12747 if (
GetGame().ConfigIsExisting(paramPath))
12749
12750 return 0.0;
12751 }
12752
12754 {
12755 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12756 if (
GetGame().ConfigIsExisting(paramPath))
12758
12759 return 0.0;
12760 }
12761
12762 override void SetWet(
float value,
bool allow_client =
false)
12763 {
12764 if (!IsServerCheck(allow_client))
12765 return;
12766
12769
12771
12772 m_VarWet = Math.Clamp(value, min, max);
12773
12775 {
12778 }
12779 }
12780
12781 override void AddWet(
float value)
12782 {
12784 }
12785
12787 {
12789 }
12790
12792 {
12794 }
12795
12797 {
12799 }
12800
12802 {
12804 }
12805
12807 {
12809 }
12810
12811 override void OnWetChanged(
float newVal,
float oldVal)
12812 {
12815 if (newLevel != oldLevel)
12816 {
12818 }
12819 }
12820
12822 {
12823 SetWeightDirty();
12824 }
12825
12827 {
12828 return GetWetLevelInternal(
m_VarWet);
12829 }
12830
12831
12832
12834 {
12836 }
12837
12839 {
12841 }
12842
12844 {
12846 }
12847
12849 {
12851 }
12852
12853
12854
12856 {
12857 if (ConfigIsExisting("itemModelLength"))
12858 {
12859 return ConfigGetFloat("itemModelLength");
12860 }
12861 return 0;
12862 }
12863
12865 {
12866 if (ConfigIsExisting("itemAttachOffset"))
12867 {
12868 return ConfigGetFloat("itemAttachOffset");
12869 }
12870 return 0;
12871 }
12872
12873 override void SetCleanness(
int value,
bool allow_client =
false)
12874 {
12875 if (!IsServerCheck(allow_client))
12876 return;
12877
12879
12881
12884 }
12885
12887 {
12889 }
12890
12892 {
12893 return true;
12894 }
12895
12896
12897
12898
12900 {
12902 }
12903
12905 {
12907 }
12908
12909
12910
12911
12912 override void SetColor(
int r,
int g,
int b,
int a)
12913 {
12919 }
12921 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12922 {
12927 }
12928
12930 {
12932 }
12933
12936 {
12937 int r,g,b,a;
12939 r = r/255;
12940 g = g/255;
12941 b = b/255;
12942 a = a/255;
12943 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12944 }
12945
12946
12947
12948 override void SetLiquidType(
int value,
bool allow_client =
false)
12949 {
12950 if (!IsServerCheck(allow_client))
12951 return;
12952
12957 }
12958
12960 {
12961 return ConfigGetInt("varLiquidTypeInit");
12962 }
12963
12965 {
12967 }
12968
12970 {
12972 SetFrozen(false);
12973 }
12974
12977 {
12978 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12979 }
12980
12981
12984 {
12985 PlayerBase nplayer;
12986 if (PlayerBase.CastTo(nplayer, player))
12987 {
12989
12990 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12991 }
12992 }
12993
12994
12997 {
12998 PlayerBase nplayer;
12999 if (PlayerBase.CastTo(nplayer,player))
13000 {
13001
13002 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13003
13004 }
13005
13006
13007 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13008
13009
13010 if (HasEnergyManager())
13011 {
13012 GetCompEM().UpdatePlugState();
13013 }
13014 }
13015
13016
13018 {
13019 super.OnPlacementStarted(player);
13020
13022 }
13023
13024 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13025 {
13027 {
13028 m_AdminLog.OnPlacementComplete(player,
this);
13029 }
13030
13031 super.OnPlacementComplete(player, position, orientation);
13032 }
13033
13034
13035
13036
13037
13039 {
13041 {
13042 return true;
13043 }
13044 else
13045 {
13046 return false;
13047 }
13048 }
13049
13050
13052 {
13054 {
13056 }
13057 }
13058
13059
13061 {
13063 }
13064
13066 {
13068 }
13069
13070 override void InsertAgent(
int agent,
float count = 1)
13071 {
13072 if (count < 1)
13073 return;
13074
13076 }
13077
13080 {
13082 }
13083
13084
13086 {
13088 }
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13132 {
13134 return false;
13135 return true;
13136 }
13137
13139 {
13140
13142 }
13143
13144
13147 {
13148 super.CheckForRoofLimited(timeTresholdMS);
13149
13151 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13152 {
13153 m_PreviousRoofTestTime = time;
13154 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13155 }
13156 }
13157
13158
13160 {
13162 {
13163 return 0;
13164 }
13165
13166 if (GetInventory().GetAttachmentSlotsCount() != 0)
13167 {
13168 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13169 if (filter)
13170 return filter.GetProtectionLevel(type, false, system);
13171 else
13172 return 0;
13173 }
13174
13175 string subclassPath, entryName;
13176
13177 switch (type)
13178 {
13180 entryName = "biological";
13181 break;
13183 entryName = "chemical";
13184 break;
13185 default:
13186 entryName = "biological";
13187 break;
13188 }
13189
13190 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13191
13193 }
13194
13195
13196
13199 {
13200 if (!IsMagazine())
13202
13204 }
13205
13206
13207
13208
13209
13214 {
13215 return true;
13216 }
13217
13219 {
13221 }
13222
13223
13224
13225
13226
13228 {
13229 if (parent)
13230 {
13231 if (parent.IsInherited(DayZInfected))
13232 return true;
13233
13234 if (!parent.IsRuined())
13235 return true;
13236 }
13237
13238 return true;
13239 }
13240
13242 {
13243 if (!super.CanPutAsAttachment(parent))
13244 {
13245 return false;
13246 }
13247
13248 if (!IsRuined() && !parent.IsRuined())
13249 {
13250 return true;
13251 }
13252
13253 return false;
13254 }
13255
13257 {
13258
13259
13260
13261
13262 return super.CanReceiveItemIntoCargo(item);
13263 }
13264
13266 {
13267
13268
13269
13270
13271 GameInventory attachmentInv = attachment.GetInventory();
13273 {
13274 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13275 return false;
13276 }
13277
13278 InventoryLocation loc = new InventoryLocation();
13279 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13280 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13281 return false;
13282
13283 return super.CanReceiveAttachment(attachment, slotId);
13284 }
13285
13287 {
13288 if (!super.CanReleaseAttachment(attachment))
13289 return false;
13290
13291 return GetInventory().AreChildrenAccessible();
13292 }
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13315 {
13316 int id = muzzle_owner.GetMuzzleID();
13317 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13318
13319 if (WPOF_array)
13320 {
13321 for (int i = 0; i < WPOF_array.Count(); i++)
13322 {
13323 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13324
13325 if (WPOF)
13326 {
13327 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13328 }
13329 }
13330 }
13331 }
13332
13333
13335 {
13336 int id = muzzle_owner.GetMuzzleID();
13338
13339 if (WPOBE_array)
13340 {
13341 for (int i = 0; i < WPOBE_array.Count(); i++)
13342 {
13343 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13344
13345 if (WPOBE)
13346 {
13347 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13348 }
13349 }
13350 }
13351 }
13352
13353
13355 {
13356 int id = muzzle_owner.GetMuzzleID();
13357 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13358
13359 if (WPOOH_array)
13360 {
13361 for (int i = 0; i < WPOOH_array.Count(); i++)
13362 {
13363 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13364
13365 if (WPOOH)
13366 {
13367 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13368 }
13369 }
13370 }
13371 }
13372
13373
13375 {
13376 int id = muzzle_owner.GetMuzzleID();
13377 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13378
13379 if (WPOOH_array)
13380 {
13381 for (int i = 0; i < WPOOH_array.Count(); i++)
13382 {
13383 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13384
13385 if (WPOOH)
13386 {
13387 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13388 }
13389 }
13390 }
13391 }
13392
13393
13395 {
13396 int id = muzzle_owner.GetMuzzleID();
13397 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13398
13399 if (WPOOH_array)
13400 {
13401 for (int i = 0; i < WPOOH_array.Count(); i++)
13402 {
13403 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13404
13405 if (WPOOH)
13406 {
13407 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13408 }
13409 }
13410 }
13411 }
13412
13413
13414
13416 {
13418 {
13419 return true;
13420 }
13421
13422 return false;
13423 }
13424
13426 {
13428 {
13429 return true;
13430 }
13431
13432 return false;
13433 }
13434
13436 {
13438 {
13439 return true;
13440 }
13441
13442 return false;
13443 }
13444
13446 {
13447 return false;
13448 }
13449
13452 {
13453 return UATimeSpent.DEFAULT_DEPLOY;
13454 }
13455
13456
13457
13458
13460 {
13462 SetSynchDirty();
13463 }
13464
13466 {
13468 }
13469
13470
13472 {
13473 return false;
13474 }
13475
13478 {
13479 string att_type = "None";
13480
13481 if (ConfigIsExisting("soundAttType"))
13482 {
13483 att_type = ConfigGetString("soundAttType");
13484 }
13485
13487 }
13488
13490 {
13492 }
13493
13494
13495
13496
13497
13501
13503 {
13506
13508 }
13509
13510
13512 {
13514 return;
13515
13517
13520
13523
13524 SoundParameters params = new SoundParameters();
13528 }
13529
13530
13532 {
13534 return;
13535
13537 SetSynchDirty();
13538
13541 }
13542
13543
13545 {
13547 return;
13548
13550 SetSynchDirty();
13551
13554 }
13555
13557 {
13559 }
13560
13562 {
13564 }
13565
13568 {
13569 if (!
GetGame().IsDedicatedServer())
13570 {
13571 if (ConfigIsExisting("attachSoundSet"))
13572 {
13573 string cfg_path = "";
13574 string soundset = "";
13575 string type_name =
GetType();
13576
13579 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13580 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13581
13582 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13583 {
13584 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13585 {
13586 if (cfg_slot_array[i] == slot_type)
13587 {
13588 soundset = cfg_soundset_array[i];
13589 break;
13590 }
13591 }
13592 }
13593
13594 if (soundset != "")
13595 {
13596 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13598 }
13599 }
13600 }
13601 }
13602
13604 {
13605
13606 }
13607
13608 void OnApply(PlayerBase player);
13609
13611 {
13612 return 1.0;
13613 };
13614
13616 {
13618 }
13619
13621 {
13623 }
13624
13626
13628 {
13629 SetDynamicPhysicsLifeTime(0.01);
13631 }
13632
13634 {
13635 array<string> zone_names = new array<string>;
13636 GetDamageZones(zone_names);
13637 for (int i = 0; i < zone_names.Count(); i++)
13638 {
13639 SetHealthMax(zone_names.Get(i),"Health");
13640 }
13641 SetHealthMax("","Health");
13642 }
13643
13646 {
13647 float global_health = GetHealth01("","Health");
13648 array<string> zones = new array<string>;
13649 GetDamageZones(zones);
13650
13651 for (int i = 0; i < zones.Count(); i++)
13652 {
13653 SetHealth01(zones.Get(i),"Health",global_health);
13654 }
13655 }
13656
13659 {
13660 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13661 }
13662
13664 {
13665 if (!hasRootAsPlayer)
13666 {
13667 if (refParentIB)
13668 {
13669
13670 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13671 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13672
13673 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13674 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13675
13678 }
13679 else
13680 {
13681
13684 }
13685 }
13686 }
13687
13689 {
13691 {
13692 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13693 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13694 {
13695 float heatPermCoef = 1.0;
13697 while (ent)
13698 {
13699 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13700 ent = ent.GetHierarchyParent();
13701 }
13702
13703 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13704 }
13705 }
13706 }
13707
13709 {
13710
13711 EntityAI parent = GetHierarchyParent();
13712 if (!parent)
13713 {
13714 hasParent = false;
13715 hasRootAsPlayer = false;
13716 }
13717 else
13718 {
13719 hasParent = true;
13720 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13721 refParentIB =
ItemBase.Cast(parent);
13722 }
13723 }
13724
13725 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13726 {
13727
13728 }
13729
13731 {
13732
13733 return false;
13734 }
13735
13737 {
13738
13739
13740 return false;
13741 }
13742
13744 {
13745
13746 return false;
13747 }
13748
13751 {
13752 return !GetIsFrozen() &&
IsOpen();
13753 }
13754
13756 {
13757 bool hasParent = false, hasRootAsPlayer = false;
13759
13760 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13761 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13762
13763 if (wwtu || foodDecay)
13764 {
13768
13769 if (processWetness || processTemperature || processDecay)
13770 {
13772
13773 if (processWetness)
13774 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13775
13776 if (processTemperature)
13778
13779 if (processDecay)
13780 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13781 }
13782 }
13783 }
13784
13787 {
13789 }
13790
13792 {
13795
13796 return super.GetTemperatureFreezeThreshold();
13797 }
13798
13800 {
13803
13804 return super.GetTemperatureThawThreshold();
13805 }
13806
13808 {
13811
13812 return super.GetItemOverheatThreshold();
13813 }
13814
13816 {
13818 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13819
13820 return super.GetTemperatureFreezeTime();
13821 }
13822
13824 {
13826 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13827
13828 return super.GetTemperatureThawTime();
13829 }
13830
13835
13837 {
13838 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13839 }
13840
13842 {
13843 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13844 }
13845
13848 {
13850 }
13851
13853 {
13855 }
13856
13858 {
13860 }
13861
13864 {
13865 return null;
13866 }
13867
13870 {
13871 return false;
13872 }
13873
13875 {
13877 {
13880 if (!trg)
13881 {
13883 explosive = this;
13884 }
13885
13886 explosive.PairRemote(trg);
13888
13889 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13890 trg.SetPersistentPairID(persistentID);
13891 explosive.SetPersistentPairID(persistentID);
13892
13893 return true;
13894 }
13895 return false;
13896 }
13897
13900 {
13901 float ret = 1.0;
13904 ret *= GetHealth01();
13905
13906 return ret;
13907 }
13908
13909 #ifdef DEVELOPER
13910 override void SetDebugItem()
13911 {
13912 super.SetDebugItem();
13913 _itemBase = this;
13914 }
13915
13917 {
13918 string text = super.GetDebugText();
13919
13921 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13922
13923 return text;
13924 }
13925 #endif
13926
13928 {
13929 return true;
13930 }
13931
13933
13935
13937 {
13940 }
13941
13942
13950
13966}
13967
13969{
13971 if (entity)
13972 {
13973 bool is_item = entity.IsInherited(
ItemBase);
13974 if (is_item && full_quantity)
13975 {
13978 }
13979 }
13980 else
13981 {
13983 return NULL;
13984 }
13985 return entity;
13986}
13987
13989{
13990 if (item)
13991 {
13992 if (health > 0)
13993 item.SetHealth("", "", health);
13994
13995 if (item.CanHaveTemperature())
13996 {
13998 if (item.CanFreeze())
13999 item.SetFrozen(false);
14000 }
14001
14002 if (item.HasEnergyManager())
14003 {
14004 if (quantity >= 0)
14005 {
14006 item.GetCompEM().SetEnergy0To1(quantity);
14007 }
14008 else
14009 {
14011 }
14012 }
14013 else if (item.IsMagazine())
14014 {
14015 Magazine mag = Magazine.Cast(item);
14016 if (quantity >= 0)
14017 {
14018 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14019 }
14020 else
14021 {
14023 }
14024
14025 }
14026 else
14027 {
14028 if (quantity >= 0)
14029 {
14030 item.SetQuantityNormalized(quantity, false);
14031 }
14032 else
14033 {
14035 }
14036
14037 }
14038 }
14039}
14040
14041#ifdef DEVELOPER
14043#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.