8408{
8410 {
8411 return true;
8412 }
8413};
8414
8415
8416
8418{
8422
8424
8427
8428
8429
8430
8431
8440
8446
8451
8456
8477 protected bool m_IsResultOfSplit
8478
8480
8485
8486
8487
8489
8493
8494
8495
8497
8500
8501
8502
8508
8509
8517
8520
8521
8523
8524
8526
8527
8532
8533
8538
8539
8541
8542
8544 {
8549
8550 if (!
GetGame().IsDedicatedServer())
8551 {
8553 {
8555
8557 {
8559 }
8560 }
8561
8564 }
8565
8566 m_OldLocation = null;
8567
8569 {
8571 }
8572
8573 if (ConfigIsExisting("headSelectionsToHide"))
8574 {
8577 }
8578
8580 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8581 {
8583 }
8584
8586
8587 m_IsResultOfSplit = false;
8588
8590 }
8591
8593 {
8594 super.InitItemVariables();
8595
8601 m_Count = ConfigGetInt(
"count");
8602
8605
8610
8613
8618
8630
8634
8635
8638 if (ConfigIsExisting("canBeSplit"))
8639 {
8642 }
8643
8645 if (ConfigIsExisting("itemBehaviour"))
8647
8648
8651 RegisterNetSyncVariableInt("m_VarLiquidType");
8652 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8653
8654 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8655 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8656 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8657
8658 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8659 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8660 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8661 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8662
8663 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8664 RegisterNetSyncVariableBool("m_IsTakeable");
8665 RegisterNetSyncVariableBool("m_IsHologram");
8666
8669 {
8672 }
8673
8675
8677 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8679
8680 }
8681
8683 {
8685 }
8686
8688 {
8691 {
8696 }
8697 }
8698
8699 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8700 {
8702 {
8705 }
8706
8708 }
8709
8711 {
8717 }
8718
8720
8722 {
8724
8725 if (!action)
8726 {
8727 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8728 return;
8729 }
8730
8732 if (!ai)
8733 {
8735 return;
8736 }
8737
8739 if (!action_array)
8740 {
8741 action_array = new array<ActionBase_Basic>;
8743 }
8744 if (LogManager.IsActionLogEnable())
8745 {
8746 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8747 }
8748
8749 if (action_array.Find(action) != -1)
8750 {
8751 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8752 }
8753 else
8754 {
8755 action_array.Insert(action);
8756 }
8757 }
8758
8760 {
8762 ActionBase action = player.GetActionManager().GetAction(actionName);
8765
8766 if (action_array)
8767 {
8768 action_array.RemoveItem(action);
8769 }
8770 }
8771
8772
8773
8775 {
8776 ActionOverrideData overrideData = new ActionOverrideData();
8780
8782 if (!actionMap)
8783 {
8786 }
8787
8788 actionMap.Insert(this.
Type(), overrideData);
8789
8790 }
8791
8793
8795
8796
8798 {
8801
8804
8805 string config_to_search = "CfgVehicles";
8806 string muzzle_owner_config;
8807
8809 {
8810 if (IsInherited(Weapon))
8811 config_to_search = "CfgWeapons";
8812
8813 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8814
8815 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8816
8818
8819 if (config_OnFire_subclass_count > 0)
8820 {
8821 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8822
8823 for (int i = 0; i < config_OnFire_subclass_count; i++)
8824 {
8825 string particle_class = "";
8827 string config_OnFire_entry = config_OnFire_class + particle_class;
8828 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8829 WPOF_array.Insert(WPOF);
8830 }
8831
8832
8834 }
8835 }
8836
8838 {
8839 config_to_search = "CfgWeapons";
8840 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8841
8842 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8843
8845
8846 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8847 {
8848 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8849
8850 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8851 {
8852 string particle_class2 = "";
8854 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8855 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8856 WPOBE_array.Insert(WPOBE);
8857 }
8858
8859
8861 }
8862 }
8863 }
8864
8865
8867 {
8870
8872 {
8873 string config_to_search = "CfgVehicles";
8874
8875 if (IsInherited(Weapon))
8876 config_to_search = "CfgWeapons";
8877
8878 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8879 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8880
8881 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8882 {
8883
8885
8887 {
8889 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8891 return;
8892 }
8893
8896
8897
8898
8900 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8901
8902 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8903 {
8904 string particle_class = "";
8906 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8908
8909 if (entry_type == CT_CLASS)
8910 {
8911 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8912 WPOOH_array.Insert(WPOF);
8913 }
8914 }
8915
8916
8918 }
8919 }
8920 }
8921
8923 {
8925 }
8926
8928 {
8930 {
8932
8935
8938
8939 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8940 }
8941 }
8942
8944 {
8946 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8947
8949 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8950
8952 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8953
8955 {
8957 }
8958 }
8959
8961 {
8963 }
8964
8966 {
8969 else
8971
8973 {
8976 }
8977 else
8978 {
8981
8984 }
8985
8987 }
8988
8990 {
8992 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8993 }
8994
8996 {
8998 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9000 }
9001
9003 {
9005 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9006 }
9007
9009 {
9012
9013 OverheatingParticle OP = new OverheatingParticle();
9018
9020 }
9021
9023 {
9026
9027 return -1;
9028 }
9029
9031 {
9033 {
9036
9037 for (int i = count; i > 0; --i)
9038 {
9039 int id = i - 1;
9042
9045
9046 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9047 {
9048 if (p)
9049 {
9052 }
9053 }
9054 }
9055 }
9056 }
9057
9059 {
9061 {
9063 {
9064 int id = i - 1;
9066
9067 if (OP)
9068 {
9070
9071 if (p)
9072 {
9074 }
9075
9076 delete OP;
9077 }
9078 }
9079
9082 }
9083 }
9084
9087 {
9088 return 0.0;
9089 }
9090
9091
9093 {
9094 return 250;
9095 }
9096
9098 {
9099 return 0;
9100 }
9101
9104 {
9106 return true;
9107
9108 return false;
9109 }
9110
9113 {
9116
9118 {
9120 }
9121 else
9122 {
9123
9125 }
9126
9128 }
9129
9136 {
9137 return -1;
9138 }
9139
9140
9141
9142
9144 {
9146 {
9148 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9149
9150 if (r_index >= 0)
9151 {
9152 InventoryLocation r_il = new InventoryLocation;
9153 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9154
9155 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9158 {
9159 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9160 }
9162 {
9163 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9164 }
9165
9166 }
9167
9168 player.GetHumanInventory().ClearUserReservedLocation(this);
9169 }
9170
9173 }
9174
9175
9176
9177
9179 {
9180 return ItemBase.m_DebugActionsMask;
9181 }
9182
9184 {
9185 return ItemBase.m_DebugActionsMask & mask;
9186 }
9187
9189 {
9190 ItemBase.m_DebugActionsMask = mask;
9191 }
9192
9194 {
9195 ItemBase.m_DebugActionsMask |= mask;
9196 }
9197
9199 {
9200 ItemBase.m_DebugActionsMask &= ~mask;
9201 }
9202
9204 {
9206 {
9208 }
9209 else
9210 {
9212 }
9213 }
9214
9215
9217 {
9218 if (GetEconomyProfile())
9219 {
9220 float q_max = GetEconomyProfile().GetQuantityMax();
9221 if (q_max > 0)
9222 {
9223 float q_min = GetEconomyProfile().GetQuantityMin();
9224 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9225
9227 {
9228 ComponentEnergyManager comp = GetCompEM();
9230 {
9232 }
9233 }
9235 {
9237
9238 }
9239
9240 }
9241 }
9242 }
9243
9246 {
9247 EntityAI parent = GetHierarchyParent();
9248
9249 if (parent)
9250 {
9251 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9252 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9253 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9254 }
9255 }
9256
9259 {
9260 EntityAI parent = GetHierarchyParent();
9261
9262 if (parent)
9263 {
9264 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9265 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9266 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9267 }
9268 }
9269
9271 {
9272
9273
9274
9275
9277
9279 {
9280 if (ScriptInputUserData.CanStoreInputUserData())
9281 {
9282 ScriptInputUserData ctx = new ScriptInputUserData;
9288 ctx.
Write(use_stack_max);
9291
9293 {
9294 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9295 }
9296 }
9297 }
9298 else if (!
GetGame().IsMultiplayer())
9299 {
9301 }
9302 }
9303
9305 {
9307 }
9308
9310 {
9312 }
9313
9315 {
9317 }
9318
9320 {
9321
9322 return false;
9323 }
9324
9326 {
9327 return false;
9328 }
9329
9333 {
9334 return false;
9335 }
9336
9338 {
9339 return "";
9340 }
9341
9343
9345 {
9346 return false;
9347 }
9348
9350 {
9351 return true;
9352 }
9353
9354
9355
9357 {
9358 return true;
9359 }
9360
9362 {
9363 return true;
9364 }
9365
9367 {
9368 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9370 }
9371
9373 {
9375 }
9376
9378 {
9380 if (!is_being_placed)
9382 SetSynchDirty();
9383 }
9384
9385
9387
9389 {
9391 }
9392
9394 {
9396 }
9397
9399 {
9400 return 1;
9401 }
9402
9404 {
9405 return false;
9406 }
9407
9409 {
9411 SetSynchDirty();
9412 }
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9449 {
9450 super.OnMovedInsideCargo(container);
9451
9452 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9453 }
9454
9455 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9456 {
9457 super.EEItemLocationChanged(oldLoc,newLoc);
9458
9459 PlayerBase new_player = null;
9460 PlayerBase old_player = null;
9461
9462 if (newLoc.GetParent())
9463 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9464
9465 if (oldLoc.GetParent())
9466 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9467
9469 {
9470 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9471
9472 if (r_index >= 0)
9473 {
9474 InventoryLocation r_il = new InventoryLocation;
9475 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9476
9477 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9480 {
9481 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9482 }
9484 {
9485 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9486 }
9487
9488 }
9489 }
9490
9492 {
9493 if (new_player)
9494 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9495
9496 if (new_player == old_player)
9497 {
9498
9499 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9500 {
9502 {
9503 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9504 {
9505 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9506 }
9507 }
9508 else
9509 {
9510 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9511 }
9512 }
9513
9514 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9515 {
9516 int type = oldLoc.GetType();
9518 {
9519 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9520 }
9522 {
9523 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9524 }
9525 }
9526 if (!m_OldLocation)
9527 {
9528 m_OldLocation = new InventoryLocation;
9529 }
9530 m_OldLocation.Copy(oldLoc);
9531 }
9532 else
9533 {
9534 if (m_OldLocation)
9535 {
9536 m_OldLocation.Reset();
9537 }
9538 }
9539
9541 }
9542 else
9543 {
9544 if (new_player)
9545 {
9546 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9547 if (res_index >= 0)
9548 {
9549 InventoryLocation il = new InventoryLocation;
9550 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9552 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9555 {
9556 il.
GetParent().GetOnReleaseLock().Invoke(it);
9557 }
9559 {
9561 }
9562
9563 }
9564 }
9566 {
9567
9569 }
9570
9571 if (m_OldLocation)
9572 {
9573 m_OldLocation.Reset();
9574 }
9575 }
9576 }
9577
9578 override void EOnContact(IEntity other, Contact extra)
9579 {
9581 {
9582 int liquidType = -1;
9584 if (impactSpeed > 0.0)
9585 {
9587 #ifndef SERVER
9589 #else
9591 SetSynchDirty();
9592 #endif
9594 }
9595 }
9596
9597 #ifdef SERVER
9598 if (GetCompEM() && GetCompEM().IsPlugged())
9599 {
9600 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9601 GetCompEM().UnplugThis();
9602 }
9603 #endif
9604 }
9605
9607
9609 {
9611 }
9612
9614 {
9615
9616 }
9617
9619 {
9620 super.OnItemLocationChanged(old_owner, new_owner);
9621
9622 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9623 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9624
9625 if (!relatedPlayer && playerNew)
9626 relatedPlayer = playerNew;
9627
9628 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9629 {
9631 if (actionMgr)
9632 {
9633 ActionBase currentAction = actionMgr.GetRunningAction();
9634 if (currentAction)
9636 }
9637 }
9638
9639 Man ownerPlayerOld = null;
9640 Man ownerPlayerNew = null;
9641
9642 if (old_owner)
9643 {
9644 if (old_owner.
IsMan())
9645 {
9646 ownerPlayerOld = Man.Cast(old_owner);
9647 }
9648 else
9649 {
9650 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9651 }
9652 }
9653 else
9654 {
9656 {
9658
9659 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9660 {
9661 GetCompEM().UnplugThis();
9662 }
9663 }
9664 }
9665
9666 if (new_owner)
9667 {
9668 if (new_owner.
IsMan())
9669 {
9670 ownerPlayerNew = Man.Cast(new_owner);
9671 }
9672 else
9673 {
9674 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9675 }
9676 }
9677
9678 if (ownerPlayerOld != ownerPlayerNew)
9679 {
9680 if (ownerPlayerOld)
9681 {
9682 array<EntityAI> subItemsExit = new array<EntityAI>;
9684 for (int i = 0; i < subItemsExit.Count(); i++)
9685 {
9688 }
9689 }
9690
9691 if (ownerPlayerNew)
9692 {
9693 array<EntityAI> subItemsEnter = new array<EntityAI>;
9695 for (int j = 0; j < subItemsEnter.Count(); j++)
9696 {
9699 }
9700 }
9701 }
9702 else if (ownerPlayerNew != null)
9703 {
9704 PlayerBase nplayer;
9705 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9706 {
9707 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9709 for (int k = 0; k < subItemsUpdate.Count(); k++)
9710 {
9712 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9713 }
9714 }
9715 }
9716
9717 if (old_owner)
9718 old_owner.OnChildItemRemoved(this);
9719 if (new_owner)
9720 new_owner.OnChildItemReceived(this);
9721 }
9722
9723
9725 {
9726 super.EEDelete(parent);
9727 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9728 if (player)
9729 {
9731
9732 if (player.IsAlive())
9733 {
9734 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9735 if (r_index >= 0)
9736 {
9737 InventoryLocation r_il = new InventoryLocation;
9738 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9739
9740 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9743 {
9744 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9745 }
9747 {
9748 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9749 }
9750
9751 }
9752
9753 player.RemoveQuickBarEntityShortcut(this);
9754 }
9755 }
9756 }
9757
9759 {
9760 super.EEKilled(killer);
9761
9764 {
9765 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9766 {
9767 if (IsMagazine())
9768 {
9769 if (Magazine.Cast(this).GetAmmoCount() > 0)
9770 {
9772 }
9773 }
9774 else
9775 {
9777 }
9778 }
9779 }
9780 }
9781
9783 {
9784 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9785
9786 super.OnWasAttached(parent, slot_id);
9787
9790
9792 }
9793
9795 {
9796 super.OnWasDetached(parent, slot_id);
9797
9800 }
9801
9803 {
9804 int idx;
9807
9808 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9809 if (inventory_slots.Count() < 1)
9810 {
9811 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9812 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9813 }
9814 else
9815 {
9816 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9817 }
9818
9819 idx = inventory_slots.Find(slot);
9820 if (idx < 0)
9821 return "";
9822
9823 return attach_types.Get(idx);
9824 }
9825
9827 {
9828 int idx = -1;
9829 string slot;
9830
9833
9834 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9835 if (inventory_slots.Count() < 1)
9836 {
9837 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9838 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9839 }
9840 else
9841 {
9842 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9843 if (detach_types.Count() < 1)
9844 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9845 }
9846
9847 for (int i = 0; i < inventory_slots.Count(); i++)
9848 {
9849 slot = inventory_slots.Get(i);
9850 }
9851
9852 if (slot != "")
9853 {
9854 if (detach_types.Count() == 1)
9855 idx = 0;
9856 else
9857 idx = inventory_slots.Find(slot);
9858 }
9859 if (idx < 0)
9860 return "";
9861
9862 return detach_types.Get(idx);
9863 }
9864
9866 {
9867
9869
9870
9871 float min_time = 1;
9872 float max_time = 3;
9873 float delay = Math.RandomFloat(min_time, max_time);
9874
9875 explode_timer.Run(delay, this, "DoAmmoExplosion");
9876 }
9877
9879 {
9880 Magazine magazine = Magazine.Cast(this);
9881 int pop_sounds_count = 6;
9882 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9883
9884
9885 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9886 string sound_name = pop_sounds[ sound_idx ];
9888
9889
9890 magazine.ServerAddAmmoCount(-1);
9891
9892
9893 float min_temp_to_explode = 100;
9894
9895 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9896 {
9898 }
9899 }
9900
9901
9902 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9903 {
9904 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9905
9906 const int CHANCE_DAMAGE_CARGO = 4;
9907 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9908 const int CHANCE_DAMAGE_NOTHING = 2;
9909
9911 {
9912 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9913 int chances;
9914 int rnd;
9915
9916 if (GetInventory().GetCargo())
9917 {
9918 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9919 rnd = Math.RandomInt(0,chances);
9920
9921 if (rnd < CHANCE_DAMAGE_CARGO)
9922 {
9924 }
9925 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9926 {
9928 }
9929 }
9930 else
9931 {
9932 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9933 rnd = Math.RandomInt(0,chances);
9934
9935 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9936 {
9938 }
9939 }
9940 }
9941 }
9942
9944 {
9945 if (GetInventory().GetCargo())
9946 {
9947 int item_count = GetInventory().GetCargo().GetItemCount();
9948 if (item_count > 0)
9949 {
9950 int random_pick = Math.RandomInt(0, item_count);
9952 if (!item.IsExplosive())
9953 {
9954 item.AddHealth("","",damage);
9955 return true;
9956 }
9957 }
9958 }
9959 return false;
9960 }
9961
9963 {
9964 int attachment_count = GetInventory().AttachmentCount();
9965 if (attachment_count > 0)
9966 {
9967 int random_pick = Math.RandomInt(0, attachment_count);
9968 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9969 if (!attachment.IsExplosive())
9970 {
9971 attachment.AddHealth("","",damage);
9972 return true;
9973 }
9974 }
9975 return false;
9976 }
9977
9979 {
9981 }
9982
9984 {
9986 return GetInventory().CanRemoveEntity();
9987
9988 return false;
9989 }
9990
9992 {
9994 return;
9995
9997 {
9998 if (ScriptInputUserData.CanStoreInputUserData())
9999 {
10000 ScriptInputUserData ctx = new ScriptInputUserData;
10005 ctx.
Write(destination_entity);
10007 ctx.
Write(slot_id);
10009 }
10010 }
10011 else if (!
GetGame().IsMultiplayer())
10012 {
10014 }
10015 }
10016
10018 {
10020 return;
10021
10022 float split_quantity_new;
10026 InventoryLocation loc = new InventoryLocation;
10027
10028 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10029 {
10031 split_quantity_new = stack_max;
10032 else
10034
10035 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10036 if (new_item)
10037 {
10038 new_item.SetResultOfSplit(true);
10039 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10041 new_item.SetQuantity(split_quantity_new);
10042 }
10043 }
10044 else if (destination_entity && slot_id == -1)
10045 {
10046 if (quantity > stack_max)
10047 split_quantity_new = stack_max;
10048 else
10049 split_quantity_new = quantity;
10050
10052 {
10055 }
10056
10057 if (new_item)
10058 {
10059 new_item.SetResultOfSplit(true);
10060 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10062 new_item.SetQuantity(split_quantity_new);
10063 }
10064 }
10065 else
10066 {
10067 if (stack_max != 0)
10068 {
10070 {
10072 }
10073
10074 if (split_quantity_new == 0)
10075 {
10076 if (!
GetGame().IsMultiplayer())
10077 player.PhysicalPredictiveDropItem(this);
10078 else
10079 player.ServerDropEntity(this);
10080 return;
10081 }
10082
10084
10085 if (new_item)
10086 {
10087 new_item.SetResultOfSplit(true);
10088 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10090 new_item.SetQuantity(stack_max);
10091 new_item.PlaceOnSurface();
10092 }
10093 }
10094 }
10095 }
10096
10098 {
10100 return;
10101
10102 float split_quantity_new;
10106 InventoryLocation loc = new InventoryLocation;
10107
10108 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10109 {
10111 split_quantity_new = stack_max;
10112 else
10114
10115 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10116 if (new_item)
10117 {
10118 new_item.SetResultOfSplit(true);
10119 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10121 new_item.SetQuantity(split_quantity_new);
10122 }
10123 }
10124 else if (destination_entity && slot_id == -1)
10125 {
10126 if (quantity > stack_max)
10127 split_quantity_new = stack_max;
10128 else
10129 split_quantity_new = quantity;
10130
10132 {
10135 }
10136
10137 if (new_item)
10138 {
10139 new_item.SetResultOfSplit(true);
10140 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10142 new_item.SetQuantity(split_quantity_new);
10143 }
10144 }
10145 else
10146 {
10147 if (stack_max != 0)
10148 {
10150 {
10152 }
10153
10155
10156 if (new_item)
10157 {
10158 new_item.SetResultOfSplit(true);
10159 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10161 new_item.SetQuantity(stack_max);
10162 new_item.PlaceOnSurface();
10163 }
10164 }
10165 }
10166 }
10167
10169 {
10171 return;
10172
10174 {
10175 if (ScriptInputUserData.CanStoreInputUserData())
10176 {
10177 ScriptInputUserData ctx = new ScriptInputUserData;
10182 dst.WriteToContext(ctx);
10184 }
10185 }
10186 else if (!
GetGame().IsMultiplayer())
10187 {
10189 }
10190 }
10191
10193 {
10195 return;
10196
10198 {
10199 if (ScriptInputUserData.CanStoreInputUserData())
10200 {
10201 ScriptInputUserData ctx = new ScriptInputUserData;
10206 ctx.
Write(destination_entity);
10212 }
10213 }
10214 else if (!
GetGame().IsMultiplayer())
10215 {
10217 }
10218 }
10219
10221 {
10223 }
10224
10226 {
10228 return this;
10229
10231 float split_quantity_new;
10233 if (dst.IsValid())
10234 {
10235 int slot_id = dst.GetSlot();
10237
10238 if (quantity > stack_max)
10239 split_quantity_new = stack_max;
10240 else
10241 split_quantity_new = quantity;
10242
10244
10245 if (new_item)
10246 {
10247 new_item.SetResultOfSplit(true);
10248 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10251 }
10252
10253 return new_item;
10254 }
10255
10256 return null;
10257 }
10258
10260 {
10262 return;
10263
10265 float split_quantity_new;
10267 if (destination_entity)
10268 {
10270 if (quantity > stackable)
10271 split_quantity_new = stackable;
10272 else
10273 split_quantity_new = quantity;
10274
10275 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10276 if (new_item)
10277 {
10278 new_item.SetResultOfSplit(true);
10279 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10281 new_item.SetQuantity(split_quantity_new);
10282 }
10283 }
10284 }
10285
10287 {
10289 return;
10290
10292 {
10293 if (ScriptInputUserData.CanStoreInputUserData())
10294 {
10295 ScriptInputUserData ctx = new ScriptInputUserData;
10300 ItemBase destination_entity =
this;
10301 ctx.
Write(destination_entity);
10305 }
10306 }
10307 else if (!
GetGame().IsMultiplayer())
10308 {
10310 }
10311 }
10312
10314 {
10316 return;
10317
10319 float split_quantity_new;
10321 if (player)
10322 {
10324 if (quantity > stackable)
10325 split_quantity_new = stackable;
10326 else
10327 split_quantity_new = quantity;
10328
10329 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10330 new_item =
ItemBase.Cast(in_hands);
10331 if (new_item)
10332 {
10333 new_item.SetResultOfSplit(true);
10334 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10336 new_item.SetQuantity(split_quantity_new);
10337 }
10338 }
10339 }
10340
10342 {
10344 return;
10345
10347 float split_quantity_new = Math.Floor(quantity * 0.5);
10348
10350
10351 if (new_item)
10352 {
10353 if (new_item.GetQuantityMax() < split_quantity_new)
10354 {
10355 split_quantity_new = new_item.GetQuantityMax();
10356 }
10357
10358 new_item.SetResultOfSplit(true);
10359 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10360
10362 {
10365 }
10366 else
10367 {
10370 }
10371 }
10372 }
10373
10375 {
10377 return;
10378
10380 float split_quantity_new = Math.Floor(quantity / 2);
10381
10382 InventoryLocation invloc = new InventoryLocation;
10384
10386 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10387
10388 if (new_item)
10389 {
10390 if (new_item.GetQuantityMax() < split_quantity_new)
10391 {
10392 split_quantity_new = new_item.GetQuantityMax();
10393 }
10395 {
10398 }
10399 else
10400 {
10403 }
10404 }
10405 }
10406
10409 {
10410 SetWeightDirty();
10412
10413 if (parent)
10414 parent.OnAttachmentQuantityChangedEx(this, delta);
10415
10417 {
10419 {
10421 }
10423 {
10424 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10426 }
10427 }
10428
10429 }
10430
10433 {
10434
10435 }
10436
10439 {
10441 }
10442
10444 {
10445 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10446
10448 {
10449 if (newLevel == GameConstants.STATE_RUINED)
10450 {
10452 EntityAI parent = GetHierarchyParent();
10453 if (parent && parent.IsFireplace())
10454 {
10455 CargoBase cargo = GetInventory().GetCargo();
10456 if (cargo)
10457 {
10459 {
10461 }
10462 }
10463 }
10464 }
10465
10467 {
10468
10470 return;
10471 }
10472
10473 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10474 {
10476 }
10477 }
10478 }
10479
10480
10482 {
10483 super.OnRightClick();
10484
10486 {
10488 {
10489 if (ScriptInputUserData.CanStoreInputUserData())
10490 {
10491 vector m4[4];
10493
10494 EntityAI root = GetHierarchyRoot();
10495
10496 InventoryLocation dst = new InventoryLocation;
10498 {
10499 if (root)
10500 {
10501 root.GetTransform(m4);
10503 }
10504 else
10505 GetInventory().GetCurrentInventoryLocation(dst);
10506 }
10507 else
10508 {
10510
10511
10512 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10513 {
10514 if (root)
10515 {
10516 root.GetTransform(m4);
10518 }
10519 else
10520 GetInventory().GetCurrentInventoryLocation(dst);
10521 }
10522 else
10523 {
10524 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10525 }
10526 }
10527
10528 ScriptInputUserData ctx = new ScriptInputUserData;
10536 }
10537 }
10538 else if (!
GetGame().IsMultiplayer())
10539 {
10541 }
10542 }
10543 }
10544
10545 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10546 {
10547
10548 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10549 return false;
10550
10551 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10552 return false;
10553
10554
10556 return false;
10557
10558
10559 Magazine mag = Magazine.Cast(this);
10560 if (mag)
10561 {
10562 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10563 return false;
10564
10565 if (stack_max_limit)
10566 {
10567 Magazine other_mag = Magazine.Cast(other_item);
10568 if (other_item)
10569 {
10570 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10571 return false;
10572 }
10573
10574 }
10575 }
10576 else
10577 {
10578
10580 return false;
10581
10583 return false;
10584 }
10585
10586 PlayerBase player = null;
10587 if (CastTo(player, GetHierarchyRootPlayer()))
10588 {
10589 if (player.GetInventory().HasAttachment(this))
10590 return false;
10591
10592 if (player.IsItemsToDelete())
10593 return false;
10594 }
10595
10596 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10597 return false;
10598
10599 int slotID;
10601 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10602 return false;
10603
10604 return true;
10605 }
10606
10608 {
10610 }
10611
10613 {
10614 return m_IsResultOfSplit;
10615 }
10616
10618 {
10619 m_IsResultOfSplit = value;
10620 }
10621
10623 {
10625 }
10626
10628 {
10629 float other_item_quantity = other_item.GetQuantity();
10630 float this_free_space;
10631
10633
10635
10636 if (other_item_quantity > this_free_space)
10637 {
10638 return this_free_space;
10639 }
10640 else
10641 {
10642 return other_item_quantity;
10643 }
10644 }
10645
10647 {
10649 }
10650
10652 {
10654 return;
10655
10656 if (!IsMagazine() && other_item)
10657 {
10659 if (quantity_used != 0)
10660 {
10661 float hp1 = GetHealth01("","");
10662 float hp2 = other_item.GetHealth01("","");
10663 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10664 hpResult = hpResult / (
GetQuantity() + quantity_used);
10665
10666 hpResult *= GetMaxHealth();
10667 Math.Round(hpResult);
10668 SetHealth("", "Health", hpResult);
10669
10671 other_item.AddQuantity(-quantity_used);
10672 }
10673 }
10675 }
10676
10678 {
10679 #ifdef SERVER
10680 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10681 GetHierarchyParent().IncreaseLifetimeUp();
10682 #endif
10683 };
10684
10686 {
10687 PlayerBase p = PlayerBase.Cast(player);
10688
10689 array<int> recipesIds = p.m_Recipes;
10690 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10691 if (moduleRecipesManager)
10692 {
10693 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10694 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10695 }
10696
10697 for (int i = 0;i < recipesIds.Count(); i++)
10698 {
10699 int key = recipesIds.Get(i);
10700 string recipeName = moduleRecipesManager.GetRecipeName(key);
10702 }
10703 }
10704
10705
10706 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10707 {
10708 super.GetDebugActions(outputList);
10709
10710
10715
10716
10720
10724
10725
10728
10729
10731 {
10734 }
10735
10737
10740
10744 }
10745
10746
10747
10748
10750 {
10751 super.OnAction(action_id, player, ctx);
10752 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10753 {
10754 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10755 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10756 PlayerBase p = PlayerBase.Cast(player);
10757 if (
EActions.RECIPES_RANGE_START < 1000)
10758 {
10759 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10760 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10761 }
10762 }
10763 #ifndef SERVER
10764 else if (action_id ==
EActions.WATCH_PLAYER)
10765 {
10766 PluginDeveloper.SetDeveloperItemClientEx(player);
10767 }
10768 #endif
10770 {
10771 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10772 {
10773 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10774 OnDebugButtonPressServer(id + 1);
10775 }
10776
10777 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10778 {
10779 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10781 }
10782
10783 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10784 {
10785 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10787 }
10788
10789 else if (action_id ==
EActions.ADD_QUANTITY)
10790 {
10791 if (IsMagazine())
10792 {
10793 Magazine mag = Magazine.Cast(this);
10794 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10795 }
10796 else
10797 {
10799 }
10800
10801 if (m_EM)
10802 {
10803 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10804 }
10805
10806 }
10807
10808 else if (action_id ==
EActions.REMOVE_QUANTITY)
10809 {
10810 if (IsMagazine())
10811 {
10812 Magazine mag2 = Magazine.Cast(this);
10813 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10814 }
10815 else
10816 {
10818 }
10819 if (m_EM)
10820 {
10821 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10822 }
10823
10824 }
10825
10826 else if (action_id ==
EActions.SET_QUANTITY_0)
10827 {
10829
10830 if (m_EM)
10831 {
10832 m_EM.SetEnergy(0);
10833 }
10834 }
10835
10836 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10837 {
10839
10840 if (m_EM)
10841 {
10842 m_EM.SetEnergy(m_EM.GetEnergyMax());
10843 }
10844 }
10845
10846 else if (action_id ==
EActions.ADD_HEALTH)
10847 {
10848 AddHealth("","",GetMaxHealth("","Health")/5);
10849 }
10850 else if (action_id ==
EActions.REMOVE_HEALTH)
10851 {
10852 AddHealth("","",-GetMaxHealth("","Health")/5);
10853 }
10854 else if (action_id ==
EActions.DESTROY_HEALTH)
10855 {
10856 SetHealth01("","",0);
10857 }
10858 else if (action_id ==
EActions.WATCH_ITEM)
10859 {
10861 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10862 #ifdef DEVELOPER
10863 SetDebugDeveloper_item(this);
10864 #endif
10865 }
10866
10867 else if (action_id ==
EActions.ADD_TEMPERATURE)
10868 {
10869 AddTemperature(20);
10870
10871 }
10872
10873 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10874 {
10875 AddTemperature(-20);
10876
10877 }
10878
10879 else if (action_id ==
EActions.FLIP_FROZEN)
10880 {
10881 SetFrozen(!GetIsFrozen());
10882
10883 }
10884
10885 else if (action_id ==
EActions.ADD_WETNESS)
10886 {
10888
10889 }
10890
10891 else if (action_id ==
EActions.REMOVE_WETNESS)
10892 {
10894
10895 }
10896
10897 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10898 {
10901
10902
10903 }
10904
10905 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10906 {
10909 }
10910
10911 else if (action_id ==
EActions.MAKE_SPECIAL)
10912 {
10913 auto debugParams = DebugSpawnParams.WithPlayer(player);
10914 OnDebugSpawnEx(debugParams);
10915 }
10916
10917 else if (action_id ==
EActions.DELETE)
10918 {
10919 Delete();
10920 }
10921
10922 }
10923
10924
10925 return false;
10926 }
10927
10928
10929
10930
10934
10937
10938
10939
10941 {
10942 return false;
10943 }
10944
10945
10947 {
10948 return true;
10949 }
10950
10951
10953 {
10954 return true;
10955 }
10956
10957
10958
10960 {
10961 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10963 }
10964
10967 {
10968 return null;
10969 }
10970
10972 {
10973 return false;
10974 }
10975
10977 {
10978 return false;
10979 }
10980
10984
10985
10987 {
10988 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10989 return module_repairing.CanRepair(this, item_repair_kit);
10990 }
10991
10992
10993 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10994 {
10995 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10996 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10997 }
10998
10999
11001 {
11002
11003
11004
11005
11006
11007
11008
11009
11010 return 1;
11011 }
11012
11013
11014
11016 {
11018 }
11019
11020
11021
11023 {
11025 }
11026
11027
11036 {
11037 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11038
11039 if (player)
11040 {
11041 player.MessageStatus(text);
11042 }
11043 }
11044
11045
11054 {
11055 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11056
11057 if (player)
11058 {
11059 player.MessageAction(text);
11060 }
11061 }
11062
11063
11072 {
11073 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11074
11075 if (player)
11076 {
11077 player.MessageFriendly(text);
11078 }
11079 }
11080
11081
11090 {
11091 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11092
11093 if (player)
11094 {
11095 player.MessageImportant(text);
11096 }
11097 }
11098
11100 {
11101 return true;
11102 }
11103
11104
11105 override bool KindOf(
string tag)
11106 {
11107 bool found = false;
11108 string item_name = this.
GetType();
11111
11112 int array_size = item_tag_array.Count();
11113 for (int i = 0; i < array_size; i++)
11114 {
11115 if (item_tag_array.Get(i) == tag)
11116 {
11117 found = true;
11118 break;
11119 }
11120 }
11121 return found;
11122 }
11123
11124
11126 {
11127
11128 super.OnRPC(sender, rpc_type,ctx);
11129
11130
11131 switch (rpc_type)
11132 {
11133 #ifndef SERVER
11134 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11135 Param2<bool, string> p = new Param2<bool, string>(false, "");
11136
11138 return;
11139
11140 bool play = p.param1;
11141 string soundSet = p.param2;
11142
11143 if (play)
11144 {
11146 {
11148 {
11150 }
11151 }
11152 else
11153 {
11155 }
11156 }
11157 else
11158 {
11160 }
11161
11162 break;
11163 #endif
11164
11165 }
11166
11168 {
11170 }
11171 }
11172
11173
11174
11175
11177 {
11178 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11179 return plugin.GetID(
name);
11180 }
11181
11183 {
11184 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11185 return plugin.GetName(id);
11186 }
11187
11190 {
11191
11192
11193 int varFlags;
11194 if (!ctx.
Read(varFlags))
11195 return;
11196
11197 if (varFlags & ItemVariableFlags.FLOAT)
11198 {
11200 }
11201 }
11202
11204 {
11205
11206 super.SerializeNumericalVars(floats_out);
11207
11208
11209
11211 {
11213 }
11214
11216 {
11218 }
11219
11221 {
11223 }
11224
11226 {
11231 }
11232
11234 {
11236 }
11237 }
11238
11240 {
11241
11242 super.DeSerializeNumericalVars(floats);
11243
11244
11245 int index = 0;
11246 int mask = Math.Round(floats.Get(index));
11247
11248 index++;
11249
11251 {
11253 {
11255 }
11256 else
11257 {
11258 float quantity = floats.Get(index);
11259 SetQuantity(quantity,
true,
false,
false,
false);
11260 }
11261 index++;
11262 }
11263
11265 {
11266 float wet = floats.Get(index);
11268 index++;
11269 }
11270
11272 {
11273 int liquidtype = Math.Round(floats.Get(index));
11275 index++;
11276 }
11277
11279 {
11281 index++;
11283 index++;
11285 index++;
11287 index++;
11288 }
11289
11291 {
11292 int cleanness = Math.Round(floats.Get(index));
11294 index++;
11295 }
11296 }
11297
11299 {
11300 super.WriteVarsToCTX(ctx);
11301
11302
11304 {
11306 }
11307
11309 {
11311 }
11312
11314 {
11316 }
11317
11319 {
11320 int r,g,b,a;
11326 }
11327
11329 {
11331 }
11332 }
11333
11335 {
11336 if (!super.ReadVarsFromCTX(ctx,version))
11337 return false;
11338
11339 int intValue;
11340 float value;
11341
11342 if (version < 140)
11343 {
11344 if (!ctx.
Read(intValue))
11345 return false;
11346
11347 m_VariablesMask = intValue;
11348 }
11349
11351 {
11352 if (!ctx.
Read(value))
11353 return false;
11354
11356 {
11358 }
11359 else
11360 {
11362 }
11363 }
11364
11365 if (version < 140)
11366 {
11368 {
11369 if (!ctx.
Read(value))
11370 return false;
11371 SetTemperatureDirect(value);
11372 }
11373 }
11374
11376 {
11377 if (!ctx.
Read(value))
11378 return false;
11380 }
11381
11383 {
11384 if (!ctx.
Read(intValue))
11385 return false;
11387 }
11388
11390 {
11391 int r,g,b,a;
11393 return false;
11395 return false;
11397 return false;
11399 return false;
11400
11402 }
11403
11405 {
11406 if (!ctx.
Read(intValue))
11407 return false;
11409 }
11410
11411 if (version >= 138 && version < 140)
11412 {
11414 {
11415 if (!ctx.
Read(intValue))
11416 return false;
11417 SetFrozen(intValue);
11418 }
11419 }
11420
11421 return true;
11422 }
11423
11424
11426 {
11429 {
11431 }
11432
11433 if (!super.OnStoreLoad(ctx, version))
11434 {
11436 return false;
11437 }
11438
11439 if (version >= 114)
11440 {
11441 bool hasQuickBarIndexSaved;
11442
11443 if (!ctx.
Read(hasQuickBarIndexSaved))
11444 {
11446 return false;
11447 }
11448
11449 if (hasQuickBarIndexSaved)
11450 {
11451 int itmQBIndex;
11452
11453
11454 if (!ctx.
Read(itmQBIndex))
11455 {
11457 return false;
11458 }
11459
11460 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11461 if (itmQBIndex != -1 && parentPlayer)
11462 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11463 }
11464 }
11465 else
11466 {
11467
11468 PlayerBase player;
11469 int itemQBIndex;
11470 if (version ==
int.
MAX)
11471 {
11472 if (!ctx.
Read(itemQBIndex))
11473 {
11475 return false;
11476 }
11477 }
11478 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11479 {
11480
11481 if (!ctx.
Read(itemQBIndex))
11482 {
11484 return false;
11485 }
11486 if (itemQBIndex != -1 && player)
11487 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11488 }
11489 }
11490
11491 if (version < 140)
11492 {
11493
11494 if (!LoadVariables(ctx, version))
11495 {
11497 return false;
11498 }
11499 }
11500
11501
11503 {
11505 return false;
11506 }
11507 if (version >= 132)
11508 {
11510 if (raib)
11511 {
11513 {
11515 return false;
11516 }
11517 }
11518 }
11519
11521 return true;
11522 }
11523
11524
11525
11527 {
11528 super.OnStoreSave(ctx);
11529
11530 PlayerBase player;
11531 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11532 {
11534
11535 int itemQBIndex = -1;
11536 itemQBIndex = player.FindQuickBarEntityIndex(this);
11537 ctx.
Write(itemQBIndex);
11538 }
11539 else
11540 {
11542 }
11543
11545
11547 if (raib)
11548 {
11550 }
11551 }
11552
11553
11555 {
11556 super.AfterStoreLoad();
11557
11559 {
11561 }
11562
11564 {
11567 }
11568 }
11569
11571 {
11572 super.EEOnAfterLoad();
11573
11575 {
11577 }
11578
11581 }
11582
11584 {
11585 return false;
11586 }
11587
11588
11589
11591 {
11593 {
11594 #ifdef PLATFORM_CONSOLE
11595
11597 {
11599 if (menu)
11600 {
11602 }
11603 }
11604 #endif
11605 }
11606
11608 {
11611 }
11612
11614 {
11615 SetWeightDirty();
11617 }
11619 {
11622 }
11623
11625 {
11628 }
11630 {
11633 }
11634
11635 super.OnVariablesSynchronized();
11636 }
11637
11638
11639
11641 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11642 {
11643 if (!IsServerCheck(allow_client))
11644 return false;
11645
11647 return false;
11648
11651
11652 if (value <= (min + 0.001))
11653 value = min;
11654
11655 if (value == min)
11656 {
11657 if (destroy_config)
11658 {
11659 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11660 if (dstr)
11661 {
11663 this.Delete();
11664 return true;
11665 }
11666 }
11667 else if (destroy_forced)
11668 {
11670 this.Delete();
11671 return true;
11672 }
11673
11675 }
11676
11679
11681 {
11683
11684 if (delta)
11686 }
11687
11689
11690 return false;
11691 }
11692
11693
11695 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11696 {
11698 }
11699
11701 {
11704 }
11705
11707 {
11710 }
11711
11714 {
11715 float value_clamped = Math.Clamp(value, 0, 1);
11717 SetQuantity(result, destroy_config, destroy_forced);
11718 }
11719
11720
11723 {
11725 }
11726
11728 {
11730 }
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11742 {
11743 int slot = -1;
11744 if (GetInventory())
11745 {
11746 InventoryLocation il = new InventoryLocation;
11747 GetInventory().GetCurrentInventoryLocation(il);
11749 }
11750
11752 }
11753
11755 {
11756 float quantity_max = 0;
11757
11759 {
11760 if (attSlotID != -1)
11761 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11762
11763 if (quantity_max <= 0)
11765 }
11766
11767 if (quantity_max <= 0)
11769
11770 return quantity_max;
11771 }
11772
11774 {
11776 }
11777
11779 {
11781 }
11782
11783
11785 {
11787 }
11788
11790 {
11792 }
11793
11795 {
11797 }
11798
11799
11801 {
11802
11803 float weightEx = GetWeightEx();
11804 float special = GetInventoryAndCargoWeight();
11805 return weightEx - special;
11806 }
11807
11808
11810 {
11812 }
11813
11815 {
11817 {
11818 #ifdef DEVELOPER
11819 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11820 {
11821 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11823 }
11824 #endif
11825
11826 return GetQuantity() * GetConfigWeightModified();
11827 }
11828 else if (HasEnergyManager())
11829 {
11830 #ifdef DEVELOPER
11831 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11832 {
11833 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11834 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11835 }
11836 #endif
11837 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11838 }
11839 else
11840 {
11841 #ifdef DEVELOPER
11842 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11843 {
11844 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11845 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11846 }
11847 #endif
11848 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11849 }
11850 }
11851
11854 {
11855 int item_count = 0;
11857
11858 if (GetInventory().GetCargo() != NULL)
11859 {
11860 item_count = GetInventory().GetCargo().GetItemCount();
11861 }
11862
11863 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11864 {
11865 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11866 if (item)
11867 item_count += item.GetNumberOfItems();
11868 }
11869 return item_count;
11870 }
11871
11874 {
11875 float weight = 0;
11876 float wetness = 1;
11877 if (include_wetness)
11880 {
11881 weight = wetness * m_ConfigWeight;
11882 }
11884 {
11885 weight = 1;
11886 }
11887 return weight;
11888 }
11889
11890
11891
11893 {
11894 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11895 {
11896 GameInventory inv = GetInventory();
11897 array<EntityAI> items = new array<EntityAI>;
11899 for (int i = 0; i < items.Count(); i++)
11900 {
11902 if (item)
11903 {
11905 }
11906 }
11907 }
11908 }
11909
11910
11911
11912
11914 {
11915 float energy = 0;
11916 if (HasEnergyManager())
11917 {
11918 energy = GetCompEM().GetEnergy();
11919 }
11920 return energy;
11921 }
11922
11923
11925 {
11926 super.OnEnergyConsumed();
11927
11929 }
11930
11932 {
11933 super.OnEnergyAdded();
11934
11936 }
11937
11938
11940 {
11941 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11942 {
11944 {
11945 float energy_0to1 = GetCompEM().GetEnergy0To1();
11947 }
11948 }
11949 }
11950
11951
11953 {
11954 return ConfigGetFloat("heatIsolation");
11955 }
11956
11958 {
11960 }
11961
11963 {
11964 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11965 if (
GetGame().ConfigIsExisting(paramPath))
11967
11968 return 0.0;
11969 }
11970
11972 {
11973 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11974 if (
GetGame().ConfigIsExisting(paramPath))
11976
11977 return 0.0;
11978 }
11979
11980 override void SetWet(
float value,
bool allow_client =
false)
11981 {
11982 if (!IsServerCheck(allow_client))
11983 return;
11984
11987
11989
11990 m_VarWet = Math.Clamp(value, min, max);
11991
11993 {
11996 }
11997 }
11998
11999 override void AddWet(
float value)
12000 {
12002 }
12003
12005 {
12007 }
12008
12010 {
12012 }
12013
12015 {
12017 }
12018
12020 {
12022 }
12023
12025 {
12027 }
12028
12029 override void OnWetChanged(
float newVal,
float oldVal)
12030 {
12033 if (newLevel != oldLevel)
12034 {
12036 }
12037 }
12038
12040 {
12041 SetWeightDirty();
12042 }
12043
12045 {
12046 return GetWetLevelInternal(
m_VarWet);
12047 }
12048
12049
12050
12052 {
12054 }
12055
12057 {
12059 }
12060
12062 {
12064 }
12065
12067 {
12069 }
12070
12071
12072
12074 {
12075 if (ConfigIsExisting("itemModelLength"))
12076 {
12077 return ConfigGetFloat("itemModelLength");
12078 }
12079 return 0;
12080 }
12081
12083 {
12084 if (ConfigIsExisting("itemAttachOffset"))
12085 {
12086 return ConfigGetFloat("itemAttachOffset");
12087 }
12088 return 0;
12089 }
12090
12091 override void SetCleanness(
int value,
bool allow_client =
false)
12092 {
12093 if (!IsServerCheck(allow_client))
12094 return;
12095
12097
12099
12102 }
12103
12105 {
12107 }
12108
12110 {
12111 return true;
12112 }
12113
12114
12115
12116
12118 {
12120 }
12121
12123 {
12125 }
12126
12127
12128
12129
12130 override void SetColor(
int r,
int g,
int b,
int a)
12131 {
12137 }
12139 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12140 {
12145 }
12146
12148 {
12150 }
12151
12154 {
12155 int r,g,b,a;
12157 r = r/255;
12158 g = g/255;
12159 b = b/255;
12160 a = a/255;
12161 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12162 }
12163
12164
12165
12166 override void SetLiquidType(
int value,
bool allow_client =
false)
12167 {
12168 if (!IsServerCheck(allow_client))
12169 return;
12170
12175 }
12176
12178 {
12179 return ConfigGetInt("varLiquidTypeInit");
12180 }
12181
12183 {
12185 }
12186
12188 {
12190 SetFrozen(false);
12191 }
12192
12195 {
12196 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12197 }
12198
12199
12202 {
12203 PlayerBase nplayer;
12204 if (PlayerBase.CastTo(nplayer, player))
12205 {
12207
12208 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12209 }
12210 }
12211
12212
12215 {
12216 PlayerBase nplayer;
12217 if (PlayerBase.CastTo(nplayer,player))
12218 {
12219
12220 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12221
12222 }
12223
12224
12225 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12226
12227
12228 if (HasEnergyManager())
12229 {
12230 GetCompEM().UpdatePlugState();
12231 }
12232 }
12233
12234
12236 {
12237 super.OnPlacementStarted(player);
12238
12240 }
12241
12242 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12243 {
12245 {
12246 m_AdminLog.OnPlacementComplete(player,
this);
12247 }
12248
12249 super.OnPlacementComplete(player, position, orientation);
12250 }
12251
12252
12253
12254
12255
12257 {
12259 {
12260 return true;
12261 }
12262 else
12263 {
12264 return false;
12265 }
12266 }
12267
12268
12270 {
12272 {
12274 }
12275 }
12276
12277
12279 {
12281 }
12282
12284 {
12286 }
12287
12288 override void InsertAgent(
int agent,
float count = 1)
12289 {
12290 if (count < 1)
12291 return;
12292
12294 }
12295
12298 {
12300 }
12301
12302
12304 {
12306 }
12307
12308
12309
12310
12311
12312
12313
12314
12315
12316
12317
12318
12319
12320
12321
12322
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
12345
12346
12347
12348
12350 {
12352 return false;
12353 return true;
12354 }
12355
12357 {
12358
12360 }
12361
12362
12365 {
12366 super.CheckForRoofLimited(timeTresholdMS);
12367
12369 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12370 {
12371 m_PreviousRoofTestTime = time;
12372 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12373 }
12374 }
12375
12376
12378 {
12380 {
12381 return 0;
12382 }
12383
12384 if (GetInventory().GetAttachmentSlotsCount() != 0)
12385 {
12386 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12387 if (filter)
12388 return filter.GetProtectionLevel(type, false, system);
12389 else
12390 return 0;
12391 }
12392
12393 string subclassPath, entryName;
12394
12395 switch (type)
12396 {
12398 entryName = "biological";
12399 break;
12401 entryName = "chemical";
12402 break;
12403 default:
12404 entryName = "biological";
12405 break;
12406 }
12407
12408 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12409
12411 }
12412
12413
12414
12417 {
12418 if (!IsMagazine())
12420
12422 }
12423
12424
12425
12426
12427
12432 {
12433 return true;
12434 }
12435
12437 {
12439 }
12440
12441
12442
12443
12444
12446 {
12447 if (parent)
12448 {
12449 if (parent.IsInherited(DayZInfected))
12450 return true;
12451
12452 if (!parent.IsRuined())
12453 return true;
12454 }
12455
12456 return true;
12457 }
12458
12460 {
12461 if (!super.CanPutAsAttachment(parent))
12462 {
12463 return false;
12464 }
12465
12466 if (!IsRuined() && !parent.IsRuined())
12467 {
12468 return true;
12469 }
12470
12471 return false;
12472 }
12473
12475 {
12476
12477
12478
12479
12480 return super.CanReceiveItemIntoCargo(item);
12481 }
12482
12484 {
12485
12486
12487
12488
12489 GameInventory attachmentInv = attachment.GetInventory();
12491 {
12492 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12493 return false;
12494 }
12495
12496 InventoryLocation loc = new InventoryLocation();
12497 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12498 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12499 return false;
12500
12501 return super.CanReceiveAttachment(attachment, slotId);
12502 }
12503
12505 {
12506 if (!super.CanReleaseAttachment(attachment))
12507 return false;
12508
12509 return GetInventory().AreChildrenAccessible();
12510 }
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
12529
12530
12531
12533 {
12534 int id = muzzle_owner.GetMuzzleID();
12535 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12536
12537 if (WPOF_array)
12538 {
12539 for (int i = 0; i < WPOF_array.Count(); i++)
12540 {
12541 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12542
12543 if (WPOF)
12544 {
12545 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12546 }
12547 }
12548 }
12549 }
12550
12551
12553 {
12554 int id = muzzle_owner.GetMuzzleID();
12556
12557 if (WPOBE_array)
12558 {
12559 for (int i = 0; i < WPOBE_array.Count(); i++)
12560 {
12561 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12562
12563 if (WPOBE)
12564 {
12565 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12566 }
12567 }
12568 }
12569 }
12570
12571
12573 {
12574 int id = muzzle_owner.GetMuzzleID();
12575 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12576
12577 if (WPOOH_array)
12578 {
12579 for (int i = 0; i < WPOOH_array.Count(); i++)
12580 {
12581 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12582
12583 if (WPOOH)
12584 {
12585 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12586 }
12587 }
12588 }
12589 }
12590
12591
12593 {
12594 int id = muzzle_owner.GetMuzzleID();
12595 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12596
12597 if (WPOOH_array)
12598 {
12599 for (int i = 0; i < WPOOH_array.Count(); i++)
12600 {
12601 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12602
12603 if (WPOOH)
12604 {
12605 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12606 }
12607 }
12608 }
12609 }
12610
12611
12613 {
12614 int id = muzzle_owner.GetMuzzleID();
12615 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12616
12617 if (WPOOH_array)
12618 {
12619 for (int i = 0; i < WPOOH_array.Count(); i++)
12620 {
12621 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12622
12623 if (WPOOH)
12624 {
12625 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12626 }
12627 }
12628 }
12629 }
12630
12631
12632
12634 {
12636 {
12637 return true;
12638 }
12639
12640 return false;
12641 }
12642
12644 {
12646 {
12647 return true;
12648 }
12649
12650 return false;
12651 }
12652
12654 {
12656 {
12657 return true;
12658 }
12659
12660 return false;
12661 }
12662
12664 {
12665 return false;
12666 }
12667
12670 {
12671 return UATimeSpent.DEFAULT_DEPLOY;
12672 }
12673
12674
12675
12676
12678 {
12680 SetSynchDirty();
12681 }
12682
12684 {
12686 }
12687
12688
12690 {
12691 return false;
12692 }
12693
12696 {
12697 string att_type = "None";
12698
12699 if (ConfigIsExisting("soundAttType"))
12700 {
12701 att_type = ConfigGetString("soundAttType");
12702 }
12703
12705 }
12706
12708 {
12710 }
12711
12712
12713
12714
12715
12719
12721 {
12724
12726 }
12727
12728
12730 {
12732 return;
12733
12735
12738
12741
12742 SoundParameters params = new SoundParameters();
12746 }
12747
12748
12750 {
12752 return;
12753
12755 SetSynchDirty();
12756
12759 }
12760
12761
12763 {
12765 return;
12766
12768 SetSynchDirty();
12769
12772 }
12773
12775 {
12777 }
12778
12780 {
12782 }
12783
12786 {
12787 if (!
GetGame().IsDedicatedServer())
12788 {
12789 if (ConfigIsExisting("attachSoundSet"))
12790 {
12791 string cfg_path = "";
12792 string soundset = "";
12793 string type_name =
GetType();
12794
12797 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12798 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12799
12800 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12801 {
12802 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12803 {
12804 if (cfg_slot_array[i] == slot_type)
12805 {
12806 soundset = cfg_soundset_array[i];
12807 break;
12808 }
12809 }
12810 }
12811
12812 if (soundset != "")
12813 {
12814 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12816 }
12817 }
12818 }
12819 }
12820
12822 {
12823
12824 }
12825
12826 void OnApply(PlayerBase player);
12827
12829 {
12830 return 1.0;
12831 };
12832
12834 {
12836 }
12837
12839 {
12841 }
12842
12844
12846 {
12847 SetDynamicPhysicsLifeTime(0.01);
12849 }
12850
12852 {
12853 array<string> zone_names = new array<string>;
12854 GetDamageZones(zone_names);
12855 for (int i = 0; i < zone_names.Count(); i++)
12856 {
12857 SetHealthMax(zone_names.Get(i),"Health");
12858 }
12859 SetHealthMax("","Health");
12860 }
12861
12864 {
12865 float global_health = GetHealth01("","Health");
12866 array<string> zones = new array<string>;
12867 GetDamageZones(zones);
12868
12869 for (int i = 0; i < zones.Count(); i++)
12870 {
12871 SetHealth01(zones.Get(i),"Health",global_health);
12872 }
12873 }
12874
12877 {
12878 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12879 }
12880
12882 {
12883 if (!hasRootAsPlayer)
12884 {
12885 if (refParentIB)
12886 {
12887
12888 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12889 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12890
12891 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12892 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12893
12896 }
12897 else
12898 {
12899
12902 }
12903 }
12904 }
12905
12907 {
12909 {
12910 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12911 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12912 {
12913 float heatPermCoef = 1.0;
12915 while (ent)
12916 {
12917 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12918 ent = ent.GetHierarchyParent();
12919 }
12920
12921 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12922 }
12923 }
12924 }
12925
12927 {
12928
12929 EntityAI parent = GetHierarchyParent();
12930 if (!parent)
12931 {
12932 hasParent = false;
12933 hasRootAsPlayer = false;
12934 }
12935 else
12936 {
12937 hasParent = true;
12938 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12939 refParentIB =
ItemBase.Cast(parent);
12940 }
12941 }
12942
12943 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12944 {
12945
12946 }
12947
12949 {
12950
12951 return false;
12952 }
12953
12955 {
12956
12957
12958 return false;
12959 }
12960
12962 {
12963
12964 return false;
12965 }
12966
12969 {
12970 return !GetIsFrozen() &&
IsOpen();
12971 }
12972
12974 {
12975 bool hasParent = false, hasRootAsPlayer = false;
12977
12978 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12979 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12980
12981 if (wwtu || foodDecay)
12982 {
12986
12987 if (processWetness || processTemperature || processDecay)
12988 {
12990
12991 if (processWetness)
12992 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12993
12994 if (processTemperature)
12996
12997 if (processDecay)
12998 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12999 }
13000 }
13001 }
13002
13005 {
13007 }
13008
13010 {
13013
13014 return super.GetTemperatureFreezeThreshold();
13015 }
13016
13018 {
13021
13022 return super.GetTemperatureThawThreshold();
13023 }
13024
13026 {
13029
13030 return super.GetItemOverheatThreshold();
13031 }
13032
13034 {
13036 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13037
13038 return super.GetTemperatureFreezeTime();
13039 }
13040
13042 {
13044 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13045
13046 return super.GetTemperatureThawTime();
13047 }
13048
13053
13055 {
13056 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13057 }
13058
13060 {
13061 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13062 }
13063
13066 {
13068 }
13069
13071 {
13073 }
13074
13076 {
13078 }
13079
13082 {
13083 return null;
13084 }
13085
13088 {
13089 return false;
13090 }
13091
13093 {
13095 {
13098 if (!trg)
13099 {
13101 explosive = this;
13102 }
13103
13104 explosive.PairRemote(trg);
13106
13107 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13108 trg.SetPersistentPairID(persistentID);
13109 explosive.SetPersistentPairID(persistentID);
13110
13111 return true;
13112 }
13113 return false;
13114 }
13115
13118 {
13119 float ret = 1.0;
13122 ret *= GetHealth01();
13123
13124 return ret;
13125 }
13126
13127 #ifdef DEVELOPER
13128 override void SetDebugItem()
13129 {
13130 super.SetDebugItem();
13131 _itemBase = this;
13132 }
13133
13135 {
13136 string text = super.GetDebugText();
13137
13139 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13140
13141 return text;
13142 }
13143 #endif
13144
13146 {
13147 return true;
13148 }
13149
13151
13153
13155 {
13158 }
13159
13160
13168
13184}
13185
13187{
13189 if (entity)
13190 {
13191 bool is_item = entity.IsInherited(
ItemBase);
13192 if (is_item && full_quantity)
13193 {
13196 }
13197 }
13198 else
13199 {
13201 return NULL;
13202 }
13203 return entity;
13204}
13205
13207{
13208 if (item)
13209 {
13210 if (health > 0)
13211 item.SetHealth("", "", health);
13212
13213 if (item.CanHaveTemperature())
13214 {
13216 if (item.CanFreeze())
13217 item.SetFrozen(false);
13218 }
13219
13220 if (item.HasEnergyManager())
13221 {
13222 if (quantity >= 0)
13223 {
13224 item.GetCompEM().SetEnergy0To1(quantity);
13225 }
13226 else
13227 {
13229 }
13230 }
13231 else if (item.IsMagazine())
13232 {
13233 Magazine mag = Magazine.Cast(item);
13234 if (quantity >= 0)
13235 {
13236 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13237 }
13238 else
13239 {
13241 }
13242
13243 }
13244 else
13245 {
13246 if (quantity >= 0)
13247 {
13248 item.SetQuantityNormalized(quantity, false);
13249 }
13250 else
13251 {
13253 }
13254
13255 }
13256 }
13257}
13258
13259#ifdef DEVELOPER
13261#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.