8384{
8386 {
8387 return true;
8388 }
8389};
8390
8391
8392
8394{
8398
8400
8403
8404
8405
8406
8407
8416
8422
8427
8432
8453 protected bool m_IsResultOfSplit
8454
8456
8461
8462
8463
8465
8469
8470
8471
8473
8476
8477
8478
8484
8485
8493
8496
8497
8499
8500
8502
8503
8508
8509
8514
8515
8517
8518
8520 {
8525
8526 if (!
GetGame().IsDedicatedServer())
8527 {
8529 {
8531
8533 {
8535 }
8536 }
8537
8540 }
8541
8542 m_OldLocation = null;
8543
8545 {
8547 }
8548
8549 if (ConfigIsExisting("headSelectionsToHide"))
8550 {
8553 }
8554
8556 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8557 {
8559 }
8560
8562
8563 m_IsResultOfSplit = false;
8564
8566 }
8567
8569 {
8570 super.InitItemVariables();
8571
8577 m_Count = ConfigGetInt(
"count");
8578
8581
8586
8589
8594
8606
8610
8611
8614 if (ConfigIsExisting("canBeSplit"))
8615 {
8618 }
8619
8621 if (ConfigIsExisting("itemBehaviour"))
8623
8624
8627 RegisterNetSyncVariableInt("m_VarLiquidType");
8628 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8629
8630 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8631 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8632 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8633
8634 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8635 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8636 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8637 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8638
8639 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8640 RegisterNetSyncVariableBool("m_IsTakeable");
8641 RegisterNetSyncVariableBool("m_IsHologram");
8642
8645 {
8648 }
8649
8651
8653 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8655
8656 }
8657
8659 {
8661 }
8662
8664 {
8667 {
8672 }
8673 }
8674
8675 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8676 {
8678 {
8681 }
8682
8684 }
8685
8687 {
8693 }
8694
8696
8698 {
8700
8701 if (!action)
8702 {
8703 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8704 return;
8705 }
8706
8708 if (!ai)
8709 {
8711 return;
8712 }
8713
8715 if (!action_array)
8716 {
8717 action_array = new array<ActionBase_Basic>;
8719 }
8720 if (LogManager.IsActionLogEnable())
8721 {
8722 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8723 }
8724
8725 if (action_array.Find(action) != -1)
8726 {
8727 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8728 }
8729 else
8730 {
8731 action_array.Insert(action);
8732 }
8733 }
8734
8736 {
8738 ActionBase action = player.GetActionManager().GetAction(actionName);
8741
8742 if (action_array)
8743 {
8744 action_array.RemoveItem(action);
8745 }
8746 }
8747
8748
8749
8751 {
8752 ActionOverrideData overrideData = new ActionOverrideData();
8756
8758 if (!actionMap)
8759 {
8762 }
8763
8764 actionMap.Insert(this.
Type(), overrideData);
8765
8766 }
8767
8769
8771
8772
8774 {
8777
8780
8781 string config_to_search = "CfgVehicles";
8782 string muzzle_owner_config;
8783
8785 {
8786 if (IsInherited(Weapon))
8787 config_to_search = "CfgWeapons";
8788
8789 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8790
8791 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8792
8794
8795 if (config_OnFire_subclass_count > 0)
8796 {
8797 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8798
8799 for (int i = 0; i < config_OnFire_subclass_count; i++)
8800 {
8801 string particle_class = "";
8803 string config_OnFire_entry = config_OnFire_class + particle_class;
8804 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8805 WPOF_array.Insert(WPOF);
8806 }
8807
8808
8810 }
8811 }
8812
8814 {
8815 config_to_search = "CfgWeapons";
8816 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8817
8818 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8819
8821
8822 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8823 {
8824 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8825
8826 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8827 {
8828 string particle_class2 = "";
8830 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8831 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8832 WPOBE_array.Insert(WPOBE);
8833 }
8834
8835
8837 }
8838 }
8839 }
8840
8841
8843 {
8846
8848 {
8849 string config_to_search = "CfgVehicles";
8850
8851 if (IsInherited(Weapon))
8852 config_to_search = "CfgWeapons";
8853
8854 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8855 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8856
8857 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8858 {
8859
8861
8863 {
8865 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8867 return;
8868 }
8869
8872
8873
8874
8876 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8877
8878 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8879 {
8880 string particle_class = "";
8882 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8884
8885 if (entry_type == CT_CLASS)
8886 {
8887 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8888 WPOOH_array.Insert(WPOF);
8889 }
8890 }
8891
8892
8894 }
8895 }
8896 }
8897
8899 {
8901 }
8902
8904 {
8906 {
8908
8911
8914
8915 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8916 }
8917 }
8918
8920 {
8922 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8923
8925 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8926
8928 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8929
8931 {
8933 }
8934 }
8935
8937 {
8939 }
8940
8942 {
8945 else
8947
8949 {
8952 }
8953 else
8954 {
8957
8960 }
8961
8963 }
8964
8966 {
8968 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8969 }
8970
8972 {
8974 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8976 }
8977
8979 {
8981 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8982 }
8983
8985 {
8988
8989 OverheatingParticle OP = new OverheatingParticle();
8994
8996 }
8997
8999 {
9002
9003 return -1;
9004 }
9005
9007 {
9009 {
9012
9013 for (int i = count; i > 0; --i)
9014 {
9015 int id = i - 1;
9018
9021
9022 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9023 {
9024 if (p)
9025 {
9028 }
9029 }
9030 }
9031 }
9032 }
9033
9035 {
9037 {
9039 {
9040 int id = i - 1;
9042
9043 if (OP)
9044 {
9046
9047 if (p)
9048 {
9050 }
9051
9052 delete OP;
9053 }
9054 }
9055
9058 }
9059 }
9060
9063 {
9064 return 0.0;
9065 }
9066
9067
9069 {
9070 return 250;
9071 }
9072
9074 {
9075 return 0;
9076 }
9077
9080 {
9082 return true;
9083
9084 return false;
9085 }
9086
9089 {
9092
9094 {
9096 }
9097 else
9098 {
9099
9101 }
9102
9104 }
9105
9112 {
9113 return -1;
9114 }
9115
9116
9117
9118
9120 {
9122 {
9124 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9125
9126 if (r_index >= 0)
9127 {
9128 InventoryLocation r_il = new InventoryLocation;
9129 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9130
9131 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9134 {
9135 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9136 }
9138 {
9139 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9140 }
9141
9142 }
9143
9144 player.GetHumanInventory().ClearUserReservedLocation(this);
9145 }
9146
9149 }
9150
9151
9152
9153
9155 {
9156 return ItemBase.m_DebugActionsMask;
9157 }
9158
9160 {
9161 return ItemBase.m_DebugActionsMask & mask;
9162 }
9163
9165 {
9166 ItemBase.m_DebugActionsMask = mask;
9167 }
9168
9170 {
9171 ItemBase.m_DebugActionsMask |= mask;
9172 }
9173
9175 {
9176 ItemBase.m_DebugActionsMask &= ~mask;
9177 }
9178
9180 {
9182 {
9184 }
9185 else
9186 {
9188 }
9189 }
9190
9191
9193 {
9194 if (GetEconomyProfile())
9195 {
9196 float q_max = GetEconomyProfile().GetQuantityMax();
9197 if (q_max > 0)
9198 {
9199 float q_min = GetEconomyProfile().GetQuantityMin();
9200 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9201
9203 {
9204 ComponentEnergyManager comp = GetCompEM();
9206 {
9208 }
9209 }
9211 {
9213
9214 }
9215
9216 }
9217 }
9218 }
9219
9222 {
9223 EntityAI parent = GetHierarchyParent();
9224
9225 if (parent)
9226 {
9227 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9228 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9229 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9230 }
9231 }
9232
9235 {
9236 EntityAI parent = GetHierarchyParent();
9237
9238 if (parent)
9239 {
9240 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9241 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9242 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9243 }
9244 }
9245
9247 {
9248
9249
9250
9251
9253
9255 {
9256 if (ScriptInputUserData.CanStoreInputUserData())
9257 {
9258 ScriptInputUserData ctx = new ScriptInputUserData;
9264 ctx.
Write(use_stack_max);
9267
9269 {
9270 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9271 }
9272 }
9273 }
9274 else if (!
GetGame().IsMultiplayer())
9275 {
9277 }
9278 }
9279
9281 {
9283 }
9284
9286 {
9288 }
9289
9291 {
9293 }
9294
9296 {
9297
9298 return false;
9299 }
9300
9302 {
9303 return false;
9304 }
9305
9309 {
9310 return false;
9311 }
9312
9314 {
9315 return "";
9316 }
9317
9319
9321 {
9322 return false;
9323 }
9324
9326 {
9327 return true;
9328 }
9329
9330
9331
9333 {
9334 return true;
9335 }
9336
9338 {
9339 return true;
9340 }
9341
9343 {
9344 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9346 }
9347
9349 {
9351 }
9352
9354 {
9356 if (!is_being_placed)
9358 SetSynchDirty();
9359 }
9360
9361
9363
9365 {
9367 }
9368
9370 {
9372 }
9373
9375 {
9376 return 1;
9377 }
9378
9380 {
9381 return false;
9382 }
9383
9385 {
9387 SetSynchDirty();
9388 }
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9425 {
9426 super.OnMovedInsideCargo(container);
9427
9428 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9429 }
9430
9431 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9432 {
9433 super.EEItemLocationChanged(oldLoc,newLoc);
9434
9435 PlayerBase new_player = null;
9436 PlayerBase old_player = null;
9437
9438 if (newLoc.GetParent())
9439 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9440
9441 if (oldLoc.GetParent())
9442 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9443
9445 {
9446 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9447
9448 if (r_index >= 0)
9449 {
9450 InventoryLocation r_il = new InventoryLocation;
9451 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9452
9453 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9456 {
9457 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9458 }
9460 {
9461 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9462 }
9463
9464 }
9465 }
9466
9468 {
9469 if (new_player)
9470 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9471
9472 if (new_player == old_player)
9473 {
9474
9475 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9476 {
9478 {
9479 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9480 {
9481 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9482 }
9483 }
9484 else
9485 {
9486 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9487 }
9488 }
9489
9490 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9491 {
9492 int type = oldLoc.GetType();
9494 {
9495 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9496 }
9498 {
9499 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9500 }
9501 }
9502 if (!m_OldLocation)
9503 {
9504 m_OldLocation = new InventoryLocation;
9505 }
9506 m_OldLocation.Copy(oldLoc);
9507 }
9508 else
9509 {
9510 if (m_OldLocation)
9511 {
9512 m_OldLocation.Reset();
9513 }
9514 }
9515
9517 }
9518 else
9519 {
9520 if (new_player)
9521 {
9522 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9523 if (res_index >= 0)
9524 {
9525 InventoryLocation il = new InventoryLocation;
9526 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9528 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9531 {
9532 il.
GetParent().GetOnReleaseLock().Invoke(it);
9533 }
9535 {
9537 }
9538
9539 }
9540 }
9542 {
9543
9545 }
9546
9547 if (m_OldLocation)
9548 {
9549 m_OldLocation.Reset();
9550 }
9551 }
9552 }
9553
9554 override void EOnContact(IEntity other, Contact extra)
9555 {
9557 {
9558 int liquidType = -1;
9560 if (impactSpeed > 0.0)
9561 {
9563 #ifndef SERVER
9565 #else
9567 SetSynchDirty();
9568 #endif
9570 }
9571 }
9572
9573 #ifdef SERVER
9574 if (GetCompEM() && GetCompEM().IsPlugged())
9575 {
9576 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9577 GetCompEM().UnplugThis();
9578 }
9579 #endif
9580 }
9581
9583
9585 {
9587 }
9588
9590 {
9591
9592 }
9593
9595 {
9596 super.OnItemLocationChanged(old_owner, new_owner);
9597
9598 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9599 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9600
9601 if (!relatedPlayer && playerNew)
9602 relatedPlayer = playerNew;
9603
9604 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9605 {
9607 if (actionMgr)
9608 {
9609 ActionBase currentAction = actionMgr.GetRunningAction();
9610 if (currentAction)
9612 }
9613 }
9614
9615 Man ownerPlayerOld = null;
9616 Man ownerPlayerNew = null;
9617
9618 if (old_owner)
9619 {
9620 if (old_owner.
IsMan())
9621 {
9622 ownerPlayerOld = Man.Cast(old_owner);
9623 }
9624 else
9625 {
9626 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9627 }
9628 }
9629 else
9630 {
9632 {
9634
9635 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9636 {
9637 GetCompEM().UnplugThis();
9638 }
9639 }
9640 }
9641
9642 if (new_owner)
9643 {
9644 if (new_owner.
IsMan())
9645 {
9646 ownerPlayerNew = Man.Cast(new_owner);
9647 }
9648 else
9649 {
9650 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9651 }
9652 }
9653
9654 if (ownerPlayerOld != ownerPlayerNew)
9655 {
9656 if (ownerPlayerOld)
9657 {
9658 array<EntityAI> subItemsExit = new array<EntityAI>;
9660 for (int i = 0; i < subItemsExit.Count(); i++)
9661 {
9664 }
9665 }
9666
9667 if (ownerPlayerNew)
9668 {
9669 array<EntityAI> subItemsEnter = new array<EntityAI>;
9671 for (int j = 0; j < subItemsEnter.Count(); j++)
9672 {
9675 }
9676 }
9677 }
9678 else if (ownerPlayerNew != null)
9679 {
9680 PlayerBase nplayer;
9681 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9682 {
9683 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9685 for (int k = 0; k < subItemsUpdate.Count(); k++)
9686 {
9688 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9689 }
9690 }
9691 }
9692
9693 if (old_owner)
9694 old_owner.OnChildItemRemoved(this);
9695 if (new_owner)
9696 new_owner.OnChildItemReceived(this);
9697 }
9698
9699
9701 {
9702 super.EEDelete(parent);
9703 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9704 if (player)
9705 {
9707
9708 if (player.IsAlive())
9709 {
9710 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9711 if (r_index >= 0)
9712 {
9713 InventoryLocation r_il = new InventoryLocation;
9714 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9715
9716 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9719 {
9720 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9721 }
9723 {
9724 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9725 }
9726
9727 }
9728
9729 player.RemoveQuickBarEntityShortcut(this);
9730 }
9731 }
9732 }
9733
9735 {
9736 super.EEKilled(killer);
9737
9740 {
9741 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9742 {
9743 if (IsMagazine())
9744 {
9745 if (Magazine.Cast(this).GetAmmoCount() > 0)
9746 {
9748 }
9749 }
9750 else
9751 {
9753 }
9754 }
9755 }
9756 }
9757
9759 {
9760 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9761
9762 super.OnWasAttached(parent, slot_id);
9763
9766
9768 }
9769
9771 {
9772 super.OnWasDetached(parent, slot_id);
9773
9776 }
9777
9779 {
9780 int idx;
9783
9784 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9785 if (inventory_slots.Count() < 1)
9786 {
9787 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9788 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9789 }
9790 else
9791 {
9792 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9793 }
9794
9795 idx = inventory_slots.Find(slot);
9796 if (idx < 0)
9797 return "";
9798
9799 return attach_types.Get(idx);
9800 }
9801
9803 {
9804 int idx = -1;
9805 string slot;
9806
9809
9810 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9811 if (inventory_slots.Count() < 1)
9812 {
9813 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9814 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9815 }
9816 else
9817 {
9818 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9819 if (detach_types.Count() < 1)
9820 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9821 }
9822
9823 for (int i = 0; i < inventory_slots.Count(); i++)
9824 {
9825 slot = inventory_slots.Get(i);
9826 }
9827
9828 if (slot != "")
9829 {
9830 if (detach_types.Count() == 1)
9831 idx = 0;
9832 else
9833 idx = inventory_slots.Find(slot);
9834 }
9835 if (idx < 0)
9836 return "";
9837
9838 return detach_types.Get(idx);
9839 }
9840
9842 {
9843
9845
9846
9847 float min_time = 1;
9848 float max_time = 3;
9849 float delay = Math.RandomFloat(min_time, max_time);
9850
9851 explode_timer.Run(delay, this, "DoAmmoExplosion");
9852 }
9853
9855 {
9856 Magazine magazine = Magazine.Cast(this);
9857 int pop_sounds_count = 6;
9858 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9859
9860
9861 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9862 string sound_name = pop_sounds[ sound_idx ];
9864
9865
9866 magazine.ServerAddAmmoCount(-1);
9867
9868
9869 float min_temp_to_explode = 100;
9870
9871 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9872 {
9874 }
9875 }
9876
9877
9878 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9879 {
9880 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9881
9882 const int CHANCE_DAMAGE_CARGO = 4;
9883 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9884 const int CHANCE_DAMAGE_NOTHING = 2;
9885
9887 {
9888 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9889 int chances;
9890 int rnd;
9891
9892 if (GetInventory().GetCargo())
9893 {
9894 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9895 rnd = Math.RandomInt(0,chances);
9896
9897 if (rnd < CHANCE_DAMAGE_CARGO)
9898 {
9900 }
9901 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9902 {
9904 }
9905 }
9906 else
9907 {
9908 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9909 rnd = Math.RandomInt(0,chances);
9910
9911 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9912 {
9914 }
9915 }
9916 }
9917 }
9918
9920 {
9921 if (GetInventory().GetCargo())
9922 {
9923 int item_count = GetInventory().GetCargo().GetItemCount();
9924 if (item_count > 0)
9925 {
9926 int random_pick = Math.RandomInt(0, item_count);
9928 if (!item.IsExplosive())
9929 {
9930 item.AddHealth("","",damage);
9931 return true;
9932 }
9933 }
9934 }
9935 return false;
9936 }
9937
9939 {
9940 int attachment_count = GetInventory().AttachmentCount();
9941 if (attachment_count > 0)
9942 {
9943 int random_pick = Math.RandomInt(0, attachment_count);
9944 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9945 if (!attachment.IsExplosive())
9946 {
9947 attachment.AddHealth("","",damage);
9948 return true;
9949 }
9950 }
9951 return false;
9952 }
9953
9955 {
9957 }
9958
9960 {
9962 return GetInventory().CanRemoveEntity();
9963
9964 return false;
9965 }
9966
9968 {
9969
9971 return false;
9972
9973
9975 return false;
9976
9977
9978
9980 if (delta == 0)
9981 return false;
9982
9983
9984 return true;
9985 }
9986
9988 {
9990 {
9991 if (ScriptInputUserData.CanStoreInputUserData())
9992 {
9993 ScriptInputUserData ctx = new ScriptInputUserData;
9998 ctx.
Write(destination_entity);
10000 ctx.
Write(slot_id);
10002 }
10003 }
10004 else if (!
GetGame().IsMultiplayer())
10005 {
10007 }
10008 }
10009
10011 {
10012 float split_quantity_new;
10016 InventoryLocation loc = new InventoryLocation;
10017
10018 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10019 {
10021 split_quantity_new = stack_max;
10022 else
10024
10026 {
10027 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10028 if (new_item)
10029 {
10030 new_item.SetResultOfSplit(true);
10031 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10033 new_item.
SetQuantity(split_quantity_new,
false,
true);
10034 }
10035 }
10036 }
10037 else if (destination_entity && slot_id == -1)
10038 {
10039 if (quantity > stack_max)
10040 split_quantity_new = stack_max;
10041 else
10042 split_quantity_new = quantity;
10043
10045 {
10047 {
10050 }
10051
10052 if (new_item)
10053 {
10054 new_item.SetResultOfSplit(true);
10055 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10057 new_item.
SetQuantity(split_quantity_new,
false,
true);
10058 }
10059 }
10060 }
10061 else
10062 {
10063 if (stack_max != 0)
10064 {
10066 {
10068 }
10069
10070 if (split_quantity_new == 0)
10071 {
10072 if (!
GetGame().IsMultiplayer())
10073 player.PhysicalPredictiveDropItem(this);
10074 else
10075 player.ServerDropEntity(this);
10076 return;
10077 }
10078
10080 {
10082
10083 if (new_item)
10084 {
10085 new_item.SetResultOfSplit(true);
10086 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10089 new_item.PlaceOnSurface();
10090 }
10091 }
10092 }
10093 }
10094 }
10095
10097 {
10098 float split_quantity_new;
10102 InventoryLocation loc = new InventoryLocation;
10103
10104 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10105 {
10107 split_quantity_new = stack_max;
10108 else
10110
10112 {
10113 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10114 if (new_item)
10115 {
10116 new_item.SetResultOfSplit(true);
10117 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10119 new_item.
SetQuantity(split_quantity_new,
false,
true);
10120 }
10121 }
10122 }
10123 else if (destination_entity && slot_id == -1)
10124 {
10125 if (quantity > stack_max)
10126 split_quantity_new = stack_max;
10127 else
10128 split_quantity_new = quantity;
10129
10131 {
10133 {
10136 }
10137
10138 if (new_item)
10139 {
10140 new_item.SetResultOfSplit(true);
10141 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10143 new_item.
SetQuantity(split_quantity_new,
false,
true);
10144 }
10145 }
10146 }
10147 else
10148 {
10149 if (stack_max != 0)
10150 {
10152 {
10154 }
10155
10157 {
10159
10160 if (new_item)
10161 {
10162 new_item.SetResultOfSplit(true);
10163 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10166 new_item.PlaceOnSurface();
10167 }
10168 }
10169 }
10170 }
10171 }
10172
10174 {
10176 {
10177 if (ScriptInputUserData.CanStoreInputUserData())
10178 {
10179 ScriptInputUserData ctx = new ScriptInputUserData;
10184 dst.WriteToContext(ctx);
10186 }
10187 }
10188 else if (!
GetGame().IsMultiplayer())
10189 {
10191 }
10192 }
10193
10195 {
10197 {
10198 if (ScriptInputUserData.CanStoreInputUserData())
10199 {
10200 ScriptInputUserData ctx = new ScriptInputUserData;
10205 ctx.
Write(destination_entity);
10211 }
10212 }
10213 else if (!
GetGame().IsMultiplayer())
10214 {
10216 }
10217 }
10218
10220 {
10222 }
10223
10225 {
10227 float split_quantity_new;
10229 if (dst.IsValid())
10230 {
10231 int slot_id = dst.GetSlot();
10233
10234 if (quantity > stack_max)
10235 split_quantity_new = stack_max;
10236 else
10237 split_quantity_new = quantity;
10238
10240 {
10242
10243 if (new_item)
10244 {
10245 new_item.SetResultOfSplit(true);
10246 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10248 new_item.
SetQuantity(split_quantity_new,
false,
true);
10249 }
10250
10251 return new_item;
10252 }
10253 }
10254
10255 return null;
10256 }
10257
10259 {
10261 float split_quantity_new;
10263 if (destination_entity)
10264 {
10266 if (quantity > stackable)
10267 split_quantity_new = stackable;
10268 else
10269 split_quantity_new = quantity;
10270
10272 {
10273 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10274 if (new_item)
10275 {
10276 new_item.SetResultOfSplit(true);
10277 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10279 new_item.
SetQuantity(split_quantity_new,
false,
true);
10280 }
10281 }
10282 }
10283 }
10284
10286 {
10288 {
10289 if (ScriptInputUserData.CanStoreInputUserData())
10290 {
10291 ScriptInputUserData ctx = new ScriptInputUserData;
10296 ItemBase destination_entity =
this;
10297 ctx.
Write(destination_entity);
10301 }
10302 }
10303 else if (!
GetGame().IsMultiplayer())
10304 {
10306 }
10307 }
10308
10310 {
10312 float split_quantity_new;
10314 if (player)
10315 {
10317 if (quantity > stackable)
10318 split_quantity_new = stackable;
10319 else
10320 split_quantity_new = quantity;
10321
10323 {
10324 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10325 new_item =
ItemBase.Cast(in_hands);
10326 if (new_item)
10327 {
10328 new_item.SetResultOfSplit(true);
10329 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10331 new_item.SetQuantity(split_quantity_new, false, true);
10332 }
10333 }
10334 }
10335 }
10336
10338 {
10340 float split_quantity_new = Math.Floor(quantity * 0.5);
10341
10343 return;
10344
10346
10347 if (new_item)
10348 {
10349 if (new_item.GetQuantityMax() < split_quantity_new)
10350 {
10351 split_quantity_new = new_item.GetQuantityMax();
10352 }
10353
10354 new_item.SetResultOfSplit(true);
10355 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10356
10358 {
10361 }
10362 else
10363 {
10365 new_item.
SetQuantity(split_quantity_new,
false,
true);
10366 }
10367 }
10368 }
10369
10371 {
10373 float split_quantity_new = Math.Floor(quantity / 2);
10374
10376 return;
10377
10378 InventoryLocation invloc = new InventoryLocation;
10380
10382 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10383
10384 if (new_item)
10385 {
10386 if (new_item.GetQuantityMax() < split_quantity_new)
10387 {
10388 split_quantity_new = new_item.GetQuantityMax();
10389 }
10391 {
10394 }
10395 else if (split_quantity_new > 1)
10396 {
10398 new_item.
SetQuantity(split_quantity_new,
false,
true);
10399 }
10400 }
10401 }
10402
10405 {
10406 SetWeightDirty();
10408
10409 if (parent)
10410 parent.OnAttachmentQuantityChangedEx(this, delta);
10411
10413 {
10415 {
10417 }
10419 {
10420 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10422 }
10423 }
10424
10425 }
10426
10429 {
10430
10431 }
10432
10435 {
10437 }
10438
10440 {
10441 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10442
10444 {
10445 if (newLevel == GameConstants.STATE_RUINED)
10446 {
10448 EntityAI parent = GetHierarchyParent();
10449 if (parent && parent.IsFireplace())
10450 {
10451 CargoBase cargo = GetInventory().GetCargo();
10452 if (cargo)
10453 {
10455 {
10457 }
10458 }
10459 }
10460 }
10461
10463 {
10464
10466 return;
10467 }
10468
10469 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10470 {
10472 }
10473 }
10474 }
10475
10476
10478 {
10479 super.OnRightClick();
10480
10482 {
10484 {
10485 if (ScriptInputUserData.CanStoreInputUserData())
10486 {
10487 EntityAI root = GetHierarchyRoot();
10488 Man playerOwner = GetHierarchyRootPlayer();
10489 InventoryLocation dst = new InventoryLocation;
10490
10491
10492 if (!playerOwner && root && root == this)
10493 {
10495 }
10496 else
10497 {
10498
10499 GetInventory().GetCurrentInventoryLocation(dst);
10501 {
10504 {
10506 }
10507 else
10508 {
10510
10511
10512 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10513 {
10515 }
10516 else
10517 {
10518 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10519 }
10520 }
10521 }
10522 }
10523
10524 ScriptInputUserData ctx = new ScriptInputUserData;
10532 }
10533 }
10534 else if (!
GetGame().IsMultiplayer())
10535 {
10537 }
10538 }
10539 }
10540
10542 {
10543 if (root)
10544 {
10545 vector m4[4];
10546 root.GetTransform(m4);
10547 dst.SetGround(this, m4);
10548 }
10549 else
10550 {
10551 GetInventory().GetCurrentInventoryLocation(dst);
10552 }
10553 }
10554
10555 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10556 {
10557
10558 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10559 return false;
10560
10561 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10562 return false;
10563
10564
10566 return false;
10567
10568
10569 Magazine mag = Magazine.Cast(this);
10570 if (mag)
10571 {
10572 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10573 return false;
10574
10575 if (stack_max_limit)
10576 {
10577 Magazine other_mag = Magazine.Cast(other_item);
10578 if (other_item)
10579 {
10580 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10581 return false;
10582 }
10583
10584 }
10585 }
10586 else
10587 {
10588
10590 return false;
10591
10593 return false;
10594 }
10595
10596 PlayerBase player = null;
10597 if (CastTo(player, GetHierarchyRootPlayer()))
10598 {
10599 if (player.GetInventory().HasAttachment(this))
10600 return false;
10601
10602 if (player.IsItemsToDelete())
10603 return false;
10604 }
10605
10606 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10607 return false;
10608
10609 int slotID;
10611 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10612 return false;
10613
10614 return true;
10615 }
10616
10618 {
10620 }
10621
10623 {
10624 return m_IsResultOfSplit;
10625 }
10626
10628 {
10629 m_IsResultOfSplit = value;
10630 }
10631
10633 {
10635 }
10636
10638 {
10639 float other_item_quantity = other_item.GetQuantity();
10640 float this_free_space;
10641
10643
10645
10646 if (other_item_quantity > this_free_space)
10647 {
10648 return this_free_space;
10649 }
10650 else
10651 {
10652 return other_item_quantity;
10653 }
10654 }
10655
10657 {
10659 }
10660
10662 {
10664 return;
10665
10666 if (!IsMagazine() && other_item)
10667 {
10669 if (quantity_used != 0)
10670 {
10671 float hp1 = GetHealth01("","");
10672 float hp2 = other_item.GetHealth01("","");
10673 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10674 hpResult = hpResult / (
GetQuantity() + quantity_used);
10675
10676 hpResult *= GetMaxHealth();
10677 Math.Round(hpResult);
10678 SetHealth("", "Health", hpResult);
10679
10681 other_item.AddQuantity(-quantity_used);
10682 }
10683 }
10685 }
10686
10688 {
10689 #ifdef SERVER
10690 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10691 GetHierarchyParent().IncreaseLifetimeUp();
10692 #endif
10693 };
10694
10696 {
10697 PlayerBase p = PlayerBase.Cast(player);
10698
10699 array<int> recipesIds = p.m_Recipes;
10700 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10701 if (moduleRecipesManager)
10702 {
10703 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10704 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10705 }
10706
10707 for (int i = 0;i < recipesIds.Count(); i++)
10708 {
10709 int key = recipesIds.Get(i);
10710 string recipeName = moduleRecipesManager.GetRecipeName(key);
10712 }
10713 }
10714
10715
10716 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10717 {
10718 super.GetDebugActions(outputList);
10719
10720
10726
10727
10732
10737
10738
10742
10743
10745 {
10749 }
10750
10753
10754
10758
10760
10761 InventoryLocation loc = new InventoryLocation();
10762 GetInventory().GetCurrentInventoryLocation(loc);
10764 {
10765 if (Gizmo_IsSupported())
10768 }
10769
10771 }
10772
10773
10774
10775
10777 {
10778 super.OnAction(action_id, player, ctx);
10779
10781 {
10782 switch (action_id)
10783 {
10786 return true;
10789 return true;
10790 }
10791 }
10792
10794 {
10795 switch (action_id)
10796 {
10798 Delete();
10799 return true;
10800 }
10801 }
10802
10803 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10804 {
10805 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10806 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10807 PlayerBase p = PlayerBase.Cast(player);
10808 if (
EActions.RECIPES_RANGE_START < 1000)
10809 {
10810 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10811 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10812 }
10813 }
10814 #ifndef SERVER
10815 else if (action_id ==
EActions.WATCH_PLAYER)
10816 {
10817 PluginDeveloper.SetDeveloperItemClientEx(player);
10818 }
10819 #endif
10821 {
10822 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10823 {
10824 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10825 OnDebugButtonPressServer(id + 1);
10826 }
10827
10828 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10829 {
10830 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10832 }
10833
10834 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10835 {
10836 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10838 }
10839
10840 else if (action_id ==
EActions.ADD_QUANTITY)
10841 {
10842 if (IsMagazine())
10843 {
10844 Magazine mag = Magazine.Cast(this);
10845 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10846 }
10847 else
10848 {
10850 }
10851
10852 if (m_EM)
10853 {
10854 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10855 }
10856
10857 }
10858
10859 else if (action_id ==
EActions.REMOVE_QUANTITY)
10860 {
10861 if (IsMagazine())
10862 {
10863 Magazine mag2 = Magazine.Cast(this);
10864 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10865 }
10866 else
10867 {
10869 }
10870 if (m_EM)
10871 {
10872 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10873 }
10874
10875 }
10876
10877 else if (action_id ==
EActions.SET_QUANTITY_0)
10878 {
10880
10881 if (m_EM)
10882 {
10883 m_EM.SetEnergy(0);
10884 }
10885 }
10886
10887 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10888 {
10890
10891 if (m_EM)
10892 {
10893 m_EM.SetEnergy(m_EM.GetEnergyMax());
10894 }
10895 }
10896
10897 else if (action_id ==
EActions.ADD_HEALTH)
10898 {
10899 AddHealth("","",GetMaxHealth("","Health")/5);
10900 }
10901 else if (action_id ==
EActions.REMOVE_HEALTH)
10902 {
10903 AddHealth("","",-GetMaxHealth("","Health")/5);
10904 }
10905 else if (action_id ==
EActions.DESTROY_HEALTH)
10906 {
10907 SetHealth01("","",0);
10908 }
10909 else if (action_id ==
EActions.WATCH_ITEM)
10910 {
10912 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10913 #ifdef DEVELOPER
10914 SetDebugDeveloper_item(this);
10915 #endif
10916 }
10917
10918 else if (action_id ==
EActions.ADD_TEMPERATURE)
10919 {
10920 AddTemperature(20);
10921
10922 }
10923
10924 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10925 {
10926 AddTemperature(-20);
10927
10928 }
10929
10930 else if (action_id ==
EActions.FLIP_FROZEN)
10931 {
10932 SetFrozen(!GetIsFrozen());
10933
10934 }
10935
10936 else if (action_id ==
EActions.ADD_WETNESS)
10937 {
10939
10940 }
10941
10942 else if (action_id ==
EActions.REMOVE_WETNESS)
10943 {
10945
10946 }
10947
10948 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10949 {
10952
10953
10954 }
10955
10956 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10957 {
10960 }
10961
10962 else if (action_id ==
EActions.MAKE_SPECIAL)
10963 {
10964 auto debugParams = DebugSpawnParams.WithPlayer(player);
10965 OnDebugSpawnEx(debugParams);
10966 }
10967
10968 }
10969
10970
10971 return false;
10972 }
10973
10974
10975
10976
10980
10983
10984
10985
10987 {
10988 return false;
10989 }
10990
10991
10993 {
10994 return true;
10995 }
10996
10997
10999 {
11000 return true;
11001 }
11002
11003
11004
11006 {
11007 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11009 }
11010
11013 {
11014 return null;
11015 }
11016
11018 {
11019 return false;
11020 }
11021
11023 {
11024 return false;
11025 }
11026
11030
11031
11033 {
11034 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11035 return module_repairing.CanRepair(this, item_repair_kit);
11036 }
11037
11038
11039 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11040 {
11041 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11042 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11043 }
11044
11045
11047 {
11048
11049
11050
11051
11052
11053
11054
11055
11056 return 1;
11057 }
11058
11059
11060
11062 {
11064 }
11065
11066
11067
11069 {
11071 }
11072
11073
11082 {
11083 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11084
11085 if (player)
11086 {
11087 player.MessageStatus(text);
11088 }
11089 }
11090
11091
11100 {
11101 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11102
11103 if (player)
11104 {
11105 player.MessageAction(text);
11106 }
11107 }
11108
11109
11118 {
11119 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11120
11121 if (player)
11122 {
11123 player.MessageFriendly(text);
11124 }
11125 }
11126
11127
11136 {
11137 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11138
11139 if (player)
11140 {
11141 player.MessageImportant(text);
11142 }
11143 }
11144
11146 {
11147 return true;
11148 }
11149
11150
11151 override bool KindOf(
string tag)
11152 {
11153 bool found = false;
11154 string item_name = this.
GetType();
11157
11158 int array_size = item_tag_array.Count();
11159 for (int i = 0; i < array_size; i++)
11160 {
11161 if (item_tag_array.Get(i) == tag)
11162 {
11163 found = true;
11164 break;
11165 }
11166 }
11167 return found;
11168 }
11169
11170
11172 {
11173
11174 super.OnRPC(sender, rpc_type,ctx);
11175
11176
11177 switch (rpc_type)
11178 {
11179 #ifndef SERVER
11180 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11181 Param2<bool, string> p = new Param2<bool, string>(false, "");
11182
11184 return;
11185
11186 bool play = p.param1;
11187 string soundSet = p.param2;
11188
11189 if (play)
11190 {
11192 {
11194 {
11196 }
11197 }
11198 else
11199 {
11201 }
11202 }
11203 else
11204 {
11206 }
11207
11208 break;
11209 #endif
11210
11211 }
11212
11214 {
11216 }
11217 }
11218
11219
11220
11221
11223 {
11224 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11225 return plugin.GetID(
name);
11226 }
11227
11229 {
11230 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11231 return plugin.GetName(id);
11232 }
11233
11236 {
11237
11238
11239 int varFlags;
11240 if (!ctx.
Read(varFlags))
11241 return;
11242
11243 if (varFlags & ItemVariableFlags.FLOAT)
11244 {
11246 }
11247 }
11248
11250 {
11251
11252 super.SerializeNumericalVars(floats_out);
11253
11254
11255
11257 {
11259 }
11260
11262 {
11264 }
11265
11267 {
11269 }
11270
11272 {
11277 }
11278
11280 {
11282 }
11283 }
11284
11286 {
11287
11288 super.DeSerializeNumericalVars(floats);
11289
11290
11291 int index = 0;
11292 int mask = Math.Round(floats.Get(index));
11293
11294 index++;
11295
11297 {
11299 {
11301 }
11302 else
11303 {
11304 float quantity = floats.Get(index);
11305 SetQuantity(quantity,
true,
false,
false,
false);
11306 }
11307 index++;
11308 }
11309
11311 {
11312 float wet = floats.Get(index);
11314 index++;
11315 }
11316
11318 {
11319 int liquidtype = Math.Round(floats.Get(index));
11321 index++;
11322 }
11323
11325 {
11327 index++;
11329 index++;
11331 index++;
11333 index++;
11334 }
11335
11337 {
11338 int cleanness = Math.Round(floats.Get(index));
11340 index++;
11341 }
11342 }
11343
11345 {
11346 super.WriteVarsToCTX(ctx);
11347
11348
11350 {
11352 }
11353
11355 {
11357 }
11358
11360 {
11362 }
11363
11365 {
11366 int r,g,b,a;
11372 }
11373
11375 {
11377 }
11378 }
11379
11381 {
11382 if (!super.ReadVarsFromCTX(ctx,version))
11383 return false;
11384
11385 int intValue;
11386 float value;
11387
11388 if (version < 140)
11389 {
11390 if (!ctx.
Read(intValue))
11391 return false;
11392
11393 m_VariablesMask = intValue;
11394 }
11395
11397 {
11398 if (!ctx.
Read(value))
11399 return false;
11400
11402 {
11404 }
11405 else
11406 {
11408 }
11409 }
11410
11411 if (version < 140)
11412 {
11414 {
11415 if (!ctx.
Read(value))
11416 return false;
11417 SetTemperatureDirect(value);
11418 }
11419 }
11420
11422 {
11423 if (!ctx.
Read(value))
11424 return false;
11426 }
11427
11429 {
11430 if (!ctx.
Read(intValue))
11431 return false;
11433 }
11434
11436 {
11437 int r,g,b,a;
11439 return false;
11441 return false;
11443 return false;
11445 return false;
11446
11448 }
11449
11451 {
11452 if (!ctx.
Read(intValue))
11453 return false;
11455 }
11456
11457 if (version >= 138 && version < 140)
11458 {
11460 {
11461 if (!ctx.
Read(intValue))
11462 return false;
11463 SetFrozen(intValue);
11464 }
11465 }
11466
11467 return true;
11468 }
11469
11470
11472 {
11475 {
11477 }
11478
11479 if (!super.OnStoreLoad(ctx, version))
11480 {
11482 return false;
11483 }
11484
11485 if (version >= 114)
11486 {
11487 bool hasQuickBarIndexSaved;
11488
11489 if (!ctx.
Read(hasQuickBarIndexSaved))
11490 {
11492 return false;
11493 }
11494
11495 if (hasQuickBarIndexSaved)
11496 {
11497 int itmQBIndex;
11498
11499
11500 if (!ctx.
Read(itmQBIndex))
11501 {
11503 return false;
11504 }
11505
11506 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11507 if (itmQBIndex != -1 && parentPlayer)
11508 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11509 }
11510 }
11511 else
11512 {
11513
11514 PlayerBase player;
11515 int itemQBIndex;
11516 if (version ==
int.
MAX)
11517 {
11518 if (!ctx.
Read(itemQBIndex))
11519 {
11521 return false;
11522 }
11523 }
11524 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11525 {
11526
11527 if (!ctx.
Read(itemQBIndex))
11528 {
11530 return false;
11531 }
11532 if (itemQBIndex != -1 && player)
11533 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11534 }
11535 }
11536
11537 if (version < 140)
11538 {
11539
11540 if (!LoadVariables(ctx, version))
11541 {
11543 return false;
11544 }
11545 }
11546
11547
11549 {
11551 return false;
11552 }
11553 if (version >= 132)
11554 {
11556 if (raib)
11557 {
11559 {
11561 return false;
11562 }
11563 }
11564 }
11565
11567 return true;
11568 }
11569
11570
11571
11573 {
11574 super.OnStoreSave(ctx);
11575
11576 PlayerBase player;
11577 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11578 {
11580
11581 int itemQBIndex = -1;
11582 itemQBIndex = player.FindQuickBarEntityIndex(this);
11583 ctx.
Write(itemQBIndex);
11584 }
11585 else
11586 {
11588 }
11589
11591
11593 if (raib)
11594 {
11596 }
11597 }
11598
11599
11601 {
11602 super.AfterStoreLoad();
11603
11605 {
11607 }
11608
11610 {
11613 }
11614 }
11615
11617 {
11618 super.EEOnAfterLoad();
11619
11621 {
11623 }
11624
11627 }
11628
11630 {
11631 return false;
11632 }
11633
11634
11635
11637 {
11639 {
11640 #ifdef PLATFORM_CONSOLE
11641
11643 {
11645 if (menu)
11646 {
11648 }
11649 }
11650 #endif
11651 }
11652
11654 {
11657 }
11658
11660 {
11661 SetWeightDirty();
11663 }
11665 {
11668 }
11669
11671 {
11674 }
11676 {
11679 }
11680
11681 super.OnVariablesSynchronized();
11682 }
11683
11684
11685
11687 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11688 {
11689 if (!IsServerCheck(allow_client))
11690 return false;
11691
11693 return false;
11694
11697
11698 if (value <= (min + 0.001))
11699 value = min;
11700
11701 if (value == min)
11702 {
11703 if (destroy_config)
11704 {
11705 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11706 if (dstr)
11707 {
11709 this.Delete();
11710 return true;
11711 }
11712 }
11713 else if (destroy_forced)
11714 {
11716 this.Delete();
11717 return true;
11718 }
11719
11721 }
11722
11725
11727 {
11729
11730 if (delta)
11732 }
11733
11735
11736 return false;
11737 }
11738
11739
11741 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11742 {
11744 }
11745
11747 {
11750 }
11751
11753 {
11756 }
11757
11759 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11760 {
11761 float value_clamped = Math.Clamp(value, 0, 1);
11763 SetQuantity(result, destroy_config, destroy_forced);
11764 }
11765
11766
11769 {
11771 }
11772
11774 {
11776 }
11777
11778
11779
11780
11781
11782
11783
11784
11785
11786
11788 {
11789 int slot = -1;
11790 if (GetInventory())
11791 {
11792 InventoryLocation il = new InventoryLocation;
11793 GetInventory().GetCurrentInventoryLocation(il);
11795 }
11796
11798 }
11799
11801 {
11802 float quantity_max = 0;
11803
11805 {
11806 if (attSlotID != -1)
11807 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11808
11809 if (quantity_max <= 0)
11811 }
11812
11813 if (quantity_max <= 0)
11815
11816 return quantity_max;
11817 }
11818
11820 {
11822 }
11823
11825 {
11827 }
11828
11829
11831 {
11833 }
11834
11836 {
11838 }
11839
11841 {
11843 }
11844
11845
11847 {
11848
11849 float weightEx = GetWeightEx();
11850 float special = GetInventoryAndCargoWeight();
11851 return weightEx - special;
11852 }
11853
11854
11856 {
11858 }
11859
11861 {
11863 {
11864 #ifdef DEVELOPER
11865 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11866 {
11867 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11869 }
11870 #endif
11871
11872 return GetQuantity() * GetConfigWeightModified();
11873 }
11874 else if (HasEnergyManager())
11875 {
11876 #ifdef DEVELOPER
11877 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11878 {
11879 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11880 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11881 }
11882 #endif
11883 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11884 }
11885 else
11886 {
11887 #ifdef DEVELOPER
11888 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11889 {
11890 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11891 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11892 }
11893 #endif
11894 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11895 }
11896 }
11897
11900 {
11901 int item_count = 0;
11903
11904 if (GetInventory().GetCargo() != NULL)
11905 {
11906 item_count = GetInventory().GetCargo().GetItemCount();
11907 }
11908
11909 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11910 {
11911 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11912 if (item)
11913 item_count += item.GetNumberOfItems();
11914 }
11915 return item_count;
11916 }
11917
11920 {
11921 float weight = 0;
11922 float wetness = 1;
11923 if (include_wetness)
11926 {
11927 weight = wetness * m_ConfigWeight;
11928 }
11930 {
11931 weight = 1;
11932 }
11933 return weight;
11934 }
11935
11936
11937
11939 {
11940 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11941 {
11942 GameInventory inv = GetInventory();
11943 array<EntityAI> items = new array<EntityAI>;
11945 for (int i = 0; i < items.Count(); i++)
11946 {
11948 if (item)
11949 {
11951 }
11952 }
11953 }
11954 }
11955
11956
11957
11958
11960 {
11961 float energy = 0;
11962 if (HasEnergyManager())
11963 {
11964 energy = GetCompEM().GetEnergy();
11965 }
11966 return energy;
11967 }
11968
11969
11971 {
11972 super.OnEnergyConsumed();
11973
11975 }
11976
11978 {
11979 super.OnEnergyAdded();
11980
11982 }
11983
11984
11986 {
11987 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11988 {
11990 {
11991 float energy_0to1 = GetCompEM().GetEnergy0To1();
11993 }
11994 }
11995 }
11996
11997
11999 {
12000 return ConfigGetFloat("heatIsolation");
12001 }
12002
12004 {
12006 }
12007
12009 {
12010 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12011 if (
GetGame().ConfigIsExisting(paramPath))
12013
12014 return 0.0;
12015 }
12016
12018 {
12019 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12020 if (
GetGame().ConfigIsExisting(paramPath))
12022
12023 return 0.0;
12024 }
12025
12026 override void SetWet(
float value,
bool allow_client =
false)
12027 {
12028 if (!IsServerCheck(allow_client))
12029 return;
12030
12033
12035
12036 m_VarWet = Math.Clamp(value, min, max);
12037
12039 {
12042 }
12043 }
12044
12045 override void AddWet(
float value)
12046 {
12048 }
12049
12051 {
12053 }
12054
12056 {
12058 }
12059
12061 {
12063 }
12064
12066 {
12068 }
12069
12071 {
12073 }
12074
12075 override void OnWetChanged(
float newVal,
float oldVal)
12076 {
12079 if (newLevel != oldLevel)
12080 {
12082 }
12083 }
12084
12086 {
12087 SetWeightDirty();
12088 }
12089
12091 {
12092 return GetWetLevelInternal(
m_VarWet);
12093 }
12094
12095
12096
12098 {
12100 }
12101
12103 {
12105 }
12106
12108 {
12110 }
12111
12113 {
12115 }
12116
12117
12118
12120 {
12121 if (ConfigIsExisting("itemModelLength"))
12122 {
12123 return ConfigGetFloat("itemModelLength");
12124 }
12125 return 0;
12126 }
12127
12129 {
12130 if (ConfigIsExisting("itemAttachOffset"))
12131 {
12132 return ConfigGetFloat("itemAttachOffset");
12133 }
12134 return 0;
12135 }
12136
12137 override void SetCleanness(
int value,
bool allow_client =
false)
12138 {
12139 if (!IsServerCheck(allow_client))
12140 return;
12141
12143
12145
12148 }
12149
12151 {
12153 }
12154
12156 {
12157 return true;
12158 }
12159
12160
12161
12162
12164 {
12166 }
12167
12169 {
12171 }
12172
12173
12174
12175
12176 override void SetColor(
int r,
int g,
int b,
int a)
12177 {
12183 }
12185 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12186 {
12191 }
12192
12194 {
12196 }
12197
12200 {
12201 int r,g,b,a;
12203 r = r/255;
12204 g = g/255;
12205 b = b/255;
12206 a = a/255;
12207 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12208 }
12209
12210
12211
12212 override void SetLiquidType(
int value,
bool allow_client =
false)
12213 {
12214 if (!IsServerCheck(allow_client))
12215 return;
12216
12221 }
12222
12224 {
12225 return ConfigGetInt("varLiquidTypeInit");
12226 }
12227
12229 {
12231 }
12232
12234 {
12236 SetFrozen(false);
12237 }
12238
12241 {
12242 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12243 }
12244
12245
12248 {
12249 PlayerBase nplayer;
12250 if (PlayerBase.CastTo(nplayer, player))
12251 {
12253
12254 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12255 }
12256 }
12257
12258
12261 {
12262 PlayerBase nplayer;
12263 if (PlayerBase.CastTo(nplayer,player))
12264 {
12265
12266 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12267
12268 }
12269
12270
12271 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12272
12273
12274 if (HasEnergyManager())
12275 {
12276 GetCompEM().UpdatePlugState();
12277 }
12278 }
12279
12280
12282 {
12283 super.OnPlacementStarted(player);
12284
12286 }
12287
12288 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12289 {
12291 {
12292 m_AdminLog.OnPlacementComplete(player,
this);
12293 }
12294
12295 super.OnPlacementComplete(player, position, orientation);
12296 }
12297
12298
12299
12300
12301
12303 {
12305 {
12306 return true;
12307 }
12308 else
12309 {
12310 return false;
12311 }
12312 }
12313
12314
12316 {
12318 {
12320 }
12321 }
12322
12323
12325 {
12327 }
12328
12330 {
12332 }
12333
12334 override void InsertAgent(
int agent,
float count = 1)
12335 {
12336 if (count < 1)
12337 return;
12338
12340 }
12341
12344 {
12346 }
12347
12348
12350 {
12352 }
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12396 {
12398 return false;
12399 return true;
12400 }
12401
12403 {
12404
12406 }
12407
12408
12411 {
12412 super.CheckForRoofLimited(timeTresholdMS);
12413
12415 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12416 {
12417 m_PreviousRoofTestTime = time;
12418 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12419 }
12420 }
12421
12422
12424 {
12426 {
12427 return 0;
12428 }
12429
12430 if (GetInventory().GetAttachmentSlotsCount() != 0)
12431 {
12432 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12433 if (filter)
12434 return filter.GetProtectionLevel(type, false, system);
12435 else
12436 return 0;
12437 }
12438
12439 string subclassPath, entryName;
12440
12441 switch (type)
12442 {
12444 entryName = "biological";
12445 break;
12447 entryName = "chemical";
12448 break;
12449 default:
12450 entryName = "biological";
12451 break;
12452 }
12453
12454 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12455
12457 }
12458
12459
12460
12463 {
12464 if (!IsMagazine())
12466
12468 }
12469
12470
12471
12472
12473
12478 {
12479 return true;
12480 }
12481
12483 {
12485 }
12486
12487
12488
12489
12490
12492 {
12493 if (parent)
12494 {
12495 if (parent.IsInherited(DayZInfected))
12496 return true;
12497
12498 if (!parent.IsRuined())
12499 return true;
12500 }
12501
12502 return true;
12503 }
12504
12506 {
12507 if (!super.CanPutAsAttachment(parent))
12508 {
12509 return false;
12510 }
12511
12512 if (!IsRuined() && !parent.IsRuined())
12513 {
12514 return true;
12515 }
12516
12517 return false;
12518 }
12519
12521 {
12522
12523
12524
12525
12526 return super.CanReceiveItemIntoCargo(item);
12527 }
12528
12530 {
12531
12532
12533
12534
12535 GameInventory attachmentInv = attachment.GetInventory();
12537 {
12538 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12539 return false;
12540 }
12541
12542 InventoryLocation loc = new InventoryLocation();
12543 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12544 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12545 return false;
12546
12547 return super.CanReceiveAttachment(attachment, slotId);
12548 }
12549
12551 {
12552 if (!super.CanReleaseAttachment(attachment))
12553 return false;
12554
12555 return GetInventory().AreChildrenAccessible();
12556 }
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12579 {
12580 int id = muzzle_owner.GetMuzzleID();
12581 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12582
12583 if (WPOF_array)
12584 {
12585 for (int i = 0; i < WPOF_array.Count(); i++)
12586 {
12587 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12588
12589 if (WPOF)
12590 {
12591 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12592 }
12593 }
12594 }
12595 }
12596
12597
12599 {
12600 int id = muzzle_owner.GetMuzzleID();
12602
12603 if (WPOBE_array)
12604 {
12605 for (int i = 0; i < WPOBE_array.Count(); i++)
12606 {
12607 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12608
12609 if (WPOBE)
12610 {
12611 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12612 }
12613 }
12614 }
12615 }
12616
12617
12619 {
12620 int id = muzzle_owner.GetMuzzleID();
12621 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12622
12623 if (WPOOH_array)
12624 {
12625 for (int i = 0; i < WPOOH_array.Count(); i++)
12626 {
12627 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12628
12629 if (WPOOH)
12630 {
12631 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12632 }
12633 }
12634 }
12635 }
12636
12637
12639 {
12640 int id = muzzle_owner.GetMuzzleID();
12641 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12642
12643 if (WPOOH_array)
12644 {
12645 for (int i = 0; i < WPOOH_array.Count(); i++)
12646 {
12647 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12648
12649 if (WPOOH)
12650 {
12651 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12652 }
12653 }
12654 }
12655 }
12656
12657
12659 {
12660 int id = muzzle_owner.GetMuzzleID();
12661 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12662
12663 if (WPOOH_array)
12664 {
12665 for (int i = 0; i < WPOOH_array.Count(); i++)
12666 {
12667 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12668
12669 if (WPOOH)
12670 {
12671 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12672 }
12673 }
12674 }
12675 }
12676
12677
12678
12680 {
12682 {
12683 return true;
12684 }
12685
12686 return false;
12687 }
12688
12690 {
12692 {
12693 return true;
12694 }
12695
12696 return false;
12697 }
12698
12700 {
12702 {
12703 return true;
12704 }
12705
12706 return false;
12707 }
12708
12710 {
12711 return false;
12712 }
12713
12716 {
12717 return UATimeSpent.DEFAULT_DEPLOY;
12718 }
12719
12720
12721
12722
12724 {
12726 SetSynchDirty();
12727 }
12728
12730 {
12732 }
12733
12734
12736 {
12737 return false;
12738 }
12739
12742 {
12743 string att_type = "None";
12744
12745 if (ConfigIsExisting("soundAttType"))
12746 {
12747 att_type = ConfigGetString("soundAttType");
12748 }
12749
12751 }
12752
12754 {
12756 }
12757
12758
12759
12760
12761
12767
12769 {
12772
12774 }
12775
12776
12778 {
12780 return;
12781
12783
12786
12789
12790 SoundParameters params = new SoundParameters();
12794 }
12795
12796
12798 {
12800 return;
12801
12803 SetSynchDirty();
12804
12807 }
12808
12809
12811 {
12813 return;
12814
12816 SetSynchDirty();
12817
12820 }
12821
12823 {
12825 }
12826
12828 {
12830 }
12831
12834 {
12835 if (!
GetGame().IsDedicatedServer())
12836 {
12837 if (ConfigIsExisting("attachSoundSet"))
12838 {
12839 string cfg_path = "";
12840 string soundset = "";
12841 string type_name =
GetType();
12842
12845 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12846 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12847
12848 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12849 {
12850 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12851 {
12852 if (cfg_slot_array[i] == slot_type)
12853 {
12854 soundset = cfg_soundset_array[i];
12855 break;
12856 }
12857 }
12858 }
12859
12860 if (soundset != "")
12861 {
12862 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12864 }
12865 }
12866 }
12867 }
12868
12870 {
12871
12872 }
12873
12874 void OnApply(PlayerBase player);
12875
12877 {
12878 return 1.0;
12879 };
12880
12882 {
12884 }
12885
12887 {
12889 }
12890
12892
12894 {
12895 SetDynamicPhysicsLifeTime(0.01);
12897 }
12898
12900 {
12901 array<string> zone_names = new array<string>;
12902 GetDamageZones(zone_names);
12903 for (int i = 0; i < zone_names.Count(); i++)
12904 {
12905 SetHealthMax(zone_names.Get(i),"Health");
12906 }
12907 SetHealthMax("","Health");
12908 }
12909
12912 {
12913 float global_health = GetHealth01("","Health");
12914 array<string> zones = new array<string>;
12915 GetDamageZones(zones);
12916
12917 for (int i = 0; i < zones.Count(); i++)
12918 {
12919 SetHealth01(zones.Get(i),"Health",global_health);
12920 }
12921 }
12922
12925 {
12926 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12927 }
12928
12930 {
12931 if (!hasRootAsPlayer)
12932 {
12933 if (refParentIB)
12934 {
12935
12936 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12937 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12938
12939 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12940 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12941
12944 }
12945 else
12946 {
12947
12950 }
12951 }
12952 }
12953
12955 {
12957 {
12958 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12959 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12960 {
12961 float heatPermCoef = 1.0;
12963 while (ent)
12964 {
12965 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12966 ent = ent.GetHierarchyParent();
12967 }
12968
12969 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12970 }
12971 }
12972 }
12973
12975 {
12976
12977 EntityAI parent = GetHierarchyParent();
12978 if (!parent)
12979 {
12980 hasParent = false;
12981 hasRootAsPlayer = false;
12982 }
12983 else
12984 {
12985 hasParent = true;
12986 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12987 refParentIB =
ItemBase.Cast(parent);
12988 }
12989 }
12990
12991 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12992 {
12993
12994 }
12995
12997 {
12998
12999 return false;
13000 }
13001
13003 {
13004
13005
13006 return false;
13007 }
13008
13010 {
13011
13012 return false;
13013 }
13014
13017 {
13018 return !GetIsFrozen() &&
IsOpen();
13019 }
13020
13022 {
13023 bool hasParent = false, hasRootAsPlayer = false;
13025
13026 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13027 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13028
13029 if (wwtu || foodDecay)
13030 {
13034
13035 if (processWetness || processTemperature || processDecay)
13036 {
13038
13039 if (processWetness)
13040 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13041
13042 if (processTemperature)
13044
13045 if (processDecay)
13046 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13047 }
13048 }
13049 }
13050
13053 {
13055 }
13056
13058 {
13061
13062 return super.GetTemperatureFreezeThreshold();
13063 }
13064
13066 {
13069
13070 return super.GetTemperatureThawThreshold();
13071 }
13072
13074 {
13077
13078 return super.GetItemOverheatThreshold();
13079 }
13080
13082 {
13084 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13085
13086 return super.GetTemperatureFreezeTime();
13087 }
13088
13090 {
13092 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13093
13094 return super.GetTemperatureThawTime();
13095 }
13096
13101
13103 {
13104 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13105 }
13106
13108 {
13109 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13110 }
13111
13114 {
13116 }
13117
13119 {
13121 }
13122
13124 {
13126 }
13127
13130 {
13131 return null;
13132 }
13133
13136 {
13137 return false;
13138 }
13139
13141 {
13143 {
13146 if (!trg)
13147 {
13149 explosive = this;
13150 }
13151
13152 explosive.PairRemote(trg);
13154
13155 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13156 trg.SetPersistentPairID(persistentID);
13157 explosive.SetPersistentPairID(persistentID);
13158
13159 return true;
13160 }
13161 return false;
13162 }
13163
13166 {
13167 float ret = 1.0;
13170 ret *= GetHealth01();
13171
13172 return ret;
13173 }
13174
13175 #ifdef DEVELOPER
13176 override void SetDebugItem()
13177 {
13178 super.SetDebugItem();
13179 _itemBase = this;
13180 }
13181
13183 {
13184 string text = super.GetDebugText();
13185
13187 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13188
13189 return text;
13190 }
13191 #endif
13192
13194 {
13195 return true;
13196 }
13197
13199
13201
13203 {
13206 }
13207
13208
13216
13232}
13233
13235{
13237 if (entity)
13238 {
13239 bool is_item = entity.IsInherited(
ItemBase);
13240 if (is_item && full_quantity)
13241 {
13244 }
13245 }
13246 else
13247 {
13249 return NULL;
13250 }
13251 return entity;
13252}
13253
13255{
13256 if (item)
13257 {
13258 if (health > 0)
13259 item.SetHealth("", "", health);
13260
13261 if (item.CanHaveTemperature())
13262 {
13264 if (item.CanFreeze())
13265 item.SetFrozen(false);
13266 }
13267
13268 if (item.HasEnergyManager())
13269 {
13270 if (quantity >= 0)
13271 {
13272 item.GetCompEM().SetEnergy0To1(quantity);
13273 }
13274 else
13275 {
13277 }
13278 }
13279 else if (item.IsMagazine())
13280 {
13281 Magazine mag = Magazine.Cast(item);
13282 if (quantity >= 0)
13283 {
13284 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13285 }
13286 else
13287 {
13289 }
13290
13291 }
13292 else
13293 {
13294 if (quantity >= 0)
13295 {
13296 item.SetQuantityNormalized(quantity, false);
13297 }
13298 else
13299 {
13301 }
13302
13303 }
13304 }
13305}
13306
13307#ifdef DEVELOPER
13309#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.