8746{
8748 {
8749 return true;
8750 }
8751};
8752
8753
8754
8756{
8760
8762
8765
8766
8767
8768
8769
8778
8784
8789
8794
8815 protected bool m_IsResultOfSplit
8816
8818
8823
8824
8825
8827
8831
8832
8833
8835
8838
8839
8840
8846
8847
8855
8858
8859
8861
8862
8864
8865
8870
8871
8876
8877
8879
8880
8882 {
8887
8888 if (!
GetGame().IsDedicatedServer())
8889 {
8891 {
8893
8895 {
8897 }
8898 }
8899
8902 }
8903
8904 m_OldLocation = null;
8905
8907 {
8909 }
8910
8911 if (ConfigIsExisting("headSelectionsToHide"))
8912 {
8915 }
8916
8918 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8919 {
8921 }
8922
8924
8925 m_IsResultOfSplit = false;
8926
8928 }
8929
8931 {
8932 super.InitItemVariables();
8933
8939 m_Count = ConfigGetInt(
"count");
8940
8943
8948
8951
8956
8968
8972
8973
8976 if (ConfigIsExisting("canBeSplit"))
8977 {
8980 }
8981
8983 if (ConfigIsExisting("itemBehaviour"))
8985
8986
8989 RegisterNetSyncVariableInt("m_VarLiquidType");
8990 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8991
8992 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8993 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8994 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8995
8996 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8997 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8998 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8999 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9000
9001 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9002 RegisterNetSyncVariableBool("m_IsTakeable");
9003 RegisterNetSyncVariableBool("m_IsHologram");
9004
9007 {
9010 }
9011
9013
9015 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9017
9018 }
9019
9021 {
9023 }
9024
9026 {
9029 {
9034 }
9035 }
9036
9037 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9038 {
9040 {
9043 }
9044
9046 }
9047
9049 {
9055 }
9056
9058
9060 {
9062
9063 if (!action)
9064 {
9065 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9066 return;
9067 }
9068
9070 if (!ai)
9071 {
9073 return;
9074 }
9075
9077 if (!action_array)
9078 {
9079 action_array = new array<ActionBase_Basic>;
9081 }
9082 if (LogManager.IsActionLogEnable())
9083 {
9084 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9085 }
9086
9087 if (action_array.Find(action) != -1)
9088 {
9089 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9090 }
9091 else
9092 {
9093 action_array.Insert(action);
9094 }
9095 }
9096
9098 {
9100 ActionBase action = player.GetActionManager().GetAction(actionName);
9103
9104 if (action_array)
9105 {
9106 action_array.RemoveItem(action);
9107 }
9108 }
9109
9110
9111
9113 {
9114 ActionOverrideData overrideData = new ActionOverrideData();
9118
9120 if (!actionMap)
9121 {
9124 }
9125
9126 actionMap.Insert(this.
Type(), overrideData);
9127
9128 }
9129
9131
9133
9134
9136 {
9139
9142
9143 string config_to_search = "CfgVehicles";
9144 string muzzle_owner_config;
9145
9147 {
9148 if (IsInherited(Weapon))
9149 config_to_search = "CfgWeapons";
9150
9151 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9152
9153 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9154
9156
9157 if (config_OnFire_subclass_count > 0)
9158 {
9159 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9160
9161 for (int i = 0; i < config_OnFire_subclass_count; i++)
9162 {
9163 string particle_class = "";
9165 string config_OnFire_entry = config_OnFire_class + particle_class;
9166 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9167 WPOF_array.Insert(WPOF);
9168 }
9169
9170
9172 }
9173 }
9174
9176 {
9177 config_to_search = "CfgWeapons";
9178 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9179
9180 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9181
9183
9184 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9185 {
9186 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9187
9188 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9189 {
9190 string particle_class2 = "";
9192 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9193 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9194 WPOBE_array.Insert(WPOBE);
9195 }
9196
9197
9199 }
9200 }
9201 }
9202
9203
9205 {
9208
9210 {
9211 string config_to_search = "CfgVehicles";
9212
9213 if (IsInherited(Weapon))
9214 config_to_search = "CfgWeapons";
9215
9216 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9217 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9218
9219 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9220 {
9221
9223
9225 {
9227 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9229 return;
9230 }
9231
9234
9235
9236
9238 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9239
9240 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9241 {
9242 string particle_class = "";
9244 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9246
9247 if (entry_type == CT_CLASS)
9248 {
9249 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9250 WPOOH_array.Insert(WPOF);
9251 }
9252 }
9253
9254
9256 }
9257 }
9258 }
9259
9261 {
9263 }
9264
9266 {
9268 {
9270
9273
9276
9277 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9278 }
9279 }
9280
9282 {
9284 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9285
9287 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9288
9290 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9291
9293 {
9295 }
9296 }
9297
9299 {
9301 }
9302
9304 {
9307 else
9309
9311 {
9314 }
9315 else
9316 {
9319
9322 }
9323
9325 }
9326
9328 {
9330 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9331 }
9332
9334 {
9336 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9338 }
9339
9341 {
9343 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9344 }
9345
9347 {
9350
9351 OverheatingParticle OP = new OverheatingParticle();
9356
9358 }
9359
9361 {
9364
9365 return -1;
9366 }
9367
9369 {
9371 {
9374
9375 for (int i = count; i > 0; --i)
9376 {
9377 int id = i - 1;
9380
9383
9384 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9385 {
9386 if (p)
9387 {
9390 }
9391 }
9392 }
9393 }
9394 }
9395
9397 {
9399 {
9401 {
9402 int id = i - 1;
9404
9405 if (OP)
9406 {
9408
9409 if (p)
9410 {
9412 }
9413
9414 delete OP;
9415 }
9416 }
9417
9420 }
9421 }
9422
9425 {
9426 return 0.0;
9427 }
9428
9429
9431 {
9432 return 250;
9433 }
9434
9436 {
9437 return 0;
9438 }
9439
9442 {
9444 return true;
9445
9446 return false;
9447 }
9448
9451 {
9454
9456 {
9458 }
9459 else
9460 {
9461
9463 }
9464
9466 }
9467
9474 {
9475 return -1;
9476 }
9477
9478
9479
9480
9482 {
9484 {
9486 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9487
9488 if (r_index >= 0)
9489 {
9490 InventoryLocation r_il = new InventoryLocation;
9491 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9492
9493 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9496 {
9497 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9498 }
9500 {
9501 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9502 }
9503
9504 }
9505
9506 player.GetHumanInventory().ClearUserReservedLocation(this);
9507 }
9508
9511 }
9512
9513
9514
9515
9517 {
9518 return ItemBase.m_DebugActionsMask;
9519 }
9520
9522 {
9523 return ItemBase.m_DebugActionsMask & mask;
9524 }
9525
9527 {
9528 ItemBase.m_DebugActionsMask = mask;
9529 }
9530
9532 {
9533 ItemBase.m_DebugActionsMask |= mask;
9534 }
9535
9537 {
9538 ItemBase.m_DebugActionsMask &= ~mask;
9539 }
9540
9542 {
9544 {
9546 }
9547 else
9548 {
9550 }
9551 }
9552
9553
9555 {
9556 if (GetEconomyProfile())
9557 {
9558 float q_max = GetEconomyProfile().GetQuantityMax();
9559 if (q_max > 0)
9560 {
9561 float q_min = GetEconomyProfile().GetQuantityMin();
9562 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9563
9565 {
9566 ComponentEnergyManager comp = GetCompEM();
9568 {
9570 }
9571 }
9573 {
9575
9576 }
9577
9578 }
9579 }
9580 }
9581
9584 {
9585 EntityAI parent = GetHierarchyParent();
9586
9587 if (parent)
9588 {
9589 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9590 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9591 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9592 }
9593 }
9594
9597 {
9598 EntityAI parent = GetHierarchyParent();
9599
9600 if (parent)
9601 {
9602 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9603 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9604 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9605 }
9606 }
9607
9609 {
9610
9611
9612
9613
9615
9617 {
9618 if (ScriptInputUserData.CanStoreInputUserData())
9619 {
9620 ScriptInputUserData ctx = new ScriptInputUserData;
9626 ctx.
Write(use_stack_max);
9629
9631 {
9632 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9633 }
9634 }
9635 }
9636 else if (!
GetGame().IsMultiplayer())
9637 {
9639 }
9640 }
9641
9643 {
9645 }
9646
9648 {
9650 }
9651
9653 {
9655 }
9656
9658 {
9659
9660 return false;
9661 }
9662
9664 {
9665 return false;
9666 }
9667
9671 {
9672 return false;
9673 }
9674
9676 {
9677 return "";
9678 }
9679
9681
9683 {
9684 return false;
9685 }
9686
9688 {
9689 return true;
9690 }
9691
9692
9693
9695 {
9696 return true;
9697 }
9698
9700 {
9701 return true;
9702 }
9703
9705 {
9706 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9708 }
9709
9711 {
9713 }
9714
9716 {
9718 if (!is_being_placed)
9720 SetSynchDirty();
9721 }
9722
9723
9725
9727 {
9729 }
9730
9732 {
9734 }
9735
9737 {
9738 return 1;
9739 }
9740
9742 {
9743 return false;
9744 }
9745
9747 {
9749 SetSynchDirty();
9750 }
9751
9752
9753
9754
9755
9756
9757
9758
9759
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
9787 {
9788 super.OnMovedInsideCargo(container);
9789
9790 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9791 }
9792
9793 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9794 {
9795 super.EEItemLocationChanged(oldLoc,newLoc);
9796
9797 PlayerBase new_player = null;
9798 PlayerBase old_player = null;
9799
9800 if (newLoc.GetParent())
9801 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9802
9803 if (oldLoc.GetParent())
9804 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9805
9807 {
9808 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9809
9810 if (r_index >= 0)
9811 {
9812 InventoryLocation r_il = new InventoryLocation;
9813 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9814
9815 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9818 {
9819 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9820 }
9822 {
9823 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9824 }
9825
9826 }
9827 }
9828
9830 {
9831 if (new_player)
9832 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9833
9834 if (new_player == old_player)
9835 {
9836
9837 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9838 {
9840 {
9841 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9842 {
9843 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9844 }
9845 }
9846 else
9847 {
9848 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9849 }
9850 }
9851
9852 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9853 {
9854 int type = oldLoc.GetType();
9856 {
9857 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9858 }
9860 {
9861 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9862 }
9863 }
9864 if (!m_OldLocation)
9865 {
9866 m_OldLocation = new InventoryLocation;
9867 }
9868 m_OldLocation.Copy(oldLoc);
9869 }
9870 else
9871 {
9872 if (m_OldLocation)
9873 {
9874 m_OldLocation.Reset();
9875 }
9876 }
9877
9879 }
9880 else
9881 {
9882 if (new_player)
9883 {
9884 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9885 if (res_index >= 0)
9886 {
9887 InventoryLocation il = new InventoryLocation;
9888 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9890 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9893 {
9894 il.
GetParent().GetOnReleaseLock().Invoke(it);
9895 }
9897 {
9899 }
9900
9901 }
9902 }
9904 {
9905
9907 }
9908
9909 if (m_OldLocation)
9910 {
9911 m_OldLocation.Reset();
9912 }
9913 }
9914 }
9915
9916 override void EOnContact(IEntity other, Contact extra)
9917 {
9919 {
9920 int liquidType = -1;
9922 if (impactSpeed > 0.0)
9923 {
9925 #ifndef SERVER
9927 #else
9929 SetSynchDirty();
9930 #endif
9932 }
9933 }
9934
9935 #ifdef SERVER
9936 if (GetCompEM() && GetCompEM().IsPlugged())
9937 {
9938 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9939 GetCompEM().UnplugThis();
9940 }
9941 #endif
9942 }
9943
9945
9947 {
9949 }
9950
9952 {
9953
9954 }
9955
9957 {
9958 super.OnItemLocationChanged(old_owner, new_owner);
9959
9960 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9961 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9962
9963 if (!relatedPlayer && playerNew)
9964 relatedPlayer = playerNew;
9965
9966 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9967 {
9969 if (actionMgr)
9970 {
9971 ActionBase currentAction = actionMgr.GetRunningAction();
9972 if (currentAction)
9974 }
9975 }
9976
9977 Man ownerPlayerOld = null;
9978 Man ownerPlayerNew = null;
9979
9980 if (old_owner)
9981 {
9982 if (old_owner.
IsMan())
9983 {
9984 ownerPlayerOld = Man.Cast(old_owner);
9985 }
9986 else
9987 {
9988 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9989 }
9990 }
9991 else
9992 {
9994 {
9996
9997 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9998 {
9999 GetCompEM().UnplugThis();
10000 }
10001 }
10002 }
10003
10004 if (new_owner)
10005 {
10006 if (new_owner.
IsMan())
10007 {
10008 ownerPlayerNew = Man.Cast(new_owner);
10009 }
10010 else
10011 {
10012 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10013 }
10014 }
10015
10016 if (ownerPlayerOld != ownerPlayerNew)
10017 {
10018 if (ownerPlayerOld)
10019 {
10020 array<EntityAI> subItemsExit = new array<EntityAI>;
10022 for (int i = 0; i < subItemsExit.Count(); i++)
10023 {
10026 }
10027 }
10028
10029 if (ownerPlayerNew)
10030 {
10031 array<EntityAI> subItemsEnter = new array<EntityAI>;
10033 for (int j = 0; j < subItemsEnter.Count(); j++)
10034 {
10037 }
10038 }
10039 }
10040 else if (ownerPlayerNew != null)
10041 {
10042 PlayerBase nplayer;
10043 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10044 {
10045 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10047 for (int k = 0; k < subItemsUpdate.Count(); k++)
10048 {
10050 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10051 }
10052 }
10053 }
10054
10055 if (old_owner)
10056 old_owner.OnChildItemRemoved(this);
10057 if (new_owner)
10058 new_owner.OnChildItemReceived(this);
10059 }
10060
10061
10063 {
10064 super.EEDelete(parent);
10065 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10066 if (player)
10067 {
10069
10070 if (player.IsAlive())
10071 {
10072 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10073 if (r_index >= 0)
10074 {
10075 InventoryLocation r_il = new InventoryLocation;
10076 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10077
10078 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10081 {
10082 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10083 }
10085 {
10086 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10087 }
10088
10089 }
10090
10091 player.RemoveQuickBarEntityShortcut(this);
10092 }
10093 }
10094 }
10095
10097 {
10098 super.EEKilled(killer);
10099
10102 {
10103 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10104 {
10105 if (IsMagazine())
10106 {
10107 if (Magazine.Cast(this).GetAmmoCount() > 0)
10108 {
10110 }
10111 }
10112 else
10113 {
10115 }
10116 }
10117 }
10118 }
10119
10121 {
10122 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10123
10124 super.OnWasAttached(parent, slot_id);
10125
10128
10130 }
10131
10133 {
10134 super.OnWasDetached(parent, slot_id);
10135
10138 }
10139
10141 {
10142 int idx;
10145
10146 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10147 if (inventory_slots.Count() < 1)
10148 {
10149 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10150 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10151 }
10152 else
10153 {
10154 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10155 }
10156
10157 idx = inventory_slots.Find(slot);
10158 if (idx < 0)
10159 return "";
10160
10161 return attach_types.Get(idx);
10162 }
10163
10165 {
10166 int idx = -1;
10167 string slot;
10168
10171
10172 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10173 if (inventory_slots.Count() < 1)
10174 {
10175 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10176 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10177 }
10178 else
10179 {
10180 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10181 if (detach_types.Count() < 1)
10182 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10183 }
10184
10185 for (int i = 0; i < inventory_slots.Count(); i++)
10186 {
10187 slot = inventory_slots.Get(i);
10188 }
10189
10190 if (slot != "")
10191 {
10192 if (detach_types.Count() == 1)
10193 idx = 0;
10194 else
10195 idx = inventory_slots.Find(slot);
10196 }
10197 if (idx < 0)
10198 return "";
10199
10200 return detach_types.Get(idx);
10201 }
10202
10204 {
10205
10207
10208
10209 float min_time = 1;
10210 float max_time = 3;
10211 float delay = Math.RandomFloat(min_time, max_time);
10212
10213 explode_timer.Run(delay, this, "DoAmmoExplosion");
10214 }
10215
10217 {
10218 Magazine magazine = Magazine.Cast(this);
10219 int pop_sounds_count = 6;
10220 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10221
10222
10223 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10224 string sound_name = pop_sounds[ sound_idx ];
10226
10227
10228 magazine.ServerAddAmmoCount(-1);
10229
10230
10231 float min_temp_to_explode = 100;
10232
10233 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10234 {
10236 }
10237 }
10238
10239
10240 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10241 {
10242 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10243
10244 const int CHANCE_DAMAGE_CARGO = 4;
10245 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10246 const int CHANCE_DAMAGE_NOTHING = 2;
10247
10249 {
10250 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10251 int chances;
10252 int rnd;
10253
10254 if (GetInventory().GetCargo())
10255 {
10256 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10257 rnd = Math.RandomInt(0,chances);
10258
10259 if (rnd < CHANCE_DAMAGE_CARGO)
10260 {
10262 }
10263 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10264 {
10266 }
10267 }
10268 else
10269 {
10270 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10271 rnd = Math.RandomInt(0,chances);
10272
10273 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10274 {
10276 }
10277 }
10278 }
10279 }
10280
10282 {
10283 if (GetInventory().GetCargo())
10284 {
10285 int item_count = GetInventory().GetCargo().GetItemCount();
10286 if (item_count > 0)
10287 {
10288 int random_pick = Math.RandomInt(0, item_count);
10290 if (!item.IsExplosive())
10291 {
10292 item.AddHealth("","",damage);
10293 return true;
10294 }
10295 }
10296 }
10297 return false;
10298 }
10299
10301 {
10302 int attachment_count = GetInventory().AttachmentCount();
10303 if (attachment_count > 0)
10304 {
10305 int random_pick = Math.RandomInt(0, attachment_count);
10306 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10307 if (!attachment.IsExplosive())
10308 {
10309 attachment.AddHealth("","",damage);
10310 return true;
10311 }
10312 }
10313 return false;
10314 }
10315
10317 {
10319 }
10320
10322 {
10324 return GetInventory().CanRemoveEntity();
10325
10326 return false;
10327 }
10328
10330 {
10331
10333 return false;
10334
10335
10337 return false;
10338
10339
10340
10342 if (delta == 0)
10343 return false;
10344
10345
10346 return true;
10347 }
10348
10350 {
10352 {
10353 if (ScriptInputUserData.CanStoreInputUserData())
10354 {
10355 ScriptInputUserData ctx = new ScriptInputUserData;
10360 ctx.
Write(destination_entity);
10362 ctx.
Write(slot_id);
10364 }
10365 }
10366 else if (!
GetGame().IsMultiplayer())
10367 {
10369 }
10370 }
10371
10373 {
10374 float split_quantity_new;
10378 InventoryLocation loc = new InventoryLocation;
10379
10380 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10381 {
10383 split_quantity_new = stack_max;
10384 else
10386
10388 {
10389 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10390 if (new_item)
10391 {
10392 new_item.SetResultOfSplit(true);
10393 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10395 new_item.
SetQuantity(split_quantity_new,
false,
true);
10396 }
10397 }
10398 }
10399 else if (destination_entity && slot_id == -1)
10400 {
10401 if (quantity > stack_max)
10402 split_quantity_new = stack_max;
10403 else
10404 split_quantity_new = quantity;
10405
10407 {
10409 {
10412 }
10413
10414 if (new_item)
10415 {
10416 new_item.SetResultOfSplit(true);
10417 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10419 new_item.
SetQuantity(split_quantity_new,
false,
true);
10420 }
10421 }
10422 }
10423 else
10424 {
10425 if (stack_max != 0)
10426 {
10428 {
10430 }
10431
10432 if (split_quantity_new == 0)
10433 {
10434 if (!
GetGame().IsMultiplayer())
10435 player.PhysicalPredictiveDropItem(this);
10436 else
10437 player.ServerDropEntity(this);
10438 return;
10439 }
10440
10442 {
10444
10445 if (new_item)
10446 {
10447 new_item.SetResultOfSplit(true);
10448 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10451 new_item.PlaceOnSurface();
10452 }
10453 }
10454 }
10455 }
10456 }
10457
10459 {
10460 float split_quantity_new;
10464 InventoryLocation loc = new InventoryLocation;
10465
10466 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10467 {
10469 split_quantity_new = stack_max;
10470 else
10472
10474 {
10475 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10476 if (new_item)
10477 {
10478 new_item.SetResultOfSplit(true);
10479 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10481 new_item.
SetQuantity(split_quantity_new,
false,
true);
10482 }
10483 }
10484 }
10485 else if (destination_entity && slot_id == -1)
10486 {
10487 if (quantity > stack_max)
10488 split_quantity_new = stack_max;
10489 else
10490 split_quantity_new = quantity;
10491
10493 {
10495 {
10498 }
10499
10500 if (new_item)
10501 {
10502 new_item.SetResultOfSplit(true);
10503 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10505 new_item.
SetQuantity(split_quantity_new,
false,
true);
10506 }
10507 }
10508 }
10509 else
10510 {
10511 if (stack_max != 0)
10512 {
10514 {
10516 }
10517
10519 {
10521
10522 if (new_item)
10523 {
10524 new_item.SetResultOfSplit(true);
10525 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10528 new_item.PlaceOnSurface();
10529 }
10530 }
10531 }
10532 }
10533 }
10534
10536 {
10538 {
10539 if (ScriptInputUserData.CanStoreInputUserData())
10540 {
10541 ScriptInputUserData ctx = new ScriptInputUserData;
10546 dst.WriteToContext(ctx);
10548 }
10549 }
10550 else if (!
GetGame().IsMultiplayer())
10551 {
10553 }
10554 }
10555
10557 {
10559 {
10560 if (ScriptInputUserData.CanStoreInputUserData())
10561 {
10562 ScriptInputUserData ctx = new ScriptInputUserData;
10567 ctx.
Write(destination_entity);
10573 }
10574 }
10575 else if (!
GetGame().IsMultiplayer())
10576 {
10578 }
10579 }
10580
10582 {
10584 }
10585
10587 {
10589 float split_quantity_new;
10591 if (dst.IsValid())
10592 {
10593 int slot_id = dst.GetSlot();
10595
10596 if (quantity > stack_max)
10597 split_quantity_new = stack_max;
10598 else
10599 split_quantity_new = quantity;
10600
10602 {
10604
10605 if (new_item)
10606 {
10607 new_item.SetResultOfSplit(true);
10608 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10610 new_item.
SetQuantity(split_quantity_new,
false,
true);
10611 }
10612
10613 return new_item;
10614 }
10615 }
10616
10617 return null;
10618 }
10619
10621 {
10623 float split_quantity_new;
10625 if (destination_entity)
10626 {
10628 if (quantity > stackable)
10629 split_quantity_new = stackable;
10630 else
10631 split_quantity_new = quantity;
10632
10634 {
10635 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10636 if (new_item)
10637 {
10638 new_item.SetResultOfSplit(true);
10639 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10641 new_item.
SetQuantity(split_quantity_new,
false,
true);
10642 }
10643 }
10644 }
10645 }
10646
10648 {
10650 {
10651 if (ScriptInputUserData.CanStoreInputUserData())
10652 {
10653 ScriptInputUserData ctx = new ScriptInputUserData;
10658 ItemBase destination_entity =
this;
10659 ctx.
Write(destination_entity);
10663 }
10664 }
10665 else if (!
GetGame().IsMultiplayer())
10666 {
10668 }
10669 }
10670
10672 {
10674 float split_quantity_new;
10676 if (player)
10677 {
10679 if (quantity > stackable)
10680 split_quantity_new = stackable;
10681 else
10682 split_quantity_new = quantity;
10683
10685 {
10686 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10687 new_item =
ItemBase.Cast(in_hands);
10688 if (new_item)
10689 {
10690 new_item.SetResultOfSplit(true);
10691 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10693 new_item.SetQuantity(split_quantity_new, false, true);
10694 }
10695 }
10696 }
10697 }
10698
10700 {
10702 float split_quantity_new = Math.Floor(quantity * 0.5);
10703
10705 return;
10706
10708
10709 if (new_item)
10710 {
10711 if (new_item.GetQuantityMax() < split_quantity_new)
10712 {
10713 split_quantity_new = new_item.GetQuantityMax();
10714 }
10715
10716 new_item.SetResultOfSplit(true);
10717 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10718
10720 {
10723 }
10724 else
10725 {
10727 new_item.
SetQuantity(split_quantity_new,
false,
true);
10728 }
10729 }
10730 }
10731
10733 {
10735 float split_quantity_new = Math.Floor(quantity / 2);
10736
10738 return;
10739
10740 InventoryLocation invloc = new InventoryLocation;
10742
10744 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10745
10746 if (new_item)
10747 {
10748 if (new_item.GetQuantityMax() < split_quantity_new)
10749 {
10750 split_quantity_new = new_item.GetQuantityMax();
10751 }
10753 {
10756 }
10757 else if (split_quantity_new > 1)
10758 {
10760 new_item.
SetQuantity(split_quantity_new,
false,
true);
10761 }
10762 }
10763 }
10764
10767 {
10768 SetWeightDirty();
10770
10771 if (parent)
10772 parent.OnAttachmentQuantityChangedEx(this, delta);
10773
10775 {
10777 {
10779 }
10781 {
10782 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10784 }
10785 }
10786
10787 }
10788
10791 {
10792
10793 }
10794
10797 {
10799 }
10800
10802 {
10803 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10804
10806 {
10807 if (newLevel == GameConstants.STATE_RUINED)
10808 {
10810 EntityAI parent = GetHierarchyParent();
10811 if (parent && parent.IsFireplace())
10812 {
10813 CargoBase cargo = GetInventory().GetCargo();
10814 if (cargo)
10815 {
10817 {
10819 }
10820 }
10821 }
10822 }
10823
10825 {
10826
10828 return;
10829 }
10830
10831 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10832 {
10834 }
10835 }
10836 }
10837
10838
10840 {
10841 super.OnRightClick();
10842
10844 {
10846 {
10847 if (ScriptInputUserData.CanStoreInputUserData())
10848 {
10849 EntityAI root = GetHierarchyRoot();
10850 Man playerOwner = GetHierarchyRootPlayer();
10851 InventoryLocation dst = new InventoryLocation;
10852
10853
10854 if (!playerOwner && root && root == this)
10855 {
10857 }
10858 else
10859 {
10860
10861 GetInventory().GetCurrentInventoryLocation(dst);
10863 {
10866 {
10868 }
10869 else
10870 {
10872
10873
10874 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10875 {
10877 }
10878 else
10879 {
10880 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10881 }
10882 }
10883 }
10884 }
10885
10886 ScriptInputUserData ctx = new ScriptInputUserData;
10894 }
10895 }
10896 else if (!
GetGame().IsMultiplayer())
10897 {
10899 }
10900 }
10901 }
10902
10904 {
10905 if (root)
10906 {
10907 vector m4[4];
10908 root.GetTransform(m4);
10909 dst.SetGround(this, m4);
10910 }
10911 else
10912 {
10913 GetInventory().GetCurrentInventoryLocation(dst);
10914 }
10915 }
10916
10917 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10918 {
10919
10920 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10921 return false;
10922
10923 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10924 return false;
10925
10926
10928 return false;
10929
10930
10931 Magazine mag = Magazine.Cast(this);
10932 if (mag)
10933 {
10934 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10935 return false;
10936
10937 if (stack_max_limit)
10938 {
10939 Magazine other_mag = Magazine.Cast(other_item);
10940 if (other_item)
10941 {
10942 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10943 return false;
10944 }
10945
10946 }
10947 }
10948 else
10949 {
10950
10952 return false;
10953
10955 return false;
10956 }
10957
10958 PlayerBase player = null;
10959 if (CastTo(player, GetHierarchyRootPlayer()))
10960 {
10961 if (player.GetInventory().HasAttachment(this))
10962 return false;
10963
10964 if (player.IsItemsToDelete())
10965 return false;
10966 }
10967
10968 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10969 return false;
10970
10971 int slotID;
10973 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10974 return false;
10975
10976 return true;
10977 }
10978
10980 {
10982 }
10983
10985 {
10986 return m_IsResultOfSplit;
10987 }
10988
10990 {
10991 m_IsResultOfSplit = value;
10992 }
10993
10995 {
10997 }
10998
11000 {
11001 float other_item_quantity = other_item.GetQuantity();
11002 float this_free_space;
11003
11005
11007
11008 if (other_item_quantity > this_free_space)
11009 {
11010 return this_free_space;
11011 }
11012 else
11013 {
11014 return other_item_quantity;
11015 }
11016 }
11017
11019 {
11021 }
11022
11024 {
11026 return;
11027
11028 if (!IsMagazine() && other_item)
11029 {
11031 if (quantity_used != 0)
11032 {
11033 float hp1 = GetHealth01("","");
11034 float hp2 = other_item.GetHealth01("","");
11035 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11036 hpResult = hpResult / (
GetQuantity() + quantity_used);
11037
11038 hpResult *= GetMaxHealth();
11039 Math.Round(hpResult);
11040 SetHealth("", "Health", hpResult);
11041
11043 other_item.AddQuantity(-quantity_used);
11044 }
11045 }
11047 }
11048
11050 {
11051 #ifdef SERVER
11052 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11053 GetHierarchyParent().IncreaseLifetimeUp();
11054 #endif
11055 };
11056
11058 {
11059 PlayerBase p = PlayerBase.Cast(player);
11060
11061 array<int> recipesIds = p.m_Recipes;
11062 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11063 if (moduleRecipesManager)
11064 {
11065 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11066 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11067 }
11068
11069 for (int i = 0;i < recipesIds.Count(); i++)
11070 {
11071 int key = recipesIds.Get(i);
11072 string recipeName = moduleRecipesManager.GetRecipeName(key);
11074 }
11075 }
11076
11077
11078 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11079 {
11080 super.GetDebugActions(outputList);
11081
11082
11088
11089
11094
11099
11100
11104
11105
11107 {
11111 }
11112
11115
11116
11120
11122
11123 InventoryLocation loc = new InventoryLocation();
11124 GetInventory().GetCurrentInventoryLocation(loc);
11126 {
11127 if (Gizmo_IsSupported())
11130 }
11131
11133 }
11134
11135
11136
11137
11139 {
11140 super.OnAction(action_id, player, ctx);
11141
11143 {
11144 switch (action_id)
11145 {
11148 return true;
11151 return true;
11152 }
11153 }
11154
11156 {
11157 switch (action_id)
11158 {
11160 Delete();
11161 return true;
11162 }
11163 }
11164
11165 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11166 {
11167 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11168 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11169 PlayerBase p = PlayerBase.Cast(player);
11170 if (
EActions.RECIPES_RANGE_START < 1000)
11171 {
11172 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11173 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11174 }
11175 }
11176 #ifndef SERVER
11177 else if (action_id ==
EActions.WATCH_PLAYER)
11178 {
11179 PluginDeveloper.SetDeveloperItemClientEx(player);
11180 }
11181 #endif
11183 {
11184 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11185 {
11186 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11187 OnDebugButtonPressServer(id + 1);
11188 }
11189
11190 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11191 {
11192 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11194 }
11195
11196 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11197 {
11198 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11200 }
11201
11202 else if (action_id ==
EActions.ADD_QUANTITY)
11203 {
11204 if (IsMagazine())
11205 {
11206 Magazine mag = Magazine.Cast(this);
11207 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11208 }
11209 else
11210 {
11212 }
11213
11214 if (m_EM)
11215 {
11216 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11217 }
11218
11219 }
11220
11221 else if (action_id ==
EActions.REMOVE_QUANTITY)
11222 {
11223 if (IsMagazine())
11224 {
11225 Magazine mag2 = Magazine.Cast(this);
11226 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11227 }
11228 else
11229 {
11231 }
11232 if (m_EM)
11233 {
11234 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11235 }
11236
11237 }
11238
11239 else if (action_id ==
EActions.SET_QUANTITY_0)
11240 {
11242
11243 if (m_EM)
11244 {
11245 m_EM.SetEnergy(0);
11246 }
11247 }
11248
11249 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11250 {
11252
11253 if (m_EM)
11254 {
11255 m_EM.SetEnergy(m_EM.GetEnergyMax());
11256 }
11257 }
11258
11259 else if (action_id ==
EActions.ADD_HEALTH)
11260 {
11261 AddHealth("","",GetMaxHealth("","Health")/5);
11262 }
11263 else if (action_id ==
EActions.REMOVE_HEALTH)
11264 {
11265 AddHealth("","",-GetMaxHealth("","Health")/5);
11266 }
11267 else if (action_id ==
EActions.DESTROY_HEALTH)
11268 {
11269 SetHealth01("","",0);
11270 }
11271 else if (action_id ==
EActions.WATCH_ITEM)
11272 {
11274 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11275 #ifdef DEVELOPER
11276 SetDebugDeveloper_item(this);
11277 #endif
11278 }
11279
11280 else if (action_id ==
EActions.ADD_TEMPERATURE)
11281 {
11282 AddTemperature(20);
11283
11284 }
11285
11286 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11287 {
11288 AddTemperature(-20);
11289
11290 }
11291
11292 else if (action_id ==
EActions.FLIP_FROZEN)
11293 {
11294 SetFrozen(!GetIsFrozen());
11295
11296 }
11297
11298 else if (action_id ==
EActions.ADD_WETNESS)
11299 {
11301
11302 }
11303
11304 else if (action_id ==
EActions.REMOVE_WETNESS)
11305 {
11307
11308 }
11309
11310 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11311 {
11314
11315
11316 }
11317
11318 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11319 {
11322 }
11323
11324 else if (action_id ==
EActions.MAKE_SPECIAL)
11325 {
11326 auto debugParams = DebugSpawnParams.WithPlayer(player);
11327 OnDebugSpawnEx(debugParams);
11328 }
11329
11330 }
11331
11332
11333 return false;
11334 }
11335
11336
11337
11338
11342
11345
11346
11347
11349 {
11350 return false;
11351 }
11352
11353
11355 {
11356 return true;
11357 }
11358
11359
11361 {
11362 return true;
11363 }
11364
11365
11366
11368 {
11369 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11371 }
11372
11375 {
11376 return null;
11377 }
11378
11380 {
11381 return false;
11382 }
11383
11385 {
11386 return false;
11387 }
11388
11392
11393
11395 {
11396 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11397 return module_repairing.CanRepair(this, item_repair_kit);
11398 }
11399
11400
11401 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11402 {
11403 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11404 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11405 }
11406
11407
11409 {
11410
11411
11412
11413
11414
11415
11416
11417
11418 return 1;
11419 }
11420
11421
11422
11424 {
11426 }
11427
11428
11429
11431 {
11433 }
11434
11435
11444 {
11445 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11446
11447 if (player)
11448 {
11449 player.MessageStatus(text);
11450 }
11451 }
11452
11453
11462 {
11463 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11464
11465 if (player)
11466 {
11467 player.MessageAction(text);
11468 }
11469 }
11470
11471
11480 {
11481 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11482
11483 if (player)
11484 {
11485 player.MessageFriendly(text);
11486 }
11487 }
11488
11489
11498 {
11499 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11500
11501 if (player)
11502 {
11503 player.MessageImportant(text);
11504 }
11505 }
11506
11508 {
11509 return true;
11510 }
11511
11512
11513 override bool KindOf(
string tag)
11514 {
11515 bool found = false;
11516 string item_name = this.
GetType();
11519
11520 int array_size = item_tag_array.Count();
11521 for (int i = 0; i < array_size; i++)
11522 {
11523 if (item_tag_array.Get(i) == tag)
11524 {
11525 found = true;
11526 break;
11527 }
11528 }
11529 return found;
11530 }
11531
11532
11534 {
11535
11536 super.OnRPC(sender, rpc_type,ctx);
11537
11538
11539 switch (rpc_type)
11540 {
11541 #ifndef SERVER
11542 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11543 Param2<bool, string> p = new Param2<bool, string>(false, "");
11544
11546 return;
11547
11548 bool play = p.param1;
11549 string soundSet = p.param2;
11550
11551 if (play)
11552 {
11554 {
11556 {
11558 }
11559 }
11560 else
11561 {
11563 }
11564 }
11565 else
11566 {
11568 }
11569
11570 break;
11571 #endif
11572
11573 }
11574
11576 {
11578 }
11579 }
11580
11581
11582
11583
11585 {
11586 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11587 return plugin.GetID(
name);
11588 }
11589
11591 {
11592 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11593 return plugin.GetName(id);
11594 }
11595
11598 {
11599
11600
11601 int varFlags;
11602 if (!ctx.
Read(varFlags))
11603 return;
11604
11605 if (varFlags & ItemVariableFlags.FLOAT)
11606 {
11608 }
11609 }
11610
11612 {
11613
11614 super.SerializeNumericalVars(floats_out);
11615
11616
11617
11619 {
11621 }
11622
11624 {
11626 }
11627
11629 {
11631 }
11632
11634 {
11639 }
11640
11642 {
11644 }
11645 }
11646
11648 {
11649
11650 super.DeSerializeNumericalVars(floats);
11651
11652
11653 int index = 0;
11654 int mask = Math.Round(floats.Get(index));
11655
11656 index++;
11657
11659 {
11661 {
11663 }
11664 else
11665 {
11666 float quantity = floats.Get(index);
11667 SetQuantity(quantity,
true,
false,
false,
false);
11668 }
11669 index++;
11670 }
11671
11673 {
11674 float wet = floats.Get(index);
11676 index++;
11677 }
11678
11680 {
11681 int liquidtype = Math.Round(floats.Get(index));
11683 index++;
11684 }
11685
11687 {
11689 index++;
11691 index++;
11693 index++;
11695 index++;
11696 }
11697
11699 {
11700 int cleanness = Math.Round(floats.Get(index));
11702 index++;
11703 }
11704 }
11705
11707 {
11708 super.WriteVarsToCTX(ctx);
11709
11710
11712 {
11714 }
11715
11717 {
11719 }
11720
11722 {
11724 }
11725
11727 {
11728 int r,g,b,a;
11734 }
11735
11737 {
11739 }
11740 }
11741
11743 {
11744 if (!super.ReadVarsFromCTX(ctx,version))
11745 return false;
11746
11747 int intValue;
11748 float value;
11749
11750 if (version < 140)
11751 {
11752 if (!ctx.
Read(intValue))
11753 return false;
11754
11755 m_VariablesMask = intValue;
11756 }
11757
11759 {
11760 if (!ctx.
Read(value))
11761 return false;
11762
11764 {
11766 }
11767 else
11768 {
11770 }
11771 }
11772
11773 if (version < 140)
11774 {
11776 {
11777 if (!ctx.
Read(value))
11778 return false;
11779 SetTemperatureDirect(value);
11780 }
11781 }
11782
11784 {
11785 if (!ctx.
Read(value))
11786 return false;
11788 }
11789
11791 {
11792 if (!ctx.
Read(intValue))
11793 return false;
11795 }
11796
11798 {
11799 int r,g,b,a;
11801 return false;
11803 return false;
11805 return false;
11807 return false;
11808
11810 }
11811
11813 {
11814 if (!ctx.
Read(intValue))
11815 return false;
11817 }
11818
11819 if (version >= 138 && version < 140)
11820 {
11822 {
11823 if (!ctx.
Read(intValue))
11824 return false;
11825 SetFrozen(intValue);
11826 }
11827 }
11828
11829 return true;
11830 }
11831
11832
11834 {
11837 {
11839 }
11840
11841 if (!super.OnStoreLoad(ctx, version))
11842 {
11844 return false;
11845 }
11846
11847 if (version >= 114)
11848 {
11849 bool hasQuickBarIndexSaved;
11850
11851 if (!ctx.
Read(hasQuickBarIndexSaved))
11852 {
11854 return false;
11855 }
11856
11857 if (hasQuickBarIndexSaved)
11858 {
11859 int itmQBIndex;
11860
11861
11862 if (!ctx.
Read(itmQBIndex))
11863 {
11865 return false;
11866 }
11867
11868 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11869 if (itmQBIndex != -1 && parentPlayer)
11870 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11871 }
11872 }
11873 else
11874 {
11875
11876 PlayerBase player;
11877 int itemQBIndex;
11878 if (version ==
int.
MAX)
11879 {
11880 if (!ctx.
Read(itemQBIndex))
11881 {
11883 return false;
11884 }
11885 }
11886 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11887 {
11888
11889 if (!ctx.
Read(itemQBIndex))
11890 {
11892 return false;
11893 }
11894 if (itemQBIndex != -1 && player)
11895 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11896 }
11897 }
11898
11899 if (version < 140)
11900 {
11901
11902 if (!LoadVariables(ctx, version))
11903 {
11905 return false;
11906 }
11907 }
11908
11909
11911 {
11913 return false;
11914 }
11915 if (version >= 132)
11916 {
11918 if (raib)
11919 {
11921 {
11923 return false;
11924 }
11925 }
11926 }
11927
11929 return true;
11930 }
11931
11932
11933
11935 {
11936 super.OnStoreSave(ctx);
11937
11938 PlayerBase player;
11939 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11940 {
11942
11943 int itemQBIndex = -1;
11944 itemQBIndex = player.FindQuickBarEntityIndex(this);
11945 ctx.
Write(itemQBIndex);
11946 }
11947 else
11948 {
11950 }
11951
11953
11955 if (raib)
11956 {
11958 }
11959 }
11960
11961
11963 {
11964 super.AfterStoreLoad();
11965
11967 {
11969 }
11970
11972 {
11975 }
11976 }
11977
11979 {
11980 super.EEOnAfterLoad();
11981
11983 {
11985 }
11986
11989 }
11990
11992 {
11993 return false;
11994 }
11995
11996
11997
11999 {
12001 {
12002 #ifdef PLATFORM_CONSOLE
12003
12005 {
12007 if (menu)
12008 {
12010 }
12011 }
12012 #endif
12013 }
12014
12016 {
12019 }
12020
12022 {
12023 SetWeightDirty();
12025 }
12027 {
12030 }
12031
12033 {
12036 }
12038 {
12041 }
12042
12043 super.OnVariablesSynchronized();
12044 }
12045
12046
12047
12049 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12050 {
12051 if (!IsServerCheck(allow_client))
12052 return false;
12053
12055 return false;
12056
12059
12060 if (value <= (min + 0.001))
12061 value = min;
12062
12063 if (value == min)
12064 {
12065 if (destroy_config)
12066 {
12067 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12068 if (dstr)
12069 {
12071 this.Delete();
12072 return true;
12073 }
12074 }
12075 else if (destroy_forced)
12076 {
12078 this.Delete();
12079 return true;
12080 }
12081
12083 }
12084
12087
12089 {
12091
12092 if (delta)
12094 }
12095
12097
12098 return false;
12099 }
12100
12101
12103 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12104 {
12106 }
12107
12109 {
12112 }
12113
12115 {
12118 }
12119
12121 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12122 {
12123 float value_clamped = Math.Clamp(value, 0, 1);
12125 SetQuantity(result, destroy_config, destroy_forced);
12126 }
12127
12128
12131 {
12133 }
12134
12136 {
12138 }
12139
12140
12141
12142
12143
12144
12145
12146
12147
12148
12150 {
12151 int slot = -1;
12152 if (GetInventory())
12153 {
12154 InventoryLocation il = new InventoryLocation;
12155 GetInventory().GetCurrentInventoryLocation(il);
12157 }
12158
12160 }
12161
12163 {
12164 float quantity_max = 0;
12165
12167 {
12168 if (attSlotID != -1)
12169 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12170
12171 if (quantity_max <= 0)
12173 }
12174
12175 if (quantity_max <= 0)
12177
12178 return quantity_max;
12179 }
12180
12182 {
12184 }
12185
12187 {
12189 }
12190
12191
12193 {
12195 }
12196
12198 {
12200 }
12201
12203 {
12205 }
12206
12207
12209 {
12210
12211 float weightEx = GetWeightEx();
12212 float special = GetInventoryAndCargoWeight();
12213 return weightEx - special;
12214 }
12215
12216
12218 {
12220 }
12221
12223 {
12225 {
12226 #ifdef DEVELOPER
12227 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12228 {
12229 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12231 }
12232 #endif
12233
12234 return GetQuantity() * GetConfigWeightModified();
12235 }
12236 else if (HasEnergyManager())
12237 {
12238 #ifdef DEVELOPER
12239 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12240 {
12241 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12242 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12243 }
12244 #endif
12245 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12246 }
12247 else
12248 {
12249 #ifdef DEVELOPER
12250 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12251 {
12252 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12253 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12254 }
12255 #endif
12256 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12257 }
12258 }
12259
12262 {
12263 int item_count = 0;
12265
12266 if (GetInventory().GetCargo() != NULL)
12267 {
12268 item_count = GetInventory().GetCargo().GetItemCount();
12269 }
12270
12271 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12272 {
12273 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12274 if (item)
12275 item_count += item.GetNumberOfItems();
12276 }
12277 return item_count;
12278 }
12279
12282 {
12283 float weight = 0;
12284 float wetness = 1;
12285 if (include_wetness)
12288 {
12289 weight = wetness * m_ConfigWeight;
12290 }
12292 {
12293 weight = 1;
12294 }
12295 return weight;
12296 }
12297
12298
12299
12301 {
12302 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12303 {
12304 GameInventory inv = GetInventory();
12305 array<EntityAI> items = new array<EntityAI>;
12307 for (int i = 0; i < items.Count(); i++)
12308 {
12310 if (item)
12311 {
12313 }
12314 }
12315 }
12316 }
12317
12318
12319
12320
12322 {
12323 float energy = 0;
12324 if (HasEnergyManager())
12325 {
12326 energy = GetCompEM().GetEnergy();
12327 }
12328 return energy;
12329 }
12330
12331
12333 {
12334 super.OnEnergyConsumed();
12335
12337 }
12338
12340 {
12341 super.OnEnergyAdded();
12342
12344 }
12345
12346
12348 {
12349 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12350 {
12352 {
12353 float energy_0to1 = GetCompEM().GetEnergy0To1();
12355 }
12356 }
12357 }
12358
12359
12361 {
12362 return ConfigGetFloat("heatIsolation");
12363 }
12364
12366 {
12368 }
12369
12371 {
12372 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12373 if (
GetGame().ConfigIsExisting(paramPath))
12375
12376 return 0.0;
12377 }
12378
12380 {
12381 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12382 if (
GetGame().ConfigIsExisting(paramPath))
12384
12385 return 0.0;
12386 }
12387
12388 override void SetWet(
float value,
bool allow_client =
false)
12389 {
12390 if (!IsServerCheck(allow_client))
12391 return;
12392
12395
12397
12398 m_VarWet = Math.Clamp(value, min, max);
12399
12401 {
12404 }
12405 }
12406
12407 override void AddWet(
float value)
12408 {
12410 }
12411
12413 {
12415 }
12416
12418 {
12420 }
12421
12423 {
12425 }
12426
12428 {
12430 }
12431
12433 {
12435 }
12436
12437 override void OnWetChanged(
float newVal,
float oldVal)
12438 {
12441 if (newLevel != oldLevel)
12442 {
12444 }
12445 }
12446
12448 {
12449 SetWeightDirty();
12450 }
12451
12453 {
12454 return GetWetLevelInternal(
m_VarWet);
12455 }
12456
12457
12458
12460 {
12462 }
12463
12465 {
12467 }
12468
12470 {
12472 }
12473
12475 {
12477 }
12478
12479
12480
12482 {
12483 if (ConfigIsExisting("itemModelLength"))
12484 {
12485 return ConfigGetFloat("itemModelLength");
12486 }
12487 return 0;
12488 }
12489
12491 {
12492 if (ConfigIsExisting("itemAttachOffset"))
12493 {
12494 return ConfigGetFloat("itemAttachOffset");
12495 }
12496 return 0;
12497 }
12498
12499 override void SetCleanness(
int value,
bool allow_client =
false)
12500 {
12501 if (!IsServerCheck(allow_client))
12502 return;
12503
12505
12507
12510 }
12511
12513 {
12515 }
12516
12518 {
12519 return true;
12520 }
12521
12522
12523
12524
12526 {
12528 }
12529
12531 {
12533 }
12534
12535
12536
12537
12538 override void SetColor(
int r,
int g,
int b,
int a)
12539 {
12545 }
12547 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12548 {
12553 }
12554
12556 {
12558 }
12559
12562 {
12563 int r,g,b,a;
12565 r = r/255;
12566 g = g/255;
12567 b = b/255;
12568 a = a/255;
12569 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12570 }
12571
12572
12573
12574 override void SetLiquidType(
int value,
bool allow_client =
false)
12575 {
12576 if (!IsServerCheck(allow_client))
12577 return;
12578
12583 }
12584
12586 {
12587 return ConfigGetInt("varLiquidTypeInit");
12588 }
12589
12591 {
12593 }
12594
12596 {
12598 SetFrozen(false);
12599 }
12600
12603 {
12604 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12605 }
12606
12607
12610 {
12611 PlayerBase nplayer;
12612 if (PlayerBase.CastTo(nplayer, player))
12613 {
12615
12616 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12617 }
12618 }
12619
12620
12623 {
12624 PlayerBase nplayer;
12625 if (PlayerBase.CastTo(nplayer,player))
12626 {
12627
12628 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12629
12630 }
12631
12632
12633 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12634
12635
12636 if (HasEnergyManager())
12637 {
12638 GetCompEM().UpdatePlugState();
12639 }
12640 }
12641
12642
12644 {
12645 super.OnPlacementStarted(player);
12646
12648 }
12649
12650 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12651 {
12653 {
12654 m_AdminLog.OnPlacementComplete(player,
this);
12655 }
12656
12657 super.OnPlacementComplete(player, position, orientation);
12658 }
12659
12660
12661
12662
12663
12665 {
12667 {
12668 return true;
12669 }
12670 else
12671 {
12672 return false;
12673 }
12674 }
12675
12676
12678 {
12680 {
12682 }
12683 }
12684
12685
12687 {
12689 }
12690
12692 {
12694 }
12695
12696 override void InsertAgent(
int agent,
float count = 1)
12697 {
12698 if (count < 1)
12699 return;
12700
12702 }
12703
12706 {
12708 }
12709
12710
12712 {
12714 }
12715
12716
12717
12718
12719
12720
12721
12722
12723
12724
12725
12726
12727
12728
12729
12730
12731
12732
12733
12734
12735
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
12753
12754
12755
12756
12758 {
12760 return false;
12761 return true;
12762 }
12763
12765 {
12766
12768 }
12769
12770
12773 {
12774 super.CheckForRoofLimited(timeTresholdMS);
12775
12777 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12778 {
12779 m_PreviousRoofTestTime = time;
12780 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12781 }
12782 }
12783
12784
12786 {
12788 {
12789 return 0;
12790 }
12791
12792 if (GetInventory().GetAttachmentSlotsCount() != 0)
12793 {
12794 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12795 if (filter)
12796 return filter.GetProtectionLevel(type, false, system);
12797 else
12798 return 0;
12799 }
12800
12801 string subclassPath, entryName;
12802
12803 switch (type)
12804 {
12806 entryName = "biological";
12807 break;
12809 entryName = "chemical";
12810 break;
12811 default:
12812 entryName = "biological";
12813 break;
12814 }
12815
12816 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12817
12819 }
12820
12821
12822
12825 {
12826 if (!IsMagazine())
12828
12830 }
12831
12832
12833
12834
12835
12840 {
12841 return true;
12842 }
12843
12845 {
12847 }
12848
12849
12850
12851
12852
12854 {
12855 if (parent)
12856 {
12857 if (parent.IsInherited(DayZInfected))
12858 return true;
12859
12860 if (!parent.IsRuined())
12861 return true;
12862 }
12863
12864 return true;
12865 }
12866
12868 {
12869 if (!super.CanPutAsAttachment(parent))
12870 {
12871 return false;
12872 }
12873
12874 if (!IsRuined() && !parent.IsRuined())
12875 {
12876 return true;
12877 }
12878
12879 return false;
12880 }
12881
12883 {
12884
12885
12886
12887
12888 return super.CanReceiveItemIntoCargo(item);
12889 }
12890
12892 {
12893
12894
12895
12896
12897 GameInventory attachmentInv = attachment.GetInventory();
12899 {
12900 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12901 return false;
12902 }
12903
12904 InventoryLocation loc = new InventoryLocation();
12905 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12906 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12907 return false;
12908
12909 return super.CanReceiveAttachment(attachment, slotId);
12910 }
12911
12913 {
12914 if (!super.CanReleaseAttachment(attachment))
12915 return false;
12916
12917 return GetInventory().AreChildrenAccessible();
12918 }
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12941 {
12942 int id = muzzle_owner.GetMuzzleID();
12943 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12944
12945 if (WPOF_array)
12946 {
12947 for (int i = 0; i < WPOF_array.Count(); i++)
12948 {
12949 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12950
12951 if (WPOF)
12952 {
12953 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12954 }
12955 }
12956 }
12957 }
12958
12959
12961 {
12962 int id = muzzle_owner.GetMuzzleID();
12964
12965 if (WPOBE_array)
12966 {
12967 for (int i = 0; i < WPOBE_array.Count(); i++)
12968 {
12969 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12970
12971 if (WPOBE)
12972 {
12973 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12974 }
12975 }
12976 }
12977 }
12978
12979
12981 {
12982 int id = muzzle_owner.GetMuzzleID();
12983 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12984
12985 if (WPOOH_array)
12986 {
12987 for (int i = 0; i < WPOOH_array.Count(); i++)
12988 {
12989 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12990
12991 if (WPOOH)
12992 {
12993 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12994 }
12995 }
12996 }
12997 }
12998
12999
13001 {
13002 int id = muzzle_owner.GetMuzzleID();
13003 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13004
13005 if (WPOOH_array)
13006 {
13007 for (int i = 0; i < WPOOH_array.Count(); i++)
13008 {
13009 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13010
13011 if (WPOOH)
13012 {
13013 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13014 }
13015 }
13016 }
13017 }
13018
13019
13021 {
13022 int id = muzzle_owner.GetMuzzleID();
13023 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13024
13025 if (WPOOH_array)
13026 {
13027 for (int i = 0; i < WPOOH_array.Count(); i++)
13028 {
13029 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13030
13031 if (WPOOH)
13032 {
13033 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13034 }
13035 }
13036 }
13037 }
13038
13039
13040
13042 {
13044 {
13045 return true;
13046 }
13047
13048 return false;
13049 }
13050
13052 {
13054 {
13055 return true;
13056 }
13057
13058 return false;
13059 }
13060
13062 {
13064 {
13065 return true;
13066 }
13067
13068 return false;
13069 }
13070
13072 {
13073 return false;
13074 }
13075
13078 {
13079 return UATimeSpent.DEFAULT_DEPLOY;
13080 }
13081
13082
13083
13084
13086 {
13088 SetSynchDirty();
13089 }
13090
13092 {
13094 }
13095
13096
13098 {
13099 return false;
13100 }
13101
13104 {
13105 string att_type = "None";
13106
13107 if (ConfigIsExisting("soundAttType"))
13108 {
13109 att_type = ConfigGetString("soundAttType");
13110 }
13111
13113 }
13114
13116 {
13118 }
13119
13120
13121
13122
13123
13129
13131 {
13134
13136 }
13137
13138
13140 {
13142 return;
13143
13145
13148
13151
13152 SoundParameters params = new SoundParameters();
13156 }
13157
13158
13160 {
13162 return;
13163
13165 SetSynchDirty();
13166
13169 }
13170
13171
13173 {
13175 return;
13176
13178 SetSynchDirty();
13179
13182 }
13183
13185 {
13187 }
13188
13190 {
13192 }
13193
13196 {
13197 if (!
GetGame().IsDedicatedServer())
13198 {
13199 if (ConfigIsExisting("attachSoundSet"))
13200 {
13201 string cfg_path = "";
13202 string soundset = "";
13203 string type_name =
GetType();
13204
13207 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13208 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13209
13210 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13211 {
13212 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13213 {
13214 if (cfg_slot_array[i] == slot_type)
13215 {
13216 soundset = cfg_soundset_array[i];
13217 break;
13218 }
13219 }
13220 }
13221
13222 if (soundset != "")
13223 {
13224 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13226 }
13227 }
13228 }
13229 }
13230
13232 {
13233
13234 }
13235
13236 void OnApply(PlayerBase player);
13237
13239 {
13240 return 1.0;
13241 };
13242
13244 {
13246 }
13247
13249 {
13251 }
13252
13254
13256 {
13257 SetDynamicPhysicsLifeTime(0.01);
13259 }
13260
13262 {
13263 array<string> zone_names = new array<string>;
13264 GetDamageZones(zone_names);
13265 for (int i = 0; i < zone_names.Count(); i++)
13266 {
13267 SetHealthMax(zone_names.Get(i),"Health");
13268 }
13269 SetHealthMax("","Health");
13270 }
13271
13274 {
13275 float global_health = GetHealth01("","Health");
13276 array<string> zones = new array<string>;
13277 GetDamageZones(zones);
13278
13279 for (int i = 0; i < zones.Count(); i++)
13280 {
13281 SetHealth01(zones.Get(i),"Health",global_health);
13282 }
13283 }
13284
13287 {
13288 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13289 }
13290
13292 {
13293 if (!hasRootAsPlayer)
13294 {
13295 if (refParentIB)
13296 {
13297
13298 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13299 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13300
13301 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13302 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13303
13306 }
13307 else
13308 {
13309
13312 }
13313 }
13314 }
13315
13317 {
13319 {
13320 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13321 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13322 {
13323 float heatPermCoef = 1.0;
13325 while (ent)
13326 {
13327 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13328 ent = ent.GetHierarchyParent();
13329 }
13330
13331 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13332 }
13333 }
13334 }
13335
13337 {
13338
13339 EntityAI parent = GetHierarchyParent();
13340 if (!parent)
13341 {
13342 hasParent = false;
13343 hasRootAsPlayer = false;
13344 }
13345 else
13346 {
13347 hasParent = true;
13348 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13349 refParentIB =
ItemBase.Cast(parent);
13350 }
13351 }
13352
13353 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13354 {
13355
13356 }
13357
13359 {
13360
13361 return false;
13362 }
13363
13365 {
13366
13367
13368 return false;
13369 }
13370
13372 {
13373
13374 return false;
13375 }
13376
13379 {
13380 return !GetIsFrozen() &&
IsOpen();
13381 }
13382
13384 {
13385 bool hasParent = false, hasRootAsPlayer = false;
13387
13388 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13389 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13390
13391 if (wwtu || foodDecay)
13392 {
13396
13397 if (processWetness || processTemperature || processDecay)
13398 {
13400
13401 if (processWetness)
13402 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13403
13404 if (processTemperature)
13406
13407 if (processDecay)
13408 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13409 }
13410 }
13411 }
13412
13415 {
13417 }
13418
13420 {
13423
13424 return super.GetTemperatureFreezeThreshold();
13425 }
13426
13428 {
13431
13432 return super.GetTemperatureThawThreshold();
13433 }
13434
13436 {
13439
13440 return super.GetItemOverheatThreshold();
13441 }
13442
13444 {
13446 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13447
13448 return super.GetTemperatureFreezeTime();
13449 }
13450
13452 {
13454 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13455
13456 return super.GetTemperatureThawTime();
13457 }
13458
13463
13465 {
13466 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13467 }
13468
13470 {
13471 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13472 }
13473
13476 {
13478 }
13479
13481 {
13483 }
13484
13486 {
13488 }
13489
13492 {
13493 return null;
13494 }
13495
13498 {
13499 return false;
13500 }
13501
13503 {
13505 {
13508 if (!trg)
13509 {
13511 explosive = this;
13512 }
13513
13514 explosive.PairRemote(trg);
13516
13517 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13518 trg.SetPersistentPairID(persistentID);
13519 explosive.SetPersistentPairID(persistentID);
13520
13521 return true;
13522 }
13523 return false;
13524 }
13525
13528 {
13529 float ret = 1.0;
13532 ret *= GetHealth01();
13533
13534 return ret;
13535 }
13536
13537 #ifdef DEVELOPER
13538 override void SetDebugItem()
13539 {
13540 super.SetDebugItem();
13541 _itemBase = this;
13542 }
13543
13545 {
13546 string text = super.GetDebugText();
13547
13549 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13550
13551 return text;
13552 }
13553 #endif
13554
13556 {
13557 return true;
13558 }
13559
13561
13563
13565 {
13568 }
13569
13570
13578
13594}
13595
13597{
13599 if (entity)
13600 {
13601 bool is_item = entity.IsInherited(
ItemBase);
13602 if (is_item && full_quantity)
13603 {
13606 }
13607 }
13608 else
13609 {
13611 return NULL;
13612 }
13613 return entity;
13614}
13615
13617{
13618 if (item)
13619 {
13620 if (health > 0)
13621 item.SetHealth("", "", health);
13622
13623 if (item.CanHaveTemperature())
13624 {
13626 if (item.CanFreeze())
13627 item.SetFrozen(false);
13628 }
13629
13630 if (item.HasEnergyManager())
13631 {
13632 if (quantity >= 0)
13633 {
13634 item.GetCompEM().SetEnergy0To1(quantity);
13635 }
13636 else
13637 {
13639 }
13640 }
13641 else if (item.IsMagazine())
13642 {
13643 Magazine mag = Magazine.Cast(item);
13644 if (quantity >= 0)
13645 {
13646 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13647 }
13648 else
13649 {
13651 }
13652
13653 }
13654 else
13655 {
13656 if (quantity >= 0)
13657 {
13658 item.SetQuantityNormalized(quantity, false);
13659 }
13660 else
13661 {
13663 }
13664
13665 }
13666 }
13667}
13668
13669#ifdef DEVELOPER
13671#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
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()
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)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.