8747{
8749 {
8750 return true;
8751 }
8752};
8753
8755{
8756
8757};
8758
8759
8760
8762{
8766
8768
8771
8772
8773
8774
8775
8784
8790
8795
8800
8821 protected bool m_IsResultOfSplit
8822
8824
8829
8830
8831
8833
8837
8838
8839
8841
8844
8845
8846
8852
8853
8861
8864
8865
8867
8868
8870
8871
8876
8877
8882
8884
8885
8887
8888
8890 {
8895
8896 if (!
g_Game.IsDedicatedServer())
8897 {
8899 {
8901
8903 {
8905 }
8906 }
8907
8910 }
8911
8912 m_OldLocation = null;
8913
8915 {
8917 }
8918
8919 if (ConfigIsExisting("headSelectionsToHide"))
8920 {
8923 }
8924
8926 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8927 {
8929 }
8930
8932
8933 m_IsResultOfSplit = false;
8934
8936 }
8937
8939 {
8940 super.InitItemVariables();
8941
8947 m_Count = ConfigGetInt(
"count");
8948
8951
8956
8959
8964
8976
8980
8981
8984 if (ConfigIsExisting("canBeSplit"))
8985 {
8988 }
8989
8991 if (ConfigIsExisting("itemBehaviour"))
8993
8994
8997 RegisterNetSyncVariableInt("m_VarLiquidType");
8998 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8999
9000 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9001 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9002 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9003
9004 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9005 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9006 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9007 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9008
9009 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9010 RegisterNetSyncVariableBool("m_IsTakeable");
9011 RegisterNetSyncVariableBool("m_IsHologram");
9012
9015 {
9018 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9019 }
9020
9022
9024 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9026
9028 }
9029
9031 {
9033 }
9034
9036 {
9039 {
9044 }
9045 }
9046
9047 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9048 {
9050 {
9053 }
9054
9056 }
9057
9059 {
9065 }
9066
9068
9070 {
9072
9073 if (!action)
9074 {
9075 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9076 return;
9077 }
9078
9080 if (!ai)
9081 {
9083 return;
9084 }
9085
9087 if (!action_array)
9088 {
9089 action_array = new array<ActionBase_Basic>;
9091 }
9092 if (LogManager.IsActionLogEnable())
9093 {
9094 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9095 }
9096
9097 if (action_array.Find(action) != -1)
9098 {
9099 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9100 }
9101 else
9102 {
9103 action_array.Insert(action);
9104 }
9105 }
9106
9108 {
9109 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9110 ActionBase action = player.GetActionManager().GetAction(actionName);
9113
9114 if (action_array)
9115 {
9116 action_array.RemoveItem(action);
9117 }
9118 }
9119
9120
9121
9123 {
9124 ActionOverrideData overrideData = new ActionOverrideData();
9128
9130 if (!actionMap)
9131 {
9134 }
9135
9136 actionMap.Insert(this.
Type(), overrideData);
9137
9138 }
9139
9141
9143
9144
9146 {
9149
9152
9153 string config_to_search = "CfgVehicles";
9154 string muzzle_owner_config;
9155
9157 {
9158 if (IsInherited(Weapon))
9159 config_to_search = "CfgWeapons";
9160
9161 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9162
9163 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9164
9165 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9166
9167 if (config_OnFire_subclass_count > 0)
9168 {
9169 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9170
9171 for (int i = 0; i < config_OnFire_subclass_count; i++)
9172 {
9173 string particle_class = "";
9174 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9175 string config_OnFire_entry = config_OnFire_class + particle_class;
9176 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9177 WPOF_array.Insert(WPOF);
9178 }
9179
9180
9182 }
9183 }
9184
9186 {
9187 config_to_search = "CfgWeapons";
9188 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9189
9190 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9191
9192 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9193
9194 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9195 {
9196 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9197
9198 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9199 {
9200 string particle_class2 = "";
9201 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9202 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9203 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9204 WPOBE_array.Insert(WPOBE);
9205 }
9206
9207
9209 }
9210 }
9211 }
9212
9213
9215 {
9218
9220 {
9221 string config_to_search = "CfgVehicles";
9222
9223 if (IsInherited(Weapon))
9224 config_to_search = "CfgWeapons";
9225
9226 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9227 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9228
9229 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9230 {
9231
9233
9235 {
9237 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9239 return;
9240 }
9241
9244
9245
9246
9247 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9248 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9249
9250 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9251 {
9252 string particle_class = "";
9253 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9254 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9255 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9256
9257 if (entry_type == CT_CLASS)
9258 {
9259 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9260 WPOOH_array.Insert(WPOF);
9261 }
9262 }
9263
9264
9266 }
9267 }
9268 }
9269
9271 {
9273 }
9274
9276 {
9278 {
9280
9283
9286
9287 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9288 }
9289 }
9290
9292 {
9294 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9295
9297 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9298
9300 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9301
9303 {
9305 }
9306 }
9307
9309 {
9311 }
9312
9314 {
9317 else
9319
9321 {
9324 }
9325 else
9326 {
9329
9332 }
9333
9335 }
9336
9338 {
9340 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9341 }
9342
9344 {
9346 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9348 }
9349
9351 {
9353 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9354 }
9355
9357 {
9360
9361 OverheatingParticle OP = new OverheatingParticle();
9366
9368 }
9369
9371 {
9374
9375 return -1;
9376 }
9377
9379 {
9381 {
9384
9385 for (int i = count; i > 0; --i)
9386 {
9387 int id = i - 1;
9390
9393
9394 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9395 {
9396 if (p)
9397 {
9400 }
9401 }
9402 }
9403 }
9404 }
9405
9407 {
9409 {
9411 {
9412 int id = i - 1;
9414
9415 if (OP)
9416 {
9418
9419 if (p)
9420 {
9422 }
9423
9424 delete OP;
9425 }
9426 }
9427
9430 }
9431 }
9432
9435 {
9436 return 0.0;
9437 }
9438
9439
9441 {
9442 return 250;
9443 }
9444
9446 {
9447 return 0;
9448 }
9449
9452 {
9454 return true;
9455
9456 return false;
9457 }
9458
9461 {
9464
9466 {
9468 }
9469 else
9470 {
9471
9473 }
9474
9476 }
9477
9484 {
9485 return -1;
9486 }
9487
9488
9489
9490
9492 {
9494 {
9495 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9496 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9497
9498 if (r_index >= 0)
9499 {
9500 InventoryLocation r_il = new InventoryLocation;
9501 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9502
9503 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9506 {
9507 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9508 }
9510 {
9511 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9512 }
9513
9514 }
9515
9516 player.GetHumanInventory().ClearUserReservedLocation(this);
9517 }
9518
9521 }
9522
9523
9524
9525
9527 {
9528 return ItemBase.m_DebugActionsMask;
9529 }
9530
9532 {
9533 return ItemBase.m_DebugActionsMask & mask;
9534 }
9535
9537 {
9538 ItemBase.m_DebugActionsMask = mask;
9539 }
9540
9542 {
9543 ItemBase.m_DebugActionsMask |= mask;
9544 }
9545
9547 {
9548 ItemBase.m_DebugActionsMask &= ~mask;
9549 }
9550
9552 {
9554 {
9556 }
9557 else
9558 {
9560 }
9561 }
9562
9563
9565 {
9566 if (GetEconomyProfile())
9567 {
9568 float q_max = GetEconomyProfile().GetQuantityMax();
9569 if (q_max > 0)
9570 {
9571 float q_min = GetEconomyProfile().GetQuantityMin();
9572 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9573
9575 {
9576 ComponentEnergyManager comp = GetCompEM();
9578 {
9580 }
9581 }
9583 {
9585
9586 }
9587
9588 }
9589 }
9590 }
9591
9594 {
9595 EntityAI parent = GetHierarchyParent();
9596
9597 if (parent)
9598 {
9599 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9600 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9601 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9602 }
9603 }
9604
9607 {
9608 EntityAI parent = GetHierarchyParent();
9609
9610 if (parent)
9611 {
9612 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9613 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9614 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9615 }
9616 }
9617
9619 {
9620
9621
9622
9623
9625
9627 {
9628 if (ScriptInputUserData.CanStoreInputUserData())
9629 {
9630 ScriptInputUserData ctx = new ScriptInputUserData;
9636 ctx.
Write(use_stack_max);
9639
9641 {
9642 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9643 }
9644 }
9645 }
9646 else if (!
g_Game.IsMultiplayer())
9647 {
9649 }
9650 }
9651
9653 {
9655 }
9656
9658 {
9660 }
9661
9663 {
9665 }
9666
9668 {
9669
9670 return false;
9671 }
9672
9674 {
9675 return false;
9676 }
9677
9681 {
9682 return false;
9683 }
9684
9686 {
9687 return "";
9688 }
9689
9691
9693 {
9694 return false;
9695 }
9696
9698 {
9699 return true;
9700 }
9701
9702
9703
9705 {
9706 return true;
9707 }
9708
9710 {
9711 return true;
9712 }
9713
9715 {
9716 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9718 }
9719
9721 {
9723 }
9724
9726 {
9728 if (!is_being_placed)
9730 SetSynchDirty();
9731 }
9732
9733
9735
9737 {
9739 }
9740
9742 {
9744 }
9745
9747 {
9748 return 1;
9749 }
9750
9752 {
9753 return false;
9754 }
9755
9757 {
9759 SetSynchDirty();
9760 }
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9797 {
9798 super.OnMovedInsideCargo(container);
9799
9800 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9801 }
9802
9803 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9804 {
9805 super.EEItemLocationChanged(oldLoc, newLoc);
9806
9807 PlayerBase newPlayer = null;
9808 PlayerBase oldPlayer = null;
9809
9810 if (newLoc.GetParent())
9811 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9812
9813 if (oldLoc.GetParent())
9814 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9815
9817 {
9818 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9819
9820 if (rIndex >= 0)
9821 {
9822 InventoryLocation rIl = new InventoryLocation;
9823 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9824
9825 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9828 {
9829 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9830 }
9832 {
9834 }
9835
9836 }
9837 }
9838
9840 {
9841 if (newPlayer)
9842 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9843
9844 if (newPlayer == oldPlayer)
9845 {
9846 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9847 {
9849 {
9850 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9851 {
9852 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9853 }
9854 }
9855 else
9856 {
9857 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9858 }
9859 }
9860
9861 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9862 {
9863 int type = oldLoc.GetType();
9865 {
9866 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9867 }
9869 {
9870 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9871 }
9872 }
9873 if (!m_OldLocation)
9874 {
9875 m_OldLocation = new InventoryLocation;
9876 }
9877 m_OldLocation.Copy(oldLoc);
9878 }
9879 else
9880 {
9881 if (m_OldLocation)
9882 {
9883 m_OldLocation.Reset();
9884 }
9885 }
9886
9887 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9888 }
9889 else
9890 {
9891 if (newPlayer)
9892 {
9893 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9894 if (resIndex >= 0)
9895 {
9896 InventoryLocation il = new InventoryLocation;
9897 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9899 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9902 {
9903 il.
GetParent().GetOnReleaseLock().Invoke(it);
9904 }
9906 {
9908 }
9909
9910 }
9911 }
9913 {
9914
9916 }
9917
9918 if (m_OldLocation)
9919 {
9920 m_OldLocation.Reset();
9921 }
9922 }
9923
9925 {
9926 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9927 }
9928
9930 {
9931 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9932 }
9933 }
9934
9935 override void EOnContact(IEntity other, Contact extra)
9936 {
9938 {
9939 int liquidType = -1;
9941 if (impactSpeed > 0.0)
9942 {
9944 #ifndef SERVER
9946 #else
9948 SetSynchDirty();
9949 #endif
9951 }
9952 }
9953
9954 #ifdef SERVER
9955 if (GetCompEM() && GetCompEM().IsPlugged())
9956 {
9957 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9958 GetCompEM().UnplugThis();
9959 }
9960 #endif
9961 }
9962
9964
9966 {
9968 }
9969
9971 {
9972
9973 }
9974
9976 {
9977 super.OnItemLocationChanged(old_owner, new_owner);
9978
9979 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9980 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9981
9982 if (!relatedPlayer && playerNew)
9983 relatedPlayer = playerNew;
9984
9985 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9986 {
9988 if (actionMgr)
9989 {
9990 ActionBase currentAction = actionMgr.GetRunningAction();
9991 if (currentAction)
9993 }
9994 }
9995
9996 Man ownerPlayerOld = null;
9997 Man ownerPlayerNew = null;
9998
9999 if (old_owner)
10000 {
10001 if (old_owner.
IsMan())
10002 {
10003 ownerPlayerOld = Man.Cast(old_owner);
10004 }
10005 else
10006 {
10007 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10008 }
10009 }
10010 else
10011 {
10013 {
10015
10016 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10017 {
10018 GetCompEM().UnplugThis();
10019 }
10020 }
10021 }
10022
10023 if (new_owner)
10024 {
10025 if (new_owner.
IsMan())
10026 {
10027 ownerPlayerNew = Man.Cast(new_owner);
10028 }
10029 else
10030 {
10031 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10032 }
10033 }
10034
10035 if (ownerPlayerOld != ownerPlayerNew)
10036 {
10037 if (ownerPlayerOld)
10038 {
10039 array<EntityAI> subItemsExit = new array<EntityAI>;
10041 for (int i = 0; i < subItemsExit.Count(); i++)
10042 {
10045 }
10046 }
10047
10048 if (ownerPlayerNew)
10049 {
10050 array<EntityAI> subItemsEnter = new array<EntityAI>;
10052 for (int j = 0; j < subItemsEnter.Count(); j++)
10053 {
10056 }
10057 }
10058 }
10059 else if (ownerPlayerNew != null)
10060 {
10061 PlayerBase nplayer;
10062 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10063 {
10064 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10066 for (int k = 0; k < subItemsUpdate.Count(); k++)
10067 {
10069 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10070 }
10071 }
10072 }
10073
10074 if (old_owner)
10075 old_owner.OnChildItemRemoved(this);
10076 if (new_owner)
10077 new_owner.OnChildItemReceived(this);
10078 }
10079
10080
10082 {
10083 super.EEDelete(parent);
10084 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10085 if (player)
10086 {
10088
10089 if (player.IsAlive())
10090 {
10091 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10092 if (r_index >= 0)
10093 {
10094 InventoryLocation r_il = new InventoryLocation;
10095 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10096
10097 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10100 {
10101 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10102 }
10104 {
10105 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10106 }
10107
10108 }
10109
10110 player.RemoveQuickBarEntityShortcut(this);
10111 }
10112 }
10113 }
10114
10116 {
10117 super.EEKilled(killer);
10118
10121 {
10122 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10123 {
10124 if (IsMagazine())
10125 {
10126 if (Magazine.Cast(this).GetAmmoCount() > 0)
10127 {
10129 }
10130 }
10131 else
10132 {
10134 }
10135 }
10136 }
10137 }
10138
10140 {
10141 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10142
10143 super.OnWasAttached(parent, slot_id);
10144
10147
10150 }
10151
10153 {
10154 super.OnWasDetached(parent, slot_id);
10155
10158
10161 }
10162
10164 {
10165 int idx;
10168
10169 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10170 if (inventory_slots.Count() < 1)
10171 {
10172 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10173 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10174 }
10175 else
10176 {
10177 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10178 }
10179
10180 idx = inventory_slots.Find(slot);
10181 if (idx < 0)
10182 return "";
10183
10184 return attach_types.Get(idx);
10185 }
10186
10188 {
10189 int idx = -1;
10190 string slot;
10191
10194
10195 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10196 if (inventory_slots.Count() < 1)
10197 {
10198 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10199 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10200 }
10201 else
10202 {
10203 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10204 if (detach_types.Count() < 1)
10205 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10206 }
10207
10208 for (int i = 0; i < inventory_slots.Count(); i++)
10209 {
10210 slot = inventory_slots.Get(i);
10211 }
10212
10213 if (slot != "")
10214 {
10215 if (detach_types.Count() == 1)
10216 idx = 0;
10217 else
10218 idx = inventory_slots.Find(slot);
10219 }
10220 if (idx < 0)
10221 return "";
10222
10223 return detach_types.Get(idx);
10224 }
10225
10227 {
10228
10230
10231
10232 float min_time = 1;
10233 float max_time = 3;
10234 float delay = Math.RandomFloat(min_time, max_time);
10235
10236 explode_timer.Run(delay, this, "DoAmmoExplosion");
10237 }
10238
10240 {
10241 Magazine magazine = Magazine.Cast(this);
10242 int pop_sounds_count = 6;
10243 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10244
10245
10246 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10247 string sound_name = pop_sounds[ sound_idx ];
10248 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10249
10250
10251 magazine.ServerAddAmmoCount(-1);
10252
10253
10254 float min_temp_to_explode = 100;
10255
10256 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10257 {
10259 }
10260 }
10261
10262
10263 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10264 {
10265 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10266
10267 const int CHANCE_DAMAGE_CARGO = 4;
10268 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10269 const int CHANCE_DAMAGE_NOTHING = 2;
10270
10272 {
10273 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10274 int chances;
10275 int rnd;
10276
10277 if (GetInventory().GetCargo())
10278 {
10279 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10280 rnd = Math.RandomInt(0,chances);
10281
10282 if (rnd < CHANCE_DAMAGE_CARGO)
10283 {
10285 }
10286 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10287 {
10289 }
10290 }
10291 else
10292 {
10293 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10294 rnd = Math.RandomInt(0,chances);
10295
10296 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10297 {
10299 }
10300 }
10301 }
10302 }
10303
10305 {
10306 CargoBase cargo = GetInventory().GetCargo();
10307 if (cargo)
10308 {
10310 if (item_count > 0)
10311 {
10312 int random_pick = Math.RandomInt(0, item_count);
10314 if (!item.IsExplosive())
10315 {
10316 item.AddHealth("","",damage);
10317 return true;
10318 }
10319 }
10320 }
10321 return false;
10322 }
10323
10325 {
10326 GameInventory inventory = GetInventory();
10328 if (attachment_count > 0)
10329 {
10330 int random_pick = Math.RandomInt(0, attachment_count);
10332 if (!attachment.IsExplosive())
10333 {
10334 attachment.AddHealth("","",damage);
10335 return true;
10336 }
10337 }
10338 return false;
10339 }
10340
10342 {
10344 }
10345
10347 {
10349 return GetInventory().CanRemoveEntity();
10350
10351 return false;
10352 }
10353
10355 {
10356
10358 return false;
10359
10360
10362 return false;
10363
10364
10365
10367 if (delta == 0)
10368 return false;
10369
10370
10371 return true;
10372 }
10373
10375 {
10377 {
10378 if (ScriptInputUserData.CanStoreInputUserData())
10379 {
10380 ScriptInputUserData ctx = new ScriptInputUserData;
10385 ctx.
Write(destination_entity);
10387 ctx.
Write(slot_id);
10389 }
10390 }
10391 else if (!
g_Game.IsMultiplayer())
10392 {
10394 }
10395 }
10396
10398 {
10399 float split_quantity_new;
10403 InventoryLocation loc = new InventoryLocation;
10404
10405 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10406 {
10408 split_quantity_new = stack_max;
10409 else
10411
10413 {
10414 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10415 if (new_item)
10416 {
10417 new_item.SetResultOfSplit(true);
10418 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10420 new_item.
SetQuantity(split_quantity_new,
false,
true);
10421 }
10422 }
10423 }
10424 else if (destination_entity && slot_id == -1)
10425 {
10426 if (quantity > stack_max)
10427 split_quantity_new = stack_max;
10428 else
10429 split_quantity_new = quantity;
10430
10432 {
10433 GameInventory destinationInventory = destination_entity.GetInventory();
10435 {
10438 }
10439
10440 if (new_item)
10441 {
10442 new_item.SetResultOfSplit(true);
10443 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10445 new_item.
SetQuantity(split_quantity_new,
false,
true);
10446 }
10447 }
10448 }
10449 else
10450 {
10451 if (stack_max != 0)
10452 {
10454 {
10456 }
10457
10458 if (split_quantity_new == 0)
10459 {
10460 if (!
g_Game.IsMultiplayer())
10461 player.PhysicalPredictiveDropItem(this);
10462 else
10463 player.ServerDropEntity(this);
10464 return;
10465 }
10466
10468 {
10470
10471 if (new_item)
10472 {
10473 new_item.SetResultOfSplit(true);
10474 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10477 new_item.PlaceOnSurface();
10478 }
10479 }
10480 }
10481 }
10482 }
10483
10485 {
10486 float split_quantity_new;
10490 InventoryLocation loc = new InventoryLocation;
10491
10492 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10493 {
10495 split_quantity_new = stack_max;
10496 else
10498
10500 {
10501 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10502 if (new_item)
10503 {
10504 new_item.SetResultOfSplit(true);
10505 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10507 new_item.
SetQuantity(split_quantity_new,
false,
true);
10508 }
10509 }
10510 }
10511 else if (destination_entity && slot_id == -1)
10512 {
10513 if (quantity > stack_max)
10514 split_quantity_new = stack_max;
10515 else
10516 split_quantity_new = quantity;
10517
10519 {
10520 GameInventory destinationInventory = destination_entity.GetInventory();
10522 {
10525 }
10526
10527 if (new_item)
10528 {
10529 new_item.SetResultOfSplit(true);
10530 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10532 new_item.
SetQuantity(split_quantity_new,
false,
true);
10533 }
10534 }
10535 }
10536 else
10537 {
10538 if (stack_max != 0)
10539 {
10541 {
10543 }
10544
10546 {
10548
10549 if (new_item)
10550 {
10551 new_item.SetResultOfSplit(true);
10552 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10555 new_item.PlaceOnSurface();
10556 }
10557 }
10558 }
10559 }
10560 }
10561
10563 {
10565 {
10566 if (ScriptInputUserData.CanStoreInputUserData())
10567 {
10568 ScriptInputUserData ctx = new ScriptInputUserData;
10573 dst.WriteToContext(ctx);
10575 }
10576 }
10577 else if (!
g_Game.IsMultiplayer())
10578 {
10580 }
10581 }
10582
10584 {
10586 {
10587 if (ScriptInputUserData.CanStoreInputUserData())
10588 {
10589 ScriptInputUserData ctx = new ScriptInputUserData;
10594 ctx.
Write(destination_entity);
10600 }
10601 }
10602 else if (!
g_Game.IsMultiplayer())
10603 {
10605 }
10606 }
10607
10609 {
10611 }
10612
10614 {
10616 float split_quantity_new;
10618 if (dst.IsValid())
10619 {
10620 int slot_id = dst.GetSlot();
10622
10623 if (quantity > stack_max)
10624 split_quantity_new = stack_max;
10625 else
10626 split_quantity_new = quantity;
10627
10629 {
10631
10632 if (new_item)
10633 {
10634 new_item.SetResultOfSplit(true);
10635 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10637 new_item.
SetQuantity(split_quantity_new,
false,
true);
10638 }
10639
10640 return new_item;
10641 }
10642 }
10643
10644 return null;
10645 }
10646
10648 {
10650 float split_quantity_new;
10652 if (destination_entity)
10653 {
10655 if (quantity > stackable)
10656 split_quantity_new = stackable;
10657 else
10658 split_quantity_new = quantity;
10659
10661 {
10662 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10663 if (new_item)
10664 {
10665 new_item.SetResultOfSplit(true);
10666 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10668 new_item.
SetQuantity(split_quantity_new,
false,
true);
10669 }
10670 }
10671 }
10672 }
10673
10675 {
10677 {
10678 if (ScriptInputUserData.CanStoreInputUserData())
10679 {
10680 ScriptInputUserData ctx = new ScriptInputUserData;
10685 ItemBase destination_entity =
this;
10686 ctx.
Write(destination_entity);
10690 }
10691 }
10692 else if (!
g_Game.IsMultiplayer())
10693 {
10695 }
10696 }
10697
10699 {
10701 float split_quantity_new;
10703 if (player)
10704 {
10706 if (quantity > stackable)
10707 split_quantity_new = stackable;
10708 else
10709 split_quantity_new = quantity;
10710
10712 {
10713 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10714 new_item =
ItemBase.Cast(in_hands);
10715 if (new_item)
10716 {
10717 new_item.SetResultOfSplit(true);
10718 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10720 new_item.SetQuantity(split_quantity_new, false, true);
10721 }
10722 }
10723 }
10724 }
10725
10727 {
10729 float split_quantity_new = Math.Floor(quantity * 0.5);
10730
10732 return;
10733
10735
10736 if (new_item)
10737 {
10738 if (new_item.GetQuantityMax() < split_quantity_new)
10739 {
10740 split_quantity_new = new_item.GetQuantityMax();
10741 }
10742
10743 new_item.SetResultOfSplit(true);
10744 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10745
10747 {
10750 }
10751 else
10752 {
10754 new_item.
SetQuantity(split_quantity_new,
false,
true);
10755 }
10756 }
10757 }
10758
10760 {
10762 float split_quantity_new = Math.Floor(quantity / 2);
10763
10765 return;
10766
10767 InventoryLocation invloc = new InventoryLocation;
10769
10771 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10772
10773 if (new_item)
10774 {
10775 if (new_item.GetQuantityMax() < split_quantity_new)
10776 {
10777 split_quantity_new = new_item.GetQuantityMax();
10778 }
10780 {
10783 }
10784 else if (split_quantity_new > 1)
10785 {
10787 new_item.
SetQuantity(split_quantity_new,
false,
true);
10788 }
10789 }
10790 }
10791
10794 {
10795 SetWeightDirty();
10797
10798 if (parent)
10799 parent.OnAttachmentQuantityChangedEx(this, delta);
10800
10802 {
10804 {
10806 }
10808 {
10809 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10811 }
10812 }
10813 }
10814
10817 {
10818
10819 }
10820
10823 {
10825 }
10826
10828 {
10829 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10830
10832 {
10833 if (newLevel == GameConstants.STATE_RUINED)
10834 {
10836 EntityAI parent = GetHierarchyParent();
10837 if (parent && parent.IsFireplace())
10838 {
10839 CargoBase cargo = GetInventory().GetCargo();
10840 if (cargo)
10841 {
10843 {
10845 }
10846 }
10847 }
10848 }
10849
10851 {
10852
10854 return;
10855 }
10856
10857 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10858 {
10860 }
10861 }
10862 }
10863
10864
10866 {
10867 super.OnRightClick();
10868
10870 {
10872 {
10873 if (ScriptInputUserData.CanStoreInputUserData())
10874 {
10875 EntityAI root = GetHierarchyRoot();
10876 Man playerOwner = GetHierarchyRootPlayer();
10877 InventoryLocation dst = new InventoryLocation;
10878
10879
10880 if (!playerOwner && root && root == this)
10881 {
10883 }
10884 else
10885 {
10886
10887 GetInventory().GetCurrentInventoryLocation(dst);
10889 {
10890 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10892 {
10894 }
10895 else
10896 {
10898
10899
10900 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10901 {
10903 }
10904 else
10905 {
10906 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10907 }
10908 }
10909 }
10910 }
10911
10912 ScriptInputUserData ctx = new ScriptInputUserData;
10920 }
10921 }
10922 else if (!
g_Game.IsMultiplayer())
10923 {
10925 }
10926 }
10927 }
10928
10930 {
10931 if (root)
10932 {
10933 vector m4[4];
10934 root.GetTransform(m4);
10935 dst.SetGround(this, m4);
10936 }
10937 else
10938 {
10939 GetInventory().GetCurrentInventoryLocation(dst);
10940 }
10941 }
10942
10943 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10944 {
10945
10946 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10947 return false;
10948
10949 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10950 return false;
10951
10952
10954 return false;
10955
10956
10957 Magazine mag = Magazine.Cast(this);
10958 if (mag)
10959 {
10960 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10961 return false;
10962
10963 if (stack_max_limit)
10964 {
10965 Magazine other_mag = Magazine.Cast(other_item);
10966 if (other_item)
10967 {
10968 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10969 return false;
10970 }
10971
10972 }
10973 }
10974 else
10975 {
10976
10978 return false;
10979
10981 return false;
10982 }
10983
10984 PlayerBase player = null;
10985 if (CastTo(player, GetHierarchyRootPlayer()))
10986 {
10987 if (player.GetInventory().HasAttachment(this))
10988 return false;
10989
10990 if (player.IsItemsToDelete())
10991 return false;
10992 }
10993
10994 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10995 return false;
10996
10997 int slotID;
10999 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11000 return false;
11001
11002 return true;
11003 }
11004
11006 {
11008 }
11009
11011 {
11012 return m_IsResultOfSplit;
11013 }
11014
11016 {
11017 m_IsResultOfSplit = value;
11018 }
11019
11021 {
11023 }
11024
11026 {
11027 float other_item_quantity = other_item.GetQuantity();
11028 float this_free_space;
11029
11031
11033
11034 if (other_item_quantity > this_free_space)
11035 {
11036 return this_free_space;
11037 }
11038 else
11039 {
11040 return other_item_quantity;
11041 }
11042 }
11043
11045 {
11047 }
11048
11050 {
11052 return;
11053
11054 if (!IsMagazine() && other_item)
11055 {
11057 if (quantity_used != 0)
11058 {
11059 float hp1 = GetHealth01("","");
11060 float hp2 = other_item.GetHealth01("","");
11061 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11062 hpResult = hpResult / (
GetQuantity() + quantity_used);
11063
11064 hpResult *= GetMaxHealth();
11065 Math.Round(hpResult);
11066 SetHealth("", "Health", hpResult);
11067
11069 other_item.AddQuantity(-quantity_used);
11070 }
11071 }
11073 }
11074
11076 {
11077 #ifdef SERVER
11078 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11079 GetHierarchyParent().IncreaseLifetimeUp();
11080 #endif
11081 };
11082
11084 {
11085 PlayerBase p = PlayerBase.Cast(player);
11086
11087 array<int> recipesIds = p.m_Recipes;
11088 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11089 if (moduleRecipesManager)
11090 {
11091 EntityAI itemInHands = player.GetEntityInHands();
11092 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11093 }
11094
11095 for (int i = 0;i < recipesIds.Count(); i++)
11096 {
11097 int key = recipesIds.Get(i);
11098 string recipeName = moduleRecipesManager.GetRecipeName(key);
11100 }
11101 }
11102
11103
11104 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11105 {
11106 super.GetDebugActions(outputList);
11107
11108
11114
11115
11120
11125
11126
11130
11131
11133 {
11137 }
11138
11141
11142
11146
11148
11149 InventoryLocation loc = new InventoryLocation();
11150 GetInventory().GetCurrentInventoryLocation(loc);
11152 {
11153 if (Gizmo_IsSupported())
11156 }
11157
11159 }
11160
11161
11162
11163
11165 {
11166 super.OnAction(action_id, player, ctx);
11167
11169 {
11170 switch (action_id)
11171 {
11175 return true;
11179 return true;
11180 }
11181 }
11182
11184 {
11185 switch (action_id)
11186 {
11188 Delete();
11189 return true;
11190 }
11191 }
11192
11193 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11194 {
11195 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11196 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11197 PlayerBase p = PlayerBase.Cast(player);
11198 if (
EActions.RECIPES_RANGE_START < 1000)
11199 {
11200 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11201 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11202 }
11203 }
11204 #ifndef SERVER
11205 else if (action_id ==
EActions.WATCH_PLAYER)
11206 {
11207 PluginDeveloper.SetDeveloperItemClientEx(player);
11208 }
11209 #endif
11211 {
11212 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11213 {
11214 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11215 OnDebugButtonPressServer(id + 1);
11216 }
11217
11218 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11219 {
11220 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11222 }
11223
11224 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11225 {
11226 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11228 }
11229
11230 else if (action_id ==
EActions.ADD_QUANTITY)
11231 {
11232 if (IsMagazine())
11233 {
11234 Magazine mag = Magazine.Cast(this);
11235 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11236 }
11237 else
11238 {
11240 }
11241
11242 if (m_EM)
11243 {
11244 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11245 }
11246
11247 }
11248
11249 else if (action_id ==
EActions.REMOVE_QUANTITY)
11250 {
11251 if (IsMagazine())
11252 {
11253 Magazine mag2 = Magazine.Cast(this);
11254 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11255 }
11256 else
11257 {
11259 }
11260 if (m_EM)
11261 {
11262 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11263 }
11264
11265 }
11266
11267 else if (action_id ==
EActions.SET_QUANTITY_0)
11268 {
11270
11271 if (m_EM)
11272 {
11273 m_EM.SetEnergy(0);
11274 }
11275 }
11276
11277 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11278 {
11280
11281 if (m_EM)
11282 {
11283 m_EM.SetEnergy(m_EM.GetEnergyMax());
11284 }
11285 }
11286
11287 else if (action_id ==
EActions.ADD_HEALTH)
11288 {
11289 AddHealth("","",GetMaxHealth("","Health")/5);
11290 }
11291 else if (action_id ==
EActions.REMOVE_HEALTH)
11292 {
11293 AddHealth("","",-GetMaxHealth("","Health")/5);
11294 }
11295 else if (action_id ==
EActions.DESTROY_HEALTH)
11296 {
11297 SetHealth01("","",0);
11298 }
11299 else if (action_id ==
EActions.WATCH_ITEM)
11300 {
11302 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11303 #ifdef DEVELOPER
11304 SetDebugDeveloper_item(this);
11305 #endif
11306 }
11307
11308 else if (action_id ==
EActions.ADD_TEMPERATURE)
11309 {
11310 AddTemperature(20);
11311
11312 }
11313
11314 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11315 {
11316 AddTemperature(-20);
11317
11318 }
11319
11320 else if (action_id ==
EActions.FLIP_FROZEN)
11321 {
11322 SetFrozen(!GetIsFrozen());
11323
11324 }
11325
11326 else if (action_id ==
EActions.ADD_WETNESS)
11327 {
11329
11330 }
11331
11332 else if (action_id ==
EActions.REMOVE_WETNESS)
11333 {
11335
11336 }
11337
11338 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11339 {
11342
11343
11344 }
11345
11346 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11347 {
11350 }
11351
11352 else if (action_id ==
EActions.MAKE_SPECIAL)
11353 {
11354 auto debugParams = DebugSpawnParams.WithPlayer(player);
11355 OnDebugSpawnEx(debugParams);
11356 }
11357
11358 }
11359
11360
11361 return false;
11362 }
11363
11364
11365
11366
11370
11373
11374
11375
11377 {
11378 return false;
11379 }
11380
11381
11383 {
11384 return true;
11385 }
11386
11387
11389 {
11390 return true;
11391 }
11392
11393
11394
11396 {
11397 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11398 return g_Game.ConfigIsExisting(config_path);
11399 }
11400
11403 {
11404 return null;
11405 }
11406
11408 {
11409 return false;
11410 }
11411
11413 {
11414 return false;
11415 }
11416
11420
11421
11423 {
11424 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11425 return module_repairing.CanRepair(this, item_repair_kit);
11426 }
11427
11428
11429 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11430 {
11431 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11432 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11433 }
11434
11435
11437 {
11438
11439
11440
11441
11442
11443
11444
11445
11446 return 1;
11447 }
11448
11449
11450
11452 {
11454 }
11455
11456
11457
11459 {
11461 }
11462
11463
11472 {
11473 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11474
11475 if (player)
11476 {
11477 player.MessageStatus(text);
11478 }
11479 }
11480
11481
11490 {
11491 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11492
11493 if (player)
11494 {
11495 player.MessageAction(text);
11496 }
11497 }
11498
11499
11508 {
11509 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11510
11511 if (player)
11512 {
11513 player.MessageFriendly(text);
11514 }
11515 }
11516
11517
11526 {
11527 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11528
11529 if (player)
11530 {
11531 player.MessageImportant(text);
11532 }
11533 }
11534
11536 {
11537 return true;
11538 }
11539
11540
11541 override bool KindOf(
string tag)
11542 {
11543 bool found = false;
11544 string item_name = this.
GetType();
11546 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11547
11548 int array_size = item_tag_array.Count();
11549 for (int i = 0; i < array_size; i++)
11550 {
11551 if (item_tag_array.Get(i) == tag)
11552 {
11553 found = true;
11554 break;
11555 }
11556 }
11557 return found;
11558 }
11559
11560
11562 {
11563
11564 super.OnRPC(sender, rpc_type,ctx);
11565
11566
11567 switch (rpc_type)
11568 {
11569 #ifndef SERVER
11570 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11571 Param2<bool, string> p = new Param2<bool, string>(false, "");
11572
11574 return;
11575
11576 bool play = p.param1;
11577 string soundSet = p.param2;
11578
11579 if (play)
11580 {
11582 {
11584 {
11586 }
11587 }
11588 else
11589 {
11591 }
11592 }
11593 else
11594 {
11596 }
11597
11598 break;
11599 #endif
11600
11601 }
11602
11604 {
11606 }
11607 }
11608
11609
11610
11611
11613 {
11614 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11615 return plugin.GetID(
name);
11616 }
11617
11619 {
11620 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11621 return plugin.GetName(id);
11622 }
11623
11626 {
11627
11628
11629 int varFlags;
11630 if (!ctx.
Read(varFlags))
11631 return;
11632
11633 if (varFlags & ItemVariableFlags.FLOAT)
11634 {
11636 }
11637 }
11638
11640 {
11641
11642 super.SerializeNumericalVars(floats_out);
11643
11644
11645
11647 {
11649 }
11650
11652 {
11654 }
11655
11657 {
11659 }
11660
11662 {
11667 }
11668
11670 {
11672 }
11673 }
11674
11676 {
11677
11678 super.DeSerializeNumericalVars(floats);
11679
11680
11681 int index = 0;
11682 int mask = Math.Round(floats.Get(index));
11683
11684 index++;
11685
11687 {
11689 {
11691 }
11692 else
11693 {
11694 float quantity = floats.Get(index);
11695 SetQuantity(quantity,
true,
false,
false,
false);
11696 }
11697 index++;
11698 }
11699
11701 {
11702 float wet = floats.Get(index);
11704 index++;
11705 }
11706
11708 {
11709 int liquidtype = Math.Round(floats.Get(index));
11711 index++;
11712 }
11713
11715 {
11717 index++;
11719 index++;
11721 index++;
11723 index++;
11724 }
11725
11727 {
11728 int cleanness = Math.Round(floats.Get(index));
11730 index++;
11731 }
11732 }
11733
11735 {
11736 super.WriteVarsToCTX(ctx);
11737
11738
11740 {
11742 }
11743
11745 {
11747 }
11748
11750 {
11752 }
11753
11755 {
11756 int r,g,b,a;
11762 }
11763
11765 {
11767 }
11768 }
11769
11771 {
11772 if (!super.ReadVarsFromCTX(ctx,version))
11773 return false;
11774
11775 int intValue;
11776 float value;
11777
11778 if (version < 140)
11779 {
11780 if (!ctx.
Read(intValue))
11781 return false;
11782
11783 m_VariablesMask = intValue;
11784 }
11785
11787 {
11788 if (!ctx.
Read(value))
11789 return false;
11790
11792 {
11794 }
11795 else
11796 {
11798 }
11799 }
11800
11801 if (version < 140)
11802 {
11804 {
11805 if (!ctx.
Read(value))
11806 return false;
11807 SetTemperatureDirect(value);
11808 }
11809 }
11810
11812 {
11813 if (!ctx.
Read(value))
11814 return false;
11816 }
11817
11819 {
11820 if (!ctx.
Read(intValue))
11821 return false;
11823 }
11824
11826 {
11827 int r,g,b,a;
11829 return false;
11831 return false;
11833 return false;
11835 return false;
11836
11838 }
11839
11841 {
11842 if (!ctx.
Read(intValue))
11843 return false;
11845 }
11846
11847 if (version >= 138 && version < 140)
11848 {
11850 {
11851 if (!ctx.
Read(intValue))
11852 return false;
11853 SetFrozen(intValue);
11854 }
11855 }
11856
11857 return true;
11858 }
11859
11860
11862 {
11865 {
11867 }
11868
11869 if (!super.OnStoreLoad(ctx, version))
11870 {
11872 return false;
11873 }
11874
11875 if (version >= 114)
11876 {
11877 bool hasQuickBarIndexSaved;
11878
11879 if (!ctx.
Read(hasQuickBarIndexSaved))
11880 {
11882 return false;
11883 }
11884
11885 if (hasQuickBarIndexSaved)
11886 {
11887 int itmQBIndex;
11888
11889
11890 if (!ctx.
Read(itmQBIndex))
11891 {
11893 return false;
11894 }
11895
11896 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11897 if (itmQBIndex != -1 && parentPlayer)
11898 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11899 }
11900 }
11901 else
11902 {
11903
11904 PlayerBase player;
11905 int itemQBIndex;
11906 if (version ==
int.
MAX)
11907 {
11908 if (!ctx.
Read(itemQBIndex))
11909 {
11911 return false;
11912 }
11913 }
11914 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11915 {
11916
11917 if (!ctx.
Read(itemQBIndex))
11918 {
11920 return false;
11921 }
11922 if (itemQBIndex != -1 && player)
11923 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11924 }
11925 }
11926
11927 if (version < 140)
11928 {
11929
11930 if (!LoadVariables(ctx, version))
11931 {
11933 return false;
11934 }
11935 }
11936
11937
11939 {
11941 return false;
11942 }
11943 if (version >= 132)
11944 {
11946 if (raib)
11947 {
11949 {
11951 return false;
11952 }
11953 }
11954 }
11955
11957 return true;
11958 }
11959
11960
11961
11963 {
11964 super.OnStoreSave(ctx);
11965
11966 PlayerBase player;
11967 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11968 {
11970
11971 int itemQBIndex = -1;
11972 itemQBIndex = player.FindQuickBarEntityIndex(this);
11973 ctx.
Write(itemQBIndex);
11974 }
11975 else
11976 {
11978 }
11979
11981
11983 if (raib)
11984 {
11986 }
11987 }
11988
11989
11991 {
11992 super.AfterStoreLoad();
11993
11995 {
11997 }
11998
12000 {
12003 }
12004 }
12005
12007 {
12008 super.EEOnAfterLoad();
12009
12011 {
12013 }
12014
12017 }
12018
12020 {
12021 return false;
12022 }
12023
12024
12025
12027 {
12029 {
12030 #ifdef PLATFORM_CONSOLE
12031
12033 {
12035 if (menu)
12036 {
12038 }
12039 }
12040 #endif
12041 }
12042
12044 {
12047 }
12048
12050 {
12051 SetWeightDirty();
12053 }
12055 {
12058 }
12059
12061 {
12064
12067 }
12069 {
12073 }
12074
12075 super.OnVariablesSynchronized();
12076 }
12077
12078
12079
12081 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12082 {
12083 if (!IsServerCheck(allow_client))
12084 return false;
12085
12087 return false;
12088
12091
12092 if (value <= (min + 0.001))
12093 value = min;
12094
12095 if (value == min)
12096 {
12097 if (destroy_config)
12098 {
12099 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12100 if (dstr)
12101 {
12103 this.Delete();
12104 return true;
12105 }
12106 }
12107 else if (destroy_forced)
12108 {
12110 this.Delete();
12111 return true;
12112 }
12113
12115 }
12116
12119
12121 {
12122 EntityAI parent = GetHierarchyRoot();
12123 InventoryLocation iLoc = new InventoryLocation();
12124 GetInventory().GetCurrentInventoryLocation(iLoc);
12126 {
12127 int iLocSlot = iLoc.
GetSlot();
12129 {
12131 }
12133 {
12135 }
12136 }
12137 }
12138
12140 {
12142
12143 if (delta)
12145 }
12146
12148
12149 return false;
12150 }
12151
12152
12154 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12155 {
12157 }
12158
12160 {
12163 }
12164
12166 {
12169 }
12170
12172 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12173 {
12174 float value_clamped = Math.Clamp(value, 0, 1);
12176 SetQuantity(result, destroy_config, destroy_forced);
12177 }
12178
12179
12182 {
12184 }
12185
12187 {
12189 }
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12201 {
12202 int slot = -1;
12203 GameInventory inventory = GetInventory();
12204 if (inventory)
12205 {
12206 InventoryLocation il = new InventoryLocation;
12209 }
12210
12212 }
12213
12215 {
12216 float quantity_max = 0;
12217
12219 {
12220 if (attSlotID != -1)
12221 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12222
12223 if (quantity_max <= 0)
12225 }
12226
12227 if (quantity_max <= 0)
12229
12230 return quantity_max;
12231 }
12232
12234 {
12236 }
12237
12239 {
12241 }
12242
12243
12245 {
12247 }
12248
12250 {
12252 }
12253
12255 {
12257 }
12258
12259
12261 {
12262
12263 float weightEx = GetWeightEx();
12264 float special = GetInventoryAndCargoWeight();
12265 return weightEx - special;
12266 }
12267
12268
12270 {
12272 }
12273
12275 {
12277 {
12278 #ifdef DEVELOPER
12279 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12280 {
12281 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12283 }
12284 #endif
12285
12286 return GetQuantity() * GetConfigWeightModified();
12287 }
12288 else if (HasEnergyManager())
12289 {
12290 #ifdef DEVELOPER
12291 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12292 {
12293 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12294 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12295 }
12296 #endif
12297 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12298 }
12299 else
12300 {
12301 #ifdef DEVELOPER
12302 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12303 {
12304 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12305 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12306 }
12307 #endif
12308 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12309 }
12310 }
12311
12314 {
12315 int item_count = 0;
12317
12318 GameInventory inventory = GetInventory();
12319 CargoBase cargo = inventory.
GetCargo();
12320 if (cargo != NULL)
12321 {
12323 }
12324
12326 for (int i = 0; i < nAttachments; ++i)
12327 {
12329 if (item)
12330 item_count += item.GetNumberOfItems();
12331 }
12332 return item_count;
12333 }
12334
12337 {
12338 float weight = 0;
12339 float wetness = 1;
12340 if (include_wetness)
12343 {
12344 weight = wetness * m_ConfigWeight;
12345 }
12347 {
12348 weight = 1;
12349 }
12350 return weight;
12351 }
12352
12353
12354
12356 {
12357 GameInventory inventory = GetInventory();
12358 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12359 {
12360 array<EntityAI> items = new array<EntityAI>;
12362 for (int i = 0; i < items.Count(); ++i)
12363 {
12365 if (item)
12366 {
12367 g_Game.ObjectDelete(item);
12368 }
12369 }
12370 }
12371 }
12372
12373
12374
12375
12377 {
12378 float energy = 0;
12379 if (HasEnergyManager())
12380 {
12381 energy = GetCompEM().GetEnergy();
12382 }
12383 return energy;
12384 }
12385
12386
12388 {
12389 super.OnEnergyConsumed();
12390
12392 }
12393
12395 {
12396 super.OnEnergyAdded();
12397
12399 }
12400
12401
12403 {
12404 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12405 {
12407 {
12408 float energy_0to1 = GetCompEM().GetEnergy0To1();
12410 }
12411 }
12412 }
12413
12414
12416 {
12417 return ConfigGetFloat("heatIsolation");
12418 }
12419
12421 {
12423 }
12424
12426 {
12427 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12428 if (
g_Game.ConfigIsExisting(paramPath))
12429 return g_Game.ConfigGetFloat(paramPath);
12430
12431 return 0.0;
12432 }
12433
12435 {
12436 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12437 if (
g_Game.ConfigIsExisting(paramPath))
12438 return g_Game.ConfigGetFloat(paramPath);
12439
12440 return 0.0;
12441 }
12442
12443 override void SetWet(
float value,
bool allow_client =
false)
12444 {
12445 if (!IsServerCheck(allow_client))
12446 return;
12447
12450
12452
12453 m_VarWet = Math.Clamp(value, min, max);
12454
12456 {
12459 }
12460 }
12461
12462 override void AddWet(
float value)
12463 {
12465 }
12466
12468 {
12470 }
12471
12473 {
12475 }
12476
12478 {
12480 }
12481
12483 {
12485 }
12486
12488 {
12490 }
12491
12492 override void OnWetChanged(
float newVal,
float oldVal)
12493 {
12496 if (newLevel != oldLevel)
12497 {
12499 }
12500 }
12501
12503 {
12504 SetWeightDirty();
12505 }
12506
12508 {
12509 return GetWetLevelInternal(
m_VarWet);
12510 }
12511
12512
12513
12515 {
12517 }
12518
12520 {
12522 }
12523
12525 {
12527 }
12528
12530 {
12532 }
12533
12534
12535
12537 {
12538 if (ConfigIsExisting("itemModelLength"))
12539 {
12540 return ConfigGetFloat("itemModelLength");
12541 }
12542 return 0;
12543 }
12544
12546 {
12547 if (ConfigIsExisting("itemAttachOffset"))
12548 {
12549 return ConfigGetFloat("itemAttachOffset");
12550 }
12551 return 0;
12552 }
12553
12554 override void SetCleanness(
int value,
bool allow_client =
false)
12555 {
12556 if (!IsServerCheck(allow_client))
12557 return;
12558
12560
12562
12565 }
12566
12568 {
12570 }
12571
12573 {
12574 return true;
12575 }
12576
12577
12578
12579
12581 {
12583 }
12584
12586 {
12588 }
12589
12590
12591
12592
12593 override void SetColor(
int r,
int g,
int b,
int a)
12594 {
12600 }
12602 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12603 {
12608 }
12609
12611 {
12613 }
12614
12617 {
12618 int r,g,b,a;
12620 r = r/255;
12621 g = g/255;
12622 b = b/255;
12623 a = a/255;
12624 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12625 }
12626
12627
12628
12629 override void SetLiquidType(
int value,
bool allow_client =
false)
12630 {
12631 if (!IsServerCheck(allow_client))
12632 return;
12633
12638 }
12639
12641 {
12642 return ConfigGetInt("varLiquidTypeInit");
12643 }
12644
12646 {
12648 }
12649
12651 {
12653 SetFrozen(false);
12654 }
12655
12658 {
12659 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12660 }
12661
12662
12665 {
12666 PlayerBase nplayer;
12667 if (PlayerBase.CastTo(nplayer, player))
12668 {
12670 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12671 }
12672 }
12673
12674
12677 {
12678 PlayerBase nplayer;
12679 if (PlayerBase.CastTo(nplayer,player))
12680 {
12681 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12682 }
12683
12684 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12685
12686 if (HasEnergyManager())
12687 {
12688 GetCompEM().UpdatePlugState();
12689 }
12690 }
12691
12692
12694 {
12695 super.OnPlacementStarted(player);
12696
12698 }
12699
12700 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12701 {
12703 {
12704 m_AdminLog.OnPlacementComplete(player,
this);
12705 }
12706
12707 super.OnPlacementComplete(player, position, orientation);
12708 }
12709
12710
12711
12712
12713
12715 {
12717 {
12718 return true;
12719 }
12720 else
12721 {
12722 return false;
12723 }
12724 }
12725
12726
12728 {
12730 {
12732 }
12733 }
12734
12735
12737 {
12739 }
12740
12742 {
12744 }
12745
12746 override void InsertAgent(
int agent,
float count = 1)
12747 {
12748 if (count < 1)
12749 return;
12750
12752 }
12753
12756 {
12758 }
12759
12760
12762 {
12764 }
12765
12766
12767
12768
12769
12770
12771
12772
12773
12774
12775
12776
12777
12778
12779
12780
12781
12782
12783
12784
12785
12786
12787
12788
12789
12790
12791
12792
12793
12794
12795
12796
12797
12798
12799
12800
12801
12802
12803
12804
12805
12806
12808 {
12810 return false;
12811 return true;
12812 }
12813
12815 {
12816
12818 }
12819
12820
12823 {
12824 super.CheckForRoofLimited(timeTresholdMS);
12825
12826 float time =
g_Game.GetTime();
12827 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12828 {
12829 m_PreviousRoofTestTime = time;
12830 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12831 }
12832 }
12833
12834
12836 {
12838 {
12839 return 0;
12840 }
12841
12842 if (GetInventory().GetAttachmentSlotsCount() != 0)
12843 {
12844 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12845 if (filter)
12846 return filter.GetProtectionLevel(type, false, system);
12847 else
12848 return 0;
12849 }
12850
12851 string subclassPath, entryName;
12852
12853 switch (type)
12854 {
12856 entryName = "biological";
12857 break;
12859 entryName = "chemical";
12860 break;
12861 default:
12862 entryName = "biological";
12863 break;
12864 }
12865
12866 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12867
12868 return g_Game.ConfigGetFloat(subclassPath + entryName);
12869 }
12870
12871
12872
12875 {
12876 if (!IsMagazine())
12878
12880 }
12881
12882
12883
12884
12885
12890 {
12891 return true;
12892 }
12893
12895 {
12897 }
12898
12899
12900
12901
12902
12904 {
12905 if (parent)
12906 {
12907 if (parent.IsInherited(DayZInfected))
12908 return true;
12909
12910 if (!parent.IsRuined())
12911 return true;
12912 }
12913
12914 return true;
12915 }
12916
12918 {
12919 if (!super.CanPutAsAttachment(parent))
12920 {
12921 return false;
12922 }
12923
12924 if (!IsRuined() && !parent.IsRuined())
12925 {
12926 return true;
12927 }
12928
12929 return false;
12930 }
12931
12933 {
12934
12935
12936
12937
12938 return super.CanReceiveItemIntoCargo(item);
12939 }
12940
12942 {
12943
12944
12945
12946
12947 GameInventory attachmentInv = attachment.GetInventory();
12949 {
12950 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12951 return false;
12952 }
12953
12954 InventoryLocation loc = new InventoryLocation();
12955 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12956 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12957 return false;
12958
12959 return super.CanReceiveAttachment(attachment, slotId);
12960 }
12961
12963 {
12964 if (!super.CanReleaseAttachment(attachment))
12965 return false;
12966
12967 return GetInventory().AreChildrenAccessible();
12968 }
12969
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987
12988
12989
12991 {
12992 int id = muzzle_owner.GetMuzzleID();
12993 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12994
12995 if (WPOF_array)
12996 {
12997 for (int i = 0; i < WPOF_array.Count(); i++)
12998 {
12999 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13000
13001 if (WPOF)
13002 {
13003 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13004 }
13005 }
13006 }
13007 }
13008
13009
13011 {
13012 int id = muzzle_owner.GetMuzzleID();
13014
13015 if (WPOBE_array)
13016 {
13017 for (int i = 0; i < WPOBE_array.Count(); i++)
13018 {
13019 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13020
13021 if (WPOBE)
13022 {
13023 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13024 }
13025 }
13026 }
13027 }
13028
13029
13031 {
13032 int id = muzzle_owner.GetMuzzleID();
13033 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13034
13035 if (WPOOH_array)
13036 {
13037 for (int i = 0; i < WPOOH_array.Count(); i++)
13038 {
13039 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13040
13041 if (WPOOH)
13042 {
13043 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13044 }
13045 }
13046 }
13047 }
13048
13049
13051 {
13052 int id = muzzle_owner.GetMuzzleID();
13053 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13054
13055 if (WPOOH_array)
13056 {
13057 for (int i = 0; i < WPOOH_array.Count(); i++)
13058 {
13059 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13060
13061 if (WPOOH)
13062 {
13063 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13064 }
13065 }
13066 }
13067 }
13068
13069
13071 {
13072 int id = muzzle_owner.GetMuzzleID();
13073 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13074
13075 if (WPOOH_array)
13076 {
13077 for (int i = 0; i < WPOOH_array.Count(); i++)
13078 {
13079 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13080
13081 if (WPOOH)
13082 {
13083 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13084 }
13085 }
13086 }
13087 }
13088
13089
13090
13092 {
13094 {
13095 return true;
13096 }
13097
13098 return false;
13099 }
13100
13102 {
13104 {
13105 return true;
13106 }
13107
13108 return false;
13109 }
13110
13112 {
13114 {
13115 return true;
13116 }
13117
13118 return false;
13119 }
13120
13122 {
13123 return false;
13124 }
13125
13128 {
13129 return UATimeSpent.DEFAULT_DEPLOY;
13130 }
13131
13132
13133
13134
13136 {
13138 SetSynchDirty();
13139 }
13140
13142 {
13144 }
13145
13146
13148 {
13149 return false;
13150 }
13151
13154 {
13155 string att_type = "None";
13156
13157 if (ConfigIsExisting("soundAttType"))
13158 {
13159 att_type = ConfigGetString("soundAttType");
13160 }
13161
13163 }
13164
13166 {
13168 }
13169
13170
13171
13172
13173
13179
13181 {
13184
13186 }
13187
13188
13190 {
13192 return;
13193
13195
13198
13201
13202 SoundParameters params = new SoundParameters();
13206 }
13207
13208
13210 {
13212 {
13215
13216 SetSynchDirty();
13217
13220 }
13221 }
13222
13224 {
13226 }
13227
13228
13230 {
13232 return;
13233
13235 SetSynchDirty();
13236
13239 }
13240
13242 {
13245 }
13246
13248 {
13250 }
13251
13252 void OnApply(PlayerBase player);
13253
13255 {
13256 return 1.0;
13257 };
13258
13260 {
13262 }
13263
13265 {
13267 }
13268
13270
13272 {
13273 SetDynamicPhysicsLifeTime(0.01);
13275 }
13276
13278 {
13279 array<string> zone_names = new array<string>;
13280 GetDamageZones(zone_names);
13281 for (int i = 0; i < zone_names.Count(); i++)
13282 {
13283 SetHealthMax(zone_names.Get(i),"Health");
13284 }
13285 SetHealthMax("","Health");
13286 }
13287
13290 {
13291 float global_health = GetHealth01("","Health");
13292 array<string> zones = new array<string>;
13293 GetDamageZones(zones);
13294
13295 for (int i = 0; i < zones.Count(); i++)
13296 {
13297 SetHealth01(zones.Get(i),"Health",global_health);
13298 }
13299 }
13300
13303 {
13304 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13305 }
13306
13308 {
13309 if (!hasRootAsPlayer)
13310 {
13311 if (refParentIB)
13312 {
13313
13314 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13315 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13316
13317 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13318 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13319
13322 }
13323 else
13324 {
13325
13328 }
13329 }
13330 }
13331
13333 {
13335 {
13336 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13337 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13338 {
13339 float heatPermCoef = 1.0;
13341 while (ent)
13342 {
13343 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13344 ent = ent.GetHierarchyParent();
13345 }
13346
13347 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13348 }
13349 }
13350 }
13351
13353 {
13354
13355 EntityAI parent = GetHierarchyParent();
13356 if (!parent)
13357 {
13358 hasParent = false;
13359 hasRootAsPlayer = false;
13360 }
13361 else
13362 {
13363 hasParent = true;
13364 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13365 refParentIB =
ItemBase.Cast(parent);
13366 }
13367 }
13368
13369 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13370 {
13371
13372 }
13373
13375 {
13376
13377 return false;
13378 }
13379
13381 {
13382
13383
13384 return false;
13385 }
13386
13388 {
13389
13390 return false;
13391 }
13392
13395 {
13396 return !GetIsFrozen() &&
IsOpen();
13397 }
13398
13400 {
13401 bool hasParent = false, hasRootAsPlayer = false;
13403
13404 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13405 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13406
13407 if (wwtu || foodDecay)
13408 {
13412
13413 if (processWetness || processTemperature || processDecay)
13414 {
13416
13417 if (processWetness)
13418 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13419
13420 if (processTemperature)
13422
13423 if (processDecay)
13424 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13425 }
13426 }
13427 }
13428
13431 {
13433 }
13434
13436 {
13439
13440 return super.GetTemperatureFreezeThreshold();
13441 }
13442
13444 {
13447
13448 return super.GetTemperatureThawThreshold();
13449 }
13450
13452 {
13455
13456 return super.GetItemOverheatThreshold();
13457 }
13458
13460 {
13462 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13463
13464 return super.GetTemperatureFreezeTime();
13465 }
13466
13468 {
13470 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13471
13472 return super.GetTemperatureThawTime();
13473 }
13474
13479
13481 {
13482 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13483 }
13484
13486 {
13487 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13488 }
13489
13492 {
13494 }
13495
13497 {
13499 }
13500
13502 {
13504 }
13505
13508 {
13509 return null;
13510 }
13511
13514 {
13515 return false;
13516 }
13517
13519 {
13521 {
13524 if (!trg)
13525 {
13527 explosive = this;
13528 }
13529
13530 explosive.PairRemote(trg);
13532
13533 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13534 trg.SetPersistentPairID(persistentID);
13535 explosive.SetPersistentPairID(persistentID);
13536
13537 return true;
13538 }
13539 return false;
13540 }
13541
13544 {
13545 float ret = 1.0;
13548 ret *= GetHealth01();
13549
13550 return ret;
13551 }
13552
13553 #ifdef DEVELOPER
13554 override void SetDebugItem()
13555 {
13556 super.SetDebugItem();
13557 _itemBase = this;
13558 }
13559
13561 {
13562 string text = super.GetDebugText();
13563
13565 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13566
13567 return text;
13568 }
13569 #endif
13570
13572 {
13573 return true;
13574 }
13575
13577
13579
13581 {
13584 }
13585
13586
13594
13610
13611 [
Obsolete(
"Use ItemSoundHandler instead")]
13614 {
13615 if (!
g_Game.IsDedicatedServer())
13616 {
13617 if (ConfigIsExisting("attachSoundSet"))
13618 {
13619 string cfg_path = "";
13620 string soundset = "";
13621 string type_name =
GetType();
13622
13625 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13626 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13627
13628 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13629 {
13630 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13631 {
13632 if (cfg_slot_array[i] == slot_type)
13633 {
13634 soundset = cfg_soundset_array[i];
13635 break;
13636 }
13637 }
13638 }
13639
13640 if (soundset != "")
13641 {
13642 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13644 }
13645 }
13646 }
13647 }
13648
13650}
13651
13653{
13655 if (entity)
13656 {
13657 bool is_item = entity.IsInherited(
ItemBase);
13658 if (is_item && full_quantity)
13659 {
13662 }
13663 }
13664 else
13665 {
13667 return NULL;
13668 }
13669 return entity;
13670}
13671
13673{
13674 if (item)
13675 {
13676 if (health > 0)
13677 item.SetHealth("", "", health);
13678
13679 if (item.CanHaveTemperature())
13680 {
13682 if (item.CanFreeze())
13683 item.SetFrozen(false);
13684 }
13685
13686 if (item.HasEnergyManager())
13687 {
13688 if (quantity >= 0)
13689 {
13690 item.GetCompEM().SetEnergy0To1(quantity);
13691 }
13692 else
13693 {
13695 }
13696 }
13697 else if (item.IsMagazine())
13698 {
13699 Magazine mag = Magazine.Cast(item);
13700 if (quantity >= 0)
13701 {
13702 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13703 }
13704 else
13705 {
13707 }
13708
13709 }
13710 else
13711 {
13712 if (quantity >= 0)
13713 {
13714 item.SetQuantityNormalized(quantity, false);
13715 }
13716 else
13717 {
13719 }
13720
13721 }
13722 }
13723}
13724
13725#ifdef DEVELOPER
13727#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.