8398{
8400 {
8401 return true;
8402 }
8403};
8404
8405
8406
8408{
8412
8414
8417
8418
8419
8420
8421
8430
8436
8441
8446
8467 protected bool m_IsResultOfSplit
8468
8470
8475
8476
8477
8479
8483
8484
8485
8487
8490
8491
8492
8498
8499
8507
8510
8511
8513
8514
8516
8517
8522
8523
8528
8529
8531
8532
8534 {
8539
8540 if (!
GetGame().IsDedicatedServer())
8541 {
8543 {
8545
8547 {
8549 }
8550 }
8551
8554 }
8555
8556 m_OldLocation = null;
8557
8559 {
8561 }
8562
8563 if (ConfigIsExisting("headSelectionsToHide"))
8564 {
8567 }
8568
8570 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8571 {
8573 }
8574
8576
8577 m_IsResultOfSplit = false;
8578
8580 }
8581
8583 {
8584 super.InitItemVariables();
8585
8591 m_Count = ConfigGetInt(
"count");
8592
8595
8600
8603
8608
8620
8624
8625
8628 if (ConfigIsExisting("canBeSplit"))
8629 {
8632 }
8633
8635 if (ConfigIsExisting("itemBehaviour"))
8637
8638
8641 RegisterNetSyncVariableInt("m_VarLiquidType");
8642 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8643
8644 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8645 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8646 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8647
8648 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8649 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8650 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8651 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8652
8653 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8654 RegisterNetSyncVariableBool("m_IsTakeable");
8655 RegisterNetSyncVariableBool("m_IsHologram");
8656
8659 {
8662 }
8663
8665
8667 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8669
8670 }
8671
8673 {
8675 }
8676
8678 {
8681 {
8686 }
8687 }
8688
8689 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8690 {
8692 {
8695 }
8696
8698 }
8699
8701 {
8707 }
8708
8710
8712 {
8714
8715 if (!action)
8716 {
8717 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8718 return;
8719 }
8720
8722 if (!ai)
8723 {
8725 return;
8726 }
8727
8729 if (!action_array)
8730 {
8731 action_array = new array<ActionBase_Basic>;
8733 }
8734 if (LogManager.IsActionLogEnable())
8735 {
8736 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8737 }
8738
8739 if (action_array.Find(action) != -1)
8740 {
8741 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8742 }
8743 else
8744 {
8745 action_array.Insert(action);
8746 }
8747 }
8748
8750 {
8752 ActionBase action = player.GetActionManager().GetAction(actionName);
8755
8756 if (action_array)
8757 {
8758 action_array.RemoveItem(action);
8759 }
8760 }
8761
8762
8763
8765 {
8766 ActionOverrideData overrideData = new ActionOverrideData();
8770
8772 if (!actionMap)
8773 {
8776 }
8777
8778 actionMap.Insert(this.
Type(), overrideData);
8779
8780 }
8781
8783
8785
8786
8788 {
8791
8794
8795 string config_to_search = "CfgVehicles";
8796 string muzzle_owner_config;
8797
8799 {
8800 if (IsInherited(Weapon))
8801 config_to_search = "CfgWeapons";
8802
8803 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8804
8805 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8806
8808
8809 if (config_OnFire_subclass_count > 0)
8810 {
8811 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8812
8813 for (int i = 0; i < config_OnFire_subclass_count; i++)
8814 {
8815 string particle_class = "";
8817 string config_OnFire_entry = config_OnFire_class + particle_class;
8818 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8819 WPOF_array.Insert(WPOF);
8820 }
8821
8822
8824 }
8825 }
8826
8828 {
8829 config_to_search = "CfgWeapons";
8830 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8831
8832 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8833
8835
8836 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8837 {
8838 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8839
8840 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8841 {
8842 string particle_class2 = "";
8844 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8845 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8846 WPOBE_array.Insert(WPOBE);
8847 }
8848
8849
8851 }
8852 }
8853 }
8854
8855
8857 {
8860
8862 {
8863 string config_to_search = "CfgVehicles";
8864
8865 if (IsInherited(Weapon))
8866 config_to_search = "CfgWeapons";
8867
8868 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8869 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8870
8871 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8872 {
8873
8875
8877 {
8879 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8881 return;
8882 }
8883
8886
8887
8888
8890 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8891
8892 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8893 {
8894 string particle_class = "";
8896 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8898
8899 if (entry_type == CT_CLASS)
8900 {
8901 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8902 WPOOH_array.Insert(WPOF);
8903 }
8904 }
8905
8906
8908 }
8909 }
8910 }
8911
8913 {
8915 }
8916
8918 {
8920 {
8922
8925
8928
8929 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8930 }
8931 }
8932
8934 {
8936 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8937
8939 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8940
8942 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8943
8945 {
8947 }
8948 }
8949
8951 {
8953 }
8954
8956 {
8959 else
8961
8963 {
8966 }
8967 else
8968 {
8971
8974 }
8975
8977 }
8978
8980 {
8982 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8983 }
8984
8986 {
8988 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8990 }
8991
8993 {
8995 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8996 }
8997
8999 {
9002
9003 OverheatingParticle OP = new OverheatingParticle();
9008
9010 }
9011
9013 {
9016
9017 return -1;
9018 }
9019
9021 {
9023 {
9026
9027 for (int i = count; i > 0; --i)
9028 {
9029 int id = i - 1;
9032
9035
9036 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9037 {
9038 if (p)
9039 {
9042 }
9043 }
9044 }
9045 }
9046 }
9047
9049 {
9051 {
9053 {
9054 int id = i - 1;
9056
9057 if (OP)
9058 {
9060
9061 if (p)
9062 {
9064 }
9065
9066 delete OP;
9067 }
9068 }
9069
9072 }
9073 }
9074
9077 {
9078 return 0.0;
9079 }
9080
9081
9083 {
9084 return 250;
9085 }
9086
9088 {
9089 return 0;
9090 }
9091
9094 {
9096 return true;
9097
9098 return false;
9099 }
9100
9103 {
9106
9108 {
9110 }
9111 else
9112 {
9113
9115 }
9116
9118 }
9119
9126 {
9127 return -1;
9128 }
9129
9130
9131
9132
9134 {
9136 {
9138 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9139
9140 if (r_index >= 0)
9141 {
9142 InventoryLocation r_il = new InventoryLocation;
9143 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9144
9145 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9148 {
9149 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9150 }
9152 {
9153 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9154 }
9155
9156 }
9157
9158 player.GetHumanInventory().ClearUserReservedLocation(this);
9159 }
9160
9163 }
9164
9165
9166
9167
9169 {
9170 return ItemBase.m_DebugActionsMask;
9171 }
9172
9174 {
9175 return ItemBase.m_DebugActionsMask & mask;
9176 }
9177
9179 {
9180 ItemBase.m_DebugActionsMask = mask;
9181 }
9182
9184 {
9185 ItemBase.m_DebugActionsMask |= mask;
9186 }
9187
9189 {
9190 ItemBase.m_DebugActionsMask &= ~mask;
9191 }
9192
9194 {
9196 {
9198 }
9199 else
9200 {
9202 }
9203 }
9204
9205
9207 {
9208 if (GetEconomyProfile())
9209 {
9210 float q_max = GetEconomyProfile().GetQuantityMax();
9211 if (q_max > 0)
9212 {
9213 float q_min = GetEconomyProfile().GetQuantityMin();
9214 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9215
9217 {
9218 ComponentEnergyManager comp = GetCompEM();
9220 {
9222 }
9223 }
9225 {
9227
9228 }
9229
9230 }
9231 }
9232 }
9233
9236 {
9237 EntityAI parent = GetHierarchyParent();
9238
9239 if (parent)
9240 {
9241 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9242 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9243 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9244 }
9245 }
9246
9249 {
9250 EntityAI parent = GetHierarchyParent();
9251
9252 if (parent)
9253 {
9254 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9255 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9256 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9257 }
9258 }
9259
9261 {
9262
9263
9264
9265
9267
9269 {
9270 if (ScriptInputUserData.CanStoreInputUserData())
9271 {
9272 ScriptInputUserData ctx = new ScriptInputUserData;
9278 ctx.
Write(use_stack_max);
9281
9283 {
9284 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9285 }
9286 }
9287 }
9288 else if (!
GetGame().IsMultiplayer())
9289 {
9291 }
9292 }
9293
9295 {
9297 }
9298
9300 {
9302 }
9303
9305 {
9307 }
9308
9310 {
9311
9312 return false;
9313 }
9314
9316 {
9317 return false;
9318 }
9319
9323 {
9324 return false;
9325 }
9326
9328 {
9329 return "";
9330 }
9331
9333
9335 {
9336 return false;
9337 }
9338
9340 {
9341 return true;
9342 }
9343
9344
9345
9347 {
9348 return true;
9349 }
9350
9352 {
9353 return true;
9354 }
9355
9357 {
9358 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9360 }
9361
9363 {
9365 }
9366
9368 {
9370 if (!is_being_placed)
9372 SetSynchDirty();
9373 }
9374
9375
9377
9379 {
9381 }
9382
9384 {
9386 }
9387
9389 {
9390 return 1;
9391 }
9392
9394 {
9395 return false;
9396 }
9397
9399 {
9401 SetSynchDirty();
9402 }
9403
9404
9405
9406
9407
9408
9409
9410
9411
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
9439 {
9440 super.OnMovedInsideCargo(container);
9441
9442 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9443 }
9444
9445 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9446 {
9447 super.EEItemLocationChanged(oldLoc,newLoc);
9448
9449 PlayerBase new_player = null;
9450 PlayerBase old_player = null;
9451
9452 if (newLoc.GetParent())
9453 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9454
9455 if (oldLoc.GetParent())
9456 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9457
9459 {
9460 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9461
9462 if (r_index >= 0)
9463 {
9464 InventoryLocation r_il = new InventoryLocation;
9465 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9466
9467 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9470 {
9471 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9472 }
9474 {
9475 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9476 }
9477
9478 }
9479 }
9480
9482 {
9483 if (new_player)
9484 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9485
9486 if (new_player == old_player)
9487 {
9488
9489 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9490 {
9492 {
9493 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9494 {
9495 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9496 }
9497 }
9498 else
9499 {
9500 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9501 }
9502 }
9503
9504 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9505 {
9506 int type = oldLoc.GetType();
9508 {
9509 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9510 }
9512 {
9513 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9514 }
9515 }
9516 if (!m_OldLocation)
9517 {
9518 m_OldLocation = new InventoryLocation;
9519 }
9520 m_OldLocation.Copy(oldLoc);
9521 }
9522 else
9523 {
9524 if (m_OldLocation)
9525 {
9526 m_OldLocation.Reset();
9527 }
9528 }
9529
9531 }
9532 else
9533 {
9534 if (new_player)
9535 {
9536 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9537 if (res_index >= 0)
9538 {
9539 InventoryLocation il = new InventoryLocation;
9540 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9542 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9545 {
9546 il.
GetParent().GetOnReleaseLock().Invoke(it);
9547 }
9549 {
9551 }
9552
9553 }
9554 }
9556 {
9557
9559 }
9560
9561 if (m_OldLocation)
9562 {
9563 m_OldLocation.Reset();
9564 }
9565 }
9566 }
9567
9568 override void EOnContact(IEntity other, Contact extra)
9569 {
9571 {
9572 int liquidType = -1;
9574 if (impactSpeed > 0.0)
9575 {
9577 #ifndef SERVER
9579 #else
9581 SetSynchDirty();
9582 #endif
9584 }
9585 }
9586
9587 #ifdef SERVER
9588 if (GetCompEM() && GetCompEM().IsPlugged())
9589 {
9590 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9591 GetCompEM().UnplugThis();
9592 }
9593 #endif
9594 }
9595
9597
9599 {
9601 }
9602
9604 {
9605
9606 }
9607
9609 {
9610 super.OnItemLocationChanged(old_owner, new_owner);
9611
9612 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9613 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9614
9615 if (!relatedPlayer && playerNew)
9616 relatedPlayer = playerNew;
9617
9618 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9619 {
9621 if (actionMgr)
9622 {
9623 ActionBase currentAction = actionMgr.GetRunningAction();
9624 if (currentAction)
9626 }
9627 }
9628
9629 Man ownerPlayerOld = null;
9630 Man ownerPlayerNew = null;
9631
9632 if (old_owner)
9633 {
9634 if (old_owner.
IsMan())
9635 {
9636 ownerPlayerOld = Man.Cast(old_owner);
9637 }
9638 else
9639 {
9640 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9641 }
9642 }
9643 else
9644 {
9646 {
9648
9649 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9650 {
9651 GetCompEM().UnplugThis();
9652 }
9653 }
9654 }
9655
9656 if (new_owner)
9657 {
9658 if (new_owner.
IsMan())
9659 {
9660 ownerPlayerNew = Man.Cast(new_owner);
9661 }
9662 else
9663 {
9664 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9665 }
9666 }
9667
9668 if (ownerPlayerOld != ownerPlayerNew)
9669 {
9670 if (ownerPlayerOld)
9671 {
9672 array<EntityAI> subItemsExit = new array<EntityAI>;
9674 for (int i = 0; i < subItemsExit.Count(); i++)
9675 {
9678 }
9679 }
9680
9681 if (ownerPlayerNew)
9682 {
9683 array<EntityAI> subItemsEnter = new array<EntityAI>;
9685 for (int j = 0; j < subItemsEnter.Count(); j++)
9686 {
9689 }
9690 }
9691 }
9692 else if (ownerPlayerNew != null)
9693 {
9694 PlayerBase nplayer;
9695 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9696 {
9697 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9699 for (int k = 0; k < subItemsUpdate.Count(); k++)
9700 {
9702 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9703 }
9704 }
9705 }
9706
9707 if (old_owner)
9708 old_owner.OnChildItemRemoved(this);
9709 if (new_owner)
9710 new_owner.OnChildItemReceived(this);
9711 }
9712
9713
9715 {
9716 super.EEDelete(parent);
9717 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9718 if (player)
9719 {
9721
9722 if (player.IsAlive())
9723 {
9724 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9725 if (r_index >= 0)
9726 {
9727 InventoryLocation r_il = new InventoryLocation;
9728 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9729
9730 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9733 {
9734 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9735 }
9737 {
9738 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9739 }
9740
9741 }
9742
9743 player.RemoveQuickBarEntityShortcut(this);
9744 }
9745 }
9746 }
9747
9749 {
9750 super.EEKilled(killer);
9751
9754 {
9755 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9756 {
9757 if (IsMagazine())
9758 {
9759 if (Magazine.Cast(this).GetAmmoCount() > 0)
9760 {
9762 }
9763 }
9764 else
9765 {
9767 }
9768 }
9769 }
9770 }
9771
9773 {
9774 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9775
9776 super.OnWasAttached(parent, slot_id);
9777
9780
9782 }
9783
9785 {
9786 super.OnWasDetached(parent, slot_id);
9787
9790 }
9791
9793 {
9794 int idx;
9797
9798 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9799 if (inventory_slots.Count() < 1)
9800 {
9801 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9802 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9803 }
9804 else
9805 {
9806 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9807 }
9808
9809 idx = inventory_slots.Find(slot);
9810 if (idx < 0)
9811 return "";
9812
9813 return attach_types.Get(idx);
9814 }
9815
9817 {
9818 int idx = -1;
9819 string slot;
9820
9823
9824 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9825 if (inventory_slots.Count() < 1)
9826 {
9827 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9828 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9829 }
9830 else
9831 {
9832 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9833 if (detach_types.Count() < 1)
9834 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9835 }
9836
9837 for (int i = 0; i < inventory_slots.Count(); i++)
9838 {
9839 slot = inventory_slots.Get(i);
9840 }
9841
9842 if (slot != "")
9843 {
9844 if (detach_types.Count() == 1)
9845 idx = 0;
9846 else
9847 idx = inventory_slots.Find(slot);
9848 }
9849 if (idx < 0)
9850 return "";
9851
9852 return detach_types.Get(idx);
9853 }
9854
9856 {
9857
9859
9860
9861 float min_time = 1;
9862 float max_time = 3;
9863 float delay = Math.RandomFloat(min_time, max_time);
9864
9865 explode_timer.Run(delay, this, "DoAmmoExplosion");
9866 }
9867
9869 {
9870 Magazine magazine = Magazine.Cast(this);
9871 int pop_sounds_count = 6;
9872 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9873
9874
9875 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9876 string sound_name = pop_sounds[ sound_idx ];
9878
9879
9880 magazine.ServerAddAmmoCount(-1);
9881
9882
9883 float min_temp_to_explode = 100;
9884
9885 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9886 {
9888 }
9889 }
9890
9891
9892 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9893 {
9894 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9895
9896 const int CHANCE_DAMAGE_CARGO = 4;
9897 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9898 const int CHANCE_DAMAGE_NOTHING = 2;
9899
9901 {
9902 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9903 int chances;
9904 int rnd;
9905
9906 if (GetInventory().GetCargo())
9907 {
9908 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9909 rnd = Math.RandomInt(0,chances);
9910
9911 if (rnd < CHANCE_DAMAGE_CARGO)
9912 {
9914 }
9915 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9916 {
9918 }
9919 }
9920 else
9921 {
9922 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9923 rnd = Math.RandomInt(0,chances);
9924
9925 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9926 {
9928 }
9929 }
9930 }
9931 }
9932
9934 {
9935 if (GetInventory().GetCargo())
9936 {
9937 int item_count = GetInventory().GetCargo().GetItemCount();
9938 if (item_count > 0)
9939 {
9940 int random_pick = Math.RandomInt(0, item_count);
9942 if (!item.IsExplosive())
9943 {
9944 item.AddHealth("","",damage);
9945 return true;
9946 }
9947 }
9948 }
9949 return false;
9950 }
9951
9953 {
9954 int attachment_count = GetInventory().AttachmentCount();
9955 if (attachment_count > 0)
9956 {
9957 int random_pick = Math.RandomInt(0, attachment_count);
9958 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9959 if (!attachment.IsExplosive())
9960 {
9961 attachment.AddHealth("","",damage);
9962 return true;
9963 }
9964 }
9965 return false;
9966 }
9967
9969 {
9971 }
9972
9974 {
9976 return GetInventory().CanRemoveEntity();
9977
9978 return false;
9979 }
9980
9982 {
9984 return;
9985
9987 {
9988 if (ScriptInputUserData.CanStoreInputUserData())
9989 {
9990 ScriptInputUserData ctx = new ScriptInputUserData;
9995 ctx.
Write(destination_entity);
9999 }
10000 }
10001 else if (!
GetGame().IsMultiplayer())
10002 {
10004 }
10005 }
10006
10008 {
10010 return;
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
10025 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10026 if (new_item)
10027 {
10028 new_item.SetResultOfSplit(true);
10029 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10031 new_item.SetQuantity(split_quantity_new);
10032 }
10033 }
10034 else if (destination_entity && slot_id == -1)
10035 {
10036 if (quantity > stack_max)
10037 split_quantity_new = stack_max;
10038 else
10039 split_quantity_new = quantity;
10040
10042 {
10045 }
10046
10047 if (new_item)
10048 {
10049 new_item.SetResultOfSplit(true);
10050 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10052 new_item.SetQuantity(split_quantity_new);
10053 }
10054 }
10055 else
10056 {
10057 if (stack_max != 0)
10058 {
10060 {
10062 }
10063
10064 if (split_quantity_new == 0)
10065 {
10066 if (!
GetGame().IsMultiplayer())
10067 player.PhysicalPredictiveDropItem(this);
10068 else
10069 player.ServerDropEntity(this);
10070 return;
10071 }
10072
10074
10075 if (new_item)
10076 {
10077 new_item.SetResultOfSplit(true);
10078 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10080 new_item.SetQuantity(stack_max);
10081 new_item.PlaceOnSurface();
10082 }
10083 }
10084 }
10085 }
10086
10088 {
10090 return;
10091
10092 float split_quantity_new;
10096 InventoryLocation loc = new InventoryLocation;
10097
10098 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10099 {
10101 split_quantity_new = stack_max;
10102 else
10104
10105 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10106 if (new_item)
10107 {
10108 new_item.SetResultOfSplit(true);
10109 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10111 new_item.SetQuantity(split_quantity_new);
10112 }
10113 }
10114 else if (destination_entity && slot_id == -1)
10115 {
10116 if (quantity > stack_max)
10117 split_quantity_new = stack_max;
10118 else
10119 split_quantity_new = quantity;
10120
10122 {
10125 }
10126
10127 if (new_item)
10128 {
10129 new_item.SetResultOfSplit(true);
10130 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10132 new_item.SetQuantity(split_quantity_new);
10133 }
10134 }
10135 else
10136 {
10137 if (stack_max != 0)
10138 {
10140 {
10142 }
10143
10145
10146 if (new_item)
10147 {
10148 new_item.SetResultOfSplit(true);
10149 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10151 new_item.SetQuantity(stack_max);
10152 new_item.PlaceOnSurface();
10153 }
10154 }
10155 }
10156 }
10157
10159 {
10161 return;
10162
10164 {
10165 if (ScriptInputUserData.CanStoreInputUserData())
10166 {
10167 ScriptInputUserData ctx = new ScriptInputUserData;
10172 dst.WriteToContext(ctx);
10174 }
10175 }
10176 else if (!
GetGame().IsMultiplayer())
10177 {
10179 }
10180 }
10181
10183 {
10185 return;
10186
10188 {
10189 if (ScriptInputUserData.CanStoreInputUserData())
10190 {
10191 ScriptInputUserData ctx = new ScriptInputUserData;
10196 ctx.
Write(destination_entity);
10202 }
10203 }
10204 else if (!
GetGame().IsMultiplayer())
10205 {
10207 }
10208 }
10209
10211 {
10213 }
10214
10216 {
10218 return this;
10219
10221 float split_quantity_new;
10223 if (dst.IsValid())
10224 {
10225 int slot_id = dst.GetSlot();
10227
10228 if (quantity > stack_max)
10229 split_quantity_new = stack_max;
10230 else
10231 split_quantity_new = quantity;
10232
10234
10235 if (new_item)
10236 {
10237 new_item.SetResultOfSplit(true);
10238 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10241 }
10242
10243 return new_item;
10244 }
10245
10246 return null;
10247 }
10248
10250 {
10252 return;
10253
10255 float split_quantity_new;
10257 if (destination_entity)
10258 {
10260 if (quantity > stackable)
10261 split_quantity_new = stackable;
10262 else
10263 split_quantity_new = quantity;
10264
10265 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10266 if (new_item)
10267 {
10268 new_item.SetResultOfSplit(true);
10269 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10271 new_item.SetQuantity(split_quantity_new);
10272 }
10273 }
10274 }
10275
10277 {
10279 return;
10280
10282 {
10283 if (ScriptInputUserData.CanStoreInputUserData())
10284 {
10285 ScriptInputUserData ctx = new ScriptInputUserData;
10290 ItemBase destination_entity =
this;
10291 ctx.
Write(destination_entity);
10295 }
10296 }
10297 else if (!
GetGame().IsMultiplayer())
10298 {
10300 }
10301 }
10302
10304 {
10306 return;
10307
10309 float split_quantity_new;
10311 if (player)
10312 {
10314 if (quantity > stackable)
10315 split_quantity_new = stackable;
10316 else
10317 split_quantity_new = quantity;
10318
10319 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10320 new_item =
ItemBase.Cast(in_hands);
10321 if (new_item)
10322 {
10323 new_item.SetResultOfSplit(true);
10324 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10326 new_item.SetQuantity(split_quantity_new);
10327 }
10328 }
10329 }
10330
10332 {
10334 return;
10335
10337 float split_quantity_new = Math.Floor(quantity * 0.5);
10338
10340
10341 if (new_item)
10342 {
10343 if (new_item.GetQuantityMax() < split_quantity_new)
10344 {
10345 split_quantity_new = new_item.GetQuantityMax();
10346 }
10347
10348 new_item.SetResultOfSplit(true);
10349 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10350
10352 {
10355 }
10356 else
10357 {
10360 }
10361 }
10362 }
10363
10365 {
10367 return;
10368
10370 float split_quantity_new = Math.Floor(quantity / 2);
10371
10372 InventoryLocation invloc = new InventoryLocation;
10374
10376 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10377
10378 if (new_item)
10379 {
10380 if (new_item.GetQuantityMax() < split_quantity_new)
10381 {
10382 split_quantity_new = new_item.GetQuantityMax();
10383 }
10385 {
10388 }
10389 else
10390 {
10393 }
10394 }
10395 }
10396
10399 {
10400 SetWeightDirty();
10402
10403 if (parent)
10404 parent.OnAttachmentQuantityChangedEx(this, delta);
10405
10407 {
10409 {
10411 }
10413 {
10414 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10416 }
10417 }
10418
10419 }
10420
10423 {
10424
10425 }
10426
10429 {
10431 }
10432
10434 {
10435 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10436
10438 {
10439 if (newLevel == GameConstants.STATE_RUINED)
10440 {
10442 EntityAI parent = GetHierarchyParent();
10443 if (parent && parent.IsFireplace())
10444 {
10445 CargoBase cargo = GetInventory().GetCargo();
10446 if (cargo)
10447 {
10449 {
10451 }
10452 }
10453 }
10454 }
10455
10457 {
10458
10460 return;
10461 }
10462
10463 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10464 {
10466 }
10467 }
10468 }
10469
10470
10472 {
10473 super.OnRightClick();
10474
10476 {
10478 {
10479 if (ScriptInputUserData.CanStoreInputUserData())
10480 {
10481 vector m4[4];
10483
10484 EntityAI root = GetHierarchyRoot();
10485
10486 InventoryLocation dst = new InventoryLocation;
10488 {
10489 if (root)
10490 {
10491 root.GetTransform(m4);
10493 }
10494 else
10495 GetInventory().GetCurrentInventoryLocation(dst);
10496 }
10497 else
10498 {
10500
10501
10502 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10503 {
10504 if (root)
10505 {
10506 root.GetTransform(m4);
10508 }
10509 else
10510 GetInventory().GetCurrentInventoryLocation(dst);
10511 }
10512 else
10513 {
10514 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10515 }
10516 }
10517
10518 ScriptInputUserData ctx = new ScriptInputUserData;
10526 }
10527 }
10528 else if (!
GetGame().IsMultiplayer())
10529 {
10531 }
10532 }
10533 }
10534
10535 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10536 {
10537
10538 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10539 return false;
10540
10541 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10542 return false;
10543
10544
10546 return false;
10547
10548
10549 Magazine mag = Magazine.Cast(this);
10550 if (mag)
10551 {
10552 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10553 return false;
10554
10555 if (stack_max_limit)
10556 {
10557 Magazine other_mag = Magazine.Cast(other_item);
10558 if (other_item)
10559 {
10560 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10561 return false;
10562 }
10563
10564 }
10565 }
10566 else
10567 {
10568
10570 return false;
10571
10573 return false;
10574 }
10575
10576 PlayerBase player = null;
10577 if (CastTo(player, GetHierarchyRootPlayer()))
10578 {
10579 if (player.GetInventory().HasAttachment(this))
10580 return false;
10581
10582 if (player.IsItemsToDelete())
10583 return false;
10584 }
10585
10586 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10587 return false;
10588
10589 int slotID;
10591 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10592 return false;
10593
10594 return true;
10595 }
10596
10598 {
10600 }
10601
10603 {
10604 return m_IsResultOfSplit;
10605 }
10606
10608 {
10609 m_IsResultOfSplit = value;
10610 }
10611
10613 {
10615 }
10616
10618 {
10619 float other_item_quantity = other_item.GetQuantity();
10620 float this_free_space;
10621
10623
10625
10626 if (other_item_quantity > this_free_space)
10627 {
10628 return this_free_space;
10629 }
10630 else
10631 {
10632 return other_item_quantity;
10633 }
10634 }
10635
10637 {
10639 }
10640
10642 {
10644 return;
10645
10646 if (!IsMagazine() && other_item)
10647 {
10649 if (quantity_used != 0)
10650 {
10651 float hp1 = GetHealth01("","");
10652 float hp2 = other_item.GetHealth01("","");
10653 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10654 hpResult = hpResult / (
GetQuantity() + quantity_used);
10655
10656 hpResult *= GetMaxHealth();
10657 Math.Round(hpResult);
10658 SetHealth("", "Health", hpResult);
10659
10661 other_item.AddQuantity(-quantity_used);
10662 }
10663 }
10665 }
10666
10668 {
10669 #ifdef SERVER
10670 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10671 GetHierarchyParent().IncreaseLifetimeUp();
10672 #endif
10673 };
10674
10676 {
10677 PlayerBase p = PlayerBase.Cast(player);
10678
10679 array<int> recipesIds = p.m_Recipes;
10680 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10681 if (moduleRecipesManager)
10682 {
10683 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10684 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10685 }
10686
10687 for (int i = 0;i < recipesIds.Count(); i++)
10688 {
10689 int key = recipesIds.Get(i);
10690 string recipeName = moduleRecipesManager.GetRecipeName(key);
10692 }
10693 }
10694
10695
10696 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10697 {
10698 super.GetDebugActions(outputList);
10699
10700
10705
10706
10710
10714
10715
10718
10719
10721 {
10724 }
10725
10727
10730
10734 }
10735
10736
10737
10738
10740 {
10741 super.OnAction(action_id, player, ctx);
10742 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10743 {
10744 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10745 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10746 PlayerBase p = PlayerBase.Cast(player);
10747 if (
EActions.RECIPES_RANGE_START < 1000)
10748 {
10749 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10750 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10751 }
10752 }
10753 #ifndef SERVER
10754 else if (action_id ==
EActions.WATCH_PLAYER)
10755 {
10756 PluginDeveloper.SetDeveloperItemClientEx(player);
10757 }
10758 #endif
10760 {
10761 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10762 {
10763 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10764 OnDebugButtonPressServer(id + 1);
10765 }
10766
10767 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10768 {
10769 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10771 }
10772
10773 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10774 {
10775 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10777 }
10778
10779 else if (action_id ==
EActions.ADD_QUANTITY)
10780 {
10781 if (IsMagazine())
10782 {
10783 Magazine mag = Magazine.Cast(this);
10784 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10785 }
10786 else
10787 {
10789 }
10790
10791 if (m_EM)
10792 {
10793 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10794 }
10795
10796 }
10797
10798 else if (action_id ==
EActions.REMOVE_QUANTITY)
10799 {
10800 if (IsMagazine())
10801 {
10802 Magazine mag2 = Magazine.Cast(this);
10803 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10804 }
10805 else
10806 {
10808 }
10809 if (m_EM)
10810 {
10811 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10812 }
10813
10814 }
10815
10816 else if (action_id ==
EActions.SET_QUANTITY_0)
10817 {
10819
10820 if (m_EM)
10821 {
10822 m_EM.SetEnergy(0);
10823 }
10824 }
10825
10826 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10827 {
10829
10830 if (m_EM)
10831 {
10832 m_EM.SetEnergy(m_EM.GetEnergyMax());
10833 }
10834 }
10835
10836 else if (action_id ==
EActions.ADD_HEALTH)
10837 {
10838 AddHealth("","",GetMaxHealth("","Health")/5);
10839 }
10840 else if (action_id ==
EActions.REMOVE_HEALTH)
10841 {
10842 AddHealth("","",-GetMaxHealth("","Health")/5);
10843 }
10844 else if (action_id ==
EActions.DESTROY_HEALTH)
10845 {
10846 SetHealth01("","",0);
10847 }
10848 else if (action_id ==
EActions.WATCH_ITEM)
10849 {
10851 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10852 #ifdef DEVELOPER
10853 SetDebugDeveloper_item(this);
10854 #endif
10855 }
10856
10857 else if (action_id ==
EActions.ADD_TEMPERATURE)
10858 {
10859 AddTemperature(20);
10860
10861 }
10862
10863 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10864 {
10865 AddTemperature(-20);
10866
10867 }
10868
10869 else if (action_id ==
EActions.FLIP_FROZEN)
10870 {
10871 SetFrozen(!GetIsFrozen());
10872
10873 }
10874
10875 else if (action_id ==
EActions.ADD_WETNESS)
10876 {
10878
10879 }
10880
10881 else if (action_id ==
EActions.REMOVE_WETNESS)
10882 {
10884
10885 }
10886
10887 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10888 {
10891
10892
10893 }
10894
10895 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10896 {
10899 }
10900
10901 else if (action_id ==
EActions.MAKE_SPECIAL)
10902 {
10903 auto debugParams = DebugSpawnParams.WithPlayer(player);
10904 OnDebugSpawnEx(debugParams);
10905 }
10906
10907 else if (action_id ==
EActions.DELETE)
10908 {
10909 Delete();
10910 }
10911
10912 }
10913
10914
10915 return false;
10916 }
10917
10918
10919
10920
10924
10927
10928
10929
10931 {
10932 return false;
10933 }
10934
10935
10937 {
10938 return true;
10939 }
10940
10941
10943 {
10944 return true;
10945 }
10946
10947
10948
10950 {
10951 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10953 }
10954
10957 {
10958 return null;
10959 }
10960
10962 {
10963 return false;
10964 }
10965
10967 {
10968 return false;
10969 }
10970
10974
10975
10977 {
10978 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10979 return module_repairing.CanRepair(this, item_repair_kit);
10980 }
10981
10982
10983 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10984 {
10985 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10986 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10987 }
10988
10989
10991 {
10992
10993
10994
10995
10996
10997
10998
10999
11000 return 1;
11001 }
11002
11003
11004
11006 {
11008 }
11009
11010
11011
11013 {
11015 }
11016
11017
11026 {
11027 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11028
11029 if (player)
11030 {
11031 player.MessageStatus(text);
11032 }
11033 }
11034
11035
11044 {
11045 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11046
11047 if (player)
11048 {
11049 player.MessageAction(text);
11050 }
11051 }
11052
11053
11062 {
11063 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11064
11065 if (player)
11066 {
11067 player.MessageFriendly(text);
11068 }
11069 }
11070
11071
11080 {
11081 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11082
11083 if (player)
11084 {
11085 player.MessageImportant(text);
11086 }
11087 }
11088
11090 {
11091 return true;
11092 }
11093
11094
11095 override bool KindOf(
string tag)
11096 {
11097 bool found = false;
11098 string item_name = this.
GetType();
11101
11102 int array_size = item_tag_array.Count();
11103 for (int i = 0; i < array_size; i++)
11104 {
11105 if (item_tag_array.Get(i) == tag)
11106 {
11107 found = true;
11108 break;
11109 }
11110 }
11111 return found;
11112 }
11113
11114
11116 {
11117
11118 super.OnRPC(sender, rpc_type,ctx);
11119
11120
11121 switch (rpc_type)
11122 {
11123 #ifndef SERVER
11124 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11125 Param2<bool, string> p = new Param2<bool, string>(false, "");
11126
11128 return;
11129
11130 bool play = p.param1;
11131 string soundSet = p.param2;
11132
11133 if (play)
11134 {
11136 {
11138 {
11140 }
11141 }
11142 else
11143 {
11145 }
11146 }
11147 else
11148 {
11150 }
11151
11152 break;
11153 #endif
11154
11155 }
11156
11158 {
11160 }
11161 }
11162
11163
11164
11165
11167 {
11168 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11169 return plugin.GetID(
name);
11170 }
11171
11173 {
11174 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11175 return plugin.GetName(id);
11176 }
11177
11180 {
11181
11182
11183 int varFlags;
11184 if (!ctx.
Read(varFlags))
11185 return;
11186
11187 if (varFlags & ItemVariableFlags.FLOAT)
11188 {
11190 }
11191 }
11192
11194 {
11195
11196 super.SerializeNumericalVars(floats_out);
11197
11198
11199
11201 {
11203 }
11204
11206 {
11208 }
11209
11211 {
11213 }
11214
11216 {
11221 }
11222
11224 {
11226 }
11227 }
11228
11230 {
11231
11232 super.DeSerializeNumericalVars(floats);
11233
11234
11235 int index = 0;
11236 int mask = Math.Round(floats.Get(index));
11237
11238 index++;
11239
11241 {
11243 {
11245 }
11246 else
11247 {
11248 float quantity = floats.Get(index);
11249 SetQuantity(quantity,
true,
false,
false,
false);
11250 }
11251 index++;
11252 }
11253
11255 {
11256 float wet = floats.Get(index);
11258 index++;
11259 }
11260
11262 {
11263 int liquidtype = Math.Round(floats.Get(index));
11265 index++;
11266 }
11267
11269 {
11271 index++;
11273 index++;
11275 index++;
11277 index++;
11278 }
11279
11281 {
11282 int cleanness = Math.Round(floats.Get(index));
11284 index++;
11285 }
11286 }
11287
11289 {
11290 super.WriteVarsToCTX(ctx);
11291
11292
11294 {
11296 }
11297
11299 {
11301 }
11302
11304 {
11306 }
11307
11309 {
11310 int r,g,b,a;
11316 }
11317
11319 {
11321 }
11322 }
11323
11325 {
11326 if (!super.ReadVarsFromCTX(ctx,version))
11327 return false;
11328
11329 int intValue;
11330 float value;
11331
11332 if (version < 140)
11333 {
11334 if (!ctx.
Read(intValue))
11335 return false;
11336
11337 m_VariablesMask = intValue;
11338 }
11339
11341 {
11342 if (!ctx.
Read(value))
11343 return false;
11344
11346 {
11348 }
11349 else
11350 {
11352 }
11353 }
11354
11355 if (version < 140)
11356 {
11358 {
11359 if (!ctx.
Read(value))
11360 return false;
11361 SetTemperatureDirect(value);
11362 }
11363 }
11364
11366 {
11367 if (!ctx.
Read(value))
11368 return false;
11370 }
11371
11373 {
11374 if (!ctx.
Read(intValue))
11375 return false;
11377 }
11378
11380 {
11381 int r,g,b,a;
11383 return false;
11385 return false;
11387 return false;
11389 return false;
11390
11392 }
11393
11395 {
11396 if (!ctx.
Read(intValue))
11397 return false;
11399 }
11400
11401 if (version >= 138 && version < 140)
11402 {
11404 {
11405 if (!ctx.
Read(intValue))
11406 return false;
11407 SetFrozen(intValue);
11408 }
11409 }
11410
11411 return true;
11412 }
11413
11414
11416 {
11419 {
11421 }
11422
11423 if (!super.OnStoreLoad(ctx, version))
11424 {
11426 return false;
11427 }
11428
11429 if (version >= 114)
11430 {
11431 bool hasQuickBarIndexSaved;
11432
11433 if (!ctx.
Read(hasQuickBarIndexSaved))
11434 {
11436 return false;
11437 }
11438
11439 if (hasQuickBarIndexSaved)
11440 {
11441 int itmQBIndex;
11442
11443
11444 if (!ctx.
Read(itmQBIndex))
11445 {
11447 return false;
11448 }
11449
11450 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11451 if (itmQBIndex != -1 && parentPlayer)
11452 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11453 }
11454 }
11455 else
11456 {
11457
11458 PlayerBase player;
11459 int itemQBIndex;
11460 if (version ==
int.
MAX)
11461 {
11462 if (!ctx.
Read(itemQBIndex))
11463 {
11465 return false;
11466 }
11467 }
11468 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11469 {
11470
11471 if (!ctx.
Read(itemQBIndex))
11472 {
11474 return false;
11475 }
11476 if (itemQBIndex != -1 && player)
11477 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11478 }
11479 }
11480
11481 if (version < 140)
11482 {
11483
11484 if (!LoadVariables(ctx, version))
11485 {
11487 return false;
11488 }
11489 }
11490
11491
11493 {
11495 return false;
11496 }
11497 if (version >= 132)
11498 {
11500 if (raib)
11501 {
11503 {
11505 return false;
11506 }
11507 }
11508 }
11509
11511 return true;
11512 }
11513
11514
11515
11517 {
11518 super.OnStoreSave(ctx);
11519
11520 PlayerBase player;
11521 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11522 {
11524
11525 int itemQBIndex = -1;
11526 itemQBIndex = player.FindQuickBarEntityIndex(this);
11527 ctx.
Write(itemQBIndex);
11528 }
11529 else
11530 {
11532 }
11533
11535
11537 if (raib)
11538 {
11540 }
11541 }
11542
11543
11545 {
11546 super.AfterStoreLoad();
11547
11549 {
11551 }
11552
11554 {
11557 }
11558 }
11559
11561 {
11562 super.EEOnAfterLoad();
11563
11565 {
11567 }
11568
11571 }
11572
11574 {
11575 return false;
11576 }
11577
11578
11579
11581 {
11583 {
11584 #ifdef PLATFORM_CONSOLE
11585
11587 {
11589 if (menu)
11590 {
11592 }
11593 }
11594 #endif
11595 }
11596
11598 {
11601 }
11602
11604 {
11605 SetWeightDirty();
11607 }
11609 {
11612 }
11613
11615 {
11618 }
11620 {
11623 }
11624
11625 super.OnVariablesSynchronized();
11626 }
11627
11628
11629
11631 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11632 {
11633 if (!IsServerCheck(allow_client))
11634 return false;
11635
11637 return false;
11638
11641
11642 if (value <= (min + 0.001))
11643 value = min;
11644
11645 if (value == min)
11646 {
11647 if (destroy_config)
11648 {
11649 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11650 if (dstr)
11651 {
11653 this.Delete();
11654 return true;
11655 }
11656 }
11657 else if (destroy_forced)
11658 {
11660 this.Delete();
11661 return true;
11662 }
11663
11665 }
11666
11669
11671 {
11673
11674 if (delta)
11676 }
11677
11679
11680 return false;
11681 }
11682
11683
11685 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11686 {
11688 }
11689
11691 {
11694 }
11695
11697 {
11700 }
11701
11704 {
11705 float value_clamped = Math.Clamp(value, 0, 1);
11707 SetQuantity(result, destroy_config, destroy_forced);
11708 }
11709
11710
11713 {
11715 }
11716
11718 {
11720 }
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730
11732 {
11733 int slot = -1;
11734 if (GetInventory())
11735 {
11736 InventoryLocation il = new InventoryLocation;
11737 GetInventory().GetCurrentInventoryLocation(il);
11739 }
11740
11742 }
11743
11745 {
11746 float quantity_max = 0;
11747
11749 {
11750 if (attSlotID != -1)
11751 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11752
11753 if (quantity_max <= 0)
11755 }
11756
11757 if (quantity_max <= 0)
11759
11760 return quantity_max;
11761 }
11762
11764 {
11766 }
11767
11769 {
11771 }
11772
11773
11775 {
11777 }
11778
11780 {
11782 }
11783
11785 {
11787 }
11788
11789
11791 {
11792
11793 float weightEx = GetWeightEx();
11794 float special = GetInventoryAndCargoWeight();
11795 return weightEx - special;
11796 }
11797
11798
11800 {
11802 }
11803
11805 {
11807 {
11808 #ifdef DEVELOPER
11809 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11810 {
11811 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11813 }
11814 #endif
11815
11816 return GetQuantity() * GetConfigWeightModified();
11817 }
11818 else if (HasEnergyManager())
11819 {
11820 #ifdef DEVELOPER
11821 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11822 {
11823 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11824 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11825 }
11826 #endif
11827 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11828 }
11829 else
11830 {
11831 #ifdef DEVELOPER
11832 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11833 {
11834 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11835 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11836 }
11837 #endif
11838 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11839 }
11840 }
11841
11844 {
11845 int item_count = 0;
11847
11848 if (GetInventory().GetCargo() != NULL)
11849 {
11850 item_count = GetInventory().GetCargo().GetItemCount();
11851 }
11852
11853 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11854 {
11855 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11856 if (item)
11857 item_count += item.GetNumberOfItems();
11858 }
11859 return item_count;
11860 }
11861
11864 {
11865 float weight = 0;
11866 float wetness = 1;
11867 if (include_wetness)
11870 {
11871 weight = wetness * m_ConfigWeight;
11872 }
11874 {
11875 weight = 1;
11876 }
11877 return weight;
11878 }
11879
11880
11881
11883 {
11884 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11885 {
11886 GameInventory inv = GetInventory();
11887 array<EntityAI> items = new array<EntityAI>;
11889 for (int i = 0; i < items.Count(); i++)
11890 {
11892 if (item)
11893 {
11895 }
11896 }
11897 }
11898 }
11899
11900
11901
11902
11904 {
11905 float energy = 0;
11906 if (HasEnergyManager())
11907 {
11908 energy = GetCompEM().GetEnergy();
11909 }
11910 return energy;
11911 }
11912
11913
11915 {
11916 super.OnEnergyConsumed();
11917
11919 }
11920
11922 {
11923 super.OnEnergyAdded();
11924
11926 }
11927
11928
11930 {
11931 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11932 {
11934 {
11935 float energy_0to1 = GetCompEM().GetEnergy0To1();
11937 }
11938 }
11939 }
11940
11941
11943 {
11944 return ConfigGetFloat("heatIsolation");
11945 }
11946
11948 {
11950 }
11951
11953 {
11954 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11955 if (
GetGame().ConfigIsExisting(paramPath))
11957
11958 return 0.0;
11959 }
11960
11962 {
11963 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11964 if (
GetGame().ConfigIsExisting(paramPath))
11966
11967 return 0.0;
11968 }
11969
11970 override void SetWet(
float value,
bool allow_client =
false)
11971 {
11972 if (!IsServerCheck(allow_client))
11973 return;
11974
11977
11979
11980 m_VarWet = Math.Clamp(value, min, max);
11981
11983 {
11986 }
11987 }
11988
11989 override void AddWet(
float value)
11990 {
11992 }
11993
11995 {
11997 }
11998
12000 {
12002 }
12003
12005 {
12007 }
12008
12010 {
12012 }
12013
12015 {
12017 }
12018
12019 override void OnWetChanged(
float newVal,
float oldVal)
12020 {
12023 if (newLevel != oldLevel)
12024 {
12026 }
12027 }
12028
12030 {
12031 SetWeightDirty();
12032 }
12033
12035 {
12036 return GetWetLevelInternal(
m_VarWet);
12037 }
12038
12039
12040
12042 {
12044 }
12045
12047 {
12049 }
12050
12052 {
12054 }
12055
12057 {
12059 }
12060
12061
12062
12064 {
12065 if (ConfigIsExisting("itemModelLength"))
12066 {
12067 return ConfigGetFloat("itemModelLength");
12068 }
12069 return 0;
12070 }
12071
12073 {
12074 if (ConfigIsExisting("itemAttachOffset"))
12075 {
12076 return ConfigGetFloat("itemAttachOffset");
12077 }
12078 return 0;
12079 }
12080
12081 override void SetCleanness(
int value,
bool allow_client =
false)
12082 {
12083 if (!IsServerCheck(allow_client))
12084 return;
12085
12087
12089
12092 }
12093
12095 {
12097 }
12098
12100 {
12101 return true;
12102 }
12103
12104
12105
12106
12108 {
12110 }
12111
12113 {
12115 }
12116
12117
12118
12119
12120 override void SetColor(
int r,
int g,
int b,
int a)
12121 {
12127 }
12129 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12130 {
12135 }
12136
12138 {
12140 }
12141
12144 {
12145 int r,g,b,a;
12147 r = r/255;
12148 g = g/255;
12149 b = b/255;
12150 a = a/255;
12151 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12152 }
12153
12154
12155
12156 override void SetLiquidType(
int value,
bool allow_client =
false)
12157 {
12158 if (!IsServerCheck(allow_client))
12159 return;
12160
12165 }
12166
12168 {
12169 return ConfigGetInt("varLiquidTypeInit");
12170 }
12171
12173 {
12175 }
12176
12178 {
12180 SetFrozen(false);
12181 }
12182
12185 {
12186 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12187 }
12188
12189
12192 {
12193 PlayerBase nplayer;
12194 if (PlayerBase.CastTo(nplayer, player))
12195 {
12197
12198 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12199 }
12200 }
12201
12202
12205 {
12206 PlayerBase nplayer;
12207 if (PlayerBase.CastTo(nplayer,player))
12208 {
12209
12210 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12211
12212 }
12213
12214
12215 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12216
12217
12218 if (HasEnergyManager())
12219 {
12220 GetCompEM().UpdatePlugState();
12221 }
12222 }
12223
12224
12226 {
12227 super.OnPlacementStarted(player);
12228
12230 }
12231
12232 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12233 {
12235 {
12236 m_AdminLog.OnPlacementComplete(player,
this);
12237 }
12238
12239 super.OnPlacementComplete(player, position, orientation);
12240 }
12241
12242
12243
12244
12245
12247 {
12249 {
12250 return true;
12251 }
12252 else
12253 {
12254 return false;
12255 }
12256 }
12257
12258
12260 {
12262 {
12264 }
12265 }
12266
12267
12269 {
12271 }
12272
12274 {
12276 }
12277
12278 override void InsertAgent(
int agent,
float count = 1)
12279 {
12280 if (count < 1)
12281 return;
12282
12284 }
12285
12288 {
12290 }
12291
12292
12294 {
12296 }
12297
12298
12299
12300
12301
12302
12303
12304
12305
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
12340 {
12342 return false;
12343 return true;
12344 }
12345
12347 {
12348
12350 }
12351
12352
12355 {
12356 super.CheckForRoofLimited(timeTresholdMS);
12357
12359 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12360 {
12361 m_PreviousRoofTestTime = time;
12362 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12363 }
12364 }
12365
12366
12368 {
12370 {
12371 return 0;
12372 }
12373
12374 if (GetInventory().GetAttachmentSlotsCount() != 0)
12375 {
12376 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12377 if (filter)
12378 return filter.GetProtectionLevel(type, false, system);
12379 else
12380 return 0;
12381 }
12382
12383 string subclassPath, entryName;
12384
12385 switch (type)
12386 {
12388 entryName = "biological";
12389 break;
12391 entryName = "chemical";
12392 break;
12393 default:
12394 entryName = "biological";
12395 break;
12396 }
12397
12398 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12399
12401 }
12402
12403
12404
12407 {
12408 if (!IsMagazine())
12410
12412 }
12413
12414
12415
12416
12417
12422 {
12423 return true;
12424 }
12425
12427 {
12429 }
12430
12431
12432
12433
12434
12436 {
12437 if (parent)
12438 {
12439 if (parent.IsInherited(DayZInfected))
12440 return true;
12441
12442 if (!parent.IsRuined())
12443 return true;
12444 }
12445
12446 return true;
12447 }
12448
12450 {
12451 if (!super.CanPutAsAttachment(parent))
12452 {
12453 return false;
12454 }
12455
12456 if (!IsRuined() && !parent.IsRuined())
12457 {
12458 return true;
12459 }
12460
12461 return false;
12462 }
12463
12465 {
12466
12467
12468
12469
12470 return super.CanReceiveItemIntoCargo(item);
12471 }
12472
12474 {
12475
12476
12477
12478
12479 GameInventory attachmentInv = attachment.GetInventory();
12481 {
12482 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12483 return false;
12484 }
12485
12486 InventoryLocation loc = new InventoryLocation();
12487 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12488 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12489 return false;
12490
12491 return super.CanReceiveAttachment(attachment, slotId);
12492 }
12493
12495 {
12496 if (!super.CanReleaseAttachment(attachment))
12497 return false;
12498
12499 return GetInventory().AreChildrenAccessible();
12500 }
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
12521
12523 {
12524 int id = muzzle_owner.GetMuzzleID();
12525 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12526
12527 if (WPOF_array)
12528 {
12529 for (int i = 0; i < WPOF_array.Count(); i++)
12530 {
12531 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12532
12533 if (WPOF)
12534 {
12535 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12536 }
12537 }
12538 }
12539 }
12540
12541
12543 {
12544 int id = muzzle_owner.GetMuzzleID();
12546
12547 if (WPOBE_array)
12548 {
12549 for (int i = 0; i < WPOBE_array.Count(); i++)
12550 {
12551 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12552
12553 if (WPOBE)
12554 {
12555 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12556 }
12557 }
12558 }
12559 }
12560
12561
12563 {
12564 int id = muzzle_owner.GetMuzzleID();
12565 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12566
12567 if (WPOOH_array)
12568 {
12569 for (int i = 0; i < WPOOH_array.Count(); i++)
12570 {
12571 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12572
12573 if (WPOOH)
12574 {
12575 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12576 }
12577 }
12578 }
12579 }
12580
12581
12583 {
12584 int id = muzzle_owner.GetMuzzleID();
12585 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12586
12587 if (WPOOH_array)
12588 {
12589 for (int i = 0; i < WPOOH_array.Count(); i++)
12590 {
12591 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12592
12593 if (WPOOH)
12594 {
12595 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12596 }
12597 }
12598 }
12599 }
12600
12601
12603 {
12604 int id = muzzle_owner.GetMuzzleID();
12605 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12606
12607 if (WPOOH_array)
12608 {
12609 for (int i = 0; i < WPOOH_array.Count(); i++)
12610 {
12611 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12612
12613 if (WPOOH)
12614 {
12615 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12616 }
12617 }
12618 }
12619 }
12620
12621
12622
12624 {
12626 {
12627 return true;
12628 }
12629
12630 return false;
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 {
12655 return false;
12656 }
12657
12660 {
12661 return UATimeSpent.DEFAULT_DEPLOY;
12662 }
12663
12664
12665
12666
12668 {
12670 SetSynchDirty();
12671 }
12672
12674 {
12676 }
12677
12678
12680 {
12681 return false;
12682 }
12683
12686 {
12687 string att_type = "None";
12688
12689 if (ConfigIsExisting("soundAttType"))
12690 {
12691 att_type = ConfigGetString("soundAttType");
12692 }
12693
12695 }
12696
12698 {
12700 }
12701
12702
12703
12704
12705
12709
12711 {
12714
12716 }
12717
12718
12720 {
12722 return;
12723
12725
12728
12731
12732 SoundParameters params = new SoundParameters();
12736 }
12737
12738
12740 {
12742 return;
12743
12745 SetSynchDirty();
12746
12749 }
12750
12751
12753 {
12755 return;
12756
12758 SetSynchDirty();
12759
12762 }
12763
12765 {
12767 }
12768
12770 {
12772 }
12773
12776 {
12777 if (!
GetGame().IsDedicatedServer())
12778 {
12779 if (ConfigIsExisting("attachSoundSet"))
12780 {
12781 string cfg_path = "";
12782 string soundset = "";
12783 string type_name =
GetType();
12784
12787 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12788 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12789
12790 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12791 {
12792 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12793 {
12794 if (cfg_slot_array[i] == slot_type)
12795 {
12796 soundset = cfg_soundset_array[i];
12797 break;
12798 }
12799 }
12800 }
12801
12802 if (soundset != "")
12803 {
12804 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12806 }
12807 }
12808 }
12809 }
12810
12812 {
12813
12814 }
12815
12816 void OnApply(PlayerBase player);
12817
12819 {
12820 return 1.0;
12821 };
12822
12824 {
12826 }
12827
12829 {
12831 }
12832
12834
12836 {
12837 SetDynamicPhysicsLifeTime(0.01);
12839 }
12840
12842 {
12843 array<string> zone_names = new array<string>;
12844 GetDamageZones(zone_names);
12845 for (int i = 0; i < zone_names.Count(); i++)
12846 {
12847 SetHealthMax(zone_names.Get(i),"Health");
12848 }
12849 SetHealthMax("","Health");
12850 }
12851
12854 {
12855 float global_health = GetHealth01("","Health");
12856 array<string> zones = new array<string>;
12857 GetDamageZones(zones);
12858
12859 for (int i = 0; i < zones.Count(); i++)
12860 {
12861 SetHealth01(zones.Get(i),"Health",global_health);
12862 }
12863 }
12864
12867 {
12868 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12869 }
12870
12872 {
12873 if (!hasRootAsPlayer)
12874 {
12875 if (refParentIB)
12876 {
12877
12878 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12879 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12880
12881 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12882 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12883
12886 }
12887 else
12888 {
12889
12892 }
12893 }
12894 }
12895
12897 {
12899 {
12900 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12901 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12902 {
12903 float heatPermCoef = 1.0;
12905 while (ent)
12906 {
12907 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12908 ent = ent.GetHierarchyParent();
12909 }
12910
12911 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12912 }
12913 }
12914 }
12915
12917 {
12918
12919 EntityAI parent = GetHierarchyParent();
12920 if (!parent)
12921 {
12922 hasParent = false;
12923 hasRootAsPlayer = false;
12924 }
12925 else
12926 {
12927 hasParent = true;
12928 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12929 refParentIB =
ItemBase.Cast(parent);
12930 }
12931 }
12932
12933 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12934 {
12935
12936 }
12937
12939 {
12940
12941 return false;
12942 }
12943
12945 {
12946
12947
12948 return false;
12949 }
12950
12952 {
12953
12954 return false;
12955 }
12956
12959 {
12960 return !GetIsFrozen() &&
IsOpen();
12961 }
12962
12964 {
12965 bool hasParent = false, hasRootAsPlayer = false;
12967
12968 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12969 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12970
12971 if (wwtu || foodDecay)
12972 {
12976
12977 if (processWetness || processTemperature || processDecay)
12978 {
12980
12981 if (processWetness)
12982 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12983
12984 if (processTemperature)
12986
12987 if (processDecay)
12988 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12989 }
12990 }
12991 }
12992
12995 {
12997 }
12998
13000 {
13003
13004 return super.GetTemperatureFreezeThreshold();
13005 }
13006
13008 {
13011
13012 return super.GetTemperatureThawThreshold();
13013 }
13014
13016 {
13019
13020 return super.GetItemOverheatThreshold();
13021 }
13022
13024 {
13026 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13027
13028 return super.GetTemperatureFreezeTime();
13029 }
13030
13032 {
13034 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13035
13036 return super.GetTemperatureThawTime();
13037 }
13038
13043
13045 {
13046 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13047 }
13048
13050 {
13051 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13052 }
13053
13056 {
13058 }
13059
13061 {
13063 }
13064
13066 {
13068 }
13069
13072 {
13073 return null;
13074 }
13075
13078 {
13079 return false;
13080 }
13081
13083 {
13085 {
13088 if (!trg)
13089 {
13091 explosive = this;
13092 }
13093
13094 explosive.PairRemote(trg);
13096
13097 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13098 trg.SetPersistentPairID(persistentID);
13099 explosive.SetPersistentPairID(persistentID);
13100
13101 return true;
13102 }
13103 return false;
13104 }
13105
13108 {
13109 float ret = 1.0;
13112 ret *= GetHealth01();
13113
13114 return ret;
13115 }
13116
13117 #ifdef DEVELOPER
13118 override void SetDebugItem()
13119 {
13120 super.SetDebugItem();
13121 _itemBase = this;
13122 }
13123
13125 {
13126 string text = super.GetDebugText();
13127
13129 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13130
13131 return text;
13132 }
13133 #endif
13134
13136 {
13137 return true;
13138 }
13139
13141
13143
13145 {
13148 }
13149
13150
13158
13174}
13175
13177{
13179 if (entity)
13180 {
13181 bool is_item = entity.IsInherited(
ItemBase);
13182 if (is_item && full_quantity)
13183 {
13186 }
13187 }
13188 else
13189 {
13191 return NULL;
13192 }
13193 return entity;
13194}
13195
13197{
13198 if (item)
13199 {
13200 if (health > 0)
13201 item.SetHealth("", "", health);
13202
13203 if (item.CanHaveTemperature())
13204 {
13206 if (item.CanFreeze())
13207 item.SetFrozen(false);
13208 }
13209
13210 if (item.HasEnergyManager())
13211 {
13212 if (quantity >= 0)
13213 {
13214 item.GetCompEM().SetEnergy0To1(quantity);
13215 }
13216 else
13217 {
13219 }
13220 }
13221 else if (item.IsMagazine())
13222 {
13223 Magazine mag = Magazine.Cast(item);
13224 if (quantity >= 0)
13225 {
13226 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13227 }
13228 else
13229 {
13231 }
13232
13233 }
13234 else
13235 {
13236 if (quantity >= 0)
13237 {
13238 item.SetQuantityNormalized(quantity, false);
13239 }
13240 else
13241 {
13243 }
13244
13245 }
13246 }
13247}
13248
13249#ifdef DEVELOPER
13251#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.