8668{
8670 {
8671 return true;
8672 }
8673};
8674
8676{
8677
8678};
8679
8680
8681
8683{
8687
8689
8692
8693
8694
8695
8696
8705
8711
8716
8721
8742 protected bool m_IsResultOfSplit
8743
8745
8750
8751
8752
8754
8758
8759
8760
8762
8765
8766
8767
8773
8774
8782
8785
8786
8788
8789
8791
8792
8797
8798
8803
8805
8806
8808
8809
8811 {
8816
8817 if (!
g_Game.IsDedicatedServer())
8818 {
8820 {
8822
8824 {
8826 }
8827 }
8828
8831 }
8832
8833 m_OldLocation = null;
8834
8836 {
8838 }
8839
8840 if (ConfigIsExisting("headSelectionsToHide"))
8841 {
8844 }
8845
8847 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8848 {
8850 }
8851
8853
8854 m_IsResultOfSplit = false;
8855
8857 }
8858
8860 {
8861 super.InitItemVariables();
8862
8868 m_Count = ConfigGetInt(
"count");
8869
8872
8877
8880
8885
8897
8901
8902
8905 if (ConfigIsExisting("canBeSplit"))
8906 {
8909 }
8910
8912 if (ConfigIsExisting("itemBehaviour"))
8914
8915
8918 RegisterNetSyncVariableInt("m_VarLiquidType");
8919 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8920
8921 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8922 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8923 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8924
8925 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8926 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8927 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8928 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8929
8930 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8931 RegisterNetSyncVariableBool("m_IsTakeable");
8932 RegisterNetSyncVariableBool("m_IsHologram");
8933
8936 {
8939 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8940 }
8941
8943
8945 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8947
8949 }
8950
8952 {
8954 }
8955
8957 {
8960 {
8965 }
8966 }
8967
8968 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8969 {
8971 {
8974 }
8975
8977 }
8978
8980 {
8986 }
8987
8989
8991 {
8993
8994 if (!action)
8995 {
8996 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8997 return;
8998 }
8999
9001 if (!ai)
9002 {
9004 return;
9005 }
9006
9008 if (!action_array)
9009 {
9010 action_array = new array<ActionBase_Basic>;
9012 }
9013 if (LogManager.IsActionLogEnable())
9014 {
9015 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9016 }
9017
9018 if (action_array.Find(action) != -1)
9019 {
9020 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9021 }
9022 else
9023 {
9024 action_array.Insert(action);
9025 }
9026 }
9027
9029 {
9030 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9031 ActionBase action = player.GetActionManager().GetAction(actionName);
9034
9035 if (action_array)
9036 {
9037 action_array.RemoveItem(action);
9038 }
9039 }
9040
9041
9042
9044 {
9045 ActionOverrideData overrideData = new ActionOverrideData();
9049
9051 if (!actionMap)
9052 {
9055 }
9056
9057 actionMap.Insert(this.
Type(), overrideData);
9058
9059 }
9060
9062
9064
9065
9067 {
9070
9073
9074 string config_to_search = "CfgVehicles";
9075 string muzzle_owner_config;
9076
9078 {
9079 if (IsInherited(Weapon))
9080 config_to_search = "CfgWeapons";
9081
9082 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9083
9084 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9085
9086 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9087
9088 if (config_OnFire_subclass_count > 0)
9089 {
9090 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9091
9092 for (int i = 0; i < config_OnFire_subclass_count; i++)
9093 {
9094 string particle_class = "";
9095 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9096 string config_OnFire_entry = config_OnFire_class + particle_class;
9097 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9098 WPOF_array.Insert(WPOF);
9099 }
9100
9101
9103 }
9104 }
9105
9107 {
9108 config_to_search = "CfgWeapons";
9109 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9110
9111 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9112
9113 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9114
9115 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9116 {
9117 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9118
9119 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9120 {
9121 string particle_class2 = "";
9122 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9123 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9124 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9125 WPOBE_array.Insert(WPOBE);
9126 }
9127
9128
9130 }
9131 }
9132 }
9133
9134
9136 {
9139
9141 {
9142 string config_to_search = "CfgVehicles";
9143
9144 if (IsInherited(Weapon))
9145 config_to_search = "CfgWeapons";
9146
9147 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9148 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9149
9150 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9151 {
9152
9154
9156 {
9158 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9160 return;
9161 }
9162
9165
9166
9167
9168 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9169 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9170
9171 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9172 {
9173 string particle_class = "";
9174 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9175 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9176 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9177
9178 if (entry_type == CT_CLASS)
9179 {
9180 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9181 WPOOH_array.Insert(WPOF);
9182 }
9183 }
9184
9185
9187 }
9188 }
9189 }
9190
9192 {
9194 }
9195
9197 {
9199 {
9201
9204
9207
9208 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9209 }
9210 }
9211
9213 {
9215 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9216
9218 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9219
9221 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9222
9224 {
9226 }
9227 }
9228
9230 {
9232 }
9233
9235 {
9238 else
9240
9242 {
9245 }
9246 else
9247 {
9250
9253 }
9254
9256 }
9257
9259 {
9261 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9262 }
9263
9265 {
9267 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9269 }
9270
9272 {
9274 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9275 }
9276
9278 {
9281
9282 OverheatingParticle OP = new OverheatingParticle();
9287
9289 }
9290
9292 {
9295
9296 return -1;
9297 }
9298
9300 {
9302 {
9305
9306 for (int i = count; i > 0; --i)
9307 {
9308 int id = i - 1;
9311
9314
9315 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9316 {
9317 if (p)
9318 {
9321 }
9322 }
9323 }
9324 }
9325 }
9326
9328 {
9330 {
9332 {
9333 int id = i - 1;
9335
9336 if (OP)
9337 {
9339
9340 if (p)
9341 {
9343 }
9344
9345 delete OP;
9346 }
9347 }
9348
9351 }
9352 }
9353
9356 {
9357 return 0.0;
9358 }
9359
9360
9362 {
9363 return 250;
9364 }
9365
9367 {
9368 return 0;
9369 }
9370
9373 {
9375 return true;
9376
9377 return false;
9378 }
9379
9382 {
9385
9387 {
9389 }
9390 else
9391 {
9392
9394 }
9395
9397 }
9398
9405 {
9406 return -1;
9407 }
9408
9409
9410
9411
9413 {
9415 {
9416 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9417 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9418
9419 if (r_index >= 0)
9420 {
9421 InventoryLocation r_il = new InventoryLocation;
9422 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9423
9424 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9427 {
9428 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9429 }
9431 {
9432 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9433 }
9434
9435 }
9436
9437 player.GetHumanInventory().ClearUserReservedLocation(this);
9438 }
9439
9442 }
9443
9444
9445
9446
9448 {
9449 return ItemBase.m_DebugActionsMask;
9450 }
9451
9453 {
9454 return ItemBase.m_DebugActionsMask & mask;
9455 }
9456
9458 {
9459 ItemBase.m_DebugActionsMask = mask;
9460 }
9461
9463 {
9464 ItemBase.m_DebugActionsMask |= mask;
9465 }
9466
9468 {
9469 ItemBase.m_DebugActionsMask &= ~mask;
9470 }
9471
9473 {
9475 {
9477 }
9478 else
9479 {
9481 }
9482 }
9483
9484
9486 {
9487 if (GetEconomyProfile())
9488 {
9489 float q_max = GetEconomyProfile().GetQuantityMax();
9490 if (q_max > 0)
9491 {
9492 float q_min = GetEconomyProfile().GetQuantityMin();
9493 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9494
9496 {
9497 ComponentEnergyManager comp = GetCompEM();
9499 {
9501 }
9502 }
9504 {
9506
9507 }
9508
9509 }
9510 }
9511 }
9512
9515 {
9516 EntityAI parent = GetHierarchyParent();
9517
9518 if (parent)
9519 {
9520 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9521 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9522 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9523 }
9524 }
9525
9528 {
9529 EntityAI parent = GetHierarchyParent();
9530
9531 if (parent)
9532 {
9533 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9534 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9535 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9536 }
9537 }
9538
9540 {
9541
9542
9543
9544
9546
9548 {
9549 if (ScriptInputUserData.CanStoreInputUserData())
9550 {
9551 ScriptInputUserData ctx = new ScriptInputUserData;
9557 ctx.
Write(use_stack_max);
9560
9562 {
9563 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9564 }
9565 }
9566 }
9567 else if (!
g_Game.IsMultiplayer())
9568 {
9570 }
9571 }
9572
9574 {
9576 }
9577
9579 {
9581 }
9582
9584 {
9586 }
9587
9589 {
9590
9591 return false;
9592 }
9593
9595 {
9596 return false;
9597 }
9598
9602 {
9603 return false;
9604 }
9605
9607 {
9608 return "";
9609 }
9610
9612
9614 {
9615 return false;
9616 }
9617
9619 {
9620 return true;
9621 }
9622
9623
9624
9626 {
9627 return true;
9628 }
9629
9631 {
9632 return true;
9633 }
9634
9636 {
9637 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9639 }
9640
9642 {
9644 }
9645
9647 {
9649 if (!is_being_placed)
9651 SetSynchDirty();
9652 }
9653
9654
9656
9658 {
9660 }
9661
9663 {
9665 }
9666
9668 {
9669 return 1;
9670 }
9671
9673 {
9674 return false;
9675 }
9676
9678 {
9680 SetSynchDirty();
9681 }
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9718 {
9719 super.OnMovedInsideCargo(container);
9720
9721 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9722 }
9723
9724 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9725 {
9726 super.EEItemLocationChanged(oldLoc, newLoc);
9727
9728 PlayerBase newPlayer = null;
9729 PlayerBase oldPlayer = null;
9730
9731 if (newLoc.GetParent())
9732 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9733
9734 if (oldLoc.GetParent())
9735 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9736
9738 {
9739 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9740
9741 if (rIndex >= 0)
9742 {
9743 InventoryLocation rIl = new InventoryLocation;
9744 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9745
9746 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9749 {
9750 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9751 }
9753 {
9755 }
9756
9757 }
9758 }
9759
9761 {
9762 if (newPlayer)
9763 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9764
9765 if (newPlayer == oldPlayer)
9766 {
9767 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9768 {
9770 {
9771 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9772 {
9773 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9774 }
9775 }
9776 else
9777 {
9778 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9779 }
9780 }
9781
9782 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9783 {
9784 int type = oldLoc.GetType();
9786 {
9787 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9788 }
9790 {
9791 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9792 }
9793 }
9794 if (!m_OldLocation)
9795 {
9796 m_OldLocation = new InventoryLocation;
9797 }
9798 m_OldLocation.Copy(oldLoc);
9799 }
9800 else
9801 {
9802 if (m_OldLocation)
9803 {
9804 m_OldLocation.Reset();
9805 }
9806 }
9807
9808 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9809 }
9810 else
9811 {
9812 if (newPlayer)
9813 {
9814 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9815 if (resIndex >= 0)
9816 {
9817 InventoryLocation il = new InventoryLocation;
9818 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9820 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9823 {
9824 il.
GetParent().GetOnReleaseLock().Invoke(it);
9825 }
9827 {
9829 }
9830
9831 }
9832 }
9834 {
9835
9837 }
9838
9839 if (m_OldLocation)
9840 {
9841 m_OldLocation.Reset();
9842 }
9843 }
9844
9846 {
9847 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9848 }
9849
9851 {
9852 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9853 }
9854 }
9855
9856 override void EOnContact(IEntity other, Contact extra)
9857 {
9859 {
9860 int liquidType = -1;
9862 if (impactSpeed > 0.0)
9863 {
9865 #ifndef SERVER
9867 #else
9869 SetSynchDirty();
9870 #endif
9872 }
9873 }
9874
9875 #ifdef SERVER
9876 if (GetCompEM() && GetCompEM().IsPlugged())
9877 {
9878 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9879 GetCompEM().UnplugThis();
9880 }
9881 #endif
9882 }
9883
9885
9887 {
9889 }
9890
9892 {
9893
9894 }
9895
9897 {
9898 super.OnItemLocationChanged(old_owner, new_owner);
9899
9900 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9901 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9902
9903 if (!relatedPlayer && playerNew)
9904 relatedPlayer = playerNew;
9905
9906 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9907 {
9909 if (actionMgr)
9910 {
9911 ActionBase currentAction = actionMgr.GetRunningAction();
9912 if (currentAction)
9914 }
9915 }
9916
9917 Man ownerPlayerOld = null;
9918 Man ownerPlayerNew = null;
9919
9920 if (old_owner)
9921 {
9922 if (old_owner.
IsMan())
9923 {
9924 ownerPlayerOld = Man.Cast(old_owner);
9925 }
9926 else
9927 {
9928 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9929 }
9930 }
9931 else
9932 {
9934 {
9936
9937 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9938 {
9939 GetCompEM().UnplugThis();
9940 }
9941 }
9942 }
9943
9944 if (new_owner)
9945 {
9946 if (new_owner.
IsMan())
9947 {
9948 ownerPlayerNew = Man.Cast(new_owner);
9949 }
9950 else
9951 {
9952 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9953 }
9954 }
9955
9956 if (ownerPlayerOld != ownerPlayerNew)
9957 {
9958 if (ownerPlayerOld)
9959 {
9960 array<EntityAI> subItemsExit = new array<EntityAI>;
9962 for (int i = 0; i < subItemsExit.Count(); i++)
9963 {
9966 }
9967 }
9968
9969 if (ownerPlayerNew)
9970 {
9971 array<EntityAI> subItemsEnter = new array<EntityAI>;
9973 for (int j = 0; j < subItemsEnter.Count(); j++)
9974 {
9977 }
9978 }
9979 }
9980 else if (ownerPlayerNew != null)
9981 {
9982 PlayerBase nplayer;
9983 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9984 {
9985 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9987 for (int k = 0; k < subItemsUpdate.Count(); k++)
9988 {
9990 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9991 }
9992 }
9993 }
9994
9995 if (old_owner)
9996 old_owner.OnChildItemRemoved(this);
9997 if (new_owner)
9998 new_owner.OnChildItemReceived(this);
9999 }
10000
10001
10003 {
10004 super.EEDelete(parent);
10005 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10006 if (player)
10007 {
10009
10010 if (player.IsAlive())
10011 {
10012 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10013 if (r_index >= 0)
10014 {
10015 InventoryLocation r_il = new InventoryLocation;
10016 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10017
10018 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10021 {
10022 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10023 }
10025 {
10026 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10027 }
10028
10029 }
10030
10031 player.RemoveQuickBarEntityShortcut(this);
10032 }
10033 }
10034 }
10035
10037 {
10038 super.EEKilled(killer);
10039
10042 {
10043 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10044 {
10045 if (IsMagazine())
10046 {
10047 if (Magazine.Cast(this).GetAmmoCount() > 0)
10048 {
10050 }
10051 }
10052 else
10053 {
10055 }
10056 }
10057 }
10058 }
10059
10061 {
10062 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10063
10064 super.OnWasAttached(parent, slot_id);
10065
10068
10071 }
10072
10074 {
10075 super.OnWasDetached(parent, slot_id);
10076
10079
10082 }
10083
10085 {
10086 int idx;
10089
10090 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10091 if (inventory_slots.Count() < 1)
10092 {
10093 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10094 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10095 }
10096 else
10097 {
10098 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10099 }
10100
10101 idx = inventory_slots.Find(slot);
10102 if (idx < 0)
10103 return "";
10104
10105 return attach_types.Get(idx);
10106 }
10107
10109 {
10110 int idx = -1;
10111 string slot;
10112
10115
10116 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10117 if (inventory_slots.Count() < 1)
10118 {
10119 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10120 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10121 }
10122 else
10123 {
10124 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10125 if (detach_types.Count() < 1)
10126 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10127 }
10128
10129 for (int i = 0; i < inventory_slots.Count(); i++)
10130 {
10131 slot = inventory_slots.Get(i);
10132 }
10133
10134 if (slot != "")
10135 {
10136 if (detach_types.Count() == 1)
10137 idx = 0;
10138 else
10139 idx = inventory_slots.Find(slot);
10140 }
10141 if (idx < 0)
10142 return "";
10143
10144 return detach_types.Get(idx);
10145 }
10146
10148 {
10149
10151
10152
10153 float min_time = 1;
10154 float max_time = 3;
10155 float delay = Math.RandomFloat(min_time, max_time);
10156
10157 explode_timer.Run(delay, this, "DoAmmoExplosion");
10158 }
10159
10161 {
10162 Magazine magazine = Magazine.Cast(this);
10163 int pop_sounds_count = 6;
10164 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10165
10166
10167 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10168 string sound_name = pop_sounds[ sound_idx ];
10169 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10170
10171
10172 magazine.ServerAddAmmoCount(-1);
10173
10174
10175 float min_temp_to_explode = 100;
10176
10177 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10178 {
10180 }
10181 }
10182
10183
10184 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10185 {
10186 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10187
10188 const int CHANCE_DAMAGE_CARGO = 4;
10189 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10190 const int CHANCE_DAMAGE_NOTHING = 2;
10191
10193 {
10194 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10195 int chances;
10196 int rnd;
10197
10198 if (GetInventory().GetCargo())
10199 {
10200 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10201 rnd = Math.RandomInt(0,chances);
10202
10203 if (rnd < CHANCE_DAMAGE_CARGO)
10204 {
10206 }
10207 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10208 {
10210 }
10211 }
10212 else
10213 {
10214 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10215 rnd = Math.RandomInt(0,chances);
10216
10217 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10218 {
10220 }
10221 }
10222 }
10223 }
10224
10226 {
10227 CargoBase cargo = GetInventory().GetCargo();
10228 if (cargo)
10229 {
10231 if (item_count > 0)
10232 {
10233 int random_pick = Math.RandomInt(0, item_count);
10235 if (!item.IsExplosive())
10236 {
10237 item.AddHealth("","",damage);
10238 return true;
10239 }
10240 }
10241 }
10242 return false;
10243 }
10244
10246 {
10247 GameInventory inventory = GetInventory();
10249 if (attachment_count > 0)
10250 {
10251 int random_pick = Math.RandomInt(0, attachment_count);
10253 if (!attachment.IsExplosive())
10254 {
10255 attachment.AddHealth("","",damage);
10256 return true;
10257 }
10258 }
10259 return false;
10260 }
10261
10263 {
10265 }
10266
10268 {
10270 return GetInventory().CanRemoveEntity();
10271
10272 return false;
10273 }
10274
10276 {
10277
10279 return false;
10280
10281
10283 return false;
10284
10285
10286
10288 if (delta == 0)
10289 return false;
10290
10291
10292 return true;
10293 }
10294
10296 {
10298 {
10299 if (ScriptInputUserData.CanStoreInputUserData())
10300 {
10301 ScriptInputUserData ctx = new ScriptInputUserData;
10306 ctx.
Write(destination_entity);
10308 ctx.
Write(slot_id);
10310 }
10311 }
10312 else if (!
g_Game.IsMultiplayer())
10313 {
10315 }
10316 }
10317
10319 {
10320 float split_quantity_new;
10324 InventoryLocation loc = new InventoryLocation;
10325
10326 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10327 {
10329 split_quantity_new = stack_max;
10330 else
10332
10334 {
10335 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10336 if (new_item)
10337 {
10338 new_item.SetResultOfSplit(true);
10339 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10341 new_item.
SetQuantity(split_quantity_new,
false,
true);
10342 }
10343 }
10344 }
10345 else if (destination_entity && slot_id == -1)
10346 {
10347 if (quantity > stack_max)
10348 split_quantity_new = stack_max;
10349 else
10350 split_quantity_new = quantity;
10351
10353 {
10354 GameInventory destinationInventory = destination_entity.GetInventory();
10356 {
10359 }
10360
10361 if (new_item)
10362 {
10363 new_item.SetResultOfSplit(true);
10364 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10366 new_item.
SetQuantity(split_quantity_new,
false,
true);
10367 }
10368 }
10369 }
10370 else
10371 {
10372 if (stack_max != 0)
10373 {
10375 {
10377 }
10378
10379 if (split_quantity_new == 0)
10380 {
10381 if (!
g_Game.IsMultiplayer())
10382 player.PhysicalPredictiveDropItem(this);
10383 else
10384 player.ServerDropEntity(this);
10385 return;
10386 }
10387
10389 {
10391
10392 if (new_item)
10393 {
10394 new_item.SetResultOfSplit(true);
10395 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10398 new_item.PlaceOnSurface();
10399 }
10400 }
10401 }
10402 }
10403 }
10404
10406 {
10407 float split_quantity_new;
10411 InventoryLocation loc = new InventoryLocation;
10412
10413 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10414 {
10416 split_quantity_new = stack_max;
10417 else
10419
10421 {
10422 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10423 if (new_item)
10424 {
10425 new_item.SetResultOfSplit(true);
10426 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10428 new_item.
SetQuantity(split_quantity_new,
false,
true);
10429 }
10430 }
10431 }
10432 else if (destination_entity && slot_id == -1)
10433 {
10434 if (quantity > stack_max)
10435 split_quantity_new = stack_max;
10436 else
10437 split_quantity_new = quantity;
10438
10440 {
10441 GameInventory destinationInventory = destination_entity.GetInventory();
10443 {
10446 }
10447
10448 if (new_item)
10449 {
10450 new_item.SetResultOfSplit(true);
10451 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10453 new_item.
SetQuantity(split_quantity_new,
false,
true);
10454 }
10455 }
10456 }
10457 else
10458 {
10459 if (stack_max != 0)
10460 {
10462 {
10464 }
10465
10467 {
10469
10470 if (new_item)
10471 {
10472 new_item.SetResultOfSplit(true);
10473 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10476 new_item.PlaceOnSurface();
10477 }
10478 }
10479 }
10480 }
10481 }
10482
10484 {
10486 {
10487 if (ScriptInputUserData.CanStoreInputUserData())
10488 {
10489 ScriptInputUserData ctx = new ScriptInputUserData;
10494 dst.WriteToContext(ctx);
10496 }
10497 }
10498 else if (!
g_Game.IsMultiplayer())
10499 {
10501 }
10502 }
10503
10505 {
10507 {
10508 if (ScriptInputUserData.CanStoreInputUserData())
10509 {
10510 ScriptInputUserData ctx = new ScriptInputUserData;
10515 ctx.
Write(destination_entity);
10521 }
10522 }
10523 else if (!
g_Game.IsMultiplayer())
10524 {
10526 }
10527 }
10528
10530 {
10532 }
10533
10535 {
10537 float split_quantity_new;
10539 if (dst.IsValid())
10540 {
10541 int slot_id = dst.GetSlot();
10543
10544 if (quantity > stack_max)
10545 split_quantity_new = stack_max;
10546 else
10547 split_quantity_new = quantity;
10548
10550 {
10552
10553 if (new_item)
10554 {
10555 new_item.SetResultOfSplit(true);
10556 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10558 new_item.
SetQuantity(split_quantity_new,
false,
true);
10559 }
10560
10561 return new_item;
10562 }
10563 }
10564
10565 return null;
10566 }
10567
10569 {
10571 float split_quantity_new;
10573 if (destination_entity)
10574 {
10576 if (quantity > stackable)
10577 split_quantity_new = stackable;
10578 else
10579 split_quantity_new = quantity;
10580
10582 {
10583 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10584 if (new_item)
10585 {
10586 new_item.SetResultOfSplit(true);
10587 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10589 new_item.
SetQuantity(split_quantity_new,
false,
true);
10590 }
10591 }
10592 }
10593 }
10594
10596 {
10598 {
10599 if (ScriptInputUserData.CanStoreInputUserData())
10600 {
10601 ScriptInputUserData ctx = new ScriptInputUserData;
10606 ItemBase destination_entity =
this;
10607 ctx.
Write(destination_entity);
10611 }
10612 }
10613 else if (!
g_Game.IsMultiplayer())
10614 {
10616 }
10617 }
10618
10620 {
10622 float split_quantity_new;
10624 if (player)
10625 {
10627 if (quantity > stackable)
10628 split_quantity_new = stackable;
10629 else
10630 split_quantity_new = quantity;
10631
10633 {
10634 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10635 new_item =
ItemBase.Cast(in_hands);
10636 if (new_item)
10637 {
10638 new_item.SetResultOfSplit(true);
10639 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10641 new_item.SetQuantity(split_quantity_new, false, true);
10642 }
10643 }
10644 }
10645 }
10646
10648 {
10650 float split_quantity_new = Math.Floor(quantity * 0.5);
10651
10653 return;
10654
10656
10657 if (new_item)
10658 {
10659 if (new_item.GetQuantityMax() < split_quantity_new)
10660 {
10661 split_quantity_new = new_item.GetQuantityMax();
10662 }
10663
10664 new_item.SetResultOfSplit(true);
10665 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10666
10668 {
10671 }
10672 else
10673 {
10675 new_item.
SetQuantity(split_quantity_new,
false,
true);
10676 }
10677 }
10678 }
10679
10681 {
10683 float split_quantity_new = Math.Floor(quantity / 2);
10684
10686 return;
10687
10688 InventoryLocation invloc = new InventoryLocation;
10690
10692 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10693
10694 if (new_item)
10695 {
10696 if (new_item.GetQuantityMax() < split_quantity_new)
10697 {
10698 split_quantity_new = new_item.GetQuantityMax();
10699 }
10701 {
10704 }
10705 else if (split_quantity_new > 1)
10706 {
10708 new_item.
SetQuantity(split_quantity_new,
false,
true);
10709 }
10710 }
10711 }
10712
10715 {
10716 SetWeightDirty();
10718
10719 if (parent)
10720 parent.OnAttachmentQuantityChangedEx(this, delta);
10721
10723 {
10725 {
10727 }
10729 {
10730 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10732 }
10733 }
10734 }
10735
10738 {
10739
10740 }
10741
10744 {
10746 }
10747
10749 {
10750 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10751
10753 {
10754 if (newLevel == GameConstants.STATE_RUINED)
10755 {
10757 EntityAI parent = GetHierarchyParent();
10758 if (parent && parent.IsFireplace())
10759 {
10760 CargoBase cargo = GetInventory().GetCargo();
10761 if (cargo)
10762 {
10764 {
10766 }
10767 }
10768 }
10769 }
10770
10772 {
10773
10775 return;
10776 }
10777
10778 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10779 {
10781 }
10782 }
10783 }
10784
10785
10787 {
10788 super.OnRightClick();
10789
10791 {
10793 {
10794 if (ScriptInputUserData.CanStoreInputUserData())
10795 {
10796 EntityAI root = GetHierarchyRoot();
10797 Man playerOwner = GetHierarchyRootPlayer();
10798 InventoryLocation dst = new InventoryLocation;
10799
10800
10801 if (!playerOwner && root && root == this)
10802 {
10804 }
10805 else
10806 {
10807
10808 GetInventory().GetCurrentInventoryLocation(dst);
10810 {
10811 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10813 {
10815 }
10816 else
10817 {
10819
10820
10821 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10822 {
10824 }
10825 else
10826 {
10827 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10828 }
10829 }
10830 }
10831 }
10832
10833 ScriptInputUserData ctx = new ScriptInputUserData;
10841 }
10842 }
10843 else if (!
g_Game.IsMultiplayer())
10844 {
10846 }
10847 }
10848 }
10849
10851 {
10852 if (root)
10853 {
10854 vector m4[4];
10855 root.GetTransform(m4);
10856 dst.SetGround(this, m4);
10857 }
10858 else
10859 {
10860 GetInventory().GetCurrentInventoryLocation(dst);
10861 }
10862 }
10863
10864 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10865 {
10866
10867 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10868 return false;
10869
10870 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10871 return false;
10872
10873
10875 return false;
10876
10877
10878 Magazine mag = Magazine.Cast(this);
10879 if (mag)
10880 {
10881 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10882 return false;
10883
10884 if (stack_max_limit)
10885 {
10886 Magazine other_mag = Magazine.Cast(other_item);
10887 if (other_item)
10888 {
10889 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10890 return false;
10891 }
10892
10893 }
10894 }
10895 else
10896 {
10897
10899 return false;
10900
10902 return false;
10903 }
10904
10905 PlayerBase player = null;
10906 if (CastTo(player, GetHierarchyRootPlayer()))
10907 {
10908 if (player.GetInventory().HasAttachment(this))
10909 return false;
10910
10911 if (player.IsItemsToDelete())
10912 return false;
10913 }
10914
10915 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10916 return false;
10917
10918 int slotID;
10920 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10921 return false;
10922
10923 return true;
10924 }
10925
10927 {
10929 }
10930
10932 {
10933 return m_IsResultOfSplit;
10934 }
10935
10937 {
10938 m_IsResultOfSplit = value;
10939 }
10940
10942 {
10944 }
10945
10947 {
10948 float other_item_quantity = other_item.GetQuantity();
10949 float this_free_space;
10950
10952
10954
10955 if (other_item_quantity > this_free_space)
10956 {
10957 return this_free_space;
10958 }
10959 else
10960 {
10961 return other_item_quantity;
10962 }
10963 }
10964
10966 {
10968 }
10969
10971 {
10973 return;
10974
10975 if (!IsMagazine() && other_item)
10976 {
10978 if (quantity_used != 0)
10979 {
10980 float hp1 = GetHealth01("","");
10981 float hp2 = other_item.GetHealth01("","");
10982 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10983 hpResult = hpResult / (
GetQuantity() + quantity_used);
10984
10985 hpResult *= GetMaxHealth();
10986 Math.Round(hpResult);
10987 SetHealth("", "Health", hpResult);
10988
10990 other_item.AddQuantity(-quantity_used);
10991 }
10992 }
10994 }
10995
10997 {
10998 #ifdef SERVER
10999 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11000 GetHierarchyParent().IncreaseLifetimeUp();
11001 #endif
11002 };
11003
11005 {
11006 PlayerBase p = PlayerBase.Cast(player);
11007
11008 array<int> recipesIds = p.m_Recipes;
11009 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11010 if (moduleRecipesManager)
11011 {
11012 EntityAI itemInHands = player.GetEntityInHands();
11013 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11014 }
11015
11016 for (int i = 0;i < recipesIds.Count(); i++)
11017 {
11018 int key = recipesIds.Get(i);
11019 string recipeName = moduleRecipesManager.GetRecipeName(key);
11021 }
11022 }
11023
11024
11025 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11026 {
11027 super.GetDebugActions(outputList);
11028
11029
11035
11036
11041
11046
11047
11051
11052
11054 {
11058 }
11059
11062
11063
11067
11069
11070 InventoryLocation loc = new InventoryLocation();
11071 GetInventory().GetCurrentInventoryLocation(loc);
11073 {
11074 if (Gizmo_IsSupported())
11077 }
11078
11080 }
11081
11082
11083
11084
11086 {
11087 super.OnAction(action_id, player, ctx);
11088
11090 {
11091 switch (action_id)
11092 {
11096 return true;
11100 return true;
11101 }
11102 }
11103
11105 {
11106 switch (action_id)
11107 {
11109 Delete();
11110 return true;
11111 }
11112 }
11113
11114 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11115 {
11116 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11117 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11118 PlayerBase p = PlayerBase.Cast(player);
11119 if (
EActions.RECIPES_RANGE_START < 1000)
11120 {
11121 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11122 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11123 }
11124 }
11125 #ifndef SERVER
11126 else if (action_id ==
EActions.WATCH_PLAYER)
11127 {
11128 PluginDeveloper.SetDeveloperItemClientEx(player);
11129 }
11130 #endif
11132 {
11133 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11134 {
11135 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11136 OnDebugButtonPressServer(id + 1);
11137 }
11138
11139 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11140 {
11141 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11143 }
11144
11145 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11146 {
11147 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11149 }
11150
11151 else if (action_id ==
EActions.ADD_QUANTITY)
11152 {
11153 if (IsMagazine())
11154 {
11155 Magazine mag = Magazine.Cast(this);
11156 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11157 }
11158 else
11159 {
11161 }
11162
11163 if (m_EM)
11164 {
11165 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11166 }
11167
11168 }
11169
11170 else if (action_id ==
EActions.REMOVE_QUANTITY)
11171 {
11172 if (IsMagazine())
11173 {
11174 Magazine mag2 = Magazine.Cast(this);
11175 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11176 }
11177 else
11178 {
11180 }
11181 if (m_EM)
11182 {
11183 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11184 }
11185
11186 }
11187
11188 else if (action_id ==
EActions.SET_QUANTITY_0)
11189 {
11191
11192 if (m_EM)
11193 {
11194 m_EM.SetEnergy(0);
11195 }
11196 }
11197
11198 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11199 {
11201
11202 if (m_EM)
11203 {
11204 m_EM.SetEnergy(m_EM.GetEnergyMax());
11205 }
11206 }
11207
11208 else if (action_id ==
EActions.ADD_HEALTH)
11209 {
11210 AddHealth("","",GetMaxHealth("","Health")/5);
11211 }
11212 else if (action_id ==
EActions.REMOVE_HEALTH)
11213 {
11214 AddHealth("","",-GetMaxHealth("","Health")/5);
11215 }
11216 else if (action_id ==
EActions.DESTROY_HEALTH)
11217 {
11218 SetHealth01("","",0);
11219 }
11220 else if (action_id ==
EActions.WATCH_ITEM)
11221 {
11223 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11224 #ifdef DEVELOPER
11225 SetDebugDeveloper_item(this);
11226 #endif
11227 }
11228
11229 else if (action_id ==
EActions.ADD_TEMPERATURE)
11230 {
11231 AddTemperature(20);
11232
11233 }
11234
11235 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11236 {
11237 AddTemperature(-20);
11238
11239 }
11240
11241 else if (action_id ==
EActions.FLIP_FROZEN)
11242 {
11243 SetFrozen(!GetIsFrozen());
11244
11245 }
11246
11247 else if (action_id ==
EActions.ADD_WETNESS)
11248 {
11250
11251 }
11252
11253 else if (action_id ==
EActions.REMOVE_WETNESS)
11254 {
11256
11257 }
11258
11259 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11260 {
11263
11264
11265 }
11266
11267 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11268 {
11271 }
11272
11273 else if (action_id ==
EActions.MAKE_SPECIAL)
11274 {
11275 auto debugParams = DebugSpawnParams.WithPlayer(player);
11276 OnDebugSpawnEx(debugParams);
11277 }
11278
11279 }
11280
11281
11282 return false;
11283 }
11284
11285
11286
11287
11291
11294
11295
11296
11298 {
11299 return false;
11300 }
11301
11302
11304 {
11305 return true;
11306 }
11307
11308
11310 {
11311 return true;
11312 }
11313
11314
11315
11317 {
11318 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11319 return g_Game.ConfigIsExisting(config_path);
11320 }
11321
11324 {
11325 return null;
11326 }
11327
11329 {
11330 return false;
11331 }
11332
11334 {
11335 return false;
11336 }
11337
11341
11342
11344 {
11345 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11346 return module_repairing.CanRepair(this, item_repair_kit);
11347 }
11348
11349
11350 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11351 {
11352 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11353 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11354 }
11355
11356
11358 {
11359
11360
11361
11362
11363
11364
11365
11366
11367 return 1;
11368 }
11369
11370
11371
11373 {
11375 }
11376
11377
11378
11380 {
11382 }
11383
11384
11393 {
11394 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11395
11396 if (player)
11397 {
11398 player.MessageStatus(text);
11399 }
11400 }
11401
11402
11411 {
11412 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11413
11414 if (player)
11415 {
11416 player.MessageAction(text);
11417 }
11418 }
11419
11420
11429 {
11430 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11431
11432 if (player)
11433 {
11434 player.MessageFriendly(text);
11435 }
11436 }
11437
11438
11447 {
11448 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11449
11450 if (player)
11451 {
11452 player.MessageImportant(text);
11453 }
11454 }
11455
11457 {
11458 return true;
11459 }
11460
11461
11462 override bool KindOf(
string tag)
11463 {
11464 bool found = false;
11465 string item_name = this.
GetType();
11467 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11468
11469 int array_size = item_tag_array.Count();
11470 for (int i = 0; i < array_size; i++)
11471 {
11472 if (item_tag_array.Get(i) == tag)
11473 {
11474 found = true;
11475 break;
11476 }
11477 }
11478 return found;
11479 }
11480
11481
11483 {
11484
11485 super.OnRPC(sender, rpc_type,ctx);
11486
11487
11488 switch (rpc_type)
11489 {
11490 #ifndef SERVER
11491 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11492 Param2<bool, string> p = new Param2<bool, string>(false, "");
11493
11495 return;
11496
11497 bool play = p.param1;
11498 string soundSet = p.param2;
11499
11500 if (play)
11501 {
11503 {
11505 {
11507 }
11508 }
11509 else
11510 {
11512 }
11513 }
11514 else
11515 {
11517 }
11518
11519 break;
11520 #endif
11521
11522 }
11523
11525 {
11527 }
11528 }
11529
11530
11531
11532
11534 {
11535 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11536 return plugin.GetID(
name);
11537 }
11538
11540 {
11541 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11542 return plugin.GetName(id);
11543 }
11544
11547 {
11548
11549
11550 int varFlags;
11551 if (!ctx.
Read(varFlags))
11552 return;
11553
11554 if (varFlags & ItemVariableFlags.FLOAT)
11555 {
11557 }
11558 }
11559
11561 {
11562
11563 super.SerializeNumericalVars(floats_out);
11564
11565
11566
11568 {
11570 }
11571
11573 {
11575 }
11576
11578 {
11580 }
11581
11583 {
11588 }
11589
11591 {
11593 }
11594 }
11595
11597 {
11598
11599 super.DeSerializeNumericalVars(floats);
11600
11601
11602 int index = 0;
11603 int mask = Math.Round(floats.Get(index));
11604
11605 index++;
11606
11608 {
11610 {
11612 }
11613 else
11614 {
11615 float quantity = floats.Get(index);
11616 SetQuantity(quantity,
true,
false,
false,
false);
11617 }
11618 index++;
11619 }
11620
11622 {
11623 float wet = floats.Get(index);
11625 index++;
11626 }
11627
11629 {
11630 int liquidtype = Math.Round(floats.Get(index));
11632 index++;
11633 }
11634
11636 {
11638 index++;
11640 index++;
11642 index++;
11644 index++;
11645 }
11646
11648 {
11649 int cleanness = Math.Round(floats.Get(index));
11651 index++;
11652 }
11653 }
11654
11656 {
11657 super.WriteVarsToCTX(ctx);
11658
11659
11661 {
11663 }
11664
11666 {
11668 }
11669
11671 {
11673 }
11674
11676 {
11677 int r,g,b,a;
11683 }
11684
11686 {
11688 }
11689 }
11690
11692 {
11693 if (!super.ReadVarsFromCTX(ctx,version))
11694 return false;
11695
11696 int intValue;
11697 float value;
11698
11699 if (version < 140)
11700 {
11701 if (!ctx.
Read(intValue))
11702 return false;
11703
11704 m_VariablesMask = intValue;
11705 }
11706
11708 {
11709 if (!ctx.
Read(value))
11710 return false;
11711
11713 {
11715 }
11716 else
11717 {
11719 }
11720 }
11721
11722 if (version < 140)
11723 {
11725 {
11726 if (!ctx.
Read(value))
11727 return false;
11728 SetTemperatureDirect(value);
11729 }
11730 }
11731
11733 {
11734 if (!ctx.
Read(value))
11735 return false;
11737 }
11738
11740 {
11741 if (!ctx.
Read(intValue))
11742 return false;
11744 }
11745
11747 {
11748 int r,g,b,a;
11750 return false;
11752 return false;
11754 return false;
11756 return false;
11757
11759 }
11760
11762 {
11763 if (!ctx.
Read(intValue))
11764 return false;
11766 }
11767
11768 if (version >= 138 && version < 140)
11769 {
11771 {
11772 if (!ctx.
Read(intValue))
11773 return false;
11774 SetFrozen(intValue);
11775 }
11776 }
11777
11778 return true;
11779 }
11780
11781
11783 {
11786 {
11788 }
11789
11790 if (!super.OnStoreLoad(ctx, version))
11791 {
11793 return false;
11794 }
11795
11796 if (version >= 114)
11797 {
11798 bool hasQuickBarIndexSaved;
11799
11800 if (!ctx.
Read(hasQuickBarIndexSaved))
11801 {
11803 return false;
11804 }
11805
11806 if (hasQuickBarIndexSaved)
11807 {
11808 int itmQBIndex;
11809
11810
11811 if (!ctx.
Read(itmQBIndex))
11812 {
11814 return false;
11815 }
11816
11817 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11818 if (itmQBIndex != -1 && parentPlayer)
11819 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11820 }
11821 }
11822 else
11823 {
11824
11825 PlayerBase player;
11826 int itemQBIndex;
11827 if (version ==
int.
MAX)
11828 {
11829 if (!ctx.
Read(itemQBIndex))
11830 {
11832 return false;
11833 }
11834 }
11835 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11836 {
11837
11838 if (!ctx.
Read(itemQBIndex))
11839 {
11841 return false;
11842 }
11843 if (itemQBIndex != -1 && player)
11844 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11845 }
11846 }
11847
11848 if (version < 140)
11849 {
11850
11851 if (!LoadVariables(ctx, version))
11852 {
11854 return false;
11855 }
11856 }
11857
11858
11860 {
11862 return false;
11863 }
11864 if (version >= 132)
11865 {
11867 if (raib)
11868 {
11870 {
11872 return false;
11873 }
11874 }
11875 }
11876
11878 return true;
11879 }
11880
11881
11882
11884 {
11885 super.OnStoreSave(ctx);
11886
11887 PlayerBase player;
11888 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11889 {
11891
11892 int itemQBIndex = -1;
11893 itemQBIndex = player.FindQuickBarEntityIndex(this);
11894 ctx.
Write(itemQBIndex);
11895 }
11896 else
11897 {
11899 }
11900
11902
11904 if (raib)
11905 {
11907 }
11908 }
11909
11910
11912 {
11913 super.AfterStoreLoad();
11914
11916 {
11918 }
11919
11921 {
11924 }
11925 }
11926
11928 {
11929 super.EEOnAfterLoad();
11930
11932 {
11934 }
11935
11938 }
11939
11941 {
11942 return false;
11943 }
11944
11945
11946
11948 {
11950 {
11951 #ifdef PLATFORM_CONSOLE
11952
11954 {
11956 if (menu)
11957 {
11959 }
11960 }
11961 #endif
11962 }
11963
11965 {
11968 }
11969
11971 {
11972 SetWeightDirty();
11974 }
11976 {
11979 }
11980
11982 {
11985
11988 }
11990 {
11994 }
11995
11996 super.OnVariablesSynchronized();
11997 }
11998
11999
12000
12002 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12003 {
12004 if (!IsServerCheck(allow_client))
12005 return false;
12006
12008 return false;
12009
12012
12013 if (value <= (min + 0.001))
12014 value = min;
12015
12016 if (value == min)
12017 {
12018 if (destroy_config)
12019 {
12020 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12021 if (dstr)
12022 {
12024 this.Delete();
12025 return true;
12026 }
12027 }
12028 else if (destroy_forced)
12029 {
12031 this.Delete();
12032 return true;
12033 }
12034
12036 }
12037
12040
12042 {
12043 EntityAI parent = GetHierarchyRoot();
12044 InventoryLocation iLoc = new InventoryLocation();
12045 GetInventory().GetCurrentInventoryLocation(iLoc);
12047 {
12048 int iLocSlot = iLoc.
GetSlot();
12050 {
12052 }
12054 {
12056 }
12057 }
12058 }
12059
12061 {
12063
12064 if (delta)
12066 }
12067
12069
12070 return false;
12071 }
12072
12073
12075 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12076 {
12078 }
12079
12081 {
12084 }
12085
12087 {
12090 }
12091
12093 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12094 {
12095 float value_clamped = Math.Clamp(value, 0, 1);
12097 SetQuantity(result, destroy_config, destroy_forced);
12098 }
12099
12100
12103 {
12105 }
12106
12108 {
12110 }
12111
12112
12113
12114
12115
12116
12117
12118
12119
12120
12122 {
12123 int slot = -1;
12124 GameInventory inventory = GetInventory();
12125 if (inventory)
12126 {
12127 InventoryLocation il = new InventoryLocation;
12130 }
12131
12133 }
12134
12136 {
12137 float quantity_max = 0;
12138
12140 {
12141 if (attSlotID != -1)
12142 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12143
12144 if (quantity_max <= 0)
12146 }
12147
12148 if (quantity_max <= 0)
12150
12151 return quantity_max;
12152 }
12153
12155 {
12157 }
12158
12160 {
12162 }
12163
12164
12166 {
12168 }
12169
12171 {
12173 }
12174
12176 {
12178 }
12179
12180
12182 {
12183
12184 float weightEx = GetWeightEx();
12185 float special = GetInventoryAndCargoWeight();
12186 return weightEx - special;
12187 }
12188
12189
12191 {
12193 }
12194
12196 {
12198 {
12199 #ifdef DEVELOPER
12200 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12201 {
12202 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12204 }
12205 #endif
12206
12207 return GetQuantity() * GetConfigWeightModified();
12208 }
12209 else if (HasEnergyManager())
12210 {
12211 #ifdef DEVELOPER
12212 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12213 {
12214 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12215 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12216 }
12217 #endif
12218 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12219 }
12220 else
12221 {
12222 #ifdef DEVELOPER
12223 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12224 {
12225 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12226 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12227 }
12228 #endif
12229 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12230 }
12231 }
12232
12235 {
12236 int item_count = 0;
12238
12239 GameInventory inventory = GetInventory();
12240 CargoBase cargo = inventory.
GetCargo();
12241 if (cargo != NULL)
12242 {
12244 }
12245
12247 for (int i = 0; i < nAttachments; ++i)
12248 {
12250 if (item)
12251 item_count += item.GetNumberOfItems();
12252 }
12253 return item_count;
12254 }
12255
12258 {
12259 float weight = 0;
12260 float wetness = 1;
12261 if (include_wetness)
12264 {
12265 weight = wetness * m_ConfigWeight;
12266 }
12268 {
12269 weight = 1;
12270 }
12271 return weight;
12272 }
12273
12274
12275
12277 {
12278 GameInventory inventory = GetInventory();
12279 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12280 {
12281 array<EntityAI> items = new array<EntityAI>;
12283 for (int i = 0; i < items.Count(); ++i)
12284 {
12286 if (item)
12287 {
12288 g_Game.ObjectDelete(item);
12289 }
12290 }
12291 }
12292 }
12293
12294
12295
12296
12298 {
12299 float energy = 0;
12300 if (HasEnergyManager())
12301 {
12302 energy = GetCompEM().GetEnergy();
12303 }
12304 return energy;
12305 }
12306
12307
12309 {
12310 super.OnEnergyConsumed();
12311
12313 }
12314
12316 {
12317 super.OnEnergyAdded();
12318
12320 }
12321
12322
12324 {
12325 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12326 {
12328 {
12329 float energy_0to1 = GetCompEM().GetEnergy0To1();
12331 }
12332 }
12333 }
12334
12335
12337 {
12338 return ConfigGetFloat("heatIsolation");
12339 }
12340
12342 {
12344 }
12345
12347 {
12348 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12349 if (
g_Game.ConfigIsExisting(paramPath))
12350 return g_Game.ConfigGetFloat(paramPath);
12351
12352 return 0.0;
12353 }
12354
12356 {
12357 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12358 if (
g_Game.ConfigIsExisting(paramPath))
12359 return g_Game.ConfigGetFloat(paramPath);
12360
12361 return 0.0;
12362 }
12363
12364 override void SetWet(
float value,
bool allow_client =
false)
12365 {
12366 if (!IsServerCheck(allow_client))
12367 return;
12368
12371
12373
12374 m_VarWet = Math.Clamp(value, min, max);
12375
12377 {
12380 }
12381 }
12382
12383 override void AddWet(
float value)
12384 {
12386 }
12387
12389 {
12391 }
12392
12394 {
12396 }
12397
12399 {
12401 }
12402
12404 {
12406 }
12407
12409 {
12411 }
12412
12413 override void OnWetChanged(
float newVal,
float oldVal)
12414 {
12417 if (newLevel != oldLevel)
12418 {
12420 }
12421 }
12422
12424 {
12425 SetWeightDirty();
12426 }
12427
12429 {
12430 return GetWetLevelInternal(
m_VarWet);
12431 }
12432
12433
12434
12436 {
12438 }
12439
12441 {
12443 }
12444
12446 {
12448 }
12449
12451 {
12453 }
12454
12455
12456
12458 {
12459 if (ConfigIsExisting("itemModelLength"))
12460 {
12461 return ConfigGetFloat("itemModelLength");
12462 }
12463 return 0;
12464 }
12465
12467 {
12468 if (ConfigIsExisting("itemAttachOffset"))
12469 {
12470 return ConfigGetFloat("itemAttachOffset");
12471 }
12472 return 0;
12473 }
12474
12475 override void SetCleanness(
int value,
bool allow_client =
false)
12476 {
12477 if (!IsServerCheck(allow_client))
12478 return;
12479
12481
12483
12486 }
12487
12489 {
12491 }
12492
12494 {
12495 return true;
12496 }
12497
12498
12499
12500
12502 {
12504 }
12505
12507 {
12509 }
12510
12511
12512
12513
12514 override void SetColor(
int r,
int g,
int b,
int a)
12515 {
12521 }
12523 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12524 {
12529 }
12530
12532 {
12534 }
12535
12538 {
12539 int r,g,b,a;
12541 r = r/255;
12542 g = g/255;
12543 b = b/255;
12544 a = a/255;
12545 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12546 }
12547
12548
12549
12550 override void SetLiquidType(
int value,
bool allow_client =
false)
12551 {
12552 if (!IsServerCheck(allow_client))
12553 return;
12554
12559 }
12560
12562 {
12563 return ConfigGetInt("varLiquidTypeInit");
12564 }
12565
12567 {
12569 }
12570
12572 {
12574 SetFrozen(false);
12575 }
12576
12579 {
12580 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12581 }
12582
12583
12586 {
12587 PlayerBase nplayer;
12588 if (PlayerBase.CastTo(nplayer, player))
12589 {
12591 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12592 }
12593 }
12594
12595
12598 {
12599 PlayerBase nplayer;
12600 if (PlayerBase.CastTo(nplayer,player))
12601 {
12602 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12603 }
12604
12605 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12606
12607 if (HasEnergyManager())
12608 {
12609 GetCompEM().UpdatePlugState();
12610 }
12611 }
12612
12613
12615 {
12616 super.OnPlacementStarted(player);
12617
12619 }
12620
12621 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12622 {
12624 {
12625 m_AdminLog.OnPlacementComplete(player,
this);
12626 }
12627
12628 super.OnPlacementComplete(player, position, orientation);
12629 }
12630
12631
12632
12633
12634
12636 {
12638 {
12639 return true;
12640 }
12641 else
12642 {
12643 return false;
12644 }
12645 }
12646
12647
12649 {
12651 {
12653 }
12654 }
12655
12656
12658 {
12660 }
12661
12663 {
12665 }
12666
12667 override void InsertAgent(
int agent,
float count = 1)
12668 {
12669 if (count < 1)
12670 return;
12671
12673 }
12674
12677 {
12679 }
12680
12681
12683 {
12685 }
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12729 {
12731 return false;
12732 return true;
12733 }
12734
12736 {
12737
12739 }
12740
12741
12744 {
12745 super.CheckForRoofLimited(timeTresholdMS);
12746
12747 float time =
g_Game.GetTime();
12748 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12749 {
12750 m_PreviousRoofTestTime = time;
12751 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12752 }
12753 }
12754
12755
12757 {
12759 {
12760 return 0;
12761 }
12762
12763 if (GetInventory().GetAttachmentSlotsCount() != 0)
12764 {
12765 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12766 if (filter)
12767 return filter.GetProtectionLevel(type, false, system);
12768 else
12769 return 0;
12770 }
12771
12772 string subclassPath, entryName;
12773
12774 switch (type)
12775 {
12777 entryName = "biological";
12778 break;
12780 entryName = "chemical";
12781 break;
12782 default:
12783 entryName = "biological";
12784 break;
12785 }
12786
12787 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12788
12789 return g_Game.ConfigGetFloat(subclassPath + entryName);
12790 }
12791
12792
12793
12796 {
12797 if (!IsMagazine())
12799
12801 }
12802
12803
12804
12805
12806
12811 {
12812 return true;
12813 }
12814
12816 {
12818 }
12819
12820
12821
12822
12823
12825 {
12826 if (parent)
12827 {
12828 if (parent.IsInherited(DayZInfected))
12829 return true;
12830
12831 if (!parent.IsRuined())
12832 return true;
12833 }
12834
12835 return true;
12836 }
12837
12839 {
12840 if (!super.CanPutAsAttachment(parent))
12841 {
12842 return false;
12843 }
12844
12845 if (!IsRuined() && !parent.IsRuined())
12846 {
12847 return true;
12848 }
12849
12850 return false;
12851 }
12852
12854 {
12855
12856
12857
12858
12859 return super.CanReceiveItemIntoCargo(item);
12860 }
12861
12863 {
12864
12865
12866
12867
12868 GameInventory attachmentInv = attachment.GetInventory();
12870 {
12871 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12872 return false;
12873 }
12874
12875 InventoryLocation loc = new InventoryLocation();
12876 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12877 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12878 return false;
12879
12880 return super.CanReceiveAttachment(attachment, slotId);
12881 }
12882
12884 {
12885 if (!super.CanReleaseAttachment(attachment))
12886 return false;
12887
12888 return GetInventory().AreChildrenAccessible();
12889 }
12890
12891
12892
12893
12894
12895
12896
12897
12898
12899
12900
12901
12902
12903
12904
12905
12906
12907
12908
12909
12910
12912 {
12913 int id = muzzle_owner.GetMuzzleID();
12914 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12915
12916 if (WPOF_array)
12917 {
12918 for (int i = 0; i < WPOF_array.Count(); i++)
12919 {
12920 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12921
12922 if (WPOF)
12923 {
12924 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12925 }
12926 }
12927 }
12928 }
12929
12930
12932 {
12933 int id = muzzle_owner.GetMuzzleID();
12935
12936 if (WPOBE_array)
12937 {
12938 for (int i = 0; i < WPOBE_array.Count(); i++)
12939 {
12940 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12941
12942 if (WPOBE)
12943 {
12944 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12945 }
12946 }
12947 }
12948 }
12949
12950
12952 {
12953 int id = muzzle_owner.GetMuzzleID();
12954 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12955
12956 if (WPOOH_array)
12957 {
12958 for (int i = 0; i < WPOOH_array.Count(); i++)
12959 {
12960 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12961
12962 if (WPOOH)
12963 {
12964 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12965 }
12966 }
12967 }
12968 }
12969
12970
12972 {
12973 int id = muzzle_owner.GetMuzzleID();
12974 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12975
12976 if (WPOOH_array)
12977 {
12978 for (int i = 0; i < WPOOH_array.Count(); i++)
12979 {
12980 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12981
12982 if (WPOOH)
12983 {
12984 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12985 }
12986 }
12987 }
12988 }
12989
12990
12992 {
12993 int id = muzzle_owner.GetMuzzleID();
12994 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12995
12996 if (WPOOH_array)
12997 {
12998 for (int i = 0; i < WPOOH_array.Count(); i++)
12999 {
13000 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13001
13002 if (WPOOH)
13003 {
13004 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13005 }
13006 }
13007 }
13008 }
13009
13010
13011
13013 {
13015 {
13016 return true;
13017 }
13018
13019 return false;
13020 }
13021
13023 {
13025 {
13026 return true;
13027 }
13028
13029 return false;
13030 }
13031
13033 {
13035 {
13036 return true;
13037 }
13038
13039 return false;
13040 }
13041
13043 {
13044 return false;
13045 }
13046
13049 {
13050 return UATimeSpent.DEFAULT_DEPLOY;
13051 }
13052
13053
13054
13055
13057 {
13059 SetSynchDirty();
13060 }
13061
13063 {
13065 }
13066
13067
13069 {
13070 return false;
13071 }
13072
13075 {
13076 string att_type = "None";
13077
13078 if (ConfigIsExisting("soundAttType"))
13079 {
13080 att_type = ConfigGetString("soundAttType");
13081 }
13082
13084 }
13085
13087 {
13089 }
13090
13091
13092
13093
13094
13100
13102 {
13105
13107 }
13108
13109
13111 {
13113 return;
13114
13116
13119
13122
13123 SoundParameters params = new SoundParameters();
13127 }
13128
13129
13131 {
13133 {
13136
13137 SetSynchDirty();
13138
13141 }
13142 }
13143
13145 {
13147 }
13148
13149
13151 {
13153 return;
13154
13156 SetSynchDirty();
13157
13160 }
13161
13163 {
13166 }
13167
13169 {
13171 }
13172
13173 void OnApply(PlayerBase player);
13174
13176 {
13177 return 1.0;
13178 };
13179
13181 {
13183 }
13184
13186 {
13188 }
13189
13191
13193 {
13194 SetDynamicPhysicsLifeTime(0.01);
13196 }
13197
13199 {
13200 array<string> zone_names = new array<string>;
13201 GetDamageZones(zone_names);
13202 for (int i = 0; i < zone_names.Count(); i++)
13203 {
13204 SetHealthMax(zone_names.Get(i),"Health");
13205 }
13206 SetHealthMax("","Health");
13207 }
13208
13211 {
13212 float global_health = GetHealth01("","Health");
13213 array<string> zones = new array<string>;
13214 GetDamageZones(zones);
13215
13216 for (int i = 0; i < zones.Count(); i++)
13217 {
13218 SetHealth01(zones.Get(i),"Health",global_health);
13219 }
13220 }
13221
13224 {
13225 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13226 }
13227
13229 {
13230 if (!hasRootAsPlayer)
13231 {
13232 if (refParentIB)
13233 {
13234
13235 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13236 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13237
13238 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13239 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13240
13243 }
13244 else
13245 {
13246
13249 }
13250 }
13251 }
13252
13254 {
13256 {
13257 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13258 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13259 {
13260 float heatPermCoef = 1.0;
13262 while (ent)
13263 {
13264 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13265 ent = ent.GetHierarchyParent();
13266 }
13267
13268 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13269 }
13270 }
13271 }
13272
13274 {
13275
13276 EntityAI parent = GetHierarchyParent();
13277 if (!parent)
13278 {
13279 hasParent = false;
13280 hasRootAsPlayer = false;
13281 }
13282 else
13283 {
13284 hasParent = true;
13285 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13286 refParentIB =
ItemBase.Cast(parent);
13287 }
13288 }
13289
13290 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13291 {
13292
13293 }
13294
13296 {
13297
13298 return false;
13299 }
13300
13302 {
13303
13304
13305 return false;
13306 }
13307
13309 {
13310
13311 return false;
13312 }
13313
13316 {
13317 return !GetIsFrozen() &&
IsOpen();
13318 }
13319
13321 {
13322 bool hasParent = false, hasRootAsPlayer = false;
13324
13325 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13326 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13327
13328 if (wwtu || foodDecay)
13329 {
13333
13334 if (processWetness || processTemperature || processDecay)
13335 {
13337
13338 if (processWetness)
13339 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13340
13341 if (processTemperature)
13343
13344 if (processDecay)
13345 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13346 }
13347 }
13348 }
13349
13352 {
13354 }
13355
13357 {
13360
13361 return super.GetTemperatureFreezeThreshold();
13362 }
13363
13365 {
13368
13369 return super.GetTemperatureThawThreshold();
13370 }
13371
13373 {
13376
13377 return super.GetItemOverheatThreshold();
13378 }
13379
13381 {
13383 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13384
13385 return super.GetTemperatureFreezeTime();
13386 }
13387
13389 {
13391 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13392
13393 return super.GetTemperatureThawTime();
13394 }
13395
13400
13402 {
13403 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13404 }
13405
13407 {
13408 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13409 }
13410
13413 {
13415 }
13416
13418 {
13420 }
13421
13423 {
13425 }
13426
13429 {
13430 return null;
13431 }
13432
13435 {
13436 return false;
13437 }
13438
13440 {
13442 {
13445 if (!trg)
13446 {
13448 explosive = this;
13449 }
13450
13451 explosive.PairRemote(trg);
13453
13454 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13455 trg.SetPersistentPairID(persistentID);
13456 explosive.SetPersistentPairID(persistentID);
13457
13458 return true;
13459 }
13460 return false;
13461 }
13462
13465 {
13466 float ret = 1.0;
13469 ret *= GetHealth01();
13470
13471 return ret;
13472 }
13473
13474 #ifdef DEVELOPER
13475 override void SetDebugItem()
13476 {
13477 super.SetDebugItem();
13478 _itemBase = this;
13479 }
13480
13482 {
13483 string text = super.GetDebugText();
13484
13486 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13487
13488 return text;
13489 }
13490 #endif
13491
13493 {
13494 return true;
13495 }
13496
13498
13500
13502 {
13505 }
13506
13507
13515
13531
13532 [
Obsolete(
"Use ItemSoundHandler instead")]
13535 {
13536 if (!
g_Game.IsDedicatedServer())
13537 {
13538 if (ConfigIsExisting("attachSoundSet"))
13539 {
13540 string cfg_path = "";
13541 string soundset = "";
13542 string type_name =
GetType();
13543
13546 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13547 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13548
13549 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13550 {
13551 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13552 {
13553 if (cfg_slot_array[i] == slot_type)
13554 {
13555 soundset = cfg_soundset_array[i];
13556 break;
13557 }
13558 }
13559 }
13560
13561 if (soundset != "")
13562 {
13563 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13565 }
13566 }
13567 }
13568 }
13569
13571}
13572
13574{
13576 if (entity)
13577 {
13578 bool is_item = entity.IsInherited(
ItemBase);
13579 if (is_item && full_quantity)
13580 {
13583 }
13584 }
13585 else
13586 {
13588 return NULL;
13589 }
13590 return entity;
13591}
13592
13594{
13595 if (item)
13596 {
13597 if (health > 0)
13598 item.SetHealth("", "", health);
13599
13600 if (item.CanHaveTemperature())
13601 {
13603 if (item.CanFreeze())
13604 item.SetFrozen(false);
13605 }
13606
13607 if (item.HasEnergyManager())
13608 {
13609 if (quantity >= 0)
13610 {
13611 item.GetCompEM().SetEnergy0To1(quantity);
13612 }
13613 else
13614 {
13616 }
13617 }
13618 else if (item.IsMagazine())
13619 {
13620 Magazine mag = Magazine.Cast(item);
13621 if (quantity >= 0)
13622 {
13623 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13624 }
13625 else
13626 {
13628 }
13629
13630 }
13631 else
13632 {
13633 if (quantity >= 0)
13634 {
13635 item.SetQuantityNormalized(quantity, false);
13636 }
13637 else
13638 {
13640 }
13641
13642 }
13643 }
13644}
13645
13646#ifdef DEVELOPER
13648#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
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)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.