8388{
8390 {
8391 return true;
8392 }
8393};
8394
8395
8396
8398{
8402
8404
8407
8408
8409
8410
8411
8420
8426
8431
8436
8457 protected bool m_IsResultOfSplit
8458
8460
8465
8466
8467
8469
8473
8474
8475
8477
8480
8481
8482
8488
8489
8497
8500
8501
8503
8504
8506
8507
8512
8513
8518
8519
8521
8522
8524 {
8529
8530 if (!
GetGame().IsDedicatedServer())
8531 {
8533 {
8535
8537 {
8539 }
8540 }
8541
8544 }
8545
8546 m_OldLocation = null;
8547
8549 {
8551 }
8552
8553 if (ConfigIsExisting("headSelectionsToHide"))
8554 {
8557 }
8558
8560 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8561 {
8563 }
8564
8566
8567 m_IsResultOfSplit = false;
8568
8570 }
8571
8573 {
8574 super.InitItemVariables();
8575
8581 m_Count = ConfigGetInt(
"count");
8582
8585
8590
8593
8598
8610
8614
8615
8618 if (ConfigIsExisting("canBeSplit"))
8619 {
8622 }
8623
8625 if (ConfigIsExisting("itemBehaviour"))
8627
8628
8631 RegisterNetSyncVariableInt("m_VarLiquidType");
8632 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8633
8634 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8635 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8636 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8637
8638 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8639 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8640 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8641 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8642
8643 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8644 RegisterNetSyncVariableBool("m_IsTakeable");
8645 RegisterNetSyncVariableBool("m_IsHologram");
8646
8649 {
8652 }
8653
8655
8657 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8659
8660 }
8661
8663 {
8665 }
8666
8668 {
8671 {
8676 }
8677 }
8678
8679 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8680 {
8682 {
8685 }
8686
8688 }
8689
8691 {
8697 }
8698
8700
8702 {
8704
8705 if (!action)
8706 {
8707 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8708 return;
8709 }
8710
8712 if (!ai)
8713 {
8715 return;
8716 }
8717
8719 if (!action_array)
8720 {
8721 action_array = new array<ActionBase_Basic>;
8723 }
8724 if (LogManager.IsActionLogEnable())
8725 {
8726 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8727 }
8728
8729 if (action_array.Find(action) != -1)
8730 {
8731 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8732 }
8733 else
8734 {
8735 action_array.Insert(action);
8736 }
8737 }
8738
8740 {
8742 ActionBase action = player.GetActionManager().GetAction(actionName);
8745
8746 if (action_array)
8747 {
8748 action_array.RemoveItem(action);
8749 }
8750 }
8751
8752
8753
8755 {
8756 ActionOverrideData overrideData = new ActionOverrideData();
8760
8762 if (!actionMap)
8763 {
8766 }
8767
8768 actionMap.Insert(this.
Type(), overrideData);
8769
8770 }
8771
8773
8775
8776
8778 {
8781
8784
8785 string config_to_search = "CfgVehicles";
8786 string muzzle_owner_config;
8787
8789 {
8790 if (IsInherited(Weapon))
8791 config_to_search = "CfgWeapons";
8792
8793 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8794
8795 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8796
8798
8799 if (config_OnFire_subclass_count > 0)
8800 {
8801 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8802
8803 for (int i = 0; i < config_OnFire_subclass_count; i++)
8804 {
8805 string particle_class = "";
8807 string config_OnFire_entry = config_OnFire_class + particle_class;
8808 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8809 WPOF_array.Insert(WPOF);
8810 }
8811
8812
8814 }
8815 }
8816
8818 {
8819 config_to_search = "CfgWeapons";
8820 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8821
8822 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8823
8825
8826 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8827 {
8828 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8829
8830 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8831 {
8832 string particle_class2 = "";
8834 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8835 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8836 WPOBE_array.Insert(WPOBE);
8837 }
8838
8839
8841 }
8842 }
8843 }
8844
8845
8847 {
8850
8852 {
8853 string config_to_search = "CfgVehicles";
8854
8855 if (IsInherited(Weapon))
8856 config_to_search = "CfgWeapons";
8857
8858 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8859 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8860
8861 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8862 {
8863
8865
8867 {
8869 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8871 return;
8872 }
8873
8876
8877
8878
8880 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8881
8882 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8883 {
8884 string particle_class = "";
8886 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8888
8889 if (entry_type == CT_CLASS)
8890 {
8891 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8892 WPOOH_array.Insert(WPOF);
8893 }
8894 }
8895
8896
8898 }
8899 }
8900 }
8901
8903 {
8905 }
8906
8908 {
8910 {
8912
8915
8918
8919 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8920 }
8921 }
8922
8924 {
8926 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8927
8929 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8930
8932 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8933
8935 {
8937 }
8938 }
8939
8941 {
8943 }
8944
8946 {
8949 else
8951
8953 {
8956 }
8957 else
8958 {
8961
8964 }
8965
8967 }
8968
8970 {
8972 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8973 }
8974
8976 {
8978 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8980 }
8981
8983 {
8985 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8986 }
8987
8989 {
8992
8993 OverheatingParticle OP = new OverheatingParticle();
8998
9000 }
9001
9003 {
9006
9007 return -1;
9008 }
9009
9011 {
9013 {
9016
9017 for (int i = count; i > 0; --i)
9018 {
9019 int id = i - 1;
9022
9025
9026 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9027 {
9028 if (p)
9029 {
9032 }
9033 }
9034 }
9035 }
9036 }
9037
9039 {
9041 {
9043 {
9044 int id = i - 1;
9046
9047 if (OP)
9048 {
9050
9051 if (p)
9052 {
9054 }
9055
9056 delete OP;
9057 }
9058 }
9059
9062 }
9063 }
9064
9067 {
9068 return 0.0;
9069 }
9070
9071
9073 {
9074 return 250;
9075 }
9076
9078 {
9079 return 0;
9080 }
9081
9084 {
9086 return true;
9087
9088 return false;
9089 }
9090
9093 {
9096
9098 {
9100 }
9101 else
9102 {
9103
9105 }
9106
9108 }
9109
9116 {
9117 return -1;
9118 }
9119
9120
9121
9122
9124 {
9126 {
9128 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9129
9130 if (r_index >= 0)
9131 {
9132 InventoryLocation r_il = new InventoryLocation;
9133 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9134
9135 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9138 {
9139 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9140 }
9142 {
9143 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9144 }
9145
9146 }
9147
9148 player.GetHumanInventory().ClearUserReservedLocation(this);
9149 }
9150
9153 }
9154
9155
9156
9157
9159 {
9160 return ItemBase.m_DebugActionsMask;
9161 }
9162
9164 {
9165 return ItemBase.m_DebugActionsMask & mask;
9166 }
9167
9169 {
9170 ItemBase.m_DebugActionsMask = mask;
9171 }
9172
9174 {
9175 ItemBase.m_DebugActionsMask |= mask;
9176 }
9177
9179 {
9180 ItemBase.m_DebugActionsMask &= ~mask;
9181 }
9182
9184 {
9186 {
9188 }
9189 else
9190 {
9192 }
9193 }
9194
9195
9197 {
9198 if (GetEconomyProfile())
9199 {
9200 float q_max = GetEconomyProfile().GetQuantityMax();
9201 if (q_max > 0)
9202 {
9203 float q_min = GetEconomyProfile().GetQuantityMin();
9204 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9205
9207 {
9208 ComponentEnergyManager comp = GetCompEM();
9210 {
9212 }
9213 }
9215 {
9217
9218 }
9219
9220 }
9221 }
9222 }
9223
9226 {
9227 EntityAI parent = GetHierarchyParent();
9228
9229 if (parent)
9230 {
9231 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9232 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9233 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9234 }
9235 }
9236
9239 {
9240 EntityAI parent = GetHierarchyParent();
9241
9242 if (parent)
9243 {
9244 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9245 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9246 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9247 }
9248 }
9249
9251 {
9252
9253
9254
9255
9257
9259 {
9260 if (ScriptInputUserData.CanStoreInputUserData())
9261 {
9262 ScriptInputUserData ctx = new ScriptInputUserData;
9268 ctx.
Write(use_stack_max);
9271
9273 {
9274 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9275 }
9276 }
9277 }
9278 else if (!
GetGame().IsMultiplayer())
9279 {
9281 }
9282 }
9283
9285 {
9287 }
9288
9290 {
9292 }
9293
9295 {
9297 }
9298
9300 {
9301
9302 return false;
9303 }
9304
9306 {
9307 return false;
9308 }
9309
9313 {
9314 return false;
9315 }
9316
9318 {
9319 return "";
9320 }
9321
9323
9325 {
9326 return false;
9327 }
9328
9330 {
9331 return true;
9332 }
9333
9334
9335
9337 {
9338 return true;
9339 }
9340
9342 {
9343 return true;
9344 }
9345
9347 {
9348 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9350 }
9351
9353 {
9355 }
9356
9358 {
9360 if (!is_being_placed)
9362 SetSynchDirty();
9363 }
9364
9365
9367
9369 {
9371 }
9372
9374 {
9376 }
9377
9379 {
9380 return 1;
9381 }
9382
9384 {
9385 return false;
9386 }
9387
9389 {
9391 SetSynchDirty();
9392 }
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9429 {
9430 super.OnMovedInsideCargo(container);
9431
9432 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9433 }
9434
9435 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9436 {
9437 super.EEItemLocationChanged(oldLoc,newLoc);
9438
9439 PlayerBase new_player = null;
9440 PlayerBase old_player = null;
9441
9442 if (newLoc.GetParent())
9443 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9444
9445 if (oldLoc.GetParent())
9446 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9447
9449 {
9450 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9451
9452 if (r_index >= 0)
9453 {
9454 InventoryLocation r_il = new InventoryLocation;
9455 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9456
9457 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9460 {
9461 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9462 }
9464 {
9465 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9466 }
9467
9468 }
9469 }
9470
9472 {
9473 if (new_player)
9474 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9475
9476 if (new_player == old_player)
9477 {
9478
9479 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9480 {
9482 {
9483 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9484 {
9485 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9486 }
9487 }
9488 else
9489 {
9490 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9491 }
9492 }
9493
9494 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9495 {
9496 int type = oldLoc.GetType();
9498 {
9499 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9500 }
9502 {
9503 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9504 }
9505 }
9506 if (!m_OldLocation)
9507 {
9508 m_OldLocation = new InventoryLocation;
9509 }
9510 m_OldLocation.Copy(oldLoc);
9511 }
9512 else
9513 {
9514 if (m_OldLocation)
9515 {
9516 m_OldLocation.Reset();
9517 }
9518 }
9519
9521 }
9522 else
9523 {
9524 if (new_player)
9525 {
9526 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9527 if (res_index >= 0)
9528 {
9529 InventoryLocation il = new InventoryLocation;
9530 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9532 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9535 {
9536 il.
GetParent().GetOnReleaseLock().Invoke(it);
9537 }
9539 {
9541 }
9542
9543 }
9544 }
9546 {
9547
9549 }
9550
9551 if (m_OldLocation)
9552 {
9553 m_OldLocation.Reset();
9554 }
9555 }
9556 }
9557
9558 override void EOnContact(IEntity other, Contact extra)
9559 {
9561 {
9562 int liquidType = -1;
9564 if (impactSpeed > 0.0)
9565 {
9567 #ifndef SERVER
9569 #else
9571 SetSynchDirty();
9572 #endif
9574 }
9575 }
9576
9577 #ifdef SERVER
9578 if (GetCompEM() && GetCompEM().IsPlugged())
9579 {
9580 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9581 GetCompEM().UnplugThis();
9582 }
9583 #endif
9584 }
9585
9587
9589 {
9591 }
9592
9594 {
9595
9596 }
9597
9599 {
9600 super.OnItemLocationChanged(old_owner, new_owner);
9601
9602 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9603 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9604
9605 if (!relatedPlayer && playerNew)
9606 relatedPlayer = playerNew;
9607
9608 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9609 {
9611 if (actionMgr)
9612 {
9613 ActionBase currentAction = actionMgr.GetRunningAction();
9614 if (currentAction)
9616 }
9617 }
9618
9619 Man ownerPlayerOld = null;
9620 Man ownerPlayerNew = null;
9621
9622 if (old_owner)
9623 {
9624 if (old_owner.
IsMan())
9625 {
9626 ownerPlayerOld = Man.Cast(old_owner);
9627 }
9628 else
9629 {
9630 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9631 }
9632 }
9633 else
9634 {
9636 {
9638
9639 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9640 {
9641 GetCompEM().UnplugThis();
9642 }
9643 }
9644 }
9645
9646 if (new_owner)
9647 {
9648 if (new_owner.
IsMan())
9649 {
9650 ownerPlayerNew = Man.Cast(new_owner);
9651 }
9652 else
9653 {
9654 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9655 }
9656 }
9657
9658 if (ownerPlayerOld != ownerPlayerNew)
9659 {
9660 if (ownerPlayerOld)
9661 {
9662 array<EntityAI> subItemsExit = new array<EntityAI>;
9664 for (int i = 0; i < subItemsExit.Count(); i++)
9665 {
9668 }
9669 }
9670
9671 if (ownerPlayerNew)
9672 {
9673 array<EntityAI> subItemsEnter = new array<EntityAI>;
9675 for (int j = 0; j < subItemsEnter.Count(); j++)
9676 {
9679 }
9680 }
9681 }
9682 else if (ownerPlayerNew != null)
9683 {
9684 PlayerBase nplayer;
9685 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9686 {
9687 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9689 for (int k = 0; k < subItemsUpdate.Count(); k++)
9690 {
9692 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9693 }
9694 }
9695 }
9696
9697 if (old_owner)
9698 old_owner.OnChildItemRemoved(this);
9699 if (new_owner)
9700 new_owner.OnChildItemReceived(this);
9701 }
9702
9703
9705 {
9706 super.EEDelete(parent);
9707 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9708 if (player)
9709 {
9711
9712 if (player.IsAlive())
9713 {
9714 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9715 if (r_index >= 0)
9716 {
9717 InventoryLocation r_il = new InventoryLocation;
9718 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9719
9720 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9723 {
9724 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9725 }
9727 {
9728 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9729 }
9730
9731 }
9732
9733 player.RemoveQuickBarEntityShortcut(this);
9734 }
9735 }
9736 }
9737
9739 {
9740 super.EEKilled(killer);
9741
9744 {
9745 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9746 {
9747 if (IsMagazine())
9748 {
9749 if (Magazine.Cast(this).GetAmmoCount() > 0)
9750 {
9752 }
9753 }
9754 else
9755 {
9757 }
9758 }
9759 }
9760 }
9761
9763 {
9764 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9765
9766 super.OnWasAttached(parent, slot_id);
9767
9770
9772 }
9773
9775 {
9776 super.OnWasDetached(parent, slot_id);
9777
9780 }
9781
9783 {
9784 int idx;
9787
9788 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9789 if (inventory_slots.Count() < 1)
9790 {
9791 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9792 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9793 }
9794 else
9795 {
9796 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9797 }
9798
9799 idx = inventory_slots.Find(slot);
9800 if (idx < 0)
9801 return "";
9802
9803 return attach_types.Get(idx);
9804 }
9805
9807 {
9808 int idx = -1;
9809 string slot;
9810
9813
9814 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9815 if (inventory_slots.Count() < 1)
9816 {
9817 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9818 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9819 }
9820 else
9821 {
9822 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9823 if (detach_types.Count() < 1)
9824 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9825 }
9826
9827 for (int i = 0; i < inventory_slots.Count(); i++)
9828 {
9829 slot = inventory_slots.Get(i);
9830 }
9831
9832 if (slot != "")
9833 {
9834 if (detach_types.Count() == 1)
9835 idx = 0;
9836 else
9837 idx = inventory_slots.Find(slot);
9838 }
9839 if (idx < 0)
9840 return "";
9841
9842 return detach_types.Get(idx);
9843 }
9844
9846 {
9847
9849
9850
9851 float min_time = 1;
9852 float max_time = 3;
9853 float delay = Math.RandomFloat(min_time, max_time);
9854
9855 explode_timer.Run(delay, this, "DoAmmoExplosion");
9856 }
9857
9859 {
9860 Magazine magazine = Magazine.Cast(this);
9861 int pop_sounds_count = 6;
9862 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9863
9864
9865 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9866 string sound_name = pop_sounds[ sound_idx ];
9868
9869
9870 magazine.ServerAddAmmoCount(-1);
9871
9872
9873 float min_temp_to_explode = 100;
9874
9875 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9876 {
9878 }
9879 }
9880
9881
9882 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9883 {
9884 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9885
9886 const int CHANCE_DAMAGE_CARGO = 4;
9887 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9888 const int CHANCE_DAMAGE_NOTHING = 2;
9889
9891 {
9892 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9893 int chances;
9894 int rnd;
9895
9896 if (GetInventory().GetCargo())
9897 {
9898 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9899 rnd = Math.RandomInt(0,chances);
9900
9901 if (rnd < CHANCE_DAMAGE_CARGO)
9902 {
9904 }
9905 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9906 {
9908 }
9909 }
9910 else
9911 {
9912 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9913 rnd = Math.RandomInt(0,chances);
9914
9915 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9916 {
9918 }
9919 }
9920 }
9921 }
9922
9924 {
9925 if (GetInventory().GetCargo())
9926 {
9927 int item_count = GetInventory().GetCargo().GetItemCount();
9928 if (item_count > 0)
9929 {
9930 int random_pick = Math.RandomInt(0, item_count);
9932 if (!item.IsExplosive())
9933 {
9934 item.AddHealth("","",damage);
9935 return true;
9936 }
9937 }
9938 }
9939 return false;
9940 }
9941
9943 {
9944 int attachment_count = GetInventory().AttachmentCount();
9945 if (attachment_count > 0)
9946 {
9947 int random_pick = Math.RandomInt(0, attachment_count);
9948 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9949 if (!attachment.IsExplosive())
9950 {
9951 attachment.AddHealth("","",damage);
9952 return true;
9953 }
9954 }
9955 return false;
9956 }
9957
9959 {
9961 }
9962
9964 {
9966 return GetInventory().CanRemoveEntity();
9967
9968 return false;
9969 }
9970
9972 {
9974 return;
9975
9977 {
9978 if (ScriptInputUserData.CanStoreInputUserData())
9979 {
9980 ScriptInputUserData ctx = new ScriptInputUserData;
9985 ctx.
Write(destination_entity);
9989 }
9990 }
9991 else if (!
GetGame().IsMultiplayer())
9992 {
9994 }
9995 }
9996
9998 {
10000 return;
10001
10002 float split_quantity_new;
10006 InventoryLocation loc = new InventoryLocation;
10007
10008 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10009 {
10011 split_quantity_new = stack_max;
10012 else
10014
10015 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10016 if (new_item)
10017 {
10018 new_item.SetResultOfSplit(true);
10019 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10021 new_item.SetQuantity(split_quantity_new);
10022 }
10023 }
10024 else if (destination_entity && slot_id == -1)
10025 {
10026 if (quantity > stack_max)
10027 split_quantity_new = stack_max;
10028 else
10029 split_quantity_new = quantity;
10030
10032 {
10035 }
10036
10037 if (new_item)
10038 {
10039 new_item.SetResultOfSplit(true);
10040 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10042 new_item.SetQuantity(split_quantity_new);
10043 }
10044 }
10045 else
10046 {
10047 if (stack_max != 0)
10048 {
10050 {
10052 }
10053
10054 if (split_quantity_new == 0)
10055 {
10056 if (!
GetGame().IsMultiplayer())
10057 player.PhysicalPredictiveDropItem(this);
10058 else
10059 player.ServerDropEntity(this);
10060 return;
10061 }
10062
10064
10065 if (new_item)
10066 {
10067 new_item.SetResultOfSplit(true);
10068 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10070 new_item.SetQuantity(stack_max);
10071 new_item.PlaceOnSurface();
10072 }
10073 }
10074 }
10075 }
10076
10078 {
10080 return;
10081
10082 float split_quantity_new;
10086 InventoryLocation loc = new InventoryLocation;
10087
10088 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10089 {
10091 split_quantity_new = stack_max;
10092 else
10094
10095 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10096 if (new_item)
10097 {
10098 new_item.SetResultOfSplit(true);
10099 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10101 new_item.SetQuantity(split_quantity_new);
10102 }
10103 }
10104 else if (destination_entity && slot_id == -1)
10105 {
10106 if (quantity > stack_max)
10107 split_quantity_new = stack_max;
10108 else
10109 split_quantity_new = quantity;
10110
10112 {
10115 }
10116
10117 if (new_item)
10118 {
10119 new_item.SetResultOfSplit(true);
10120 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10122 new_item.SetQuantity(split_quantity_new);
10123 }
10124 }
10125 else
10126 {
10127 if (stack_max != 0)
10128 {
10130 {
10132 }
10133
10135
10136 if (new_item)
10137 {
10138 new_item.SetResultOfSplit(true);
10139 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10141 new_item.SetQuantity(stack_max);
10142 new_item.PlaceOnSurface();
10143 }
10144 }
10145 }
10146 }
10147
10149 {
10151 return;
10152
10154 {
10155 if (ScriptInputUserData.CanStoreInputUserData())
10156 {
10157 ScriptInputUserData ctx = new ScriptInputUserData;
10162 dst.WriteToContext(ctx);
10164 }
10165 }
10166 else if (!
GetGame().IsMultiplayer())
10167 {
10169 }
10170 }
10171
10173 {
10175 return;
10176
10178 {
10179 if (ScriptInputUserData.CanStoreInputUserData())
10180 {
10181 ScriptInputUserData ctx = new ScriptInputUserData;
10186 ctx.
Write(destination_entity);
10192 }
10193 }
10194 else if (!
GetGame().IsMultiplayer())
10195 {
10197 }
10198 }
10199
10201 {
10203 }
10204
10206 {
10208 return this;
10209
10211 float split_quantity_new;
10213 if (dst.IsValid())
10214 {
10215 int slot_id = dst.GetSlot();
10217
10218 if (quantity > stack_max)
10219 split_quantity_new = stack_max;
10220 else
10221 split_quantity_new = quantity;
10222
10224
10225 if (new_item)
10226 {
10227 new_item.SetResultOfSplit(true);
10228 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10231 }
10232
10233 return new_item;
10234 }
10235
10236 return null;
10237 }
10238
10240 {
10242 return;
10243
10245 float split_quantity_new;
10247 if (destination_entity)
10248 {
10250 if (quantity > stackable)
10251 split_quantity_new = stackable;
10252 else
10253 split_quantity_new = quantity;
10254
10255 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10256 if (new_item)
10257 {
10258 new_item.SetResultOfSplit(true);
10259 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10261 new_item.SetQuantity(split_quantity_new);
10262 }
10263 }
10264 }
10265
10267 {
10269 return;
10270
10272 {
10273 if (ScriptInputUserData.CanStoreInputUserData())
10274 {
10275 ScriptInputUserData ctx = new ScriptInputUserData;
10280 ItemBase destination_entity =
this;
10281 ctx.
Write(destination_entity);
10285 }
10286 }
10287 else if (!
GetGame().IsMultiplayer())
10288 {
10290 }
10291 }
10292
10294 {
10296 return;
10297
10299 float split_quantity_new;
10301 if (player)
10302 {
10304 if (quantity > stackable)
10305 split_quantity_new = stackable;
10306 else
10307 split_quantity_new = quantity;
10308
10309 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10310 new_item =
ItemBase.Cast(in_hands);
10311 if (new_item)
10312 {
10313 new_item.SetResultOfSplit(true);
10314 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10316 new_item.SetQuantity(split_quantity_new);
10317 }
10318 }
10319 }
10320
10322 {
10324 return;
10325
10327 float split_quantity_new = Math.Floor(quantity * 0.5);
10328
10330
10331 if (new_item)
10332 {
10333 if (new_item.GetQuantityMax() < split_quantity_new)
10334 {
10335 split_quantity_new = new_item.GetQuantityMax();
10336 }
10337
10338 new_item.SetResultOfSplit(true);
10339 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10340
10342 {
10345 }
10346 else
10347 {
10350 }
10351 }
10352 }
10353
10355 {
10357 return;
10358
10360 float split_quantity_new = Math.Floor(quantity / 2);
10361
10362 InventoryLocation invloc = new InventoryLocation;
10364
10366 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10367
10368 if (new_item)
10369 {
10370 if (new_item.GetQuantityMax() < split_quantity_new)
10371 {
10372 split_quantity_new = new_item.GetQuantityMax();
10373 }
10375 {
10378 }
10379 else
10380 {
10383 }
10384 }
10385 }
10386
10389 {
10390 SetWeightDirty();
10392
10393 if (parent)
10394 parent.OnAttachmentQuantityChangedEx(this, delta);
10395
10397 {
10399 {
10401 }
10403 {
10404 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10406 }
10407 }
10408
10409 }
10410
10413 {
10414
10415 }
10416
10419 {
10421 }
10422
10424 {
10425 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10426
10428 {
10429 if (newLevel == GameConstants.STATE_RUINED)
10430 {
10432 EntityAI parent = GetHierarchyParent();
10433 if (parent && parent.IsFireplace())
10434 {
10435 CargoBase cargo = GetInventory().GetCargo();
10436 if (cargo)
10437 {
10439 {
10441 }
10442 }
10443 }
10444 }
10445
10447 {
10448
10450 return;
10451 }
10452
10453 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10454 {
10456 }
10457 }
10458 }
10459
10460
10462 {
10463 super.OnRightClick();
10464
10466 {
10468 {
10469 if (ScriptInputUserData.CanStoreInputUserData())
10470 {
10471 vector m4[4];
10473
10474 EntityAI root = GetHierarchyRoot();
10475
10476 InventoryLocation dst = new InventoryLocation;
10478 {
10479 if (root)
10480 {
10481 root.GetTransform(m4);
10483 }
10484 else
10485 GetInventory().GetCurrentInventoryLocation(dst);
10486 }
10487 else
10488 {
10490
10491
10492 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10493 {
10494 if (root)
10495 {
10496 root.GetTransform(m4);
10498 }
10499 else
10500 GetInventory().GetCurrentInventoryLocation(dst);
10501 }
10502 else
10503 {
10504 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10505 }
10506 }
10507
10508 ScriptInputUserData ctx = new ScriptInputUserData;
10516 }
10517 }
10518 else if (!
GetGame().IsMultiplayer())
10519 {
10521 }
10522 }
10523 }
10524
10525 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10526 {
10527
10528 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10529 return false;
10530
10531 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10532 return false;
10533
10534
10536 return false;
10537
10538
10539 Magazine mag = Magazine.Cast(this);
10540 if (mag)
10541 {
10542 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10543 return false;
10544
10545 if (stack_max_limit)
10546 {
10547 Magazine other_mag = Magazine.Cast(other_item);
10548 if (other_item)
10549 {
10550 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10551 return false;
10552 }
10553
10554 }
10555 }
10556 else
10557 {
10558
10560 return false;
10561
10563 return false;
10564 }
10565
10566 PlayerBase player = null;
10567 if (CastTo(player, GetHierarchyRootPlayer()))
10568 {
10569 if (player.GetInventory().HasAttachment(this))
10570 return false;
10571
10572 if (player.IsItemsToDelete())
10573 return false;
10574 }
10575
10576 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10577 return false;
10578
10579 int slotID;
10581 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10582 return false;
10583
10584 return true;
10585 }
10586
10588 {
10590 }
10591
10593 {
10594 return m_IsResultOfSplit;
10595 }
10596
10598 {
10599 m_IsResultOfSplit = value;
10600 }
10601
10603 {
10605 }
10606
10608 {
10609 float other_item_quantity = other_item.GetQuantity();
10610 float this_free_space;
10611
10613
10615
10616 if (other_item_quantity > this_free_space)
10617 {
10618 return this_free_space;
10619 }
10620 else
10621 {
10622 return other_item_quantity;
10623 }
10624 }
10625
10627 {
10629 }
10630
10632 {
10634 return;
10635
10636 if (!IsMagazine() && other_item)
10637 {
10639 if (quantity_used != 0)
10640 {
10641 float hp1 = GetHealth01("","");
10642 float hp2 = other_item.GetHealth01("","");
10643 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10644 hpResult = hpResult / (
GetQuantity() + quantity_used);
10645
10646 hpResult *= GetMaxHealth();
10647 Math.Round(hpResult);
10648 SetHealth("", "Health", hpResult);
10649
10651 other_item.AddQuantity(-quantity_used);
10652 }
10653 }
10655 }
10656
10658 {
10659 #ifdef SERVER
10660 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10661 GetHierarchyParent().IncreaseLifetimeUp();
10662 #endif
10663 };
10664
10666 {
10667 PlayerBase p = PlayerBase.Cast(player);
10668
10669 array<int> recipesIds = p.m_Recipes;
10670 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10671 if (moduleRecipesManager)
10672 {
10673 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10674 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10675 }
10676
10677 for (int i = 0;i < recipesIds.Count(); i++)
10678 {
10679 int key = recipesIds.Get(i);
10680 string recipeName = moduleRecipesManager.GetRecipeName(key);
10682 }
10683 }
10684
10685
10686 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10687 {
10688 super.GetDebugActions(outputList);
10689
10690
10695
10696
10700
10704
10705
10708
10709
10711 {
10714 }
10715
10717
10720
10724 }
10725
10726
10727
10728
10730 {
10731 super.OnAction(action_id, player, ctx);
10732 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10733 {
10734 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10735 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10736 PlayerBase p = PlayerBase.Cast(player);
10737 if (
EActions.RECIPES_RANGE_START < 1000)
10738 {
10739 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10740 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10741 }
10742 }
10743 #ifndef SERVER
10744 else if (action_id ==
EActions.WATCH_PLAYER)
10745 {
10746 PluginDeveloper.SetDeveloperItemClientEx(player);
10747 }
10748 #endif
10750 {
10751 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10752 {
10753 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10754 OnDebugButtonPressServer(id + 1);
10755 }
10756
10757 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10758 {
10759 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10761 }
10762
10763 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10764 {
10765 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10767 }
10768
10769 else if (action_id ==
EActions.ADD_QUANTITY)
10770 {
10771 if (IsMagazine())
10772 {
10773 Magazine mag = Magazine.Cast(this);
10774 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10775 }
10776 else
10777 {
10779 }
10780
10781 if (m_EM)
10782 {
10783 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10784 }
10785
10786 }
10787
10788 else if (action_id ==
EActions.REMOVE_QUANTITY)
10789 {
10790 if (IsMagazine())
10791 {
10792 Magazine mag2 = Magazine.Cast(this);
10793 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10794 }
10795 else
10796 {
10798 }
10799 if (m_EM)
10800 {
10801 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10802 }
10803
10804 }
10805
10806 else if (action_id ==
EActions.SET_QUANTITY_0)
10807 {
10809
10810 if (m_EM)
10811 {
10812 m_EM.SetEnergy(0);
10813 }
10814 }
10815
10816 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10817 {
10819
10820 if (m_EM)
10821 {
10822 m_EM.SetEnergy(m_EM.GetEnergyMax());
10823 }
10824 }
10825
10826 else if (action_id ==
EActions.ADD_HEALTH)
10827 {
10828 AddHealth("","",GetMaxHealth("","Health")/5);
10829 }
10830 else if (action_id ==
EActions.REMOVE_HEALTH)
10831 {
10832 AddHealth("","",-GetMaxHealth("","Health")/5);
10833 }
10834 else if (action_id ==
EActions.DESTROY_HEALTH)
10835 {
10836 SetHealth01("","",0);
10837 }
10838 else if (action_id ==
EActions.WATCH_ITEM)
10839 {
10841 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10842 #ifdef DEVELOPER
10843 SetDebugDeveloper_item(this);
10844 #endif
10845 }
10846
10847 else if (action_id ==
EActions.ADD_TEMPERATURE)
10848 {
10849 AddTemperature(20);
10850
10851 }
10852
10853 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10854 {
10855 AddTemperature(-20);
10856
10857 }
10858
10859 else if (action_id ==
EActions.FLIP_FROZEN)
10860 {
10861 SetFrozen(!GetIsFrozen());
10862
10863 }
10864
10865 else if (action_id ==
EActions.ADD_WETNESS)
10866 {
10868
10869 }
10870
10871 else if (action_id ==
EActions.REMOVE_WETNESS)
10872 {
10874
10875 }
10876
10877 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10878 {
10881
10882
10883 }
10884
10885 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10886 {
10889 }
10890
10891 else if (action_id ==
EActions.MAKE_SPECIAL)
10892 {
10893 auto debugParams = DebugSpawnParams.WithPlayer(player);
10894 OnDebugSpawnEx(debugParams);
10895 }
10896
10897 else if (action_id ==
EActions.DELETE)
10898 {
10899 Delete();
10900 }
10901
10902 }
10903
10904
10905 return false;
10906 }
10907
10908
10909
10910
10914
10917
10918
10919
10921 {
10922 return false;
10923 }
10924
10925
10927 {
10928 return true;
10929 }
10930
10931
10933 {
10934 return true;
10935 }
10936
10937
10938
10940 {
10941 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10943 }
10944
10947 {
10948 return null;
10949 }
10950
10952 {
10953 return false;
10954 }
10955
10957 {
10958 return false;
10959 }
10960
10964
10965
10967 {
10968 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10969 return module_repairing.CanRepair(this, item_repair_kit);
10970 }
10971
10972
10973 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10974 {
10975 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10976 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10977 }
10978
10979
10981 {
10982
10983
10984
10985
10986
10987
10988
10989
10990 return 1;
10991 }
10992
10993
10994
10996 {
10998 }
10999
11000
11001
11003 {
11005 }
11006
11007
11016 {
11017 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11018
11019 if (player)
11020 {
11021 player.MessageStatus(text);
11022 }
11023 }
11024
11025
11034 {
11035 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11036
11037 if (player)
11038 {
11039 player.MessageAction(text);
11040 }
11041 }
11042
11043
11052 {
11053 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11054
11055 if (player)
11056 {
11057 player.MessageFriendly(text);
11058 }
11059 }
11060
11061
11070 {
11071 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11072
11073 if (player)
11074 {
11075 player.MessageImportant(text);
11076 }
11077 }
11078
11080 {
11081 return true;
11082 }
11083
11084
11085 override bool KindOf(
string tag)
11086 {
11087 bool found = false;
11088 string item_name = this.
GetType();
11091
11092 int array_size = item_tag_array.Count();
11093 for (int i = 0; i < array_size; i++)
11094 {
11095 if (item_tag_array.Get(i) == tag)
11096 {
11097 found = true;
11098 break;
11099 }
11100 }
11101 return found;
11102 }
11103
11104
11106 {
11107
11108 super.OnRPC(sender, rpc_type,ctx);
11109
11110
11111 switch (rpc_type)
11112 {
11113 #ifndef SERVER
11114 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11115 Param2<bool, string> p = new Param2<bool, string>(false, "");
11116
11118 return;
11119
11120 bool play = p.param1;
11121 string soundSet = p.param2;
11122
11123 if (play)
11124 {
11126 {
11128 {
11130 }
11131 }
11132 else
11133 {
11135 }
11136 }
11137 else
11138 {
11140 }
11141
11142 break;
11143 #endif
11144
11145 }
11146
11148 {
11150 }
11151 }
11152
11153
11154
11155
11157 {
11158 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11159 return plugin.GetID(
name);
11160 }
11161
11163 {
11164 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11165 return plugin.GetName(id);
11166 }
11167
11170 {
11171
11172
11173 int varFlags;
11174 if (!ctx.
Read(varFlags))
11175 return;
11176
11177 if (varFlags & ItemVariableFlags.FLOAT)
11178 {
11180 }
11181 }
11182
11184 {
11185
11186 super.SerializeNumericalVars(floats_out);
11187
11188
11189
11191 {
11193 }
11194
11196 {
11198 }
11199
11201 {
11203 }
11204
11206 {
11211 }
11212
11214 {
11216 }
11217 }
11218
11220 {
11221
11222 super.DeSerializeNumericalVars(floats);
11223
11224
11225 int index = 0;
11226 int mask = Math.Round(floats.Get(index));
11227
11228 index++;
11229
11231 {
11233 {
11235 }
11236 else
11237 {
11238 float quantity = floats.Get(index);
11239 SetQuantity(quantity,
true,
false,
false,
false);
11240 }
11241 index++;
11242 }
11243
11245 {
11246 float wet = floats.Get(index);
11248 index++;
11249 }
11250
11252 {
11253 int liquidtype = Math.Round(floats.Get(index));
11255 index++;
11256 }
11257
11259 {
11261 index++;
11263 index++;
11265 index++;
11267 index++;
11268 }
11269
11271 {
11272 int cleanness = Math.Round(floats.Get(index));
11274 index++;
11275 }
11276 }
11277
11279 {
11280 super.WriteVarsToCTX(ctx);
11281
11282
11284 {
11286 }
11287
11289 {
11291 }
11292
11294 {
11296 }
11297
11299 {
11300 int r,g,b,a;
11306 }
11307
11309 {
11311 }
11312 }
11313
11315 {
11316 if (!super.ReadVarsFromCTX(ctx,version))
11317 return false;
11318
11319 int intValue;
11320 float value;
11321
11322 if (version < 140)
11323 {
11324 if (!ctx.
Read(intValue))
11325 return false;
11326
11327 m_VariablesMask = intValue;
11328 }
11329
11331 {
11332 if (!ctx.
Read(value))
11333 return false;
11334
11336 {
11338 }
11339 else
11340 {
11342 }
11343 }
11344
11345 if (version < 140)
11346 {
11348 {
11349 if (!ctx.
Read(value))
11350 return false;
11351 SetTemperatureDirect(value);
11352 }
11353 }
11354
11356 {
11357 if (!ctx.
Read(value))
11358 return false;
11360 }
11361
11363 {
11364 if (!ctx.
Read(intValue))
11365 return false;
11367 }
11368
11370 {
11371 int r,g,b,a;
11373 return false;
11375 return false;
11377 return false;
11379 return false;
11380
11382 }
11383
11385 {
11386 if (!ctx.
Read(intValue))
11387 return false;
11389 }
11390
11391 if (version >= 138 && version < 140)
11392 {
11394 {
11395 if (!ctx.
Read(intValue))
11396 return false;
11397 SetFrozen(intValue);
11398 }
11399 }
11400
11401 return true;
11402 }
11403
11404
11406 {
11409 {
11411 }
11412
11413 if (!super.OnStoreLoad(ctx, version))
11414 {
11416 return false;
11417 }
11418
11419 if (version >= 114)
11420 {
11421 bool hasQuickBarIndexSaved;
11422
11423 if (!ctx.
Read(hasQuickBarIndexSaved))
11424 {
11426 return false;
11427 }
11428
11429 if (hasQuickBarIndexSaved)
11430 {
11431 int itmQBIndex;
11432
11433
11434 if (!ctx.
Read(itmQBIndex))
11435 {
11437 return false;
11438 }
11439
11440 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11441 if (itmQBIndex != -1 && parentPlayer)
11442 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11443 }
11444 }
11445 else
11446 {
11447
11448 PlayerBase player;
11449 int itemQBIndex;
11450 if (version ==
int.
MAX)
11451 {
11452 if (!ctx.
Read(itemQBIndex))
11453 {
11455 return false;
11456 }
11457 }
11458 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11459 {
11460
11461 if (!ctx.
Read(itemQBIndex))
11462 {
11464 return false;
11465 }
11466 if (itemQBIndex != -1 && player)
11467 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11468 }
11469 }
11470
11471 if (version < 140)
11472 {
11473
11474 if (!LoadVariables(ctx, version))
11475 {
11477 return false;
11478 }
11479 }
11480
11481
11483 {
11485 return false;
11486 }
11487 if (version >= 132)
11488 {
11490 if (raib)
11491 {
11493 {
11495 return false;
11496 }
11497 }
11498 }
11499
11501 return true;
11502 }
11503
11504
11505
11507 {
11508 super.OnStoreSave(ctx);
11509
11510 PlayerBase player;
11511 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11512 {
11514
11515 int itemQBIndex = -1;
11516 itemQBIndex = player.FindQuickBarEntityIndex(this);
11517 ctx.
Write(itemQBIndex);
11518 }
11519 else
11520 {
11522 }
11523
11525
11527 if (raib)
11528 {
11530 }
11531 }
11532
11533
11535 {
11536 super.AfterStoreLoad();
11537
11539 {
11541 }
11542
11544 {
11547 }
11548 }
11549
11551 {
11552 super.EEOnAfterLoad();
11553
11555 {
11557 }
11558
11561 }
11562
11564 {
11565 return false;
11566 }
11567
11568
11569
11571 {
11573 {
11574 #ifdef PLATFORM_CONSOLE
11575
11577 {
11579 if (menu)
11580 {
11582 }
11583 }
11584 #endif
11585 }
11586
11588 {
11591 }
11592
11594 {
11595 SetWeightDirty();
11597 }
11599 {
11602 }
11603
11605 {
11608 }
11610 {
11613 }
11614
11615 super.OnVariablesSynchronized();
11616 }
11617
11618
11619
11621 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11622 {
11623 if (!IsServerCheck(allow_client))
11624 return false;
11625
11627 return false;
11628
11631
11632 if (value <= (min + 0.001))
11633 value = min;
11634
11635 if (value == min)
11636 {
11637 if (destroy_config)
11638 {
11639 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11640 if (dstr)
11641 {
11643 this.Delete();
11644 return true;
11645 }
11646 }
11647 else if (destroy_forced)
11648 {
11650 this.Delete();
11651 return true;
11652 }
11653
11655 }
11656
11659
11661 {
11663
11664 if (delta)
11666 }
11667
11669
11670 return false;
11671 }
11672
11673
11675 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11676 {
11678 }
11679
11681 {
11684 }
11685
11687 {
11690 }
11691
11694 {
11695 float value_clamped = Math.Clamp(value, 0, 1);
11697 SetQuantity(result, destroy_config, destroy_forced);
11698 }
11699
11700
11703 {
11705 }
11706
11708 {
11710 }
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11722 {
11723 int slot = -1;
11724 if (GetInventory())
11725 {
11726 InventoryLocation il = new InventoryLocation;
11727 GetInventory().GetCurrentInventoryLocation(il);
11729 }
11730
11732 }
11733
11735 {
11736 float quantity_max = 0;
11737
11739 {
11740 if (attSlotID != -1)
11741 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11742
11743 if (quantity_max <= 0)
11745 }
11746
11747 if (quantity_max <= 0)
11749
11750 return quantity_max;
11751 }
11752
11754 {
11756 }
11757
11759 {
11761 }
11762
11763
11765 {
11767 }
11768
11770 {
11772 }
11773
11775 {
11777 }
11778
11779
11781 {
11782
11783 float weightEx = GetWeightEx();
11784 float special = GetInventoryAndCargoWeight();
11785 return weightEx - special;
11786 }
11787
11788
11790 {
11792 }
11793
11795 {
11797 {
11798 #ifdef DEVELOPER
11799 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11800 {
11801 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11803 }
11804 #endif
11805
11806 return GetQuantity() * GetConfigWeightModified();
11807 }
11808 else if (HasEnergyManager())
11809 {
11810 #ifdef DEVELOPER
11811 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11812 {
11813 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11814 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11815 }
11816 #endif
11817 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11818 }
11819 else
11820 {
11821 #ifdef DEVELOPER
11822 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11823 {
11824 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11825 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11826 }
11827 #endif
11828 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11829 }
11830 }
11831
11834 {
11835 int item_count = 0;
11837
11838 if (GetInventory().GetCargo() != NULL)
11839 {
11840 item_count = GetInventory().GetCargo().GetItemCount();
11841 }
11842
11843 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11844 {
11845 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11846 if (item)
11847 item_count += item.GetNumberOfItems();
11848 }
11849 return item_count;
11850 }
11851
11854 {
11855 float weight = 0;
11856 float wetness = 1;
11857 if (include_wetness)
11860 {
11861 weight = wetness * m_ConfigWeight;
11862 }
11864 {
11865 weight = 1;
11866 }
11867 return weight;
11868 }
11869
11870
11871
11873 {
11874 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11875 {
11876 GameInventory inv = GetInventory();
11877 array<EntityAI> items = new array<EntityAI>;
11879 for (int i = 0; i < items.Count(); i++)
11880 {
11882 if (item)
11883 {
11885 }
11886 }
11887 }
11888 }
11889
11890
11891
11892
11894 {
11895 float energy = 0;
11896 if (HasEnergyManager())
11897 {
11898 energy = GetCompEM().GetEnergy();
11899 }
11900 return energy;
11901 }
11902
11903
11905 {
11906 super.OnEnergyConsumed();
11907
11909 }
11910
11912 {
11913 super.OnEnergyAdded();
11914
11916 }
11917
11918
11920 {
11921 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11922 {
11924 {
11925 float energy_0to1 = GetCompEM().GetEnergy0To1();
11927 }
11928 }
11929 }
11930
11931
11933 {
11934 return ConfigGetFloat("heatIsolation");
11935 }
11936
11938 {
11940 }
11941
11943 {
11944 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11945 if (
GetGame().ConfigIsExisting(paramPath))
11947
11948 return 0.0;
11949 }
11950
11952 {
11953 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11954 if (
GetGame().ConfigIsExisting(paramPath))
11956
11957 return 0.0;
11958 }
11959
11960 override void SetWet(
float value,
bool allow_client =
false)
11961 {
11962 if (!IsServerCheck(allow_client))
11963 return;
11964
11967
11969
11970 m_VarWet = Math.Clamp(value, min, max);
11971
11973 {
11976 }
11977 }
11978
11979 override void AddWet(
float value)
11980 {
11982 }
11983
11985 {
11987 }
11988
11990 {
11992 }
11993
11995 {
11997 }
11998
12000 {
12002 }
12003
12005 {
12007 }
12008
12009 override void OnWetChanged(
float newVal,
float oldVal)
12010 {
12013 if (newLevel != oldLevel)
12014 {
12016 }
12017 }
12018
12020 {
12021 SetWeightDirty();
12022 }
12023
12025 {
12026 return GetWetLevelInternal(
m_VarWet);
12027 }
12028
12029
12030
12032 {
12034 }
12035
12037 {
12039 }
12040
12042 {
12044 }
12045
12047 {
12049 }
12050
12051
12052
12054 {
12055 if (ConfigIsExisting("itemModelLength"))
12056 {
12057 return ConfigGetFloat("itemModelLength");
12058 }
12059 return 0;
12060 }
12061
12063 {
12064 if (ConfigIsExisting("itemAttachOffset"))
12065 {
12066 return ConfigGetFloat("itemAttachOffset");
12067 }
12068 return 0;
12069 }
12070
12071 override void SetCleanness(
int value,
bool allow_client =
false)
12072 {
12073 if (!IsServerCheck(allow_client))
12074 return;
12075
12077
12079
12082 }
12083
12085 {
12087 }
12088
12090 {
12091 return true;
12092 }
12093
12094
12095
12096
12098 {
12100 }
12101
12103 {
12105 }
12106
12107
12108
12109
12110 override void SetColor(
int r,
int g,
int b,
int a)
12111 {
12117 }
12119 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12120 {
12125 }
12126
12128 {
12130 }
12131
12134 {
12135 int r,g,b,a;
12137 r = r/255;
12138 g = g/255;
12139 b = b/255;
12140 a = a/255;
12141 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12142 }
12143
12144
12145
12146 override void SetLiquidType(
int value,
bool allow_client =
false)
12147 {
12148 if (!IsServerCheck(allow_client))
12149 return;
12150
12155 }
12156
12158 {
12159 return ConfigGetInt("varLiquidTypeInit");
12160 }
12161
12163 {
12165 }
12166
12168 {
12170 SetFrozen(false);
12171 }
12172
12175 {
12176 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12177 }
12178
12179
12182 {
12183 PlayerBase nplayer;
12184 if (PlayerBase.CastTo(nplayer, player))
12185 {
12187
12188 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12189 }
12190 }
12191
12192
12195 {
12196 PlayerBase nplayer;
12197 if (PlayerBase.CastTo(nplayer,player))
12198 {
12199
12200 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12201
12202 }
12203
12204
12205 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12206
12207
12208 if (HasEnergyManager())
12209 {
12210 GetCompEM().UpdatePlugState();
12211 }
12212 }
12213
12214
12216 {
12217 super.OnPlacementStarted(player);
12218
12220 }
12221
12222 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12223 {
12225 {
12226 m_AdminLog.OnPlacementComplete(player,
this);
12227 }
12228
12229 super.OnPlacementComplete(player, position, orientation);
12230 }
12231
12232
12233
12234
12235
12237 {
12239 {
12240 return true;
12241 }
12242 else
12243 {
12244 return false;
12245 }
12246 }
12247
12248
12250 {
12252 {
12254 }
12255 }
12256
12257
12259 {
12261 }
12262
12264 {
12266 }
12267
12268 override void InsertAgent(
int agent,
float count = 1)
12269 {
12270 if (count < 1)
12271 return;
12272
12274 }
12275
12278 {
12280 }
12281
12282
12284 {
12286 }
12287
12288
12289
12290
12291
12292
12293
12294
12295
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
12330 {
12332 return false;
12333 return true;
12334 }
12335
12337 {
12338
12340 }
12341
12342
12345 {
12346 super.CheckForRoofLimited(timeTresholdMS);
12347
12349 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12350 {
12351 m_PreviousRoofTestTime = time;
12352 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12353 }
12354 }
12355
12356
12358 {
12360 {
12361 return 0;
12362 }
12363
12364 if (GetInventory().GetAttachmentSlotsCount() != 0)
12365 {
12366 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12367 if (filter)
12368 return filter.GetProtectionLevel(type, false, system);
12369 else
12370 return 0;
12371 }
12372
12373 string subclassPath, entryName;
12374
12375 switch (type)
12376 {
12378 entryName = "biological";
12379 break;
12381 entryName = "chemical";
12382 break;
12383 default:
12384 entryName = "biological";
12385 break;
12386 }
12387
12388 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12389
12391 }
12392
12393
12394
12397 {
12398 if (!IsMagazine())
12400
12402 }
12403
12404
12405
12406
12407
12412 {
12413 return true;
12414 }
12415
12417 {
12419 }
12420
12421
12422
12423
12424
12426 {
12427 if (parent)
12428 {
12429 if (parent.IsInherited(DayZInfected))
12430 return true;
12431
12432 if (!parent.IsRuined())
12433 return true;
12434 }
12435
12436 return true;
12437 }
12438
12440 {
12441 if (!super.CanPutAsAttachment(parent))
12442 {
12443 return false;
12444 }
12445
12446 if (!IsRuined() && !parent.IsRuined())
12447 {
12448 return true;
12449 }
12450
12451 return false;
12452 }
12453
12455 {
12456
12457
12458
12459
12460 return super.CanReceiveItemIntoCargo(item);
12461 }
12462
12464 {
12465
12466
12467
12468
12469 GameInventory attachmentInv = attachment.GetInventory();
12471 {
12472 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12473 return false;
12474 }
12475
12476 InventoryLocation loc = new InventoryLocation();
12477 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12478 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12479 return false;
12480
12481 return super.CanReceiveAttachment(attachment, slotId);
12482 }
12483
12485 {
12486 if (!super.CanReleaseAttachment(attachment))
12487 return false;
12488
12489 return GetInventory().AreChildrenAccessible();
12490 }
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12502
12503
12504
12505
12506
12507
12508
12509
12510
12511
12513 {
12514 int id = muzzle_owner.GetMuzzleID();
12515 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12516
12517 if (WPOF_array)
12518 {
12519 for (int i = 0; i < WPOF_array.Count(); i++)
12520 {
12521 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12522
12523 if (WPOF)
12524 {
12525 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12526 }
12527 }
12528 }
12529 }
12530
12531
12533 {
12534 int id = muzzle_owner.GetMuzzleID();
12536
12537 if (WPOBE_array)
12538 {
12539 for (int i = 0; i < WPOBE_array.Count(); i++)
12540 {
12541 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12542
12543 if (WPOBE)
12544 {
12545 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12546 }
12547 }
12548 }
12549 }
12550
12551
12553 {
12554 int id = muzzle_owner.GetMuzzleID();
12555 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12556
12557 if (WPOOH_array)
12558 {
12559 for (int i = 0; i < WPOOH_array.Count(); i++)
12560 {
12561 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12562
12563 if (WPOOH)
12564 {
12565 WPOOH.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.OnUpdate(weapon, 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.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12606 }
12607 }
12608 }
12609 }
12610
12611
12612
12614 {
12616 {
12617 return true;
12618 }
12619
12620 return false;
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 {
12645 return false;
12646 }
12647
12650 {
12651 return UATimeSpent.DEFAULT_DEPLOY;
12652 }
12653
12654
12655
12656
12658 {
12660 SetSynchDirty();
12661 }
12662
12664 {
12666 }
12667
12668
12670 {
12671 return false;
12672 }
12673
12676 {
12677 string att_type = "None";
12678
12679 if (ConfigIsExisting("soundAttType"))
12680 {
12681 att_type = ConfigGetString("soundAttType");
12682 }
12683
12685 }
12686
12688 {
12690 }
12691
12692
12693
12694
12695
12699
12701 {
12704
12706 }
12707
12708
12710 {
12712 return;
12713
12715
12718
12721
12722 SoundParameters params = new SoundParameters();
12726 }
12727
12728
12730 {
12732 return;
12733
12735 SetSynchDirty();
12736
12739 }
12740
12741
12743 {
12745 return;
12746
12748 SetSynchDirty();
12749
12752 }
12753
12755 {
12757 }
12758
12760 {
12762 }
12763
12766 {
12767 if (!
GetGame().IsDedicatedServer())
12768 {
12769 if (ConfigIsExisting("attachSoundSet"))
12770 {
12771 string cfg_path = "";
12772 string soundset = "";
12773 string type_name =
GetType();
12774
12777 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12778 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12779
12780 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12781 {
12782 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12783 {
12784 if (cfg_slot_array[i] == slot_type)
12785 {
12786 soundset = cfg_soundset_array[i];
12787 break;
12788 }
12789 }
12790 }
12791
12792 if (soundset != "")
12793 {
12794 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12796 }
12797 }
12798 }
12799 }
12800
12802 {
12803
12804 }
12805
12806 void OnApply(PlayerBase player);
12807
12809 {
12810 return 1.0;
12811 };
12812
12814 {
12816 }
12817
12819 {
12821 }
12822
12824
12826 {
12827 SetDynamicPhysicsLifeTime(0.01);
12829 }
12830
12832 {
12833 array<string> zone_names = new array<string>;
12834 GetDamageZones(zone_names);
12835 for (int i = 0; i < zone_names.Count(); i++)
12836 {
12837 SetHealthMax(zone_names.Get(i),"Health");
12838 }
12839 SetHealthMax("","Health");
12840 }
12841
12844 {
12845 float global_health = GetHealth01("","Health");
12846 array<string> zones = new array<string>;
12847 GetDamageZones(zones);
12848
12849 for (int i = 0; i < zones.Count(); i++)
12850 {
12851 SetHealth01(zones.Get(i),"Health",global_health);
12852 }
12853 }
12854
12857 {
12858 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12859 }
12860
12862 {
12863 if (!hasRootAsPlayer)
12864 {
12865 if (refParentIB)
12866 {
12867
12868 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12869 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12870
12871 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12872 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12873
12876 }
12877 else
12878 {
12879
12882 }
12883 }
12884 }
12885
12887 {
12889 {
12890 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12891 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12892 {
12893 float heatPermCoef = 1.0;
12895 while (ent)
12896 {
12897 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12898 ent = ent.GetHierarchyParent();
12899 }
12900
12901 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12902 }
12903 }
12904 }
12905
12907 {
12908
12909 EntityAI parent = GetHierarchyParent();
12910 if (!parent)
12911 {
12912 hasParent = false;
12913 hasRootAsPlayer = false;
12914 }
12915 else
12916 {
12917 hasParent = true;
12918 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12919 refParentIB =
ItemBase.Cast(parent);
12920 }
12921 }
12922
12923 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12924 {
12925
12926 }
12927
12929 {
12930
12931 return false;
12932 }
12933
12935 {
12936
12937
12938 return false;
12939 }
12940
12942 {
12943
12944 return false;
12945 }
12946
12949 {
12950 return !GetIsFrozen() &&
IsOpen();
12951 }
12952
12954 {
12955 bool hasParent = false, hasRootAsPlayer = false;
12957
12958 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12959 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12960
12961 if (wwtu || foodDecay)
12962 {
12966
12967 if (processWetness || processTemperature || processDecay)
12968 {
12970
12971 if (processWetness)
12972 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12973
12974 if (processTemperature)
12976
12977 if (processDecay)
12978 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12979 }
12980 }
12981 }
12982
12985 {
12987 }
12988
12990 {
12993
12994 return super.GetTemperatureFreezeThreshold();
12995 }
12996
12998 {
13001
13002 return super.GetTemperatureThawThreshold();
13003 }
13004
13006 {
13009
13010 return super.GetItemOverheatThreshold();
13011 }
13012
13014 {
13016 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13017
13018 return super.GetTemperatureFreezeTime();
13019 }
13020
13022 {
13024 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13025
13026 return super.GetTemperatureThawTime();
13027 }
13028
13033
13035 {
13036 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13037 }
13038
13040 {
13041 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13042 }
13043
13046 {
13048 }
13049
13051 {
13053 }
13054
13056 {
13058 }
13059
13062 {
13063 return null;
13064 }
13065
13068 {
13069 return false;
13070 }
13071
13073 {
13075 {
13078 if (!trg)
13079 {
13081 explosive = this;
13082 }
13083
13084 explosive.PairRemote(trg);
13086
13087 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13088 trg.SetPersistentPairID(persistentID);
13089 explosive.SetPersistentPairID(persistentID);
13090
13091 return true;
13092 }
13093 return false;
13094 }
13095
13098 {
13099 float ret = 1.0;
13102 ret *= GetHealth01();
13103
13104 return ret;
13105 }
13106
13107 #ifdef DEVELOPER
13108 override void SetDebugItem()
13109 {
13110 super.SetDebugItem();
13111 _itemBase = this;
13112 }
13113
13115 {
13116 string text = super.GetDebugText();
13117
13119 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13120
13121 return text;
13122 }
13123 #endif
13124
13126 {
13127 return true;
13128 }
13129
13131
13133
13135 {
13138 }
13139
13140
13148
13164}
13165
13167{
13169 if (entity)
13170 {
13171 bool is_item = entity.IsInherited(
ItemBase);
13172 if (is_item && full_quantity)
13173 {
13176 }
13177 }
13178 else
13179 {
13181 return NULL;
13182 }
13183 return entity;
13184}
13185
13187{
13188 if (item)
13189 {
13190 if (health > 0)
13191 item.SetHealth("", "", health);
13192
13193 if (item.CanHaveTemperature())
13194 {
13196 if (item.CanFreeze())
13197 item.SetFrozen(false);
13198 }
13199
13200 if (item.HasEnergyManager())
13201 {
13202 if (quantity >= 0)
13203 {
13204 item.GetCompEM().SetEnergy0To1(quantity);
13205 }
13206 else
13207 {
13209 }
13210 }
13211 else if (item.IsMagazine())
13212 {
13213 Magazine mag = Magazine.Cast(item);
13214 if (quantity >= 0)
13215 {
13216 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13217 }
13218 else
13219 {
13221 }
13222
13223 }
13224 else
13225 {
13226 if (quantity >= 0)
13227 {
13228 item.SetQuantityNormalized(quantity, false);
13229 }
13230 else
13231 {
13233 }
13234
13235 }
13236 }
13237}
13238
13239#ifdef DEVELOPER
13241#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.