9242{
9244 {
9245 return true;
9246 }
9247};
9248
9249
9250
9252{
9256
9258
9261
9262
9263
9264
9265
9274
9280
9285
9290
9311 protected bool m_IsResultOfSplit
9312
9314
9319
9320
9321
9323
9327
9328
9329
9331
9334
9335
9336
9342
9343
9351
9354
9355
9357
9358
9360
9361
9366
9367
9372
9373
9375
9376
9378 {
9383
9384 if (!
GetGame().IsDedicatedServer())
9385 {
9387 {
9389
9391 {
9393 }
9394 }
9395
9398 }
9399
9400 m_OldLocation = null;
9401
9403 {
9405 }
9406
9407 if (ConfigIsExisting("headSelectionsToHide"))
9408 {
9411 }
9412
9414 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9415 {
9417 }
9418
9420
9421 m_IsResultOfSplit = false;
9422
9424 }
9425
9427 {
9428 super.InitItemVariables();
9429
9435 m_Count = ConfigGetInt(
"count");
9436
9439
9444
9447
9452
9464
9468
9469
9472 if (ConfigIsExisting("canBeSplit"))
9473 {
9476 }
9477
9479 if (ConfigIsExisting("itemBehaviour"))
9481
9482
9485 RegisterNetSyncVariableInt("m_VarLiquidType");
9486 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9487
9488 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9489 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9490 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9491
9492 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9493 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9494 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9495 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9496
9497 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9498 RegisterNetSyncVariableBool("m_IsTakeable");
9499 RegisterNetSyncVariableBool("m_IsHologram");
9500
9503 {
9506 }
9507
9509
9511 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9513
9514 }
9515
9517 {
9519 }
9520
9522 {
9525 {
9530 }
9531 }
9532
9533 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9534 {
9536 {
9539 }
9540
9542 }
9543
9545 {
9551 }
9552
9554
9556 {
9558
9559 if (!action)
9560 {
9561 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9562 return;
9563 }
9564
9566 if (!ai)
9567 {
9569 return;
9570 }
9571
9573 if (!action_array)
9574 {
9575 action_array = new array<ActionBase_Basic>;
9577 }
9578 if (LogManager.IsActionLogEnable())
9579 {
9580 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9581 }
9582
9583 if (action_array.Find(action) != -1)
9584 {
9585 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9586 }
9587 else
9588 {
9589 action_array.Insert(action);
9590 }
9591 }
9592
9594 {
9596 ActionBase action = player.GetActionManager().GetAction(actionName);
9599
9600 if (action_array)
9601 {
9602 action_array.RemoveItem(action);
9603 }
9604 }
9605
9606
9607
9609 {
9610 ActionOverrideData overrideData = new ActionOverrideData();
9614
9616 if (!actionMap)
9617 {
9620 }
9621
9622 actionMap.Insert(this.
Type(), overrideData);
9623
9624 }
9625
9627
9629
9630
9632 {
9635
9638
9639 string config_to_search = "CfgVehicles";
9640 string muzzle_owner_config;
9641
9643 {
9644 if (IsInherited(Weapon))
9645 config_to_search = "CfgWeapons";
9646
9647 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9648
9649 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9650
9652
9653 if (config_OnFire_subclass_count > 0)
9654 {
9655 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9656
9657 for (int i = 0; i < config_OnFire_subclass_count; i++)
9658 {
9659 string particle_class = "";
9661 string config_OnFire_entry = config_OnFire_class + particle_class;
9662 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9663 WPOF_array.Insert(WPOF);
9664 }
9665
9666
9668 }
9669 }
9670
9672 {
9673 config_to_search = "CfgWeapons";
9674 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9675
9676 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9677
9679
9680 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9681 {
9682 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9683
9684 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9685 {
9686 string particle_class2 = "";
9688 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9689 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9690 WPOBE_array.Insert(WPOBE);
9691 }
9692
9693
9695 }
9696 }
9697 }
9698
9699
9701 {
9704
9706 {
9707 string config_to_search = "CfgVehicles";
9708
9709 if (IsInherited(Weapon))
9710 config_to_search = "CfgWeapons";
9711
9712 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9713 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9714
9715 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9716 {
9717
9719
9721 {
9723 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9725 return;
9726 }
9727
9730
9731
9732
9734 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9735
9736 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9737 {
9738 string particle_class = "";
9740 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9742
9743 if (entry_type == CT_CLASS)
9744 {
9745 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9746 WPOOH_array.Insert(WPOF);
9747 }
9748 }
9749
9750
9752 }
9753 }
9754 }
9755
9757 {
9759 }
9760
9762 {
9764 {
9766
9769
9772
9773 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9774 }
9775 }
9776
9778 {
9780 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9781
9783 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9784
9786 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9787
9789 {
9791 }
9792 }
9793
9795 {
9797 }
9798
9800 {
9803 else
9805
9807 {
9810 }
9811 else
9812 {
9815
9818 }
9819
9821 }
9822
9824 {
9826 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9827 }
9828
9830 {
9832 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9834 }
9835
9837 {
9839 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9840 }
9841
9843 {
9846
9847 OverheatingParticle OP = new OverheatingParticle();
9852
9854 }
9855
9857 {
9860
9861 return -1;
9862 }
9863
9865 {
9867 {
9870
9871 for (int i = count; i > 0; --i)
9872 {
9873 int id = i - 1;
9876
9879
9880 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9881 {
9882 if (p)
9883 {
9886 }
9887 }
9888 }
9889 }
9890 }
9891
9893 {
9895 {
9897 {
9898 int id = i - 1;
9900
9901 if (OP)
9902 {
9904
9905 if (p)
9906 {
9908 }
9909
9910 delete OP;
9911 }
9912 }
9913
9916 }
9917 }
9918
9921 {
9922 return 0.0;
9923 }
9924
9925
9927 {
9928 return 250;
9929 }
9930
9932 {
9933 return 0;
9934 }
9935
9938 {
9940 return true;
9941
9942 return false;
9943 }
9944
9947 {
9950
9952 {
9954 }
9955 else
9956 {
9957
9959 }
9960
9962 }
9963
9970 {
9971 return -1;
9972 }
9973
9974
9975
9976
9978 {
9980 {
9982 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9983
9984 if (r_index >= 0)
9985 {
9986 InventoryLocation r_il = new InventoryLocation;
9987 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9988
9989 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9992 {
9993 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9994 }
9996 {
9997 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9998 }
9999
10000 }
10001
10002 player.GetHumanInventory().ClearUserReservedLocation(this);
10003 }
10004
10007 }
10008
10009
10010
10011
10013 {
10014 return ItemBase.m_DebugActionsMask;
10015 }
10016
10018 {
10019 return ItemBase.m_DebugActionsMask & mask;
10020 }
10021
10023 {
10024 ItemBase.m_DebugActionsMask = mask;
10025 }
10026
10028 {
10029 ItemBase.m_DebugActionsMask |= mask;
10030 }
10031
10033 {
10034 ItemBase.m_DebugActionsMask &= ~mask;
10035 }
10036
10038 {
10040 {
10042 }
10043 else
10044 {
10046 }
10047 }
10048
10049
10051 {
10052 if (GetEconomyProfile())
10053 {
10054 float q_max = GetEconomyProfile().GetQuantityMax();
10055 if (q_max > 0)
10056 {
10057 float q_min = GetEconomyProfile().GetQuantityMin();
10058 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10059
10061 {
10062 ComponentEnergyManager comp = GetCompEM();
10064 {
10066 }
10067 }
10069 {
10071
10072 }
10073
10074 }
10075 }
10076 }
10077
10080 {
10081 EntityAI parent = GetHierarchyParent();
10082
10083 if (parent)
10084 {
10085 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10086 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10087 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10088 }
10089 }
10090
10093 {
10094 EntityAI parent = GetHierarchyParent();
10095
10096 if (parent)
10097 {
10098 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10099 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10100 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10101 }
10102 }
10103
10105 {
10106
10107
10108
10109
10111
10113 {
10114 if (ScriptInputUserData.CanStoreInputUserData())
10115 {
10116 ScriptInputUserData ctx = new ScriptInputUserData;
10122 ctx.
Write(use_stack_max);
10125
10127 {
10128 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10129 }
10130 }
10131 }
10132 else if (!
GetGame().IsMultiplayer())
10133 {
10135 }
10136 }
10137
10139 {
10141 }
10142
10144 {
10146 }
10147
10149 {
10151 }
10152
10154 {
10155
10156 return false;
10157 }
10158
10160 {
10161 return false;
10162 }
10163
10167 {
10168 return false;
10169 }
10170
10172 {
10173 return "";
10174 }
10175
10177
10179 {
10180 return false;
10181 }
10182
10184 {
10185 return true;
10186 }
10187
10188
10189
10191 {
10192 return true;
10193 }
10194
10196 {
10197 return true;
10198 }
10199
10201 {
10202 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10204 }
10205
10207 {
10209 }
10210
10212 {
10214 if (!is_being_placed)
10216 SetSynchDirty();
10217 }
10218
10219
10221
10223 {
10225 }
10226
10228 {
10230 }
10231
10233 {
10234 return 1;
10235 }
10236
10238 {
10239 return false;
10240 }
10241
10243 {
10245 SetSynchDirty();
10246 }
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10273
10274
10275
10276
10277
10278
10279
10280
10281
10283 {
10284 super.OnMovedInsideCargo(container);
10285
10286 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10287 }
10288
10289 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10290 {
10291 super.EEItemLocationChanged(oldLoc,newLoc);
10292
10293 PlayerBase new_player = null;
10294 PlayerBase old_player = null;
10295
10296 if (newLoc.GetParent())
10297 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10298
10299 if (oldLoc.GetParent())
10300 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10301
10303 {
10304 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10305
10306 if (r_index >= 0)
10307 {
10308 InventoryLocation r_il = new InventoryLocation;
10309 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10310
10311 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10314 {
10315 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10316 }
10318 {
10319 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10320 }
10321
10322 }
10323 }
10324
10326 {
10327 if (new_player)
10328 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10329
10330 if (new_player == old_player)
10331 {
10332
10333 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10334 {
10336 {
10337 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10338 {
10339 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10340 }
10341 }
10342 else
10343 {
10344 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10345 }
10346 }
10347
10348 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10349 {
10350 int type = oldLoc.GetType();
10352 {
10353 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10354 }
10356 {
10357 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10358 }
10359 }
10360 if (!m_OldLocation)
10361 {
10362 m_OldLocation = new InventoryLocation;
10363 }
10364 m_OldLocation.Copy(oldLoc);
10365 }
10366 else
10367 {
10368 if (m_OldLocation)
10369 {
10370 m_OldLocation.Reset();
10371 }
10372 }
10373
10375 }
10376 else
10377 {
10378 if (new_player)
10379 {
10380 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10381 if (res_index >= 0)
10382 {
10383 InventoryLocation il = new InventoryLocation;
10384 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10386 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10389 {
10390 il.
GetParent().GetOnReleaseLock().Invoke(it);
10391 }
10393 {
10395 }
10396
10397 }
10398 }
10400 {
10401
10403 }
10404
10405 if (m_OldLocation)
10406 {
10407 m_OldLocation.Reset();
10408 }
10409 }
10410 }
10411
10412 override void EOnContact(IEntity other, Contact extra)
10413 {
10415 {
10416 int liquidType = -1;
10418 if (impactSpeed > 0.0)
10419 {
10421 #ifndef SERVER
10423 #else
10425 SetSynchDirty();
10426 #endif
10428 }
10429 }
10430
10431 #ifdef SERVER
10432 if (GetCompEM() && GetCompEM().IsPlugged())
10433 {
10434 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10435 GetCompEM().UnplugThis();
10436 }
10437 #endif
10438 }
10439
10441
10443 {
10445 }
10446
10448 {
10449
10450 }
10451
10453 {
10454 super.OnItemLocationChanged(old_owner, new_owner);
10455
10456 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10457 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10458
10459 if (!relatedPlayer && playerNew)
10460 relatedPlayer = playerNew;
10461
10462 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10463 {
10465 if (actionMgr)
10466 {
10467 ActionBase currentAction = actionMgr.GetRunningAction();
10468 if (currentAction)
10470 }
10471 }
10472
10473 Man ownerPlayerOld = null;
10474 Man ownerPlayerNew = null;
10475
10476 if (old_owner)
10477 {
10478 if (old_owner.
IsMan())
10479 {
10480 ownerPlayerOld = Man.Cast(old_owner);
10481 }
10482 else
10483 {
10484 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10485 }
10486 }
10487 else
10488 {
10490 {
10492
10493 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10494 {
10495 GetCompEM().UnplugThis();
10496 }
10497 }
10498 }
10499
10500 if (new_owner)
10501 {
10502 if (new_owner.
IsMan())
10503 {
10504 ownerPlayerNew = Man.Cast(new_owner);
10505 }
10506 else
10507 {
10508 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10509 }
10510 }
10511
10512 if (ownerPlayerOld != ownerPlayerNew)
10513 {
10514 if (ownerPlayerOld)
10515 {
10516 array<EntityAI> subItemsExit = new array<EntityAI>;
10518 for (int i = 0; i < subItemsExit.Count(); i++)
10519 {
10522 }
10523 }
10524
10525 if (ownerPlayerNew)
10526 {
10527 array<EntityAI> subItemsEnter = new array<EntityAI>;
10529 for (int j = 0; j < subItemsEnter.Count(); j++)
10530 {
10533 }
10534 }
10535 }
10536 else if (ownerPlayerNew != null)
10537 {
10538 PlayerBase nplayer;
10539 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10540 {
10541 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10543 for (int k = 0; k < subItemsUpdate.Count(); k++)
10544 {
10546 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10547 }
10548 }
10549 }
10550
10551 if (old_owner)
10552 old_owner.OnChildItemRemoved(this);
10553 if (new_owner)
10554 new_owner.OnChildItemReceived(this);
10555 }
10556
10557
10559 {
10560 super.EEDelete(parent);
10561 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10562 if (player)
10563 {
10565
10566 if (player.IsAlive())
10567 {
10568 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10569 if (r_index >= 0)
10570 {
10571 InventoryLocation r_il = new InventoryLocation;
10572 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10573
10574 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10577 {
10578 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10579 }
10581 {
10582 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10583 }
10584
10585 }
10586
10587 player.RemoveQuickBarEntityShortcut(this);
10588 }
10589 }
10590 }
10591
10593 {
10594 super.EEKilled(killer);
10595
10598 {
10599 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10600 {
10601 if (IsMagazine())
10602 {
10603 if (Magazine.Cast(this).GetAmmoCount() > 0)
10604 {
10606 }
10607 }
10608 else
10609 {
10611 }
10612 }
10613 }
10614 }
10615
10617 {
10618 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10619
10620 super.OnWasAttached(parent, slot_id);
10621
10624
10626 }
10627
10629 {
10630 super.OnWasDetached(parent, slot_id);
10631
10634 }
10635
10637 {
10638 int idx;
10641
10642 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10643 if (inventory_slots.Count() < 1)
10644 {
10645 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10646 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10647 }
10648 else
10649 {
10650 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10651 }
10652
10653 idx = inventory_slots.Find(slot);
10654 if (idx < 0)
10655 return "";
10656
10657 return attach_types.Get(idx);
10658 }
10659
10661 {
10662 int idx = -1;
10663 string slot;
10664
10667
10668 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10669 if (inventory_slots.Count() < 1)
10670 {
10671 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10672 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10673 }
10674 else
10675 {
10676 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10677 if (detach_types.Count() < 1)
10678 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10679 }
10680
10681 for (int i = 0; i < inventory_slots.Count(); i++)
10682 {
10683 slot = inventory_slots.Get(i);
10684 }
10685
10686 if (slot != "")
10687 {
10688 if (detach_types.Count() == 1)
10689 idx = 0;
10690 else
10691 idx = inventory_slots.Find(slot);
10692 }
10693 if (idx < 0)
10694 return "";
10695
10696 return detach_types.Get(idx);
10697 }
10698
10700 {
10701
10703
10704
10705 float min_time = 1;
10706 float max_time = 3;
10707 float delay = Math.RandomFloat(min_time, max_time);
10708
10709 explode_timer.Run(delay, this, "DoAmmoExplosion");
10710 }
10711
10713 {
10714 Magazine magazine = Magazine.Cast(this);
10715 int pop_sounds_count = 6;
10716 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10717
10718
10719 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10720 string sound_name = pop_sounds[ sound_idx ];
10722
10723
10724 magazine.ServerAddAmmoCount(-1);
10725
10726
10727 float min_temp_to_explode = 100;
10728
10729 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10730 {
10732 }
10733 }
10734
10735
10736 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10737 {
10738 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10739
10740 const int CHANCE_DAMAGE_CARGO = 4;
10741 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10742 const int CHANCE_DAMAGE_NOTHING = 2;
10743
10745 {
10746 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10747 int chances;
10748 int rnd;
10749
10750 if (GetInventory().GetCargo())
10751 {
10752 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10753 rnd = Math.RandomInt(0,chances);
10754
10755 if (rnd < CHANCE_DAMAGE_CARGO)
10756 {
10758 }
10759 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10760 {
10762 }
10763 }
10764 else
10765 {
10766 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10767 rnd = Math.RandomInt(0,chances);
10768
10769 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10770 {
10772 }
10773 }
10774 }
10775 }
10776
10778 {
10779 if (GetInventory().GetCargo())
10780 {
10781 int item_count = GetInventory().GetCargo().GetItemCount();
10782 if (item_count > 0)
10783 {
10784 int random_pick = Math.RandomInt(0, item_count);
10786 if (!item.IsExplosive())
10787 {
10788 item.AddHealth("","",damage);
10789 return true;
10790 }
10791 }
10792 }
10793 return false;
10794 }
10795
10797 {
10798 int attachment_count = GetInventory().AttachmentCount();
10799 if (attachment_count > 0)
10800 {
10801 int random_pick = Math.RandomInt(0, attachment_count);
10802 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10803 if (!attachment.IsExplosive())
10804 {
10805 attachment.AddHealth("","",damage);
10806 return true;
10807 }
10808 }
10809 return false;
10810 }
10811
10813 {
10815 }
10816
10818 {
10820 return GetInventory().CanRemoveEntity();
10821
10822 return false;
10823 }
10824
10826 {
10827
10829 return false;
10830
10831
10833 return false;
10834
10835
10836
10838 if (delta == 0)
10839 return false;
10840
10841
10842 return true;
10843 }
10844
10846 {
10848 {
10849 if (ScriptInputUserData.CanStoreInputUserData())
10850 {
10851 ScriptInputUserData ctx = new ScriptInputUserData;
10856 ctx.
Write(destination_entity);
10858 ctx.
Write(slot_id);
10860 }
10861 }
10862 else if (!
GetGame().IsMultiplayer())
10863 {
10865 }
10866 }
10867
10869 {
10870 float split_quantity_new;
10874 InventoryLocation loc = new InventoryLocation;
10875
10876 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10877 {
10879 split_quantity_new = stack_max;
10880 else
10882
10884 {
10885 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10886 if (new_item)
10887 {
10888 new_item.SetResultOfSplit(true);
10889 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10891 new_item.
SetQuantity(split_quantity_new,
false,
true);
10892 }
10893 }
10894 }
10895 else if (destination_entity && slot_id == -1)
10896 {
10897 if (quantity > stack_max)
10898 split_quantity_new = stack_max;
10899 else
10900 split_quantity_new = quantity;
10901
10903 {
10905 {
10908 }
10909
10910 if (new_item)
10911 {
10912 new_item.SetResultOfSplit(true);
10913 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10915 new_item.
SetQuantity(split_quantity_new,
false,
true);
10916 }
10917 }
10918 }
10919 else
10920 {
10921 if (stack_max != 0)
10922 {
10924 {
10926 }
10927
10928 if (split_quantity_new == 0)
10929 {
10930 if (!
GetGame().IsMultiplayer())
10931 player.PhysicalPredictiveDropItem(this);
10932 else
10933 player.ServerDropEntity(this);
10934 return;
10935 }
10936
10938 {
10940
10941 if (new_item)
10942 {
10943 new_item.SetResultOfSplit(true);
10944 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10947 new_item.PlaceOnSurface();
10948 }
10949 }
10950 }
10951 }
10952 }
10953
10955 {
10956 float split_quantity_new;
10960 InventoryLocation loc = new InventoryLocation;
10961
10962 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10963 {
10965 split_quantity_new = stack_max;
10966 else
10968
10970 {
10971 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10972 if (new_item)
10973 {
10974 new_item.SetResultOfSplit(true);
10975 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10977 new_item.
SetQuantity(split_quantity_new,
false,
true);
10978 }
10979 }
10980 }
10981 else if (destination_entity && slot_id == -1)
10982 {
10983 if (quantity > stack_max)
10984 split_quantity_new = stack_max;
10985 else
10986 split_quantity_new = quantity;
10987
10989 {
10991 {
10994 }
10995
10996 if (new_item)
10997 {
10998 new_item.SetResultOfSplit(true);
10999 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11001 new_item.
SetQuantity(split_quantity_new,
false,
true);
11002 }
11003 }
11004 }
11005 else
11006 {
11007 if (stack_max != 0)
11008 {
11010 {
11012 }
11013
11015 {
11017
11018 if (new_item)
11019 {
11020 new_item.SetResultOfSplit(true);
11021 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11024 new_item.PlaceOnSurface();
11025 }
11026 }
11027 }
11028 }
11029 }
11030
11032 {
11034 {
11035 if (ScriptInputUserData.CanStoreInputUserData())
11036 {
11037 ScriptInputUserData ctx = new ScriptInputUserData;
11042 dst.WriteToContext(ctx);
11044 }
11045 }
11046 else if (!
GetGame().IsMultiplayer())
11047 {
11049 }
11050 }
11051
11053 {
11055 {
11056 if (ScriptInputUserData.CanStoreInputUserData())
11057 {
11058 ScriptInputUserData ctx = new ScriptInputUserData;
11063 ctx.
Write(destination_entity);
11069 }
11070 }
11071 else if (!
GetGame().IsMultiplayer())
11072 {
11074 }
11075 }
11076
11078 {
11080 }
11081
11083 {
11085 float split_quantity_new;
11087 if (dst.IsValid())
11088 {
11089 int slot_id = dst.GetSlot();
11091
11092 if (quantity > stack_max)
11093 split_quantity_new = stack_max;
11094 else
11095 split_quantity_new = quantity;
11096
11098 {
11100
11101 if (new_item)
11102 {
11103 new_item.SetResultOfSplit(true);
11104 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11106 new_item.
SetQuantity(split_quantity_new,
false,
true);
11107 }
11108
11109 return new_item;
11110 }
11111 }
11112
11113 return null;
11114 }
11115
11117 {
11119 float split_quantity_new;
11121 if (destination_entity)
11122 {
11124 if (quantity > stackable)
11125 split_quantity_new = stackable;
11126 else
11127 split_quantity_new = quantity;
11128
11130 {
11131 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11132 if (new_item)
11133 {
11134 new_item.SetResultOfSplit(true);
11135 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11137 new_item.
SetQuantity(split_quantity_new,
false,
true);
11138 }
11139 }
11140 }
11141 }
11142
11144 {
11146 {
11147 if (ScriptInputUserData.CanStoreInputUserData())
11148 {
11149 ScriptInputUserData ctx = new ScriptInputUserData;
11154 ItemBase destination_entity =
this;
11155 ctx.
Write(destination_entity);
11159 }
11160 }
11161 else if (!
GetGame().IsMultiplayer())
11162 {
11164 }
11165 }
11166
11168 {
11170 float split_quantity_new;
11172 if (player)
11173 {
11175 if (quantity > stackable)
11176 split_quantity_new = stackable;
11177 else
11178 split_quantity_new = quantity;
11179
11181 {
11182 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11183 new_item =
ItemBase.Cast(in_hands);
11184 if (new_item)
11185 {
11186 new_item.SetResultOfSplit(true);
11187 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11189 new_item.SetQuantity(split_quantity_new, false, true);
11190 }
11191 }
11192 }
11193 }
11194
11196 {
11198 float split_quantity_new = Math.Floor(quantity * 0.5);
11199
11201 return;
11202
11204
11205 if (new_item)
11206 {
11207 if (new_item.GetQuantityMax() < split_quantity_new)
11208 {
11209 split_quantity_new = new_item.GetQuantityMax();
11210 }
11211
11212 new_item.SetResultOfSplit(true);
11213 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11214
11216 {
11219 }
11220 else
11221 {
11223 new_item.
SetQuantity(split_quantity_new,
false,
true);
11224 }
11225 }
11226 }
11227
11229 {
11231 float split_quantity_new = Math.Floor(quantity / 2);
11232
11234 return;
11235
11236 InventoryLocation invloc = new InventoryLocation;
11238
11240 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11241
11242 if (new_item)
11243 {
11244 if (new_item.GetQuantityMax() < split_quantity_new)
11245 {
11246 split_quantity_new = new_item.GetQuantityMax();
11247 }
11249 {
11252 }
11253 else if (split_quantity_new > 1)
11254 {
11256 new_item.
SetQuantity(split_quantity_new,
false,
true);
11257 }
11258 }
11259 }
11260
11263 {
11264 SetWeightDirty();
11266
11267 if (parent)
11268 parent.OnAttachmentQuantityChangedEx(this, delta);
11269
11271 {
11273 {
11275 }
11277 {
11278 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11280 }
11281 }
11282
11283 }
11284
11287 {
11288
11289 }
11290
11293 {
11295 }
11296
11298 {
11299 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11300
11302 {
11303 if (newLevel == GameConstants.STATE_RUINED)
11304 {
11306 EntityAI parent = GetHierarchyParent();
11307 if (parent && parent.IsFireplace())
11308 {
11309 CargoBase cargo = GetInventory().GetCargo();
11310 if (cargo)
11311 {
11313 {
11315 }
11316 }
11317 }
11318 }
11319
11321 {
11322
11324 return;
11325 }
11326
11327 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11328 {
11330 }
11331 }
11332 }
11333
11334
11336 {
11337 super.OnRightClick();
11338
11340 {
11342 {
11343 if (ScriptInputUserData.CanStoreInputUserData())
11344 {
11345 EntityAI root = GetHierarchyRoot();
11346 Man playerOwner = GetHierarchyRootPlayer();
11347 InventoryLocation dst = new InventoryLocation;
11348
11349
11350 if (!playerOwner && root && root == this)
11351 {
11353 }
11354 else
11355 {
11356
11357 GetInventory().GetCurrentInventoryLocation(dst);
11359 {
11362 {
11364 }
11365 else
11366 {
11368
11369
11370 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11371 {
11373 }
11374 else
11375 {
11376 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11377 }
11378 }
11379 }
11380 }
11381
11382 ScriptInputUserData ctx = new ScriptInputUserData;
11390 }
11391 }
11392 else if (!
GetGame().IsMultiplayer())
11393 {
11395 }
11396 }
11397 }
11398
11400 {
11401 if (root)
11402 {
11403 vector m4[4];
11404 root.GetTransform(m4);
11405 dst.SetGround(this, m4);
11406 }
11407 else
11408 {
11409 GetInventory().GetCurrentInventoryLocation(dst);
11410 }
11411 }
11412
11413 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11414 {
11415
11416 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11417 return false;
11418
11419 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11420 return false;
11421
11422
11424 return false;
11425
11426
11427 Magazine mag = Magazine.Cast(this);
11428 if (mag)
11429 {
11430 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11431 return false;
11432
11433 if (stack_max_limit)
11434 {
11435 Magazine other_mag = Magazine.Cast(other_item);
11436 if (other_item)
11437 {
11438 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11439 return false;
11440 }
11441
11442 }
11443 }
11444 else
11445 {
11446
11448 return false;
11449
11451 return false;
11452 }
11453
11454 PlayerBase player = null;
11455 if (CastTo(player, GetHierarchyRootPlayer()))
11456 {
11457 if (player.GetInventory().HasAttachment(this))
11458 return false;
11459
11460 if (player.IsItemsToDelete())
11461 return false;
11462 }
11463
11464 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11465 return false;
11466
11467 int slotID;
11469 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11470 return false;
11471
11472 return true;
11473 }
11474
11476 {
11478 }
11479
11481 {
11482 return m_IsResultOfSplit;
11483 }
11484
11486 {
11487 m_IsResultOfSplit = value;
11488 }
11489
11491 {
11493 }
11494
11496 {
11497 float other_item_quantity = other_item.GetQuantity();
11498 float this_free_space;
11499
11501
11503
11504 if (other_item_quantity > this_free_space)
11505 {
11506 return this_free_space;
11507 }
11508 else
11509 {
11510 return other_item_quantity;
11511 }
11512 }
11513
11515 {
11517 }
11518
11520 {
11522 return;
11523
11524 if (!IsMagazine() && other_item)
11525 {
11527 if (quantity_used != 0)
11528 {
11529 float hp1 = GetHealth01("","");
11530 float hp2 = other_item.GetHealth01("","");
11531 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11532 hpResult = hpResult / (
GetQuantity() + quantity_used);
11533
11534 hpResult *= GetMaxHealth();
11535 Math.Round(hpResult);
11536 SetHealth("", "Health", hpResult);
11537
11539 other_item.AddQuantity(-quantity_used);
11540 }
11541 }
11543 }
11544
11546 {
11547 #ifdef SERVER
11548 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11549 GetHierarchyParent().IncreaseLifetimeUp();
11550 #endif
11551 };
11552
11554 {
11555 PlayerBase p = PlayerBase.Cast(player);
11556
11557 array<int> recipesIds = p.m_Recipes;
11558 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11559 if (moduleRecipesManager)
11560 {
11561 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11562 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11563 }
11564
11565 for (int i = 0;i < recipesIds.Count(); i++)
11566 {
11567 int key = recipesIds.Get(i);
11568 string recipeName = moduleRecipesManager.GetRecipeName(key);
11570 }
11571 }
11572
11573
11574 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11575 {
11576 super.GetDebugActions(outputList);
11577
11578
11584
11585
11590
11595
11596
11600
11601
11603 {
11607 }
11608
11611
11612
11616
11618
11619 InventoryLocation loc = new InventoryLocation();
11620 GetInventory().GetCurrentInventoryLocation(loc);
11622 {
11623 if (Gizmo_IsSupported())
11626 }
11627
11629 }
11630
11631
11632
11633
11635 {
11636 super.OnAction(action_id, player, ctx);
11637
11639 {
11640 switch (action_id)
11641 {
11644 return true;
11647 return true;
11648 }
11649 }
11650
11652 {
11653 switch (action_id)
11654 {
11656 Delete();
11657 return true;
11658 }
11659 }
11660
11661 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11662 {
11663 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11664 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11665 PlayerBase p = PlayerBase.Cast(player);
11666 if (
EActions.RECIPES_RANGE_START < 1000)
11667 {
11668 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11669 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11670 }
11671 }
11672 #ifndef SERVER
11673 else if (action_id ==
EActions.WATCH_PLAYER)
11674 {
11675 PluginDeveloper.SetDeveloperItemClientEx(player);
11676 }
11677 #endif
11679 {
11680 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11681 {
11682 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11683 OnDebugButtonPressServer(id + 1);
11684 }
11685
11686 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11687 {
11688 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11690 }
11691
11692 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11693 {
11694 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11696 }
11697
11698 else if (action_id ==
EActions.ADD_QUANTITY)
11699 {
11700 if (IsMagazine())
11701 {
11702 Magazine mag = Magazine.Cast(this);
11703 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11704 }
11705 else
11706 {
11708 }
11709
11710 if (m_EM)
11711 {
11712 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11713 }
11714
11715 }
11716
11717 else if (action_id ==
EActions.REMOVE_QUANTITY)
11718 {
11719 if (IsMagazine())
11720 {
11721 Magazine mag2 = Magazine.Cast(this);
11722 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11723 }
11724 else
11725 {
11727 }
11728 if (m_EM)
11729 {
11730 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11731 }
11732
11733 }
11734
11735 else if (action_id ==
EActions.SET_QUANTITY_0)
11736 {
11738
11739 if (m_EM)
11740 {
11741 m_EM.SetEnergy(0);
11742 }
11743 }
11744
11745 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11746 {
11748
11749 if (m_EM)
11750 {
11751 m_EM.SetEnergy(m_EM.GetEnergyMax());
11752 }
11753 }
11754
11755 else if (action_id ==
EActions.ADD_HEALTH)
11756 {
11757 AddHealth("","",GetMaxHealth("","Health")/5);
11758 }
11759 else if (action_id ==
EActions.REMOVE_HEALTH)
11760 {
11761 AddHealth("","",-GetMaxHealth("","Health")/5);
11762 }
11763 else if (action_id ==
EActions.DESTROY_HEALTH)
11764 {
11765 SetHealth01("","",0);
11766 }
11767 else if (action_id ==
EActions.WATCH_ITEM)
11768 {
11770 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11771 #ifdef DEVELOPER
11772 SetDebugDeveloper_item(this);
11773 #endif
11774 }
11775
11776 else if (action_id ==
EActions.ADD_TEMPERATURE)
11777 {
11778 AddTemperature(20);
11779
11780 }
11781
11782 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11783 {
11784 AddTemperature(-20);
11785
11786 }
11787
11788 else if (action_id ==
EActions.FLIP_FROZEN)
11789 {
11790 SetFrozen(!GetIsFrozen());
11791
11792 }
11793
11794 else if (action_id ==
EActions.ADD_WETNESS)
11795 {
11797
11798 }
11799
11800 else if (action_id ==
EActions.REMOVE_WETNESS)
11801 {
11803
11804 }
11805
11806 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11807 {
11810
11811
11812 }
11813
11814 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11815 {
11818 }
11819
11820 else if (action_id ==
EActions.MAKE_SPECIAL)
11821 {
11822 auto debugParams = DebugSpawnParams.WithPlayer(player);
11823 OnDebugSpawnEx(debugParams);
11824 }
11825
11826 }
11827
11828
11829 return false;
11830 }
11831
11832
11833
11834
11838
11841
11842
11843
11845 {
11846 return false;
11847 }
11848
11849
11851 {
11852 return true;
11853 }
11854
11855
11857 {
11858 return true;
11859 }
11860
11861
11862
11864 {
11865 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11867 }
11868
11871 {
11872 return null;
11873 }
11874
11876 {
11877 return false;
11878 }
11879
11881 {
11882 return false;
11883 }
11884
11888
11889
11891 {
11892 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11893 return module_repairing.CanRepair(this, item_repair_kit);
11894 }
11895
11896
11897 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11898 {
11899 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11900 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11901 }
11902
11903
11905 {
11906
11907
11908
11909
11910
11911
11912
11913
11914 return 1;
11915 }
11916
11917
11918
11920 {
11922 }
11923
11924
11925
11927 {
11929 }
11930
11931
11940 {
11941 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11942
11943 if (player)
11944 {
11945 player.MessageStatus(text);
11946 }
11947 }
11948
11949
11958 {
11959 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11960
11961 if (player)
11962 {
11963 player.MessageAction(text);
11964 }
11965 }
11966
11967
11976 {
11977 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11978
11979 if (player)
11980 {
11981 player.MessageFriendly(text);
11982 }
11983 }
11984
11985
11994 {
11995 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11996
11997 if (player)
11998 {
11999 player.MessageImportant(text);
12000 }
12001 }
12002
12004 {
12005 return true;
12006 }
12007
12008
12009 override bool KindOf(
string tag)
12010 {
12011 bool found = false;
12012 string item_name = this.
GetType();
12015
12016 int array_size = item_tag_array.Count();
12017 for (int i = 0; i < array_size; i++)
12018 {
12019 if (item_tag_array.Get(i) == tag)
12020 {
12021 found = true;
12022 break;
12023 }
12024 }
12025 return found;
12026 }
12027
12028
12030 {
12031
12032 super.OnRPC(sender, rpc_type,ctx);
12033
12034
12035 switch (rpc_type)
12036 {
12037 #ifndef SERVER
12038 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12039 Param2<bool, string> p = new Param2<bool, string>(false, "");
12040
12042 return;
12043
12044 bool play = p.param1;
12045 string soundSet = p.param2;
12046
12047 if (play)
12048 {
12050 {
12052 {
12054 }
12055 }
12056 else
12057 {
12059 }
12060 }
12061 else
12062 {
12064 }
12065
12066 break;
12067 #endif
12068
12069 }
12070
12072 {
12074 }
12075 }
12076
12077
12078
12079
12081 {
12082 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12083 return plugin.GetID(
name);
12084 }
12085
12087 {
12088 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12089 return plugin.GetName(id);
12090 }
12091
12094 {
12095
12096
12097 int varFlags;
12098 if (!ctx.
Read(varFlags))
12099 return;
12100
12101 if (varFlags & ItemVariableFlags.FLOAT)
12102 {
12104 }
12105 }
12106
12108 {
12109
12110 super.SerializeNumericalVars(floats_out);
12111
12112
12113
12115 {
12117 }
12118
12120 {
12122 }
12123
12125 {
12127 }
12128
12130 {
12135 }
12136
12138 {
12140 }
12141 }
12142
12144 {
12145
12146 super.DeSerializeNumericalVars(floats);
12147
12148
12149 int index = 0;
12150 int mask = Math.Round(floats.Get(index));
12151
12152 index++;
12153
12155 {
12157 {
12159 }
12160 else
12161 {
12162 float quantity = floats.Get(index);
12163 SetQuantity(quantity,
true,
false,
false,
false);
12164 }
12165 index++;
12166 }
12167
12169 {
12170 float wet = floats.Get(index);
12172 index++;
12173 }
12174
12176 {
12177 int liquidtype = Math.Round(floats.Get(index));
12179 index++;
12180 }
12181
12183 {
12185 index++;
12187 index++;
12189 index++;
12191 index++;
12192 }
12193
12195 {
12196 int cleanness = Math.Round(floats.Get(index));
12198 index++;
12199 }
12200 }
12201
12203 {
12204 super.WriteVarsToCTX(ctx);
12205
12206
12208 {
12210 }
12211
12213 {
12215 }
12216
12218 {
12220 }
12221
12223 {
12224 int r,g,b,a;
12230 }
12231
12233 {
12235 }
12236 }
12237
12239 {
12240 if (!super.ReadVarsFromCTX(ctx,version))
12241 return false;
12242
12243 int intValue;
12244 float value;
12245
12246 if (version < 140)
12247 {
12248 if (!ctx.
Read(intValue))
12249 return false;
12250
12251 m_VariablesMask = intValue;
12252 }
12253
12255 {
12256 if (!ctx.
Read(value))
12257 return false;
12258
12260 {
12262 }
12263 else
12264 {
12266 }
12267 }
12268
12269 if (version < 140)
12270 {
12272 {
12273 if (!ctx.
Read(value))
12274 return false;
12275 SetTemperatureDirect(value);
12276 }
12277 }
12278
12280 {
12281 if (!ctx.
Read(value))
12282 return false;
12284 }
12285
12287 {
12288 if (!ctx.
Read(intValue))
12289 return false;
12291 }
12292
12294 {
12295 int r,g,b,a;
12297 return false;
12299 return false;
12301 return false;
12303 return false;
12304
12306 }
12307
12309 {
12310 if (!ctx.
Read(intValue))
12311 return false;
12313 }
12314
12315 if (version >= 138 && version < 140)
12316 {
12318 {
12319 if (!ctx.
Read(intValue))
12320 return false;
12321 SetFrozen(intValue);
12322 }
12323 }
12324
12325 return true;
12326 }
12327
12328
12330 {
12333 {
12335 }
12336
12337 if (!super.OnStoreLoad(ctx, version))
12338 {
12340 return false;
12341 }
12342
12343 if (version >= 114)
12344 {
12345 bool hasQuickBarIndexSaved;
12346
12347 if (!ctx.
Read(hasQuickBarIndexSaved))
12348 {
12350 return false;
12351 }
12352
12353 if (hasQuickBarIndexSaved)
12354 {
12355 int itmQBIndex;
12356
12357
12358 if (!ctx.
Read(itmQBIndex))
12359 {
12361 return false;
12362 }
12363
12364 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12365 if (itmQBIndex != -1 && parentPlayer)
12366 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12367 }
12368 }
12369 else
12370 {
12371
12372 PlayerBase player;
12373 int itemQBIndex;
12374 if (version ==
int.
MAX)
12375 {
12376 if (!ctx.
Read(itemQBIndex))
12377 {
12379 return false;
12380 }
12381 }
12382 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12383 {
12384
12385 if (!ctx.
Read(itemQBIndex))
12386 {
12388 return false;
12389 }
12390 if (itemQBIndex != -1 && player)
12391 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12392 }
12393 }
12394
12395 if (version < 140)
12396 {
12397
12398 if (!LoadVariables(ctx, version))
12399 {
12401 return false;
12402 }
12403 }
12404
12405
12407 {
12409 return false;
12410 }
12411 if (version >= 132)
12412 {
12414 if (raib)
12415 {
12417 {
12419 return false;
12420 }
12421 }
12422 }
12423
12425 return true;
12426 }
12427
12428
12429
12431 {
12432 super.OnStoreSave(ctx);
12433
12434 PlayerBase player;
12435 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12436 {
12438
12439 int itemQBIndex = -1;
12440 itemQBIndex = player.FindQuickBarEntityIndex(this);
12441 ctx.
Write(itemQBIndex);
12442 }
12443 else
12444 {
12446 }
12447
12449
12451 if (raib)
12452 {
12454 }
12455 }
12456
12457
12459 {
12460 super.AfterStoreLoad();
12461
12463 {
12465 }
12466
12468 {
12471 }
12472 }
12473
12475 {
12476 super.EEOnAfterLoad();
12477
12479 {
12481 }
12482
12485 }
12486
12488 {
12489 return false;
12490 }
12491
12492
12493
12495 {
12497 {
12498 #ifdef PLATFORM_CONSOLE
12499
12501 {
12503 if (menu)
12504 {
12506 }
12507 }
12508 #endif
12509 }
12510
12512 {
12515 }
12516
12518 {
12519 SetWeightDirty();
12521 }
12523 {
12526 }
12527
12529 {
12532 }
12534 {
12537 }
12538
12539 super.OnVariablesSynchronized();
12540 }
12541
12542
12543
12545 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12546 {
12547 if (!IsServerCheck(allow_client))
12548 return false;
12549
12551 return false;
12552
12555
12556 if (value <= (min + 0.001))
12557 value = min;
12558
12559 if (value == min)
12560 {
12561 if (destroy_config)
12562 {
12563 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12564 if (dstr)
12565 {
12567 this.Delete();
12568 return true;
12569 }
12570 }
12571 else if (destroy_forced)
12572 {
12574 this.Delete();
12575 return true;
12576 }
12577
12579 }
12580
12583
12585 {
12587
12588 if (delta)
12590 }
12591
12593
12594 return false;
12595 }
12596
12597
12599 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12600 {
12602 }
12603
12605 {
12608 }
12609
12611 {
12614 }
12615
12617 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12618 {
12619 float value_clamped = Math.Clamp(value, 0, 1);
12621 SetQuantity(result, destroy_config, destroy_forced);
12622 }
12623
12624
12627 {
12629 }
12630
12632 {
12634 }
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12646 {
12647 int slot = -1;
12648 if (GetInventory())
12649 {
12650 InventoryLocation il = new InventoryLocation;
12651 GetInventory().GetCurrentInventoryLocation(il);
12653 }
12654
12656 }
12657
12659 {
12660 float quantity_max = 0;
12661
12663 {
12664 if (attSlotID != -1)
12665 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12666
12667 if (quantity_max <= 0)
12669 }
12670
12671 if (quantity_max <= 0)
12673
12674 return quantity_max;
12675 }
12676
12678 {
12680 }
12681
12683 {
12685 }
12686
12687
12689 {
12691 }
12692
12694 {
12696 }
12697
12699 {
12701 }
12702
12703
12705 {
12706
12707 float weightEx = GetWeightEx();
12708 float special = GetInventoryAndCargoWeight();
12709 return weightEx - special;
12710 }
12711
12712
12714 {
12716 }
12717
12719 {
12721 {
12722 #ifdef DEVELOPER
12723 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12724 {
12725 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12727 }
12728 #endif
12729
12730 return GetQuantity() * GetConfigWeightModified();
12731 }
12732 else if (HasEnergyManager())
12733 {
12734 #ifdef DEVELOPER
12735 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12736 {
12737 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12738 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12739 }
12740 #endif
12741 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12742 }
12743 else
12744 {
12745 #ifdef DEVELOPER
12746 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12747 {
12748 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12749 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12750 }
12751 #endif
12752 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12753 }
12754 }
12755
12758 {
12759 int item_count = 0;
12761
12762 if (GetInventory().GetCargo() != NULL)
12763 {
12764 item_count = GetInventory().GetCargo().GetItemCount();
12765 }
12766
12767 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12768 {
12769 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12770 if (item)
12771 item_count += item.GetNumberOfItems();
12772 }
12773 return item_count;
12774 }
12775
12778 {
12779 float weight = 0;
12780 float wetness = 1;
12781 if (include_wetness)
12784 {
12785 weight = wetness * m_ConfigWeight;
12786 }
12788 {
12789 weight = 1;
12790 }
12791 return weight;
12792 }
12793
12794
12795
12797 {
12798 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12799 {
12800 GameInventory inv = GetInventory();
12801 array<EntityAI> items = new array<EntityAI>;
12803 for (int i = 0; i < items.Count(); i++)
12804 {
12806 if (item)
12807 {
12809 }
12810 }
12811 }
12812 }
12813
12814
12815
12816
12818 {
12819 float energy = 0;
12820 if (HasEnergyManager())
12821 {
12822 energy = GetCompEM().GetEnergy();
12823 }
12824 return energy;
12825 }
12826
12827
12829 {
12830 super.OnEnergyConsumed();
12831
12833 }
12834
12836 {
12837 super.OnEnergyAdded();
12838
12840 }
12841
12842
12844 {
12845 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12846 {
12848 {
12849 float energy_0to1 = GetCompEM().GetEnergy0To1();
12851 }
12852 }
12853 }
12854
12855
12857 {
12858 return ConfigGetFloat("heatIsolation");
12859 }
12860
12862 {
12864 }
12865
12867 {
12868 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12869 if (
GetGame().ConfigIsExisting(paramPath))
12871
12872 return 0.0;
12873 }
12874
12876 {
12877 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12878 if (
GetGame().ConfigIsExisting(paramPath))
12880
12881 return 0.0;
12882 }
12883
12884 override void SetWet(
float value,
bool allow_client =
false)
12885 {
12886 if (!IsServerCheck(allow_client))
12887 return;
12888
12891
12893
12894 m_VarWet = Math.Clamp(value, min, max);
12895
12897 {
12900 }
12901 }
12902
12903 override void AddWet(
float value)
12904 {
12906 }
12907
12909 {
12911 }
12912
12914 {
12916 }
12917
12919 {
12921 }
12922
12924 {
12926 }
12927
12929 {
12931 }
12932
12933 override void OnWetChanged(
float newVal,
float oldVal)
12934 {
12937 if (newLevel != oldLevel)
12938 {
12940 }
12941 }
12942
12944 {
12945 SetWeightDirty();
12946 }
12947
12949 {
12950 return GetWetLevelInternal(
m_VarWet);
12951 }
12952
12953
12954
12956 {
12958 }
12959
12961 {
12963 }
12964
12966 {
12968 }
12969
12971 {
12973 }
12974
12975
12976
12978 {
12979 if (ConfigIsExisting("itemModelLength"))
12980 {
12981 return ConfigGetFloat("itemModelLength");
12982 }
12983 return 0;
12984 }
12985
12987 {
12988 if (ConfigIsExisting("itemAttachOffset"))
12989 {
12990 return ConfigGetFloat("itemAttachOffset");
12991 }
12992 return 0;
12993 }
12994
12995 override void SetCleanness(
int value,
bool allow_client =
false)
12996 {
12997 if (!IsServerCheck(allow_client))
12998 return;
12999
13001
13003
13006 }
13007
13009 {
13011 }
13012
13014 {
13015 return true;
13016 }
13017
13018
13019
13020
13022 {
13024 }
13025
13027 {
13029 }
13030
13031
13032
13033
13034 override void SetColor(
int r,
int g,
int b,
int a)
13035 {
13041 }
13043 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13044 {
13049 }
13050
13052 {
13054 }
13055
13058 {
13059 int r,g,b,a;
13061 r = r/255;
13062 g = g/255;
13063 b = b/255;
13064 a = a/255;
13065 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13066 }
13067
13068
13069
13070 override void SetLiquidType(
int value,
bool allow_client =
false)
13071 {
13072 if (!IsServerCheck(allow_client))
13073 return;
13074
13079 }
13080
13082 {
13083 return ConfigGetInt("varLiquidTypeInit");
13084 }
13085
13087 {
13089 }
13090
13092 {
13094 SetFrozen(false);
13095 }
13096
13099 {
13100 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13101 }
13102
13103
13106 {
13107 PlayerBase nplayer;
13108 if (PlayerBase.CastTo(nplayer, player))
13109 {
13111
13112 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13113 }
13114 }
13115
13116
13119 {
13120 PlayerBase nplayer;
13121 if (PlayerBase.CastTo(nplayer,player))
13122 {
13123
13124 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13125
13126 }
13127
13128
13129 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13130
13131
13132 if (HasEnergyManager())
13133 {
13134 GetCompEM().UpdatePlugState();
13135 }
13136 }
13137
13138
13140 {
13141 super.OnPlacementStarted(player);
13142
13144 }
13145
13146 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13147 {
13149 {
13150 m_AdminLog.OnPlacementComplete(player,
this);
13151 }
13152
13153 super.OnPlacementComplete(player, position, orientation);
13154 }
13155
13156
13157
13158
13159
13161 {
13163 {
13164 return true;
13165 }
13166 else
13167 {
13168 return false;
13169 }
13170 }
13171
13172
13174 {
13176 {
13178 }
13179 }
13180
13181
13183 {
13185 }
13186
13188 {
13190 }
13191
13192 override void InsertAgent(
int agent,
float count = 1)
13193 {
13194 if (count < 1)
13195 return;
13196
13198 }
13199
13202 {
13204 }
13205
13206
13208 {
13210 }
13211
13212
13213
13214
13215
13216
13217
13218
13219
13220
13221
13222
13223
13224
13225
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13254 {
13256 return false;
13257 return true;
13258 }
13259
13261 {
13262
13264 }
13265
13266
13269 {
13270 super.CheckForRoofLimited(timeTresholdMS);
13271
13273 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13274 {
13275 m_PreviousRoofTestTime = time;
13276 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13277 }
13278 }
13279
13280
13282 {
13284 {
13285 return 0;
13286 }
13287
13288 if (GetInventory().GetAttachmentSlotsCount() != 0)
13289 {
13290 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13291 if (filter)
13292 return filter.GetProtectionLevel(type, false, system);
13293 else
13294 return 0;
13295 }
13296
13297 string subclassPath, entryName;
13298
13299 switch (type)
13300 {
13302 entryName = "biological";
13303 break;
13305 entryName = "chemical";
13306 break;
13307 default:
13308 entryName = "biological";
13309 break;
13310 }
13311
13312 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13313
13315 }
13316
13317
13318
13321 {
13322 if (!IsMagazine())
13324
13326 }
13327
13328
13329
13330
13331
13336 {
13337 return true;
13338 }
13339
13341 {
13343 }
13344
13345
13346
13347
13348
13350 {
13351 if (parent)
13352 {
13353 if (parent.IsInherited(DayZInfected))
13354 return true;
13355
13356 if (!parent.IsRuined())
13357 return true;
13358 }
13359
13360 return true;
13361 }
13362
13364 {
13365 if (!super.CanPutAsAttachment(parent))
13366 {
13367 return false;
13368 }
13369
13370 if (!IsRuined() && !parent.IsRuined())
13371 {
13372 return true;
13373 }
13374
13375 return false;
13376 }
13377
13379 {
13380
13381
13382
13383
13384 return super.CanReceiveItemIntoCargo(item);
13385 }
13386
13388 {
13389
13390
13391
13392
13393 GameInventory attachmentInv = attachment.GetInventory();
13395 {
13396 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13397 return false;
13398 }
13399
13400 InventoryLocation loc = new InventoryLocation();
13401 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13402 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13403 return false;
13404
13405 return super.CanReceiveAttachment(attachment, slotId);
13406 }
13407
13409 {
13410 if (!super.CanReleaseAttachment(attachment))
13411 return false;
13412
13413 return GetInventory().AreChildrenAccessible();
13414 }
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
13428
13429
13430
13431
13432
13433
13434
13435
13437 {
13438 int id = muzzle_owner.GetMuzzleID();
13439 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13440
13441 if (WPOF_array)
13442 {
13443 for (int i = 0; i < WPOF_array.Count(); i++)
13444 {
13445 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13446
13447 if (WPOF)
13448 {
13449 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13450 }
13451 }
13452 }
13453 }
13454
13455
13457 {
13458 int id = muzzle_owner.GetMuzzleID();
13460
13461 if (WPOBE_array)
13462 {
13463 for (int i = 0; i < WPOBE_array.Count(); i++)
13464 {
13465 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13466
13467 if (WPOBE)
13468 {
13469 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13470 }
13471 }
13472 }
13473 }
13474
13475
13477 {
13478 int id = muzzle_owner.GetMuzzleID();
13479 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13480
13481 if (WPOOH_array)
13482 {
13483 for (int i = 0; i < WPOOH_array.Count(); i++)
13484 {
13485 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13486
13487 if (WPOOH)
13488 {
13489 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13490 }
13491 }
13492 }
13493 }
13494
13495
13497 {
13498 int id = muzzle_owner.GetMuzzleID();
13499 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13500
13501 if (WPOOH_array)
13502 {
13503 for (int i = 0; i < WPOOH_array.Count(); i++)
13504 {
13505 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13506
13507 if (WPOOH)
13508 {
13509 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13510 }
13511 }
13512 }
13513 }
13514
13515
13517 {
13518 int id = muzzle_owner.GetMuzzleID();
13519 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13520
13521 if (WPOOH_array)
13522 {
13523 for (int i = 0; i < WPOOH_array.Count(); i++)
13524 {
13525 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13526
13527 if (WPOOH)
13528 {
13529 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13530 }
13531 }
13532 }
13533 }
13534
13535
13536
13538 {
13540 {
13541 return true;
13542 }
13543
13544 return false;
13545 }
13546
13548 {
13550 {
13551 return true;
13552 }
13553
13554 return false;
13555 }
13556
13558 {
13560 {
13561 return true;
13562 }
13563
13564 return false;
13565 }
13566
13568 {
13569 return false;
13570 }
13571
13574 {
13575 return UATimeSpent.DEFAULT_DEPLOY;
13576 }
13577
13578
13579
13580
13582 {
13584 SetSynchDirty();
13585 }
13586
13588 {
13590 }
13591
13592
13594 {
13595 return false;
13596 }
13597
13600 {
13601 string att_type = "None";
13602
13603 if (ConfigIsExisting("soundAttType"))
13604 {
13605 att_type = ConfigGetString("soundAttType");
13606 }
13607
13609 }
13610
13612 {
13614 }
13615
13616
13617
13618
13619
13625
13627 {
13630
13632 }
13633
13634
13636 {
13638 return;
13639
13641
13644
13647
13648 SoundParameters params = new SoundParameters();
13652 }
13653
13654
13656 {
13658 return;
13659
13661 SetSynchDirty();
13662
13665 }
13666
13667
13669 {
13671 return;
13672
13674 SetSynchDirty();
13675
13678 }
13679
13681 {
13683 }
13684
13686 {
13688 }
13689
13692 {
13693 if (!
GetGame().IsDedicatedServer())
13694 {
13695 if (ConfigIsExisting("attachSoundSet"))
13696 {
13697 string cfg_path = "";
13698 string soundset = "";
13699 string type_name =
GetType();
13700
13703 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13704 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13705
13706 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13707 {
13708 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13709 {
13710 if (cfg_slot_array[i] == slot_type)
13711 {
13712 soundset = cfg_soundset_array[i];
13713 break;
13714 }
13715 }
13716 }
13717
13718 if (soundset != "")
13719 {
13720 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13722 }
13723 }
13724 }
13725 }
13726
13728 {
13729
13730 }
13731
13732 void OnApply(PlayerBase player);
13733
13735 {
13736 return 1.0;
13737 };
13738
13740 {
13742 }
13743
13745 {
13747 }
13748
13750
13752 {
13753 SetDynamicPhysicsLifeTime(0.01);
13755 }
13756
13758 {
13759 array<string> zone_names = new array<string>;
13760 GetDamageZones(zone_names);
13761 for (int i = 0; i < zone_names.Count(); i++)
13762 {
13763 SetHealthMax(zone_names.Get(i),"Health");
13764 }
13765 SetHealthMax("","Health");
13766 }
13767
13770 {
13771 float global_health = GetHealth01("","Health");
13772 array<string> zones = new array<string>;
13773 GetDamageZones(zones);
13774
13775 for (int i = 0; i < zones.Count(); i++)
13776 {
13777 SetHealth01(zones.Get(i),"Health",global_health);
13778 }
13779 }
13780
13783 {
13784 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13785 }
13786
13788 {
13789 if (!hasRootAsPlayer)
13790 {
13791 if (refParentIB)
13792 {
13793
13794 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13795 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13796
13797 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13798 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13799
13802 }
13803 else
13804 {
13805
13808 }
13809 }
13810 }
13811
13813 {
13815 {
13816 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13817 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13818 {
13819 float heatPermCoef = 1.0;
13821 while (ent)
13822 {
13823 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13824 ent = ent.GetHierarchyParent();
13825 }
13826
13827 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13828 }
13829 }
13830 }
13831
13833 {
13834
13835 EntityAI parent = GetHierarchyParent();
13836 if (!parent)
13837 {
13838 hasParent = false;
13839 hasRootAsPlayer = false;
13840 }
13841 else
13842 {
13843 hasParent = true;
13844 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13845 refParentIB =
ItemBase.Cast(parent);
13846 }
13847 }
13848
13849 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13850 {
13851
13852 }
13853
13855 {
13856
13857 return false;
13858 }
13859
13861 {
13862
13863
13864 return false;
13865 }
13866
13868 {
13869
13870 return false;
13871 }
13872
13875 {
13876 return !GetIsFrozen() &&
IsOpen();
13877 }
13878
13880 {
13881 bool hasParent = false, hasRootAsPlayer = false;
13883
13884 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13885 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13886
13887 if (wwtu || foodDecay)
13888 {
13892
13893 if (processWetness || processTemperature || processDecay)
13894 {
13896
13897 if (processWetness)
13898 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13899
13900 if (processTemperature)
13902
13903 if (processDecay)
13904 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13905 }
13906 }
13907 }
13908
13911 {
13913 }
13914
13916 {
13919
13920 return super.GetTemperatureFreezeThreshold();
13921 }
13922
13924 {
13927
13928 return super.GetTemperatureThawThreshold();
13929 }
13930
13932 {
13935
13936 return super.GetItemOverheatThreshold();
13937 }
13938
13940 {
13942 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13943
13944 return super.GetTemperatureFreezeTime();
13945 }
13946
13948 {
13950 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13951
13952 return super.GetTemperatureThawTime();
13953 }
13954
13959
13961 {
13962 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13963 }
13964
13966 {
13967 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13968 }
13969
13972 {
13974 }
13975
13977 {
13979 }
13980
13982 {
13984 }
13985
13988 {
13989 return null;
13990 }
13991
13994 {
13995 return false;
13996 }
13997
13999 {
14001 {
14004 if (!trg)
14005 {
14007 explosive = this;
14008 }
14009
14010 explosive.PairRemote(trg);
14012
14013 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14014 trg.SetPersistentPairID(persistentID);
14015 explosive.SetPersistentPairID(persistentID);
14016
14017 return true;
14018 }
14019 return false;
14020 }
14021
14024 {
14025 float ret = 1.0;
14028 ret *= GetHealth01();
14029
14030 return ret;
14031 }
14032
14033 #ifdef DEVELOPER
14034 override void SetDebugItem()
14035 {
14036 super.SetDebugItem();
14037 _itemBase = this;
14038 }
14039
14041 {
14042 string text = super.GetDebugText();
14043
14045 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14046
14047 return text;
14048 }
14049 #endif
14050
14052 {
14053 return true;
14054 }
14055
14057
14059
14061 {
14064 }
14065
14066
14074
14090}
14091
14093{
14095 if (entity)
14096 {
14097 bool is_item = entity.IsInherited(
ItemBase);
14098 if (is_item && full_quantity)
14099 {
14102 }
14103 }
14104 else
14105 {
14107 return NULL;
14108 }
14109 return entity;
14110}
14111
14113{
14114 if (item)
14115 {
14116 if (health > 0)
14117 item.SetHealth("", "", health);
14118
14119 if (item.CanHaveTemperature())
14120 {
14122 if (item.CanFreeze())
14123 item.SetFrozen(false);
14124 }
14125
14126 if (item.HasEnergyManager())
14127 {
14128 if (quantity >= 0)
14129 {
14130 item.GetCompEM().SetEnergy0To1(quantity);
14131 }
14132 else
14133 {
14135 }
14136 }
14137 else if (item.IsMagazine())
14138 {
14139 Magazine mag = Magazine.Cast(item);
14140 if (quantity >= 0)
14141 {
14142 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14143 }
14144 else
14145 {
14147 }
14148
14149 }
14150 else
14151 {
14152 if (quantity >= 0)
14153 {
14154 item.SetQuantityNormalized(quantity, false);
14155 }
14156 else
14157 {
14159 }
14160
14161 }
14162 }
14163}
14164
14165#ifdef DEVELOPER
14167#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.