8378{
8380 {
8381 return true;
8382 }
8383};
8384
8385
8386
8388{
8392
8394
8397
8398
8399
8400
8401
8410
8416
8421
8426
8447 protected bool m_IsResultOfSplit
8448
8450
8455
8456
8457
8459
8463
8464
8465
8467
8470
8471
8472
8478
8479
8487
8490
8491
8493
8494
8496
8497
8502
8503
8508
8509
8511
8512
8514 {
8519
8520 if (!
GetGame().IsDedicatedServer())
8521 {
8523 {
8525
8527 {
8529 }
8530 }
8531
8534 }
8535
8536 m_OldLocation = null;
8537
8539 {
8541 }
8542
8543 if (ConfigIsExisting("headSelectionsToHide"))
8544 {
8547 }
8548
8550 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8551 {
8553 }
8554
8556
8557 m_IsResultOfSplit = false;
8558
8560 }
8561
8563 {
8564 super.InitItemVariables();
8565
8571 m_Count = ConfigGetInt(
"count");
8572
8575
8580
8583
8588
8600
8604
8605
8608 if (ConfigIsExisting("canBeSplit"))
8609 {
8612 }
8613
8615 if (ConfigIsExisting("itemBehaviour"))
8617
8618
8621 RegisterNetSyncVariableInt("m_VarLiquidType");
8622 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8623
8624 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8625 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8626 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8627
8628 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8629 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8630 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8631 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8632
8633 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8634 RegisterNetSyncVariableBool("m_IsTakeable");
8635 RegisterNetSyncVariableBool("m_IsHologram");
8636
8639 {
8642 }
8643
8645
8647 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8649
8650 }
8651
8653 {
8655 }
8656
8658 {
8661 {
8666 }
8667 }
8668
8669 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8670 {
8672 {
8675 }
8676
8678 }
8679
8681 {
8687 }
8688
8690
8692 {
8694
8695 if (!action)
8696 {
8697 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8698 return;
8699 }
8700
8702 if (!ai)
8703 {
8705 return;
8706 }
8707
8709 if (!action_array)
8710 {
8711 action_array = new array<ActionBase_Basic>;
8713 }
8714 if (LogManager.IsActionLogEnable())
8715 {
8716 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8717 }
8718
8719 if (action_array.Find(action) != -1)
8720 {
8721 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8722 }
8723 else
8724 {
8725 action_array.Insert(action);
8726 }
8727 }
8728
8730 {
8732 ActionBase action = player.GetActionManager().GetAction(actionName);
8735
8736 if (action_array)
8737 {
8738 action_array.RemoveItem(action);
8739 }
8740 }
8741
8742
8743
8745 {
8746 ActionOverrideData overrideData = new ActionOverrideData();
8750
8752 if (!actionMap)
8753 {
8756 }
8757
8758 actionMap.Insert(this.
Type(), overrideData);
8759
8760 }
8761
8763
8765
8766
8768 {
8771
8774
8775 string config_to_search = "CfgVehicles";
8776 string muzzle_owner_config;
8777
8779 {
8780 if (IsInherited(Weapon))
8781 config_to_search = "CfgWeapons";
8782
8783 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8784
8785 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8786
8788
8789 if (config_OnFire_subclass_count > 0)
8790 {
8791 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8792
8793 for (int i = 0; i < config_OnFire_subclass_count; i++)
8794 {
8795 string particle_class = "";
8797 string config_OnFire_entry = config_OnFire_class + particle_class;
8798 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8799 WPOF_array.Insert(WPOF);
8800 }
8801
8802
8804 }
8805 }
8806
8808 {
8809 config_to_search = "CfgWeapons";
8810 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8811
8812 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8813
8815
8816 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8817 {
8818 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8819
8820 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8821 {
8822 string particle_class2 = "";
8824 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8825 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8826 WPOBE_array.Insert(WPOBE);
8827 }
8828
8829
8831 }
8832 }
8833 }
8834
8835
8837 {
8840
8842 {
8843 string config_to_search = "CfgVehicles";
8844
8845 if (IsInherited(Weapon))
8846 config_to_search = "CfgWeapons";
8847
8848 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8849 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8850
8851 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8852 {
8853
8855
8857 {
8859 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8861 return;
8862 }
8863
8866
8867
8868
8870 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8871
8872 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8873 {
8874 string particle_class = "";
8876 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8878
8879 if (entry_type == CT_CLASS)
8880 {
8881 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8882 WPOOH_array.Insert(WPOF);
8883 }
8884 }
8885
8886
8888 }
8889 }
8890 }
8891
8893 {
8895 }
8896
8898 {
8900 {
8902
8905
8908
8909 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8910 }
8911 }
8912
8914 {
8916 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8917
8919 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8920
8922 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8923
8925 {
8927 }
8928 }
8929
8931 {
8933 }
8934
8936 {
8939 else
8941
8943 {
8946 }
8947 else
8948 {
8951
8954 }
8955
8957 }
8958
8960 {
8962 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8963 }
8964
8966 {
8968 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8970 }
8971
8973 {
8975 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8976 }
8977
8979 {
8982
8983 OverheatingParticle OP = new OverheatingParticle();
8988
8990 }
8991
8993 {
8996
8997 return -1;
8998 }
8999
9001 {
9003 {
9006
9007 for (int i = count; i > 0; --i)
9008 {
9009 int id = i - 1;
9012
9015
9016 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9017 {
9018 if (p)
9019 {
9022 }
9023 }
9024 }
9025 }
9026 }
9027
9029 {
9031 {
9033 {
9034 int id = i - 1;
9036
9037 if (OP)
9038 {
9040
9041 if (p)
9042 {
9044 }
9045
9046 delete OP;
9047 }
9048 }
9049
9052 }
9053 }
9054
9057 {
9058 return 0.0;
9059 }
9060
9061
9063 {
9064 return 250;
9065 }
9066
9068 {
9069 return 0;
9070 }
9071
9074 {
9076 return true;
9077
9078 return false;
9079 }
9080
9083 {
9086
9088 {
9090 }
9091 else
9092 {
9093
9095 }
9096
9098 }
9099
9106 {
9107 return -1;
9108 }
9109
9110
9111
9112
9114 {
9116 {
9118 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9119
9120 if (r_index >= 0)
9121 {
9122 InventoryLocation r_il = new InventoryLocation;
9123 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9124
9125 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9128 {
9129 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9130 }
9132 {
9133 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9134 }
9135
9136 }
9137
9138 player.GetHumanInventory().ClearUserReservedLocation(this);
9139 }
9140
9143 }
9144
9145
9146
9147
9149 {
9150 return ItemBase.m_DebugActionsMask;
9151 }
9152
9154 {
9155 return ItemBase.m_DebugActionsMask & mask;
9156 }
9157
9159 {
9160 ItemBase.m_DebugActionsMask = mask;
9161 }
9162
9164 {
9165 ItemBase.m_DebugActionsMask |= mask;
9166 }
9167
9169 {
9170 ItemBase.m_DebugActionsMask &= ~mask;
9171 }
9172
9174 {
9176 {
9178 }
9179 else
9180 {
9182 }
9183 }
9184
9185
9187 {
9188 if (GetEconomyProfile())
9189 {
9190 float q_max = GetEconomyProfile().GetQuantityMax();
9191 if (q_max > 0)
9192 {
9193 float q_min = GetEconomyProfile().GetQuantityMin();
9194 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9195
9197 {
9198 ComponentEnergyManager comp = GetCompEM();
9200 {
9202 }
9203 }
9205 {
9207
9208 }
9209
9210 }
9211 }
9212 }
9213
9216 {
9217 EntityAI parent = GetHierarchyParent();
9218
9219 if (parent)
9220 {
9221 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9222 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9223 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9224 }
9225 }
9226
9229 {
9230 EntityAI parent = GetHierarchyParent();
9231
9232 if (parent)
9233 {
9234 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9235 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9236 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9237 }
9238 }
9239
9241 {
9242
9243
9244
9245
9247
9249 {
9250 if (ScriptInputUserData.CanStoreInputUserData())
9251 {
9252 ScriptInputUserData ctx = new ScriptInputUserData;
9258 ctx.
Write(use_stack_max);
9261
9263 {
9264 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9265 }
9266 }
9267 }
9268 else if (!
GetGame().IsMultiplayer())
9269 {
9271 }
9272 }
9273
9275 {
9277 }
9278
9280 {
9282 }
9283
9285 {
9287 }
9288
9290 {
9291
9292 return false;
9293 }
9294
9296 {
9297 return false;
9298 }
9299
9303 {
9304 return false;
9305 }
9306
9308 {
9309 return "";
9310 }
9311
9313
9315 {
9316 return false;
9317 }
9318
9320 {
9321 return true;
9322 }
9323
9324
9325
9327 {
9328 return true;
9329 }
9330
9332 {
9333 return true;
9334 }
9335
9337 {
9338 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9340 }
9341
9343 {
9345 }
9346
9348 {
9350 if (!is_being_placed)
9352 SetSynchDirty();
9353 }
9354
9355
9357
9359 {
9361 }
9362
9364 {
9366 }
9367
9369 {
9370 return 1;
9371 }
9372
9374 {
9375 return false;
9376 }
9377
9379 {
9381 SetSynchDirty();
9382 }
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9417
9419 {
9420 super.OnMovedInsideCargo(container);
9421
9422 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9423 }
9424
9425 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9426 {
9427 super.EEItemLocationChanged(oldLoc,newLoc);
9428
9429 PlayerBase new_player = null;
9430 PlayerBase old_player = null;
9431
9432 if (newLoc.GetParent())
9433 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9434
9435 if (oldLoc.GetParent())
9436 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9437
9439 {
9440 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9441
9442 if (r_index >= 0)
9443 {
9444 InventoryLocation r_il = new InventoryLocation;
9445 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9446
9447 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9450 {
9451 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9452 }
9454 {
9455 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9456 }
9457
9458 }
9459 }
9460
9462 {
9463 if (new_player)
9464 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9465
9466 if (new_player == old_player)
9467 {
9468
9469 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9470 {
9472 {
9473 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9474 {
9475 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9476 }
9477 }
9478 else
9479 {
9480 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9481 }
9482 }
9483
9484 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9485 {
9486 int type = oldLoc.GetType();
9488 {
9489 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9490 }
9492 {
9493 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9494 }
9495 }
9496 if (!m_OldLocation)
9497 {
9498 m_OldLocation = new InventoryLocation;
9499 }
9500 m_OldLocation.Copy(oldLoc);
9501 }
9502 else
9503 {
9504 if (m_OldLocation)
9505 {
9506 m_OldLocation.Reset();
9507 }
9508 }
9509
9511 }
9512 else
9513 {
9514 if (new_player)
9515 {
9516 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9517 if (res_index >= 0)
9518 {
9519 InventoryLocation il = new InventoryLocation;
9520 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9522 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9525 {
9526 il.
GetParent().GetOnReleaseLock().Invoke(it);
9527 }
9529 {
9531 }
9532
9533 }
9534 }
9536 {
9537
9539 }
9540
9541 if (m_OldLocation)
9542 {
9543 m_OldLocation.Reset();
9544 }
9545 }
9546 }
9547
9548 override void EOnContact(IEntity other, Contact extra)
9549 {
9551 {
9552 int liquidType = -1;
9554 if (impactSpeed > 0.0)
9555 {
9557 #ifndef SERVER
9559 #else
9561 SetSynchDirty();
9562 #endif
9564 }
9565 }
9566
9567 #ifdef SERVER
9568 if (GetCompEM() && GetCompEM().IsPlugged())
9569 {
9570 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9571 GetCompEM().UnplugThis();
9572 }
9573 #endif
9574 }
9575
9577
9579 {
9581 }
9582
9584 {
9585
9586 }
9587
9589 {
9590 super.OnItemLocationChanged(old_owner, new_owner);
9591
9592 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9593 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9594
9595 if (!relatedPlayer && playerNew)
9596 relatedPlayer = playerNew;
9597
9598 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9599 {
9601 if (actionMgr)
9602 {
9603 ActionBase currentAction = actionMgr.GetRunningAction();
9604 if (currentAction)
9606 }
9607 }
9608
9609 Man ownerPlayerOld = null;
9610 Man ownerPlayerNew = null;
9611
9612 if (old_owner)
9613 {
9614 if (old_owner.
IsMan())
9615 {
9616 ownerPlayerOld = Man.Cast(old_owner);
9617 }
9618 else
9619 {
9620 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9621 }
9622 }
9623 else
9624 {
9626 {
9628
9629 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9630 {
9631 GetCompEM().UnplugThis();
9632 }
9633 }
9634 }
9635
9636 if (new_owner)
9637 {
9638 if (new_owner.
IsMan())
9639 {
9640 ownerPlayerNew = Man.Cast(new_owner);
9641 }
9642 else
9643 {
9644 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9645 }
9646 }
9647
9648 if (ownerPlayerOld != ownerPlayerNew)
9649 {
9650 if (ownerPlayerOld)
9651 {
9652 array<EntityAI> subItemsExit = new array<EntityAI>;
9654 for (int i = 0; i < subItemsExit.Count(); i++)
9655 {
9658 }
9659 }
9660
9661 if (ownerPlayerNew)
9662 {
9663 array<EntityAI> subItemsEnter = new array<EntityAI>;
9665 for (int j = 0; j < subItemsEnter.Count(); j++)
9666 {
9669 }
9670 }
9671 }
9672 else if (ownerPlayerNew != null)
9673 {
9674 PlayerBase nplayer;
9675 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9676 {
9677 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9679 for (int k = 0; k < subItemsUpdate.Count(); k++)
9680 {
9682 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9683 }
9684 }
9685 }
9686
9687 if (old_owner)
9688 old_owner.OnChildItemRemoved(this);
9689 if (new_owner)
9690 new_owner.OnChildItemReceived(this);
9691 }
9692
9693
9695 {
9696 super.EEDelete(parent);
9697 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9698 if (player)
9699 {
9701
9702 if (player.IsAlive())
9703 {
9704 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9705 if (r_index >= 0)
9706 {
9707 InventoryLocation r_il = new InventoryLocation;
9708 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9709
9710 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9713 {
9714 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9715 }
9717 {
9718 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9719 }
9720
9721 }
9722
9723 player.RemoveQuickBarEntityShortcut(this);
9724 }
9725 }
9726 }
9727
9729 {
9730 super.EEKilled(killer);
9731
9734 {
9735 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9736 {
9737 if (IsMagazine())
9738 {
9739 if (Magazine.Cast(this).GetAmmoCount() > 0)
9740 {
9742 }
9743 }
9744 else
9745 {
9747 }
9748 }
9749 }
9750 }
9751
9753 {
9754 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9755
9756 super.OnWasAttached(parent, slot_id);
9757
9760
9762 }
9763
9765 {
9766 super.OnWasDetached(parent, slot_id);
9767
9770 }
9771
9773 {
9774 int idx;
9777
9778 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9779 if (inventory_slots.Count() < 1)
9780 {
9781 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9782 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9783 }
9784 else
9785 {
9786 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9787 }
9788
9789 idx = inventory_slots.Find(slot);
9790 if (idx < 0)
9791 return "";
9792
9793 return attach_types.Get(idx);
9794 }
9795
9797 {
9798 int idx = -1;
9799 string slot;
9800
9803
9804 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9805 if (inventory_slots.Count() < 1)
9806 {
9807 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9808 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9809 }
9810 else
9811 {
9812 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9813 if (detach_types.Count() < 1)
9814 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9815 }
9816
9817 for (int i = 0; i < inventory_slots.Count(); i++)
9818 {
9819 slot = inventory_slots.Get(i);
9820 }
9821
9822 if (slot != "")
9823 {
9824 if (detach_types.Count() == 1)
9825 idx = 0;
9826 else
9827 idx = inventory_slots.Find(slot);
9828 }
9829 if (idx < 0)
9830 return "";
9831
9832 return detach_types.Get(idx);
9833 }
9834
9836 {
9837
9839
9840
9841 float min_time = 1;
9842 float max_time = 3;
9843 float delay = Math.RandomFloat(min_time, max_time);
9844
9845 explode_timer.Run(delay, this, "DoAmmoExplosion");
9846 }
9847
9849 {
9850 Magazine magazine = Magazine.Cast(this);
9851 int pop_sounds_count = 6;
9852 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9853
9854
9855 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9856 string sound_name = pop_sounds[ sound_idx ];
9858
9859
9860 magazine.ServerAddAmmoCount(-1);
9861
9862
9863 float min_temp_to_explode = 100;
9864
9865 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9866 {
9868 }
9869 }
9870
9871
9872 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9873 {
9874 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9875
9876 const int CHANCE_DAMAGE_CARGO = 4;
9877 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9878 const int CHANCE_DAMAGE_NOTHING = 2;
9879
9881 {
9882 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9883 int chances;
9884 int rnd;
9885
9886 if (GetInventory().GetCargo())
9887 {
9888 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9889 rnd = Math.RandomInt(0,chances);
9890
9891 if (rnd < CHANCE_DAMAGE_CARGO)
9892 {
9894 }
9895 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9896 {
9898 }
9899 }
9900 else
9901 {
9902 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9903 rnd = Math.RandomInt(0,chances);
9904
9905 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9906 {
9908 }
9909 }
9910 }
9911 }
9912
9914 {
9915 if (GetInventory().GetCargo())
9916 {
9917 int item_count = GetInventory().GetCargo().GetItemCount();
9918 if (item_count > 0)
9919 {
9920 int random_pick = Math.RandomInt(0, item_count);
9922 if (!item.IsExplosive())
9923 {
9924 item.AddHealth("","",damage);
9925 return true;
9926 }
9927 }
9928 }
9929 return false;
9930 }
9931
9933 {
9934 int attachment_count = GetInventory().AttachmentCount();
9935 if (attachment_count > 0)
9936 {
9937 int random_pick = Math.RandomInt(0, attachment_count);
9938 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9939 if (!attachment.IsExplosive())
9940 {
9941 attachment.AddHealth("","",damage);
9942 return true;
9943 }
9944 }
9945 return false;
9946 }
9947
9949 {
9951 }
9952
9954 {
9956 return GetInventory().CanRemoveEntity();
9957
9958 return false;
9959 }
9960
9962 {
9964 return;
9965
9967 {
9968 if (ScriptInputUserData.CanStoreInputUserData())
9969 {
9970 ScriptInputUserData ctx = new ScriptInputUserData;
9975 ctx.
Write(destination_entity);
9979 }
9980 }
9981 else if (!
GetGame().IsMultiplayer())
9982 {
9984 }
9985 }
9986
9988 {
9990 return;
9991
9992 float split_quantity_new;
9996 InventoryLocation loc = new InventoryLocation;
9997
9998 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9999 {
10001 split_quantity_new = stack_max;
10002 else
10004
10005 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10006 if (new_item)
10007 {
10008 new_item.SetResultOfSplit(true);
10009 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10011 new_item.SetQuantity(split_quantity_new);
10012 }
10013 }
10014 else if (destination_entity && slot_id == -1)
10015 {
10016 if (quantity > stack_max)
10017 split_quantity_new = stack_max;
10018 else
10019 split_quantity_new = quantity;
10020
10022 {
10025 }
10026
10027 if (new_item)
10028 {
10029 new_item.SetResultOfSplit(true);
10030 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10032 new_item.SetQuantity(split_quantity_new);
10033 }
10034 }
10035 else
10036 {
10037 if (stack_max != 0)
10038 {
10040 {
10042 }
10043
10044 if (split_quantity_new == 0)
10045 {
10046 if (!
GetGame().IsMultiplayer())
10047 player.PhysicalPredictiveDropItem(this);
10048 else
10049 player.ServerDropEntity(this);
10050 return;
10051 }
10052
10054
10055 if (new_item)
10056 {
10057 new_item.SetResultOfSplit(true);
10058 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10060 new_item.SetQuantity(stack_max);
10061 new_item.PlaceOnSurface();
10062 }
10063 }
10064 }
10065 }
10066
10068 {
10070 return;
10071
10072 float split_quantity_new;
10076 InventoryLocation loc = new InventoryLocation;
10077
10078 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10079 {
10081 split_quantity_new = stack_max;
10082 else
10084
10085 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10086 if (new_item)
10087 {
10088 new_item.SetResultOfSplit(true);
10089 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10091 new_item.SetQuantity(split_quantity_new);
10092 }
10093 }
10094 else if (destination_entity && slot_id == -1)
10095 {
10096 if (quantity > stack_max)
10097 split_quantity_new = stack_max;
10098 else
10099 split_quantity_new = quantity;
10100
10102 {
10105 }
10106
10107 if (new_item)
10108 {
10109 new_item.SetResultOfSplit(true);
10110 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10112 new_item.SetQuantity(split_quantity_new);
10113 }
10114 }
10115 else
10116 {
10117 if (stack_max != 0)
10118 {
10120 {
10122 }
10123
10125
10126 if (new_item)
10127 {
10128 new_item.SetResultOfSplit(true);
10129 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10131 new_item.SetQuantity(stack_max);
10132 new_item.PlaceOnSurface();
10133 }
10134 }
10135 }
10136 }
10137
10139 {
10141 return;
10142
10144 {
10145 if (ScriptInputUserData.CanStoreInputUserData())
10146 {
10147 ScriptInputUserData ctx = new ScriptInputUserData;
10152 dst.WriteToContext(ctx);
10154 }
10155 }
10156 else if (!
GetGame().IsMultiplayer())
10157 {
10159 }
10160 }
10161
10163 {
10165 return;
10166
10168 {
10169 if (ScriptInputUserData.CanStoreInputUserData())
10170 {
10171 ScriptInputUserData ctx = new ScriptInputUserData;
10176 ctx.
Write(destination_entity);
10182 }
10183 }
10184 else if (!
GetGame().IsMultiplayer())
10185 {
10187 }
10188 }
10189
10191 {
10193 }
10194
10196 {
10198 return this;
10199
10201 float split_quantity_new;
10203 if (dst.IsValid())
10204 {
10205 int slot_id = dst.GetSlot();
10207
10208 if (quantity > stack_max)
10209 split_quantity_new = stack_max;
10210 else
10211 split_quantity_new = quantity;
10212
10214
10215 if (new_item)
10216 {
10217 new_item.SetResultOfSplit(true);
10218 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10221 }
10222
10223 return new_item;
10224 }
10225
10226 return null;
10227 }
10228
10230 {
10232 return;
10233
10235 float split_quantity_new;
10237 if (destination_entity)
10238 {
10240 if (quantity > stackable)
10241 split_quantity_new = stackable;
10242 else
10243 split_quantity_new = quantity;
10244
10245 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10246 if (new_item)
10247 {
10248 new_item.SetResultOfSplit(true);
10249 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10251 new_item.SetQuantity(split_quantity_new);
10252 }
10253 }
10254 }
10255
10257 {
10259 return;
10260
10262 {
10263 if (ScriptInputUserData.CanStoreInputUserData())
10264 {
10265 ScriptInputUserData ctx = new ScriptInputUserData;
10270 ItemBase destination_entity =
this;
10271 ctx.
Write(destination_entity);
10275 }
10276 }
10277 else if (!
GetGame().IsMultiplayer())
10278 {
10280 }
10281 }
10282
10284 {
10286 return;
10287
10289 float split_quantity_new;
10291 if (player)
10292 {
10294 if (quantity > stackable)
10295 split_quantity_new = stackable;
10296 else
10297 split_quantity_new = quantity;
10298
10299 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10300 new_item =
ItemBase.Cast(in_hands);
10301 if (new_item)
10302 {
10303 new_item.SetResultOfSplit(true);
10304 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10306 new_item.SetQuantity(split_quantity_new);
10307 }
10308 }
10309 }
10310
10312 {
10314 return;
10315
10317 float split_quantity_new = Math.Floor(quantity * 0.5);
10318
10320
10321 if (new_item)
10322 {
10323 if (new_item.GetQuantityMax() < split_quantity_new)
10324 {
10325 split_quantity_new = new_item.GetQuantityMax();
10326 }
10327
10328 new_item.SetResultOfSplit(true);
10329 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10330
10332 {
10335 }
10336 else
10337 {
10340 }
10341 }
10342 }
10343
10345 {
10347 return;
10348
10350 float split_quantity_new = Math.Floor(quantity / 2);
10351
10352 InventoryLocation invloc = new InventoryLocation;
10354
10356 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10357
10358 if (new_item)
10359 {
10360 if (new_item.GetQuantityMax() < split_quantity_new)
10361 {
10362 split_quantity_new = new_item.GetQuantityMax();
10363 }
10365 {
10368 }
10369 else
10370 {
10373 }
10374 }
10375 }
10376
10379 {
10380 SetWeightDirty();
10382
10383 if (parent)
10384 parent.OnAttachmentQuantityChangedEx(this, delta);
10385
10387 {
10389 {
10391 }
10393 {
10394 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10396 }
10397 }
10398
10399 }
10400
10403 {
10404
10405 }
10406
10409 {
10411 }
10412
10414 {
10415 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10416
10418 {
10419 if (newLevel == GameConstants.STATE_RUINED)
10420 {
10422 EntityAI parent = GetHierarchyParent();
10423 if (parent && parent.IsFireplace())
10424 {
10425 CargoBase cargo = GetInventory().GetCargo();
10426 if (cargo)
10427 {
10429 {
10431 }
10432 }
10433 }
10434 }
10435
10437 {
10438
10440 return;
10441 }
10442
10443 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10444 {
10446 }
10447 }
10448 }
10449
10450
10452 {
10453 super.OnRightClick();
10454
10456 {
10458 {
10459 if (ScriptInputUserData.CanStoreInputUserData())
10460 {
10461 vector m4[4];
10463
10464 EntityAI root = GetHierarchyRoot();
10465
10466 InventoryLocation dst = new InventoryLocation;
10468 {
10469 if (root)
10470 {
10471 root.GetTransform(m4);
10473 }
10474 else
10475 GetInventory().GetCurrentInventoryLocation(dst);
10476 }
10477 else
10478 {
10480
10481
10482 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10483 {
10484 if (root)
10485 {
10486 root.GetTransform(m4);
10488 }
10489 else
10490 GetInventory().GetCurrentInventoryLocation(dst);
10491 }
10492 else
10493 {
10494 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10495 }
10496 }
10497
10498 ScriptInputUserData ctx = new ScriptInputUserData;
10506 }
10507 }
10508 else if (!
GetGame().IsMultiplayer())
10509 {
10511 }
10512 }
10513 }
10514
10515 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10516 {
10517
10518 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10519 return false;
10520
10521 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10522 return false;
10523
10524
10526 return false;
10527
10528
10529 Magazine mag = Magazine.Cast(this);
10530 if (mag)
10531 {
10532 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10533 return false;
10534
10535 if (stack_max_limit)
10536 {
10537 Magazine other_mag = Magazine.Cast(other_item);
10538 if (other_item)
10539 {
10540 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10541 return false;
10542 }
10543
10544 }
10545 }
10546 else
10547 {
10548
10550 return false;
10551
10553 return false;
10554 }
10555
10556 PlayerBase player = null;
10557 if (CastTo(player, GetHierarchyRootPlayer()))
10558 {
10559 if (player.GetInventory().HasAttachment(this))
10560 return false;
10561
10562 if (player.IsItemsToDelete())
10563 return false;
10564 }
10565
10566 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10567 return false;
10568
10569 int slotID;
10571 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10572 return false;
10573
10574 return true;
10575 }
10576
10578 {
10580 }
10581
10583 {
10584 return m_IsResultOfSplit;
10585 }
10586
10588 {
10589 m_IsResultOfSplit = value;
10590 }
10591
10593 {
10595 }
10596
10598 {
10599 float other_item_quantity = other_item.GetQuantity();
10600 float this_free_space;
10601
10603
10605
10606 if (other_item_quantity > this_free_space)
10607 {
10608 return this_free_space;
10609 }
10610 else
10611 {
10612 return other_item_quantity;
10613 }
10614 }
10615
10617 {
10619 }
10620
10622 {
10624 return;
10625
10626 if (!IsMagazine() && other_item)
10627 {
10629 if (quantity_used != 0)
10630 {
10631 float hp1 = GetHealth01("","");
10632 float hp2 = other_item.GetHealth01("","");
10633 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10634 hpResult = hpResult / (
GetQuantity() + quantity_used);
10635
10636 hpResult *= GetMaxHealth();
10637 Math.Round(hpResult);
10638 SetHealth("", "Health", hpResult);
10639
10641 other_item.AddQuantity(-quantity_used);
10642 }
10643 }
10645 }
10646
10648 {
10649 #ifdef SERVER
10650 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10651 GetHierarchyParent().IncreaseLifetimeUp();
10652 #endif
10653 };
10654
10656 {
10657 PlayerBase p = PlayerBase.Cast(player);
10658
10659 array<int> recipesIds = p.m_Recipes;
10660 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10661 if (moduleRecipesManager)
10662 {
10663 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10664 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10665 }
10666
10667 for (int i = 0;i < recipesIds.Count(); i++)
10668 {
10669 int key = recipesIds.Get(i);
10670 string recipeName = moduleRecipesManager.GetRecipeName(key);
10672 }
10673 }
10674
10675
10676 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10677 {
10678 super.GetDebugActions(outputList);
10679
10680
10685
10686
10690
10694
10695
10698
10699
10701 {
10704 }
10705
10707
10710
10714 }
10715
10716
10717
10718
10720 {
10721 super.OnAction(action_id, player, ctx);
10722 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10723 {
10724 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10725 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10726 PlayerBase p = PlayerBase.Cast(player);
10727 if (
EActions.RECIPES_RANGE_START < 1000)
10728 {
10729 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10730 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10731 }
10732 }
10733 #ifndef SERVER
10734 else if (action_id ==
EActions.WATCH_PLAYER)
10735 {
10736 PluginDeveloper.SetDeveloperItemClientEx(player);
10737 }
10738 #endif
10740 {
10741 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10742 {
10743 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10744 OnDebugButtonPressServer(id + 1);
10745 }
10746
10747 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10748 {
10749 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10751 }
10752
10753 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10754 {
10755 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10757 }
10758
10759 else if (action_id ==
EActions.ADD_QUANTITY)
10760 {
10761 if (IsMagazine())
10762 {
10763 Magazine mag = Magazine.Cast(this);
10764 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10765 }
10766 else
10767 {
10769 }
10770
10771 if (m_EM)
10772 {
10773 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10774 }
10775
10776 }
10777
10778 else if (action_id ==
EActions.REMOVE_QUANTITY)
10779 {
10780 if (IsMagazine())
10781 {
10782 Magazine mag2 = Magazine.Cast(this);
10783 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10784 }
10785 else
10786 {
10788 }
10789 if (m_EM)
10790 {
10791 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10792 }
10793
10794 }
10795
10796 else if (action_id ==
EActions.SET_QUANTITY_0)
10797 {
10799
10800 if (m_EM)
10801 {
10802 m_EM.SetEnergy(0);
10803 }
10804 }
10805
10806 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10807 {
10809
10810 if (m_EM)
10811 {
10812 m_EM.SetEnergy(m_EM.GetEnergyMax());
10813 }
10814 }
10815
10816 else if (action_id ==
EActions.ADD_HEALTH)
10817 {
10818 AddHealth("","",GetMaxHealth("","Health")/5);
10819 }
10820 else if (action_id ==
EActions.REMOVE_HEALTH)
10821 {
10822 AddHealth("","",-GetMaxHealth("","Health")/5);
10823 }
10824 else if (action_id ==
EActions.DESTROY_HEALTH)
10825 {
10826 SetHealth01("","",0);
10827 }
10828 else if (action_id ==
EActions.WATCH_ITEM)
10829 {
10831 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10832 #ifdef DEVELOPER
10833 SetDebugDeveloper_item(this);
10834 #endif
10835 }
10836
10837 else if (action_id ==
EActions.ADD_TEMPERATURE)
10838 {
10839 AddTemperature(20);
10840
10841 }
10842
10843 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10844 {
10845 AddTemperature(-20);
10846
10847 }
10848
10849 else if (action_id ==
EActions.FLIP_FROZEN)
10850 {
10851 SetFrozen(!GetIsFrozen());
10852
10853 }
10854
10855 else if (action_id ==
EActions.ADD_WETNESS)
10856 {
10858
10859 }
10860
10861 else if (action_id ==
EActions.REMOVE_WETNESS)
10862 {
10864
10865 }
10866
10867 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10868 {
10871
10872
10873 }
10874
10875 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10876 {
10879 }
10880
10881 else if (action_id ==
EActions.MAKE_SPECIAL)
10882 {
10883 auto debugParams = DebugSpawnParams.WithPlayer(player);
10884 OnDebugSpawnEx(debugParams);
10885 }
10886
10887 else if (action_id ==
EActions.DELETE)
10888 {
10889 Delete();
10890 }
10891
10892 }
10893
10894
10895 return false;
10896 }
10897
10898
10899
10900
10904
10907
10908
10909
10911 {
10912 return false;
10913 }
10914
10915
10917 {
10918 return true;
10919 }
10920
10921
10923 {
10924 return true;
10925 }
10926
10927
10928
10930 {
10931 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10933 }
10934
10937 {
10938 return null;
10939 }
10940
10942 {
10943 return false;
10944 }
10945
10947 {
10948 return false;
10949 }
10950
10954
10955
10957 {
10958 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10959 return module_repairing.CanRepair(this, item_repair_kit);
10960 }
10961
10962
10963 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10964 {
10965 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10966 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10967 }
10968
10969
10971 {
10972
10973
10974
10975
10976
10977
10978
10979
10980 return 1;
10981 }
10982
10983
10984
10986 {
10988 }
10989
10990
10991
10993 {
10995 }
10996
10997
11006 {
11007 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11008
11009 if (player)
11010 {
11011 player.MessageStatus(text);
11012 }
11013 }
11014
11015
11024 {
11025 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11026
11027 if (player)
11028 {
11029 player.MessageAction(text);
11030 }
11031 }
11032
11033
11042 {
11043 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11044
11045 if (player)
11046 {
11047 player.MessageFriendly(text);
11048 }
11049 }
11050
11051
11060 {
11061 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11062
11063 if (player)
11064 {
11065 player.MessageImportant(text);
11066 }
11067 }
11068
11070 {
11071 return true;
11072 }
11073
11074
11075 override bool KindOf(
string tag)
11076 {
11077 bool found = false;
11078 string item_name = this.
GetType();
11081
11082 int array_size = item_tag_array.Count();
11083 for (int i = 0; i < array_size; i++)
11084 {
11085 if (item_tag_array.Get(i) == tag)
11086 {
11087 found = true;
11088 break;
11089 }
11090 }
11091 return found;
11092 }
11093
11094
11096 {
11097
11098 super.OnRPC(sender, rpc_type,ctx);
11099
11100
11101 switch (rpc_type)
11102 {
11103 #ifndef SERVER
11104 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11105 Param2<bool, string> p = new Param2<bool, string>(false, "");
11106
11108 return;
11109
11110 bool play = p.param1;
11111 string soundSet = p.param2;
11112
11113 if (play)
11114 {
11116 {
11118 {
11120 }
11121 }
11122 else
11123 {
11125 }
11126 }
11127 else
11128 {
11130 }
11131
11132 break;
11133 #endif
11134
11135 }
11136
11138 {
11140 }
11141 }
11142
11143
11144
11145
11147 {
11148 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11149 return plugin.GetID(
name);
11150 }
11151
11153 {
11154 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11155 return plugin.GetName(id);
11156 }
11157
11160 {
11161
11162
11163 int varFlags;
11164 if (!ctx.
Read(varFlags))
11165 return;
11166
11167 if (varFlags & ItemVariableFlags.FLOAT)
11168 {
11170 }
11171 }
11172
11174 {
11175
11176 super.SerializeNumericalVars(floats_out);
11177
11178
11179
11181 {
11183 }
11184
11186 {
11188 }
11189
11191 {
11193 }
11194
11196 {
11201 }
11202
11204 {
11206 }
11207 }
11208
11210 {
11211
11212 super.DeSerializeNumericalVars(floats);
11213
11214
11215 int index = 0;
11216 int mask = Math.Round(floats.Get(index));
11217
11218 index++;
11219
11221 {
11223 {
11225 }
11226 else
11227 {
11228 float quantity = floats.Get(index);
11229 SetQuantity(quantity,
true,
false,
false,
false);
11230 }
11231 index++;
11232 }
11233
11235 {
11236 float wet = floats.Get(index);
11238 index++;
11239 }
11240
11242 {
11243 int liquidtype = Math.Round(floats.Get(index));
11245 index++;
11246 }
11247
11249 {
11251 index++;
11253 index++;
11255 index++;
11257 index++;
11258 }
11259
11261 {
11262 int cleanness = Math.Round(floats.Get(index));
11264 index++;
11265 }
11266 }
11267
11269 {
11270 super.WriteVarsToCTX(ctx);
11271
11272
11274 {
11276 }
11277
11279 {
11281 }
11282
11284 {
11286 }
11287
11289 {
11290 int r,g,b,a;
11296 }
11297
11299 {
11301 }
11302 }
11303
11305 {
11306 if (!super.ReadVarsFromCTX(ctx,version))
11307 return false;
11308
11309 int intValue;
11310 float value;
11311
11312 if (version < 140)
11313 {
11314 if (!ctx.
Read(intValue))
11315 return false;
11316
11317 m_VariablesMask = intValue;
11318 }
11319
11321 {
11322 if (!ctx.
Read(value))
11323 return false;
11324
11326 {
11328 }
11329 else
11330 {
11332 }
11333 }
11334
11335 if (version < 140)
11336 {
11338 {
11339 if (!ctx.
Read(value))
11340 return false;
11341 SetTemperatureDirect(value);
11342 }
11343 }
11344
11346 {
11347 if (!ctx.
Read(value))
11348 return false;
11350 }
11351
11353 {
11354 if (!ctx.
Read(intValue))
11355 return false;
11357 }
11358
11360 {
11361 int r,g,b,a;
11363 return false;
11365 return false;
11367 return false;
11369 return false;
11370
11372 }
11373
11375 {
11376 if (!ctx.
Read(intValue))
11377 return false;
11379 }
11380
11381 if (version >= 138 && version < 140)
11382 {
11384 {
11385 if (!ctx.
Read(intValue))
11386 return false;
11387 SetFrozen(intValue);
11388 }
11389 }
11390
11391 return true;
11392 }
11393
11394
11396 {
11399 {
11401 }
11402
11403 if (!super.OnStoreLoad(ctx, version))
11404 {
11406 return false;
11407 }
11408
11409 if (version >= 114)
11410 {
11411 bool hasQuickBarIndexSaved;
11412
11413 if (!ctx.
Read(hasQuickBarIndexSaved))
11414 {
11416 return false;
11417 }
11418
11419 if (hasQuickBarIndexSaved)
11420 {
11421 int itmQBIndex;
11422
11423
11424 if (!ctx.
Read(itmQBIndex))
11425 {
11427 return false;
11428 }
11429
11430 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11431 if (itmQBIndex != -1 && parentPlayer)
11432 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11433 }
11434 }
11435 else
11436 {
11437
11438 PlayerBase player;
11439 int itemQBIndex;
11440 if (version ==
int.
MAX)
11441 {
11442 if (!ctx.
Read(itemQBIndex))
11443 {
11445 return false;
11446 }
11447 }
11448 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11449 {
11450
11451 if (!ctx.
Read(itemQBIndex))
11452 {
11454 return false;
11455 }
11456 if (itemQBIndex != -1 && player)
11457 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11458 }
11459 }
11460
11461 if (version < 140)
11462 {
11463
11464 if (!LoadVariables(ctx, version))
11465 {
11467 return false;
11468 }
11469 }
11470
11471
11473 {
11475 return false;
11476 }
11477 if (version >= 132)
11478 {
11480 if (raib)
11481 {
11483 {
11485 return false;
11486 }
11487 }
11488 }
11489
11491 return true;
11492 }
11493
11494
11495
11497 {
11498 super.OnStoreSave(ctx);
11499
11500 PlayerBase player;
11501 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11502 {
11504
11505 int itemQBIndex = -1;
11506 itemQBIndex = player.FindQuickBarEntityIndex(this);
11507 ctx.
Write(itemQBIndex);
11508 }
11509 else
11510 {
11512 }
11513
11515
11517 if (raib)
11518 {
11520 }
11521 }
11522
11523
11525 {
11526 super.AfterStoreLoad();
11527
11529 {
11531 }
11532
11534 {
11537 }
11538 }
11539
11541 {
11542 super.EEOnAfterLoad();
11543
11545 {
11547 }
11548
11551 }
11552
11554 {
11555 return false;
11556 }
11557
11558
11559
11561 {
11563 {
11564 #ifdef PLATFORM_CONSOLE
11565
11567 {
11569 if (menu)
11570 {
11572 }
11573 }
11574 #endif
11575 }
11576
11578 {
11581 }
11582
11584 {
11585 SetWeightDirty();
11587 }
11589 {
11592 }
11593
11595 {
11598 }
11600 {
11603 }
11604
11605 super.OnVariablesSynchronized();
11606 }
11607
11608
11609
11611 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11612 {
11613 if (!IsServerCheck(allow_client))
11614 return false;
11615
11617 return false;
11618
11621
11622 if (value <= (min + 0.001))
11623 value = min;
11624
11625 if (value == min)
11626 {
11627 if (destroy_config)
11628 {
11629 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11630 if (dstr)
11631 {
11633 this.Delete();
11634 return true;
11635 }
11636 }
11637 else if (destroy_forced)
11638 {
11640 this.Delete();
11641 return true;
11642 }
11643
11645 }
11646
11649
11651 {
11653
11654 if (delta)
11656 }
11657
11659
11660 return false;
11661 }
11662
11663
11665 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11666 {
11668 }
11669
11671 {
11674 }
11675
11677 {
11680 }
11681
11684 {
11685 float value_clamped = Math.Clamp(value, 0, 1);
11687 SetQuantity(result, destroy_config, destroy_forced);
11688 }
11689
11690
11693 {
11695 }
11696
11698 {
11700 }
11701
11702
11703
11704
11705
11706
11707
11708
11709
11710
11712 {
11713 int slot = -1;
11714 if (GetInventory())
11715 {
11716 InventoryLocation il = new InventoryLocation;
11717 GetInventory().GetCurrentInventoryLocation(il);
11719 }
11720
11722 }
11723
11725 {
11726 float quantity_max = 0;
11727
11729 {
11730 if (attSlotID != -1)
11731 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11732
11733 if (quantity_max <= 0)
11735 }
11736
11737 if (quantity_max <= 0)
11739
11740 return quantity_max;
11741 }
11742
11744 {
11746 }
11747
11749 {
11751 }
11752
11753
11755 {
11757 }
11758
11760 {
11762 }
11763
11765 {
11767 }
11768
11769
11771 {
11772
11773 float weightEx = GetWeightEx();
11774 float special = GetInventoryAndCargoWeight();
11775 return weightEx - special;
11776 }
11777
11778
11780 {
11782 }
11783
11785 {
11787 {
11788 #ifdef DEVELOPER
11789 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11790 {
11791 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11793 }
11794 #endif
11795
11796 return GetQuantity() * GetConfigWeightModified();
11797 }
11798 else if (HasEnergyManager())
11799 {
11800 #ifdef DEVELOPER
11801 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11802 {
11803 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11804 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11805 }
11806 #endif
11807 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11808 }
11809 else
11810 {
11811 #ifdef DEVELOPER
11812 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11813 {
11814 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11815 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11816 }
11817 #endif
11818 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11819 }
11820 }
11821
11824 {
11825 int item_count = 0;
11827
11828 if (GetInventory().GetCargo() != NULL)
11829 {
11830 item_count = GetInventory().GetCargo().GetItemCount();
11831 }
11832
11833 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11834 {
11835 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11836 if (item)
11837 item_count += item.GetNumberOfItems();
11838 }
11839 return item_count;
11840 }
11841
11844 {
11845 float weight = 0;
11846 float wetness = 1;
11847 if (include_wetness)
11850 {
11851 weight = wetness * m_ConfigWeight;
11852 }
11854 {
11855 weight = 1;
11856 }
11857 return weight;
11858 }
11859
11860
11861
11863 {
11864 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11865 {
11866 GameInventory inv = GetInventory();
11867 array<EntityAI> items = new array<EntityAI>;
11869 for (int i = 0; i < items.Count(); i++)
11870 {
11872 if (item)
11873 {
11875 }
11876 }
11877 }
11878 }
11879
11880
11881
11882
11884 {
11885 float energy = 0;
11886 if (HasEnergyManager())
11887 {
11888 energy = GetCompEM().GetEnergy();
11889 }
11890 return energy;
11891 }
11892
11893
11895 {
11896 super.OnEnergyConsumed();
11897
11899 }
11900
11902 {
11903 super.OnEnergyAdded();
11904
11906 }
11907
11908
11910 {
11911 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11912 {
11914 {
11915 float energy_0to1 = GetCompEM().GetEnergy0To1();
11917 }
11918 }
11919 }
11920
11921
11923 {
11924 return ConfigGetFloat("heatIsolation");
11925 }
11926
11928 {
11930 }
11931
11933 {
11934 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11935 if (
GetGame().ConfigIsExisting(paramPath))
11937
11938 return 0.0;
11939 }
11940
11942 {
11943 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11944 if (
GetGame().ConfigIsExisting(paramPath))
11946
11947 return 0.0;
11948 }
11949
11950 override void SetWet(
float value,
bool allow_client =
false)
11951 {
11952 if (!IsServerCheck(allow_client))
11953 return;
11954
11957
11959
11960 m_VarWet = Math.Clamp(value, min, max);
11961
11963 {
11966 }
11967 }
11968
11969 override void AddWet(
float value)
11970 {
11972 }
11973
11975 {
11977 }
11978
11980 {
11982 }
11983
11985 {
11987 }
11988
11990 {
11992 }
11993
11995 {
11997 }
11998
11999 override void OnWetChanged(
float newVal,
float oldVal)
12000 {
12003 if (newLevel != oldLevel)
12004 {
12006 }
12007 }
12008
12010 {
12011 SetWeightDirty();
12012 }
12013
12015 {
12016 return GetWetLevelInternal(
m_VarWet);
12017 }
12018
12019
12020
12022 {
12024 }
12025
12027 {
12029 }
12030
12032 {
12034 }
12035
12037 {
12039 }
12040
12041
12042
12044 {
12045 if (ConfigIsExisting("itemModelLength"))
12046 {
12047 return ConfigGetFloat("itemModelLength");
12048 }
12049 return 0;
12050 }
12051
12053 {
12054 if (ConfigIsExisting("itemAttachOffset"))
12055 {
12056 return ConfigGetFloat("itemAttachOffset");
12057 }
12058 return 0;
12059 }
12060
12061 override void SetCleanness(
int value,
bool allow_client =
false)
12062 {
12063 if (!IsServerCheck(allow_client))
12064 return;
12065
12067
12069
12072 }
12073
12075 {
12077 }
12078
12080 {
12081 return true;
12082 }
12083
12084
12085
12086
12088 {
12090 }
12091
12093 {
12095 }
12096
12097
12098
12099
12100 override void SetColor(
int r,
int g,
int b,
int a)
12101 {
12107 }
12109 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12110 {
12115 }
12116
12118 {
12120 }
12121
12124 {
12125 int r,g,b,a;
12127 r = r/255;
12128 g = g/255;
12129 b = b/255;
12130 a = a/255;
12131 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12132 }
12133
12134
12135
12136 override void SetLiquidType(
int value,
bool allow_client =
false)
12137 {
12138 if (!IsServerCheck(allow_client))
12139 return;
12140
12145 }
12146
12148 {
12149 return ConfigGetInt("varLiquidTypeInit");
12150 }
12151
12153 {
12155 }
12156
12158 {
12160 SetFrozen(false);
12161 }
12162
12165 {
12166 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12167 }
12168
12169
12172 {
12173 PlayerBase nplayer;
12174 if (PlayerBase.CastTo(nplayer, player))
12175 {
12177
12178 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12179 }
12180 }
12181
12182
12185 {
12186 PlayerBase nplayer;
12187 if (PlayerBase.CastTo(nplayer,player))
12188 {
12189
12190 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12191
12192 }
12193
12194
12195 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12196
12197
12198 if (HasEnergyManager())
12199 {
12200 GetCompEM().UpdatePlugState();
12201 }
12202 }
12203
12204
12206 {
12207 super.OnPlacementStarted(player);
12208
12210 }
12211
12212 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12213 {
12215 {
12216 m_AdminLog.OnPlacementComplete(player,
this);
12217 }
12218
12219 super.OnPlacementComplete(player, position, orientation);
12220 }
12221
12222
12223
12224
12225
12227 {
12229 {
12230 return true;
12231 }
12232 else
12233 {
12234 return false;
12235 }
12236 }
12237
12238
12240 {
12242 {
12244 }
12245 }
12246
12247
12249 {
12251 }
12252
12254 {
12256 }
12257
12258 override void InsertAgent(
int agent,
float count = 1)
12259 {
12260 if (count < 1)
12261 return;
12262
12264 }
12265
12268 {
12270 }
12271
12272
12274 {
12276 }
12277
12278
12279
12280
12281
12282
12283
12284
12285
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
12320 {
12322 return false;
12323 return true;
12324 }
12325
12327 {
12328
12330 }
12331
12332
12335 {
12336 super.CheckForRoofLimited(timeTresholdMS);
12337
12339 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12340 {
12341 m_PreviousRoofTestTime = time;
12342 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12343 }
12344 }
12345
12346
12348 {
12350 {
12351 return 0;
12352 }
12353
12354 if (GetInventory().GetAttachmentSlotsCount() != 0)
12355 {
12356 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12357 if (filter)
12358 return filter.GetProtectionLevel(type, false, system);
12359 else
12360 return 0;
12361 }
12362
12363 string subclassPath, entryName;
12364
12365 switch (type)
12366 {
12368 entryName = "biological";
12369 break;
12371 entryName = "chemical";
12372 break;
12373 default:
12374 entryName = "biological";
12375 break;
12376 }
12377
12378 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12379
12381 }
12382
12383
12384
12387 {
12388 if (!IsMagazine())
12390
12392 }
12393
12394
12395
12396
12397
12402 {
12403 return true;
12404 }
12405
12407 {
12409 }
12410
12411
12412
12413
12414
12416 {
12417 if (parent)
12418 {
12419 if (parent.IsInherited(DayZInfected))
12420 return true;
12421
12422 if (!parent.IsRuined())
12423 return true;
12424 }
12425
12426 return true;
12427 }
12428
12430 {
12431 if (!super.CanPutAsAttachment(parent))
12432 {
12433 return false;
12434 }
12435
12436 if (!IsRuined() && !parent.IsRuined())
12437 {
12438 return true;
12439 }
12440
12441 return false;
12442 }
12443
12445 {
12446
12447
12448
12449
12450 return super.CanReceiveItemIntoCargo(item);
12451 }
12452
12454 {
12455
12456
12457
12458
12459 GameInventory attachmentInv = attachment.GetInventory();
12461 {
12462 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12463 return false;
12464 }
12465
12466 InventoryLocation loc = new InventoryLocation();
12467 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12468 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12469 return false;
12470
12471 return super.CanReceiveAttachment(attachment, slotId);
12472 }
12473
12475 {
12476 if (!super.CanReleaseAttachment(attachment))
12477 return false;
12478
12479 return GetInventory().AreChildrenAccessible();
12480 }
12481
12482
12483
12484
12485
12486
12487
12488
12489
12490
12491
12492
12493
12494
12495
12496
12497
12498
12499
12500
12501
12503 {
12504 int id = muzzle_owner.GetMuzzleID();
12505 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12506
12507 if (WPOF_array)
12508 {
12509 for (int i = 0; i < WPOF_array.Count(); i++)
12510 {
12511 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12512
12513 if (WPOF)
12514 {
12515 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12516 }
12517 }
12518 }
12519 }
12520
12521
12523 {
12524 int id = muzzle_owner.GetMuzzleID();
12526
12527 if (WPOBE_array)
12528 {
12529 for (int i = 0; i < WPOBE_array.Count(); i++)
12530 {
12531 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12532
12533 if (WPOBE)
12534 {
12535 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12536 }
12537 }
12538 }
12539 }
12540
12541
12543 {
12544 int id = muzzle_owner.GetMuzzleID();
12545 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12546
12547 if (WPOOH_array)
12548 {
12549 for (int i = 0; i < WPOOH_array.Count(); i++)
12550 {
12551 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12552
12553 if (WPOOH)
12554 {
12555 WPOOH.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.OnUpdate(weapon, 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.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12596 }
12597 }
12598 }
12599 }
12600
12601
12602
12604 {
12606 {
12607 return true;
12608 }
12609
12610 return false;
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 {
12635 return false;
12636 }
12637
12640 {
12641 return UATimeSpent.DEFAULT_DEPLOY;
12642 }
12643
12644
12645
12646
12648 {
12650 SetSynchDirty();
12651 }
12652
12654 {
12656 }
12657
12658
12660 {
12661 return false;
12662 }
12663
12666 {
12667 string att_type = "None";
12668
12669 if (ConfigIsExisting("soundAttType"))
12670 {
12671 att_type = ConfigGetString("soundAttType");
12672 }
12673
12675 }
12676
12678 {
12680 }
12681
12682
12683
12684
12685
12689
12691 {
12694
12696 }
12697
12698
12700 {
12702 return;
12703
12705
12708
12711
12712 SoundParameters params = new SoundParameters();
12716 }
12717
12718
12720 {
12722 return;
12723
12725 SetSynchDirty();
12726
12729 }
12730
12731
12733 {
12735 return;
12736
12738 SetSynchDirty();
12739
12742 }
12743
12745 {
12747 }
12748
12750 {
12752 }
12753
12756 {
12757 if (!
GetGame().IsDedicatedServer())
12758 {
12759 if (ConfigIsExisting("attachSoundSet"))
12760 {
12761 string cfg_path = "";
12762 string soundset = "";
12763 string type_name =
GetType();
12764
12767 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12768 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12769
12770 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12771 {
12772 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12773 {
12774 if (cfg_slot_array[i] == slot_type)
12775 {
12776 soundset = cfg_soundset_array[i];
12777 break;
12778 }
12779 }
12780 }
12781
12782 if (soundset != "")
12783 {
12784 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12786 }
12787 }
12788 }
12789 }
12790
12792 {
12793
12794 }
12795
12796 void OnApply(PlayerBase player);
12797
12799 {
12800 return 1.0;
12801 };
12802
12804 {
12806 }
12807
12809 {
12811 }
12812
12814
12816 {
12817 SetDynamicPhysicsLifeTime(0.01);
12819 }
12820
12822 {
12823 array<string> zone_names = new array<string>;
12824 GetDamageZones(zone_names);
12825 for (int i = 0; i < zone_names.Count(); i++)
12826 {
12827 SetHealthMax(zone_names.Get(i),"Health");
12828 }
12829 SetHealthMax("","Health");
12830 }
12831
12834 {
12835 float global_health = GetHealth01("","Health");
12836 array<string> zones = new array<string>;
12837 GetDamageZones(zones);
12838
12839 for (int i = 0; i < zones.Count(); i++)
12840 {
12841 SetHealth01(zones.Get(i),"Health",global_health);
12842 }
12843 }
12844
12847 {
12848 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12849 }
12850
12852 {
12853 if (!hasRootAsPlayer)
12854 {
12855 if (refParentIB)
12856 {
12857
12858 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12859 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12860
12861 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12862 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12863
12866 }
12867 else
12868 {
12869
12872 }
12873 }
12874 }
12875
12877 {
12879 {
12880 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12881 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12882 {
12883 float heatPermCoef = 1.0;
12885 while (ent)
12886 {
12887 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12888 ent = ent.GetHierarchyParent();
12889 }
12890
12891 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12892 }
12893 }
12894 }
12895
12897 {
12898
12899 EntityAI parent = GetHierarchyParent();
12900 if (!parent)
12901 {
12902 hasParent = false;
12903 hasRootAsPlayer = false;
12904 }
12905 else
12906 {
12907 hasParent = true;
12908 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12909 refParentIB =
ItemBase.Cast(parent);
12910 }
12911 }
12912
12913 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12914 {
12915
12916 }
12917
12919 {
12920
12921 return false;
12922 }
12923
12925 {
12926
12927
12928 return false;
12929 }
12930
12932 {
12933
12934 return false;
12935 }
12936
12939 {
12940 return !GetIsFrozen() &&
IsOpen();
12941 }
12942
12944 {
12945 bool hasParent = false, hasRootAsPlayer = false;
12947
12948 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12949 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12950
12951 if (wwtu || foodDecay)
12952 {
12956
12957 if (processWetness || processTemperature || processDecay)
12958 {
12960
12961 if (processWetness)
12962 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12963
12964 if (processTemperature)
12966
12967 if (processDecay)
12968 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12969 }
12970 }
12971 }
12972
12975 {
12977 }
12978
12980 {
12983
12984 return super.GetTemperatureFreezeThreshold();
12985 }
12986
12988 {
12991
12992 return super.GetTemperatureThawThreshold();
12993 }
12994
12996 {
12999
13000 return super.GetItemOverheatThreshold();
13001 }
13002
13004 {
13006 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13007
13008 return super.GetTemperatureFreezeTime();
13009 }
13010
13012 {
13014 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13015
13016 return super.GetTemperatureThawTime();
13017 }
13018
13023
13025 {
13026 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13027 }
13028
13030 {
13031 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13032 }
13033
13036 {
13038 }
13039
13041 {
13043 }
13044
13046 {
13048 }
13049
13052 {
13053 return null;
13054 }
13055
13058 {
13059 return false;
13060 }
13061
13063 {
13065 {
13068 if (!trg)
13069 {
13071 explosive = this;
13072 }
13073
13074 explosive.PairRemote(trg);
13076
13077 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13078 trg.SetPersistentPairID(persistentID);
13079 explosive.SetPersistentPairID(persistentID);
13080
13081 return true;
13082 }
13083 return false;
13084 }
13085
13088 {
13089 float ret = 1.0;
13092 ret *= GetHealth01();
13093
13094 return ret;
13095 }
13096
13097 #ifdef DEVELOPER
13098 override void SetDebugItem()
13099 {
13100 super.SetDebugItem();
13101 _itemBase = this;
13102 }
13103
13105 {
13106 string text = super.GetDebugText();
13107
13109 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13110
13111 return text;
13112 }
13113 #endif
13114
13116 {
13117 return true;
13118 }
13119
13121
13123
13125 {
13128 }
13129
13130
13138
13154}
13155
13157{
13159 if (entity)
13160 {
13161 bool is_item = entity.IsInherited(
ItemBase);
13162 if (is_item && full_quantity)
13163 {
13166 }
13167 }
13168 else
13169 {
13171 return NULL;
13172 }
13173 return entity;
13174}
13175
13177{
13178 if (item)
13179 {
13180 if (health > 0)
13181 item.SetHealth("", "", health);
13182
13183 if (item.CanHaveTemperature())
13184 {
13186 if (item.CanFreeze())
13187 item.SetFrozen(false);
13188 }
13189
13190 if (item.HasEnergyManager())
13191 {
13192 if (quantity >= 0)
13193 {
13194 item.GetCompEM().SetEnergy0To1(quantity);
13195 }
13196 else
13197 {
13199 }
13200 }
13201 else if (item.IsMagazine())
13202 {
13203 Magazine mag = Magazine.Cast(item);
13204 if (quantity >= 0)
13205 {
13206 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13207 }
13208 else
13209 {
13211 }
13212
13213 }
13214 else
13215 {
13216 if (quantity >= 0)
13217 {
13218 item.SetQuantityNormalized(quantity, false);
13219 }
13220 else
13221 {
13223 }
13224
13225 }
13226 }
13227}
13228
13229#ifdef DEVELOPER
13231#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.