8947{
8949 {
8950 return true;
8951 }
8952};
8953
8954
8955
8957{
8961
8963
8966
8967
8968
8969
8970
8979
8985
8990
8995
9016 protected bool m_IsResultOfSplit
9017
9019
9024
9025
9026
9028
9032
9033
9034
9036
9039
9040
9041
9047
9048
9056
9059
9060
9062
9063
9065
9066
9071
9072
9077
9078
9080
9081
9083 {
9088
9089 if (!
GetGame().IsDedicatedServer())
9090 {
9092 {
9094
9096 {
9098 }
9099 }
9100
9103 }
9104
9105 m_OldLocation = null;
9106
9108 {
9110 }
9111
9112 if (ConfigIsExisting("headSelectionsToHide"))
9113 {
9116 }
9117
9119 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9120 {
9122 }
9123
9125
9126 m_IsResultOfSplit = false;
9127
9129 }
9130
9132 {
9133 super.InitItemVariables();
9134
9140 m_Count = ConfigGetInt(
"count");
9141
9144
9149
9152
9157
9169
9173
9174
9177 if (ConfigIsExisting("canBeSplit"))
9178 {
9181 }
9182
9184 if (ConfigIsExisting("itemBehaviour"))
9186
9187
9190 RegisterNetSyncVariableInt("m_VarLiquidType");
9191 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9192
9193 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9194 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9195 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9196
9197 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9198 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9199 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9200 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9201
9202 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9203 RegisterNetSyncVariableBool("m_IsTakeable");
9204 RegisterNetSyncVariableBool("m_IsHologram");
9205
9208 {
9211 }
9212
9214
9216 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9218
9219 }
9220
9222 {
9224 }
9225
9227 {
9230 {
9235 }
9236 }
9237
9238 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9239 {
9241 {
9244 }
9245
9247 }
9248
9250 {
9256 }
9257
9259
9261 {
9263
9264 if (!action)
9265 {
9266 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9267 return;
9268 }
9269
9271 if (!ai)
9272 {
9274 return;
9275 }
9276
9278 if (!action_array)
9279 {
9280 action_array = new array<ActionBase_Basic>;
9282 }
9283 if (LogManager.IsActionLogEnable())
9284 {
9285 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9286 }
9287
9288 if (action_array.Find(action) != -1)
9289 {
9290 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9291 }
9292 else
9293 {
9294 action_array.Insert(action);
9295 }
9296 }
9297
9299 {
9301 ActionBase action = player.GetActionManager().GetAction(actionName);
9304
9305 if (action_array)
9306 {
9307 action_array.RemoveItem(action);
9308 }
9309 }
9310
9311
9312
9314 {
9315 ActionOverrideData overrideData = new ActionOverrideData();
9319
9321 if (!actionMap)
9322 {
9325 }
9326
9327 actionMap.Insert(this.
Type(), overrideData);
9328
9329 }
9330
9332
9334
9335
9337 {
9340
9343
9344 string config_to_search = "CfgVehicles";
9345 string muzzle_owner_config;
9346
9348 {
9349 if (IsInherited(Weapon))
9350 config_to_search = "CfgWeapons";
9351
9352 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9353
9354 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9355
9357
9358 if (config_OnFire_subclass_count > 0)
9359 {
9360 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9361
9362 for (int i = 0; i < config_OnFire_subclass_count; i++)
9363 {
9364 string particle_class = "";
9366 string config_OnFire_entry = config_OnFire_class + particle_class;
9367 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9368 WPOF_array.Insert(WPOF);
9369 }
9370
9371
9373 }
9374 }
9375
9377 {
9378 config_to_search = "CfgWeapons";
9379 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9380
9381 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9382
9384
9385 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9386 {
9387 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9388
9389 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9390 {
9391 string particle_class2 = "";
9393 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9394 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9395 WPOBE_array.Insert(WPOBE);
9396 }
9397
9398
9400 }
9401 }
9402 }
9403
9404
9406 {
9409
9411 {
9412 string config_to_search = "CfgVehicles";
9413
9414 if (IsInherited(Weapon))
9415 config_to_search = "CfgWeapons";
9416
9417 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9418 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9419
9420 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9421 {
9422
9424
9426 {
9428 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9430 return;
9431 }
9432
9435
9436
9437
9439 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9440
9441 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9442 {
9443 string particle_class = "";
9445 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9447
9448 if (entry_type == CT_CLASS)
9449 {
9450 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9451 WPOOH_array.Insert(WPOF);
9452 }
9453 }
9454
9455
9457 }
9458 }
9459 }
9460
9462 {
9464 }
9465
9467 {
9469 {
9471
9474
9477
9478 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9479 }
9480 }
9481
9483 {
9485 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9486
9488 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9489
9491 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9492
9494 {
9496 }
9497 }
9498
9500 {
9502 }
9503
9505 {
9508 else
9510
9512 {
9515 }
9516 else
9517 {
9520
9523 }
9524
9526 }
9527
9529 {
9531 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9532 }
9533
9535 {
9537 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9539 }
9540
9542 {
9544 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9545 }
9546
9548 {
9551
9552 OverheatingParticle OP = new OverheatingParticle();
9557
9559 }
9560
9562 {
9565
9566 return -1;
9567 }
9568
9570 {
9572 {
9575
9576 for (int i = count; i > 0; --i)
9577 {
9578 int id = i - 1;
9581
9584
9585 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9586 {
9587 if (p)
9588 {
9591 }
9592 }
9593 }
9594 }
9595 }
9596
9598 {
9600 {
9602 {
9603 int id = i - 1;
9605
9606 if (OP)
9607 {
9609
9610 if (p)
9611 {
9613 }
9614
9615 delete OP;
9616 }
9617 }
9618
9621 }
9622 }
9623
9626 {
9627 return 0.0;
9628 }
9629
9630
9632 {
9633 return 250;
9634 }
9635
9637 {
9638 return 0;
9639 }
9640
9643 {
9645 return true;
9646
9647 return false;
9648 }
9649
9652 {
9655
9657 {
9659 }
9660 else
9661 {
9662
9664 }
9665
9667 }
9668
9675 {
9676 return -1;
9677 }
9678
9679
9680
9681
9683 {
9685 {
9687 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9688
9689 if (r_index >= 0)
9690 {
9691 InventoryLocation r_il = new InventoryLocation;
9692 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9693
9694 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9697 {
9698 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9699 }
9701 {
9702 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9703 }
9704
9705 }
9706
9707 player.GetHumanInventory().ClearUserReservedLocation(this);
9708 }
9709
9712 }
9713
9714
9715
9716
9718 {
9719 return ItemBase.m_DebugActionsMask;
9720 }
9721
9723 {
9724 return ItemBase.m_DebugActionsMask & mask;
9725 }
9726
9728 {
9729 ItemBase.m_DebugActionsMask = mask;
9730 }
9731
9733 {
9734 ItemBase.m_DebugActionsMask |= mask;
9735 }
9736
9738 {
9739 ItemBase.m_DebugActionsMask &= ~mask;
9740 }
9741
9743 {
9745 {
9747 }
9748 else
9749 {
9751 }
9752 }
9753
9754
9756 {
9757 if (GetEconomyProfile())
9758 {
9759 float q_max = GetEconomyProfile().GetQuantityMax();
9760 if (q_max > 0)
9761 {
9762 float q_min = GetEconomyProfile().GetQuantityMin();
9763 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9764
9766 {
9767 ComponentEnergyManager comp = GetCompEM();
9769 {
9771 }
9772 }
9774 {
9776
9777 }
9778
9779 }
9780 }
9781 }
9782
9785 {
9786 EntityAI parent = GetHierarchyParent();
9787
9788 if (parent)
9789 {
9790 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9791 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9792 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9793 }
9794 }
9795
9798 {
9799 EntityAI parent = GetHierarchyParent();
9800
9801 if (parent)
9802 {
9803 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9804 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9805 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9806 }
9807 }
9808
9810 {
9811
9812
9813
9814
9816
9818 {
9819 if (ScriptInputUserData.CanStoreInputUserData())
9820 {
9821 ScriptInputUserData ctx = new ScriptInputUserData;
9827 ctx.
Write(use_stack_max);
9830
9832 {
9833 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9834 }
9835 }
9836 }
9837 else if (!
GetGame().IsMultiplayer())
9838 {
9840 }
9841 }
9842
9844 {
9846 }
9847
9849 {
9851 }
9852
9854 {
9856 }
9857
9859 {
9860
9861 return false;
9862 }
9863
9865 {
9866 return false;
9867 }
9868
9872 {
9873 return false;
9874 }
9875
9877 {
9878 return "";
9879 }
9880
9882
9884 {
9885 return false;
9886 }
9887
9889 {
9890 return true;
9891 }
9892
9893
9894
9896 {
9897 return true;
9898 }
9899
9901 {
9902 return true;
9903 }
9904
9906 {
9907 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9909 }
9910
9912 {
9914 }
9915
9917 {
9919 if (!is_being_placed)
9921 SetSynchDirty();
9922 }
9923
9924
9926
9928 {
9930 }
9931
9933 {
9935 }
9936
9938 {
9939 return 1;
9940 }
9941
9943 {
9944 return false;
9945 }
9946
9948 {
9950 SetSynchDirty();
9951 }
9952
9953
9954
9955
9956
9957
9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968
9969
9970
9971
9972
9973
9974
9975
9976
9977
9978
9979
9980
9981
9982
9983
9984
9985
9986
9988 {
9989 super.OnMovedInsideCargo(container);
9990
9991 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9992 }
9993
9994 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9995 {
9996 super.EEItemLocationChanged(oldLoc,newLoc);
9997
9998 PlayerBase new_player = null;
9999 PlayerBase old_player = null;
10000
10001 if (newLoc.GetParent())
10002 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10003
10004 if (oldLoc.GetParent())
10005 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10006
10008 {
10009 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10010
10011 if (r_index >= 0)
10012 {
10013 InventoryLocation r_il = new InventoryLocation;
10014 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10015
10016 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10019 {
10020 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10021 }
10023 {
10024 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10025 }
10026
10027 }
10028 }
10029
10031 {
10032 if (new_player)
10033 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10034
10035 if (new_player == old_player)
10036 {
10037
10038 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10039 {
10041 {
10042 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10043 {
10044 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10045 }
10046 }
10047 else
10048 {
10049 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10050 }
10051 }
10052
10053 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10054 {
10055 int type = oldLoc.GetType();
10057 {
10058 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10059 }
10061 {
10062 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10063 }
10064 }
10065 if (!m_OldLocation)
10066 {
10067 m_OldLocation = new InventoryLocation;
10068 }
10069 m_OldLocation.Copy(oldLoc);
10070 }
10071 else
10072 {
10073 if (m_OldLocation)
10074 {
10075 m_OldLocation.Reset();
10076 }
10077 }
10078
10080 }
10081 else
10082 {
10083 if (new_player)
10084 {
10085 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10086 if (res_index >= 0)
10087 {
10088 InventoryLocation il = new InventoryLocation;
10089 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10091 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10094 {
10095 il.
GetParent().GetOnReleaseLock().Invoke(it);
10096 }
10098 {
10100 }
10101
10102 }
10103 }
10105 {
10106
10108 }
10109
10110 if (m_OldLocation)
10111 {
10112 m_OldLocation.Reset();
10113 }
10114 }
10115 }
10116
10117 override void EOnContact(IEntity other, Contact extra)
10118 {
10120 {
10121 int liquidType = -1;
10123 if (impactSpeed > 0.0)
10124 {
10126 #ifndef SERVER
10128 #else
10130 SetSynchDirty();
10131 #endif
10133 }
10134 }
10135
10136 #ifdef SERVER
10137 if (GetCompEM() && GetCompEM().IsPlugged())
10138 {
10139 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10140 GetCompEM().UnplugThis();
10141 }
10142 #endif
10143 }
10144
10146
10148 {
10150 }
10151
10153 {
10154
10155 }
10156
10158 {
10159 super.OnItemLocationChanged(old_owner, new_owner);
10160
10161 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10162 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10163
10164 if (!relatedPlayer && playerNew)
10165 relatedPlayer = playerNew;
10166
10167 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10168 {
10170 if (actionMgr)
10171 {
10172 ActionBase currentAction = actionMgr.GetRunningAction();
10173 if (currentAction)
10175 }
10176 }
10177
10178 Man ownerPlayerOld = null;
10179 Man ownerPlayerNew = null;
10180
10181 if (old_owner)
10182 {
10183 if (old_owner.
IsMan())
10184 {
10185 ownerPlayerOld = Man.Cast(old_owner);
10186 }
10187 else
10188 {
10189 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10190 }
10191 }
10192 else
10193 {
10195 {
10197
10198 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10199 {
10200 GetCompEM().UnplugThis();
10201 }
10202 }
10203 }
10204
10205 if (new_owner)
10206 {
10207 if (new_owner.
IsMan())
10208 {
10209 ownerPlayerNew = Man.Cast(new_owner);
10210 }
10211 else
10212 {
10213 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10214 }
10215 }
10216
10217 if (ownerPlayerOld != ownerPlayerNew)
10218 {
10219 if (ownerPlayerOld)
10220 {
10221 array<EntityAI> subItemsExit = new array<EntityAI>;
10223 for (int i = 0; i < subItemsExit.Count(); i++)
10224 {
10227 }
10228 }
10229
10230 if (ownerPlayerNew)
10231 {
10232 array<EntityAI> subItemsEnter = new array<EntityAI>;
10234 for (int j = 0; j < subItemsEnter.Count(); j++)
10235 {
10238 }
10239 }
10240 }
10241 else if (ownerPlayerNew != null)
10242 {
10243 PlayerBase nplayer;
10244 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10245 {
10246 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10248 for (int k = 0; k < subItemsUpdate.Count(); k++)
10249 {
10251 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10252 }
10253 }
10254 }
10255
10256 if (old_owner)
10257 old_owner.OnChildItemRemoved(this);
10258 if (new_owner)
10259 new_owner.OnChildItemReceived(this);
10260 }
10261
10262
10264 {
10265 super.EEDelete(parent);
10266 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10267 if (player)
10268 {
10270
10271 if (player.IsAlive())
10272 {
10273 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10274 if (r_index >= 0)
10275 {
10276 InventoryLocation r_il = new InventoryLocation;
10277 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10278
10279 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10282 {
10283 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10284 }
10286 {
10287 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10288 }
10289
10290 }
10291
10292 player.RemoveQuickBarEntityShortcut(this);
10293 }
10294 }
10295 }
10296
10298 {
10299 super.EEKilled(killer);
10300
10303 {
10304 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10305 {
10306 if (IsMagazine())
10307 {
10308 if (Magazine.Cast(this).GetAmmoCount() > 0)
10309 {
10311 }
10312 }
10313 else
10314 {
10316 }
10317 }
10318 }
10319 }
10320
10322 {
10323 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10324
10325 super.OnWasAttached(parent, slot_id);
10326
10329
10331 }
10332
10334 {
10335 super.OnWasDetached(parent, slot_id);
10336
10339 }
10340
10342 {
10343 int idx;
10346
10347 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10348 if (inventory_slots.Count() < 1)
10349 {
10350 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10351 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10352 }
10353 else
10354 {
10355 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10356 }
10357
10358 idx = inventory_slots.Find(slot);
10359 if (idx < 0)
10360 return "";
10361
10362 return attach_types.Get(idx);
10363 }
10364
10366 {
10367 int idx = -1;
10368 string slot;
10369
10372
10373 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10374 if (inventory_slots.Count() < 1)
10375 {
10376 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10377 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10378 }
10379 else
10380 {
10381 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10382 if (detach_types.Count() < 1)
10383 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10384 }
10385
10386 for (int i = 0; i < inventory_slots.Count(); i++)
10387 {
10388 slot = inventory_slots.Get(i);
10389 }
10390
10391 if (slot != "")
10392 {
10393 if (detach_types.Count() == 1)
10394 idx = 0;
10395 else
10396 idx = inventory_slots.Find(slot);
10397 }
10398 if (idx < 0)
10399 return "";
10400
10401 return detach_types.Get(idx);
10402 }
10403
10405 {
10406
10408
10409
10410 float min_time = 1;
10411 float max_time = 3;
10412 float delay = Math.RandomFloat(min_time, max_time);
10413
10414 explode_timer.Run(delay, this, "DoAmmoExplosion");
10415 }
10416
10418 {
10419 Magazine magazine = Magazine.Cast(this);
10420 int pop_sounds_count = 6;
10421 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10422
10423
10424 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10425 string sound_name = pop_sounds[ sound_idx ];
10427
10428
10429 magazine.ServerAddAmmoCount(-1);
10430
10431
10432 float min_temp_to_explode = 100;
10433
10434 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10435 {
10437 }
10438 }
10439
10440
10441 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10442 {
10443 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10444
10445 const int CHANCE_DAMAGE_CARGO = 4;
10446 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10447 const int CHANCE_DAMAGE_NOTHING = 2;
10448
10450 {
10451 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10452 int chances;
10453 int rnd;
10454
10455 if (GetInventory().GetCargo())
10456 {
10457 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10458 rnd = Math.RandomInt(0,chances);
10459
10460 if (rnd < CHANCE_DAMAGE_CARGO)
10461 {
10463 }
10464 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10465 {
10467 }
10468 }
10469 else
10470 {
10471 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10472 rnd = Math.RandomInt(0,chances);
10473
10474 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10475 {
10477 }
10478 }
10479 }
10480 }
10481
10483 {
10484 if (GetInventory().GetCargo())
10485 {
10486 int item_count = GetInventory().GetCargo().GetItemCount();
10487 if (item_count > 0)
10488 {
10489 int random_pick = Math.RandomInt(0, item_count);
10491 if (!item.IsExplosive())
10492 {
10493 item.AddHealth("","",damage);
10494 return true;
10495 }
10496 }
10497 }
10498 return false;
10499 }
10500
10502 {
10503 int attachment_count = GetInventory().AttachmentCount();
10504 if (attachment_count > 0)
10505 {
10506 int random_pick = Math.RandomInt(0, attachment_count);
10507 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10508 if (!attachment.IsExplosive())
10509 {
10510 attachment.AddHealth("","",damage);
10511 return true;
10512 }
10513 }
10514 return false;
10515 }
10516
10518 {
10520 }
10521
10523 {
10525 return GetInventory().CanRemoveEntity();
10526
10527 return false;
10528 }
10529
10531 {
10532
10534 return false;
10535
10536
10538 return false;
10539
10540
10541
10543 if (delta == 0)
10544 return false;
10545
10546
10547 return true;
10548 }
10549
10551 {
10553 {
10554 if (ScriptInputUserData.CanStoreInputUserData())
10555 {
10556 ScriptInputUserData ctx = new ScriptInputUserData;
10561 ctx.
Write(destination_entity);
10563 ctx.
Write(slot_id);
10565 }
10566 }
10567 else if (!
GetGame().IsMultiplayer())
10568 {
10570 }
10571 }
10572
10574 {
10575 float split_quantity_new;
10579 InventoryLocation loc = new InventoryLocation;
10580
10581 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10582 {
10584 split_quantity_new = stack_max;
10585 else
10587
10589 {
10590 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10591 if (new_item)
10592 {
10593 new_item.SetResultOfSplit(true);
10594 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10596 new_item.
SetQuantity(split_quantity_new,
false,
true);
10597 }
10598 }
10599 }
10600 else if (destination_entity && slot_id == -1)
10601 {
10602 if (quantity > stack_max)
10603 split_quantity_new = stack_max;
10604 else
10605 split_quantity_new = quantity;
10606
10608 {
10610 {
10613 }
10614
10615 if (new_item)
10616 {
10617 new_item.SetResultOfSplit(true);
10618 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10620 new_item.
SetQuantity(split_quantity_new,
false,
true);
10621 }
10622 }
10623 }
10624 else
10625 {
10626 if (stack_max != 0)
10627 {
10629 {
10631 }
10632
10633 if (split_quantity_new == 0)
10634 {
10635 if (!
GetGame().IsMultiplayer())
10636 player.PhysicalPredictiveDropItem(this);
10637 else
10638 player.ServerDropEntity(this);
10639 return;
10640 }
10641
10643 {
10645
10646 if (new_item)
10647 {
10648 new_item.SetResultOfSplit(true);
10649 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10652 new_item.PlaceOnSurface();
10653 }
10654 }
10655 }
10656 }
10657 }
10658
10660 {
10661 float split_quantity_new;
10665 InventoryLocation loc = new InventoryLocation;
10666
10667 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10668 {
10670 split_quantity_new = stack_max;
10671 else
10673
10675 {
10676 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10677 if (new_item)
10678 {
10679 new_item.SetResultOfSplit(true);
10680 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10682 new_item.
SetQuantity(split_quantity_new,
false,
true);
10683 }
10684 }
10685 }
10686 else if (destination_entity && slot_id == -1)
10687 {
10688 if (quantity > stack_max)
10689 split_quantity_new = stack_max;
10690 else
10691 split_quantity_new = quantity;
10692
10694 {
10696 {
10699 }
10700
10701 if (new_item)
10702 {
10703 new_item.SetResultOfSplit(true);
10704 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10706 new_item.
SetQuantity(split_quantity_new,
false,
true);
10707 }
10708 }
10709 }
10710 else
10711 {
10712 if (stack_max != 0)
10713 {
10715 {
10717 }
10718
10720 {
10722
10723 if (new_item)
10724 {
10725 new_item.SetResultOfSplit(true);
10726 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10729 new_item.PlaceOnSurface();
10730 }
10731 }
10732 }
10733 }
10734 }
10735
10737 {
10739 {
10740 if (ScriptInputUserData.CanStoreInputUserData())
10741 {
10742 ScriptInputUserData ctx = new ScriptInputUserData;
10747 dst.WriteToContext(ctx);
10749 }
10750 }
10751 else if (!
GetGame().IsMultiplayer())
10752 {
10754 }
10755 }
10756
10758 {
10760 {
10761 if (ScriptInputUserData.CanStoreInputUserData())
10762 {
10763 ScriptInputUserData ctx = new ScriptInputUserData;
10768 ctx.
Write(destination_entity);
10774 }
10775 }
10776 else if (!
GetGame().IsMultiplayer())
10777 {
10779 }
10780 }
10781
10783 {
10785 }
10786
10788 {
10790 float split_quantity_new;
10792 if (dst.IsValid())
10793 {
10794 int slot_id = dst.GetSlot();
10796
10797 if (quantity > stack_max)
10798 split_quantity_new = stack_max;
10799 else
10800 split_quantity_new = quantity;
10801
10803 {
10805
10806 if (new_item)
10807 {
10808 new_item.SetResultOfSplit(true);
10809 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10811 new_item.
SetQuantity(split_quantity_new,
false,
true);
10812 }
10813
10814 return new_item;
10815 }
10816 }
10817
10818 return null;
10819 }
10820
10822 {
10824 float split_quantity_new;
10826 if (destination_entity)
10827 {
10829 if (quantity > stackable)
10830 split_quantity_new = stackable;
10831 else
10832 split_quantity_new = quantity;
10833
10835 {
10836 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10837 if (new_item)
10838 {
10839 new_item.SetResultOfSplit(true);
10840 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10842 new_item.
SetQuantity(split_quantity_new,
false,
true);
10843 }
10844 }
10845 }
10846 }
10847
10849 {
10851 {
10852 if (ScriptInputUserData.CanStoreInputUserData())
10853 {
10854 ScriptInputUserData ctx = new ScriptInputUserData;
10859 ItemBase destination_entity =
this;
10860 ctx.
Write(destination_entity);
10864 }
10865 }
10866 else if (!
GetGame().IsMultiplayer())
10867 {
10869 }
10870 }
10871
10873 {
10875 float split_quantity_new;
10877 if (player)
10878 {
10880 if (quantity > stackable)
10881 split_quantity_new = stackable;
10882 else
10883 split_quantity_new = quantity;
10884
10886 {
10887 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10888 new_item =
ItemBase.Cast(in_hands);
10889 if (new_item)
10890 {
10891 new_item.SetResultOfSplit(true);
10892 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10894 new_item.SetQuantity(split_quantity_new, false, true);
10895 }
10896 }
10897 }
10898 }
10899
10901 {
10903 float split_quantity_new = Math.Floor(quantity * 0.5);
10904
10906 return;
10907
10909
10910 if (new_item)
10911 {
10912 if (new_item.GetQuantityMax() < split_quantity_new)
10913 {
10914 split_quantity_new = new_item.GetQuantityMax();
10915 }
10916
10917 new_item.SetResultOfSplit(true);
10918 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10919
10921 {
10924 }
10925 else
10926 {
10928 new_item.
SetQuantity(split_quantity_new,
false,
true);
10929 }
10930 }
10931 }
10932
10934 {
10936 float split_quantity_new = Math.Floor(quantity / 2);
10937
10939 return;
10940
10941 InventoryLocation invloc = new InventoryLocation;
10943
10945 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10946
10947 if (new_item)
10948 {
10949 if (new_item.GetQuantityMax() < split_quantity_new)
10950 {
10951 split_quantity_new = new_item.GetQuantityMax();
10952 }
10954 {
10957 }
10958 else if (split_quantity_new > 1)
10959 {
10961 new_item.
SetQuantity(split_quantity_new,
false,
true);
10962 }
10963 }
10964 }
10965
10968 {
10969 SetWeightDirty();
10971
10972 if (parent)
10973 parent.OnAttachmentQuantityChangedEx(this, delta);
10974
10976 {
10978 {
10980 }
10982 {
10983 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10985 }
10986 }
10987
10988 }
10989
10992 {
10993
10994 }
10995
10998 {
11000 }
11001
11003 {
11004 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11005
11007 {
11008 if (newLevel == GameConstants.STATE_RUINED)
11009 {
11011 EntityAI parent = GetHierarchyParent();
11012 if (parent && parent.IsFireplace())
11013 {
11014 CargoBase cargo = GetInventory().GetCargo();
11015 if (cargo)
11016 {
11018 {
11020 }
11021 }
11022 }
11023 }
11024
11026 {
11027
11029 return;
11030 }
11031
11032 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11033 {
11035 }
11036 }
11037 }
11038
11039
11041 {
11042 super.OnRightClick();
11043
11045 {
11047 {
11048 if (ScriptInputUserData.CanStoreInputUserData())
11049 {
11050 EntityAI root = GetHierarchyRoot();
11051 Man playerOwner = GetHierarchyRootPlayer();
11052 InventoryLocation dst = new InventoryLocation;
11053
11054
11055 if (!playerOwner && root && root == this)
11056 {
11058 }
11059 else
11060 {
11061
11062 GetInventory().GetCurrentInventoryLocation(dst);
11064 {
11067 {
11069 }
11070 else
11071 {
11073
11074
11075 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11076 {
11078 }
11079 else
11080 {
11081 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11082 }
11083 }
11084 }
11085 }
11086
11087 ScriptInputUserData ctx = new ScriptInputUserData;
11095 }
11096 }
11097 else if (!
GetGame().IsMultiplayer())
11098 {
11100 }
11101 }
11102 }
11103
11105 {
11106 if (root)
11107 {
11108 vector m4[4];
11109 root.GetTransform(m4);
11110 dst.SetGround(this, m4);
11111 }
11112 else
11113 {
11114 GetInventory().GetCurrentInventoryLocation(dst);
11115 }
11116 }
11117
11118 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11119 {
11120
11121 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11122 return false;
11123
11124 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11125 return false;
11126
11127
11129 return false;
11130
11131
11132 Magazine mag = Magazine.Cast(this);
11133 if (mag)
11134 {
11135 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11136 return false;
11137
11138 if (stack_max_limit)
11139 {
11140 Magazine other_mag = Magazine.Cast(other_item);
11141 if (other_item)
11142 {
11143 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11144 return false;
11145 }
11146
11147 }
11148 }
11149 else
11150 {
11151
11153 return false;
11154
11156 return false;
11157 }
11158
11159 PlayerBase player = null;
11160 if (CastTo(player, GetHierarchyRootPlayer()))
11161 {
11162 if (player.GetInventory().HasAttachment(this))
11163 return false;
11164
11165 if (player.IsItemsToDelete())
11166 return false;
11167 }
11168
11169 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11170 return false;
11171
11172 int slotID;
11174 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11175 return false;
11176
11177 return true;
11178 }
11179
11181 {
11183 }
11184
11186 {
11187 return m_IsResultOfSplit;
11188 }
11189
11191 {
11192 m_IsResultOfSplit = value;
11193 }
11194
11196 {
11198 }
11199
11201 {
11202 float other_item_quantity = other_item.GetQuantity();
11203 float this_free_space;
11204
11206
11208
11209 if (other_item_quantity > this_free_space)
11210 {
11211 return this_free_space;
11212 }
11213 else
11214 {
11215 return other_item_quantity;
11216 }
11217 }
11218
11220 {
11222 }
11223
11225 {
11227 return;
11228
11229 if (!IsMagazine() && other_item)
11230 {
11232 if (quantity_used != 0)
11233 {
11234 float hp1 = GetHealth01("","");
11235 float hp2 = other_item.GetHealth01("","");
11236 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11237 hpResult = hpResult / (
GetQuantity() + quantity_used);
11238
11239 hpResult *= GetMaxHealth();
11240 Math.Round(hpResult);
11241 SetHealth("", "Health", hpResult);
11242
11244 other_item.AddQuantity(-quantity_used);
11245 }
11246 }
11248 }
11249
11251 {
11252 #ifdef SERVER
11253 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11254 GetHierarchyParent().IncreaseLifetimeUp();
11255 #endif
11256 };
11257
11259 {
11260 PlayerBase p = PlayerBase.Cast(player);
11261
11262 array<int> recipesIds = p.m_Recipes;
11263 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11264 if (moduleRecipesManager)
11265 {
11266 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11267 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11268 }
11269
11270 for (int i = 0;i < recipesIds.Count(); i++)
11271 {
11272 int key = recipesIds.Get(i);
11273 string recipeName = moduleRecipesManager.GetRecipeName(key);
11275 }
11276 }
11277
11278
11279 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11280 {
11281 super.GetDebugActions(outputList);
11282
11283
11289
11290
11295
11300
11301
11305
11306
11308 {
11312 }
11313
11316
11317
11321
11323
11324 InventoryLocation loc = new InventoryLocation();
11325 GetInventory().GetCurrentInventoryLocation(loc);
11327 {
11328 if (Gizmo_IsSupported())
11331 }
11332
11334 }
11335
11336
11337
11338
11340 {
11341 super.OnAction(action_id, player, ctx);
11342
11344 {
11345 switch (action_id)
11346 {
11349 return true;
11352 return true;
11353 }
11354 }
11355
11357 {
11358 switch (action_id)
11359 {
11361 Delete();
11362 return true;
11363 }
11364 }
11365
11366 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11367 {
11368 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11369 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11370 PlayerBase p = PlayerBase.Cast(player);
11371 if (
EActions.RECIPES_RANGE_START < 1000)
11372 {
11373 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11374 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11375 }
11376 }
11377 #ifndef SERVER
11378 else if (action_id ==
EActions.WATCH_PLAYER)
11379 {
11380 PluginDeveloper.SetDeveloperItemClientEx(player);
11381 }
11382 #endif
11384 {
11385 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11386 {
11387 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11388 OnDebugButtonPressServer(id + 1);
11389 }
11390
11391 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11392 {
11393 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11395 }
11396
11397 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11398 {
11399 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11401 }
11402
11403 else if (action_id ==
EActions.ADD_QUANTITY)
11404 {
11405 if (IsMagazine())
11406 {
11407 Magazine mag = Magazine.Cast(this);
11408 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11409 }
11410 else
11411 {
11413 }
11414
11415 if (m_EM)
11416 {
11417 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11418 }
11419
11420 }
11421
11422 else if (action_id ==
EActions.REMOVE_QUANTITY)
11423 {
11424 if (IsMagazine())
11425 {
11426 Magazine mag2 = Magazine.Cast(this);
11427 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11428 }
11429 else
11430 {
11432 }
11433 if (m_EM)
11434 {
11435 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11436 }
11437
11438 }
11439
11440 else if (action_id ==
EActions.SET_QUANTITY_0)
11441 {
11443
11444 if (m_EM)
11445 {
11446 m_EM.SetEnergy(0);
11447 }
11448 }
11449
11450 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11451 {
11453
11454 if (m_EM)
11455 {
11456 m_EM.SetEnergy(m_EM.GetEnergyMax());
11457 }
11458 }
11459
11460 else if (action_id ==
EActions.ADD_HEALTH)
11461 {
11462 AddHealth("","",GetMaxHealth("","Health")/5);
11463 }
11464 else if (action_id ==
EActions.REMOVE_HEALTH)
11465 {
11466 AddHealth("","",-GetMaxHealth("","Health")/5);
11467 }
11468 else if (action_id ==
EActions.DESTROY_HEALTH)
11469 {
11470 SetHealth01("","",0);
11471 }
11472 else if (action_id ==
EActions.WATCH_ITEM)
11473 {
11475 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11476 #ifdef DEVELOPER
11477 SetDebugDeveloper_item(this);
11478 #endif
11479 }
11480
11481 else if (action_id ==
EActions.ADD_TEMPERATURE)
11482 {
11483 AddTemperature(20);
11484
11485 }
11486
11487 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11488 {
11489 AddTemperature(-20);
11490
11491 }
11492
11493 else if (action_id ==
EActions.FLIP_FROZEN)
11494 {
11495 SetFrozen(!GetIsFrozen());
11496
11497 }
11498
11499 else if (action_id ==
EActions.ADD_WETNESS)
11500 {
11502
11503 }
11504
11505 else if (action_id ==
EActions.REMOVE_WETNESS)
11506 {
11508
11509 }
11510
11511 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11512 {
11515
11516
11517 }
11518
11519 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11520 {
11523 }
11524
11525 else if (action_id ==
EActions.MAKE_SPECIAL)
11526 {
11527 auto debugParams = DebugSpawnParams.WithPlayer(player);
11528 OnDebugSpawnEx(debugParams);
11529 }
11530
11531 }
11532
11533
11534 return false;
11535 }
11536
11537
11538
11539
11543
11546
11547
11548
11550 {
11551 return false;
11552 }
11553
11554
11556 {
11557 return true;
11558 }
11559
11560
11562 {
11563 return true;
11564 }
11565
11566
11567
11569 {
11570 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11572 }
11573
11576 {
11577 return null;
11578 }
11579
11581 {
11582 return false;
11583 }
11584
11586 {
11587 return false;
11588 }
11589
11593
11594
11596 {
11597 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11598 return module_repairing.CanRepair(this, item_repair_kit);
11599 }
11600
11601
11602 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11603 {
11604 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11605 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11606 }
11607
11608
11610 {
11611
11612
11613
11614
11615
11616
11617
11618
11619 return 1;
11620 }
11621
11622
11623
11625 {
11627 }
11628
11629
11630
11632 {
11634 }
11635
11636
11645 {
11646 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11647
11648 if (player)
11649 {
11650 player.MessageStatus(text);
11651 }
11652 }
11653
11654
11663 {
11664 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11665
11666 if (player)
11667 {
11668 player.MessageAction(text);
11669 }
11670 }
11671
11672
11681 {
11682 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11683
11684 if (player)
11685 {
11686 player.MessageFriendly(text);
11687 }
11688 }
11689
11690
11699 {
11700 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11701
11702 if (player)
11703 {
11704 player.MessageImportant(text);
11705 }
11706 }
11707
11709 {
11710 return true;
11711 }
11712
11713
11714 override bool KindOf(
string tag)
11715 {
11716 bool found = false;
11717 string item_name = this.
GetType();
11720
11721 int array_size = item_tag_array.Count();
11722 for (int i = 0; i < array_size; i++)
11723 {
11724 if (item_tag_array.Get(i) == tag)
11725 {
11726 found = true;
11727 break;
11728 }
11729 }
11730 return found;
11731 }
11732
11733
11735 {
11736
11737 super.OnRPC(sender, rpc_type,ctx);
11738
11739
11740 switch (rpc_type)
11741 {
11742 #ifndef SERVER
11743 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11744 Param2<bool, string> p = new Param2<bool, string>(false, "");
11745
11747 return;
11748
11749 bool play = p.param1;
11750 string soundSet = p.param2;
11751
11752 if (play)
11753 {
11755 {
11757 {
11759 }
11760 }
11761 else
11762 {
11764 }
11765 }
11766 else
11767 {
11769 }
11770
11771 break;
11772 #endif
11773
11774 }
11775
11777 {
11779 }
11780 }
11781
11782
11783
11784
11786 {
11787 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11788 return plugin.GetID(
name);
11789 }
11790
11792 {
11793 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11794 return plugin.GetName(id);
11795 }
11796
11799 {
11800
11801
11802 int varFlags;
11803 if (!ctx.
Read(varFlags))
11804 return;
11805
11806 if (varFlags & ItemVariableFlags.FLOAT)
11807 {
11809 }
11810 }
11811
11813 {
11814
11815 super.SerializeNumericalVars(floats_out);
11816
11817
11818
11820 {
11822 }
11823
11825 {
11827 }
11828
11830 {
11832 }
11833
11835 {
11840 }
11841
11843 {
11845 }
11846 }
11847
11849 {
11850
11851 super.DeSerializeNumericalVars(floats);
11852
11853
11854 int index = 0;
11855 int mask = Math.Round(floats.Get(index));
11856
11857 index++;
11858
11860 {
11862 {
11864 }
11865 else
11866 {
11867 float quantity = floats.Get(index);
11868 SetQuantity(quantity,
true,
false,
false,
false);
11869 }
11870 index++;
11871 }
11872
11874 {
11875 float wet = floats.Get(index);
11877 index++;
11878 }
11879
11881 {
11882 int liquidtype = Math.Round(floats.Get(index));
11884 index++;
11885 }
11886
11888 {
11890 index++;
11892 index++;
11894 index++;
11896 index++;
11897 }
11898
11900 {
11901 int cleanness = Math.Round(floats.Get(index));
11903 index++;
11904 }
11905 }
11906
11908 {
11909 super.WriteVarsToCTX(ctx);
11910
11911
11913 {
11915 }
11916
11918 {
11920 }
11921
11923 {
11925 }
11926
11928 {
11929 int r,g,b,a;
11935 }
11936
11938 {
11940 }
11941 }
11942
11944 {
11945 if (!super.ReadVarsFromCTX(ctx,version))
11946 return false;
11947
11948 int intValue;
11949 float value;
11950
11951 if (version < 140)
11952 {
11953 if (!ctx.
Read(intValue))
11954 return false;
11955
11956 m_VariablesMask = intValue;
11957 }
11958
11960 {
11961 if (!ctx.
Read(value))
11962 return false;
11963
11965 {
11967 }
11968 else
11969 {
11971 }
11972 }
11973
11974 if (version < 140)
11975 {
11977 {
11978 if (!ctx.
Read(value))
11979 return false;
11980 SetTemperatureDirect(value);
11981 }
11982 }
11983
11985 {
11986 if (!ctx.
Read(value))
11987 return false;
11989 }
11990
11992 {
11993 if (!ctx.
Read(intValue))
11994 return false;
11996 }
11997
11999 {
12000 int r,g,b,a;
12002 return false;
12004 return false;
12006 return false;
12008 return false;
12009
12011 }
12012
12014 {
12015 if (!ctx.
Read(intValue))
12016 return false;
12018 }
12019
12020 if (version >= 138 && version < 140)
12021 {
12023 {
12024 if (!ctx.
Read(intValue))
12025 return false;
12026 SetFrozen(intValue);
12027 }
12028 }
12029
12030 return true;
12031 }
12032
12033
12035 {
12038 {
12040 }
12041
12042 if (!super.OnStoreLoad(ctx, version))
12043 {
12045 return false;
12046 }
12047
12048 if (version >= 114)
12049 {
12050 bool hasQuickBarIndexSaved;
12051
12052 if (!ctx.
Read(hasQuickBarIndexSaved))
12053 {
12055 return false;
12056 }
12057
12058 if (hasQuickBarIndexSaved)
12059 {
12060 int itmQBIndex;
12061
12062
12063 if (!ctx.
Read(itmQBIndex))
12064 {
12066 return false;
12067 }
12068
12069 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12070 if (itmQBIndex != -1 && parentPlayer)
12071 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12072 }
12073 }
12074 else
12075 {
12076
12077 PlayerBase player;
12078 int itemQBIndex;
12079 if (version ==
int.
MAX)
12080 {
12081 if (!ctx.
Read(itemQBIndex))
12082 {
12084 return false;
12085 }
12086 }
12087 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12088 {
12089
12090 if (!ctx.
Read(itemQBIndex))
12091 {
12093 return false;
12094 }
12095 if (itemQBIndex != -1 && player)
12096 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12097 }
12098 }
12099
12100 if (version < 140)
12101 {
12102
12103 if (!LoadVariables(ctx, version))
12104 {
12106 return false;
12107 }
12108 }
12109
12110
12112 {
12114 return false;
12115 }
12116 if (version >= 132)
12117 {
12119 if (raib)
12120 {
12122 {
12124 return false;
12125 }
12126 }
12127 }
12128
12130 return true;
12131 }
12132
12133
12134
12136 {
12137 super.OnStoreSave(ctx);
12138
12139 PlayerBase player;
12140 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12141 {
12143
12144 int itemQBIndex = -1;
12145 itemQBIndex = player.FindQuickBarEntityIndex(this);
12146 ctx.
Write(itemQBIndex);
12147 }
12148 else
12149 {
12151 }
12152
12154
12156 if (raib)
12157 {
12159 }
12160 }
12161
12162
12164 {
12165 super.AfterStoreLoad();
12166
12168 {
12170 }
12171
12173 {
12176 }
12177 }
12178
12180 {
12181 super.EEOnAfterLoad();
12182
12184 {
12186 }
12187
12190 }
12191
12193 {
12194 return false;
12195 }
12196
12197
12198
12200 {
12202 {
12203 #ifdef PLATFORM_CONSOLE
12204
12206 {
12208 if (menu)
12209 {
12211 }
12212 }
12213 #endif
12214 }
12215
12217 {
12220 }
12221
12223 {
12224 SetWeightDirty();
12226 }
12228 {
12231 }
12232
12234 {
12237 }
12239 {
12242 }
12243
12244 super.OnVariablesSynchronized();
12245 }
12246
12247
12248
12250 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12251 {
12252 if (!IsServerCheck(allow_client))
12253 return false;
12254
12256 return false;
12257
12260
12261 if (value <= (min + 0.001))
12262 value = min;
12263
12264 if (value == min)
12265 {
12266 if (destroy_config)
12267 {
12268 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12269 if (dstr)
12270 {
12272 this.Delete();
12273 return true;
12274 }
12275 }
12276 else if (destroy_forced)
12277 {
12279 this.Delete();
12280 return true;
12281 }
12282
12284 }
12285
12288
12290 {
12292
12293 if (delta)
12295 }
12296
12298
12299 return false;
12300 }
12301
12302
12304 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12305 {
12307 }
12308
12310 {
12313 }
12314
12316 {
12319 }
12320
12322 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12323 {
12324 float value_clamped = Math.Clamp(value, 0, 1);
12326 SetQuantity(result, destroy_config, destroy_forced);
12327 }
12328
12329
12332 {
12334 }
12335
12337 {
12339 }
12340
12341
12342
12343
12344
12345
12346
12347
12348
12349
12351 {
12352 int slot = -1;
12353 if (GetInventory())
12354 {
12355 InventoryLocation il = new InventoryLocation;
12356 GetInventory().GetCurrentInventoryLocation(il);
12358 }
12359
12361 }
12362
12364 {
12365 float quantity_max = 0;
12366
12368 {
12369 if (attSlotID != -1)
12370 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12371
12372 if (quantity_max <= 0)
12374 }
12375
12376 if (quantity_max <= 0)
12378
12379 return quantity_max;
12380 }
12381
12383 {
12385 }
12386
12388 {
12390 }
12391
12392
12394 {
12396 }
12397
12399 {
12401 }
12402
12404 {
12406 }
12407
12408
12410 {
12411
12412 float weightEx = GetWeightEx();
12413 float special = GetInventoryAndCargoWeight();
12414 return weightEx - special;
12415 }
12416
12417
12419 {
12421 }
12422
12424 {
12426 {
12427 #ifdef DEVELOPER
12428 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12429 {
12430 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12432 }
12433 #endif
12434
12435 return GetQuantity() * GetConfigWeightModified();
12436 }
12437 else if (HasEnergyManager())
12438 {
12439 #ifdef DEVELOPER
12440 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12441 {
12442 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12443 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12444 }
12445 #endif
12446 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12447 }
12448 else
12449 {
12450 #ifdef DEVELOPER
12451 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12452 {
12453 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12454 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12455 }
12456 #endif
12457 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12458 }
12459 }
12460
12463 {
12464 int item_count = 0;
12466
12467 if (GetInventory().GetCargo() != NULL)
12468 {
12469 item_count = GetInventory().GetCargo().GetItemCount();
12470 }
12471
12472 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12473 {
12474 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12475 if (item)
12476 item_count += item.GetNumberOfItems();
12477 }
12478 return item_count;
12479 }
12480
12483 {
12484 float weight = 0;
12485 float wetness = 1;
12486 if (include_wetness)
12489 {
12490 weight = wetness * m_ConfigWeight;
12491 }
12493 {
12494 weight = 1;
12495 }
12496 return weight;
12497 }
12498
12499
12500
12502 {
12503 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12504 {
12505 GameInventory inv = GetInventory();
12506 array<EntityAI> items = new array<EntityAI>;
12508 for (int i = 0; i < items.Count(); i++)
12509 {
12511 if (item)
12512 {
12514 }
12515 }
12516 }
12517 }
12518
12519
12520
12521
12523 {
12524 float energy = 0;
12525 if (HasEnergyManager())
12526 {
12527 energy = GetCompEM().GetEnergy();
12528 }
12529 return energy;
12530 }
12531
12532
12534 {
12535 super.OnEnergyConsumed();
12536
12538 }
12539
12541 {
12542 super.OnEnergyAdded();
12543
12545 }
12546
12547
12549 {
12550 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12551 {
12553 {
12554 float energy_0to1 = GetCompEM().GetEnergy0To1();
12556 }
12557 }
12558 }
12559
12560
12562 {
12563 return ConfigGetFloat("heatIsolation");
12564 }
12565
12567 {
12569 }
12570
12572 {
12573 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12574 if (
GetGame().ConfigIsExisting(paramPath))
12576
12577 return 0.0;
12578 }
12579
12581 {
12582 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12583 if (
GetGame().ConfigIsExisting(paramPath))
12585
12586 return 0.0;
12587 }
12588
12589 override void SetWet(
float value,
bool allow_client =
false)
12590 {
12591 if (!IsServerCheck(allow_client))
12592 return;
12593
12596
12598
12599 m_VarWet = Math.Clamp(value, min, max);
12600
12602 {
12605 }
12606 }
12607
12608 override void AddWet(
float value)
12609 {
12611 }
12612
12614 {
12616 }
12617
12619 {
12621 }
12622
12624 {
12626 }
12627
12629 {
12631 }
12632
12634 {
12636 }
12637
12638 override void OnWetChanged(
float newVal,
float oldVal)
12639 {
12642 if (newLevel != oldLevel)
12643 {
12645 }
12646 }
12647
12649 {
12650 SetWeightDirty();
12651 }
12652
12654 {
12655 return GetWetLevelInternal(
m_VarWet);
12656 }
12657
12658
12659
12661 {
12663 }
12664
12666 {
12668 }
12669
12671 {
12673 }
12674
12676 {
12678 }
12679
12680
12681
12683 {
12684 if (ConfigIsExisting("itemModelLength"))
12685 {
12686 return ConfigGetFloat("itemModelLength");
12687 }
12688 return 0;
12689 }
12690
12692 {
12693 if (ConfigIsExisting("itemAttachOffset"))
12694 {
12695 return ConfigGetFloat("itemAttachOffset");
12696 }
12697 return 0;
12698 }
12699
12700 override void SetCleanness(
int value,
bool allow_client =
false)
12701 {
12702 if (!IsServerCheck(allow_client))
12703 return;
12704
12706
12708
12711 }
12712
12714 {
12716 }
12717
12719 {
12720 return true;
12721 }
12722
12723
12724
12725
12727 {
12729 }
12730
12732 {
12734 }
12735
12736
12737
12738
12739 override void SetColor(
int r,
int g,
int b,
int a)
12740 {
12746 }
12748 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12749 {
12754 }
12755
12757 {
12759 }
12760
12763 {
12764 int r,g,b,a;
12766 r = r/255;
12767 g = g/255;
12768 b = b/255;
12769 a = a/255;
12770 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12771 }
12772
12773
12774
12775 override void SetLiquidType(
int value,
bool allow_client =
false)
12776 {
12777 if (!IsServerCheck(allow_client))
12778 return;
12779
12784 }
12785
12787 {
12788 return ConfigGetInt("varLiquidTypeInit");
12789 }
12790
12792 {
12794 }
12795
12797 {
12799 SetFrozen(false);
12800 }
12801
12804 {
12805 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12806 }
12807
12808
12811 {
12812 PlayerBase nplayer;
12813 if (PlayerBase.CastTo(nplayer, player))
12814 {
12816
12817 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12818 }
12819 }
12820
12821
12824 {
12825 PlayerBase nplayer;
12826 if (PlayerBase.CastTo(nplayer,player))
12827 {
12828
12829 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12830
12831 }
12832
12833
12834 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12835
12836
12837 if (HasEnergyManager())
12838 {
12839 GetCompEM().UpdatePlugState();
12840 }
12841 }
12842
12843
12845 {
12846 super.OnPlacementStarted(player);
12847
12849 }
12850
12851 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12852 {
12854 {
12855 m_AdminLog.OnPlacementComplete(player,
this);
12856 }
12857
12858 super.OnPlacementComplete(player, position, orientation);
12859 }
12860
12861
12862
12863
12864
12866 {
12868 {
12869 return true;
12870 }
12871 else
12872 {
12873 return false;
12874 }
12875 }
12876
12877
12879 {
12881 {
12883 }
12884 }
12885
12886
12888 {
12890 }
12891
12893 {
12895 }
12896
12897 override void InsertAgent(
int agent,
float count = 1)
12898 {
12899 if (count < 1)
12900 return;
12901
12903 }
12904
12907 {
12909 }
12910
12911
12913 {
12915 }
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12957
12959 {
12961 return false;
12962 return true;
12963 }
12964
12966 {
12967
12969 }
12970
12971
12974 {
12975 super.CheckForRoofLimited(timeTresholdMS);
12976
12978 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12979 {
12980 m_PreviousRoofTestTime = time;
12981 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12982 }
12983 }
12984
12985
12987 {
12989 {
12990 return 0;
12991 }
12992
12993 if (GetInventory().GetAttachmentSlotsCount() != 0)
12994 {
12995 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12996 if (filter)
12997 return filter.GetProtectionLevel(type, false, system);
12998 else
12999 return 0;
13000 }
13001
13002 string subclassPath, entryName;
13003
13004 switch (type)
13005 {
13007 entryName = "biological";
13008 break;
13010 entryName = "chemical";
13011 break;
13012 default:
13013 entryName = "biological";
13014 break;
13015 }
13016
13017 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13018
13020 }
13021
13022
13023
13026 {
13027 if (!IsMagazine())
13029
13031 }
13032
13033
13034
13035
13036
13041 {
13042 return true;
13043 }
13044
13046 {
13048 }
13049
13050
13051
13052
13053
13055 {
13056 if (parent)
13057 {
13058 if (parent.IsInherited(DayZInfected))
13059 return true;
13060
13061 if (!parent.IsRuined())
13062 return true;
13063 }
13064
13065 return true;
13066 }
13067
13069 {
13070 if (!super.CanPutAsAttachment(parent))
13071 {
13072 return false;
13073 }
13074
13075 if (!IsRuined() && !parent.IsRuined())
13076 {
13077 return true;
13078 }
13079
13080 return false;
13081 }
13082
13084 {
13085
13086
13087
13088
13089 return super.CanReceiveItemIntoCargo(item);
13090 }
13091
13093 {
13094
13095
13096
13097
13098 GameInventory attachmentInv = attachment.GetInventory();
13100 {
13101 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13102 return false;
13103 }
13104
13105 InventoryLocation loc = new InventoryLocation();
13106 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13107 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13108 return false;
13109
13110 return super.CanReceiveAttachment(attachment, slotId);
13111 }
13112
13114 {
13115 if (!super.CanReleaseAttachment(attachment))
13116 return false;
13117
13118 return GetInventory().AreChildrenAccessible();
13119 }
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13142 {
13143 int id = muzzle_owner.GetMuzzleID();
13144 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13145
13146 if (WPOF_array)
13147 {
13148 for (int i = 0; i < WPOF_array.Count(); i++)
13149 {
13150 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13151
13152 if (WPOF)
13153 {
13154 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13155 }
13156 }
13157 }
13158 }
13159
13160
13162 {
13163 int id = muzzle_owner.GetMuzzleID();
13165
13166 if (WPOBE_array)
13167 {
13168 for (int i = 0; i < WPOBE_array.Count(); i++)
13169 {
13170 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13171
13172 if (WPOBE)
13173 {
13174 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13175 }
13176 }
13177 }
13178 }
13179
13180
13182 {
13183 int id = muzzle_owner.GetMuzzleID();
13184 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13185
13186 if (WPOOH_array)
13187 {
13188 for (int i = 0; i < WPOOH_array.Count(); i++)
13189 {
13190 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13191
13192 if (WPOOH)
13193 {
13194 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13195 }
13196 }
13197 }
13198 }
13199
13200
13202 {
13203 int id = muzzle_owner.GetMuzzleID();
13204 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13205
13206 if (WPOOH_array)
13207 {
13208 for (int i = 0; i < WPOOH_array.Count(); i++)
13209 {
13210 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13211
13212 if (WPOOH)
13213 {
13214 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13215 }
13216 }
13217 }
13218 }
13219
13220
13222 {
13223 int id = muzzle_owner.GetMuzzleID();
13224 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13225
13226 if (WPOOH_array)
13227 {
13228 for (int i = 0; i < WPOOH_array.Count(); i++)
13229 {
13230 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13231
13232 if (WPOOH)
13233 {
13234 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13235 }
13236 }
13237 }
13238 }
13239
13240
13241
13243 {
13245 {
13246 return true;
13247 }
13248
13249 return false;
13250 }
13251
13253 {
13255 {
13256 return true;
13257 }
13258
13259 return false;
13260 }
13261
13263 {
13265 {
13266 return true;
13267 }
13268
13269 return false;
13270 }
13271
13273 {
13274 return false;
13275 }
13276
13279 {
13280 return UATimeSpent.DEFAULT_DEPLOY;
13281 }
13282
13283
13284
13285
13287 {
13289 SetSynchDirty();
13290 }
13291
13293 {
13295 }
13296
13297
13299 {
13300 return false;
13301 }
13302
13305 {
13306 string att_type = "None";
13307
13308 if (ConfigIsExisting("soundAttType"))
13309 {
13310 att_type = ConfigGetString("soundAttType");
13311 }
13312
13314 }
13315
13317 {
13319 }
13320
13321
13322
13323
13324
13330
13332 {
13335
13337 }
13338
13339
13341 {
13343 return;
13344
13346
13349
13352
13353 SoundParameters params = new SoundParameters();
13357 }
13358
13359
13361 {
13363 return;
13364
13366 SetSynchDirty();
13367
13370 }
13371
13372
13374 {
13376 return;
13377
13379 SetSynchDirty();
13380
13383 }
13384
13386 {
13388 }
13389
13391 {
13393 }
13394
13397 {
13398 if (!
GetGame().IsDedicatedServer())
13399 {
13400 if (ConfigIsExisting("attachSoundSet"))
13401 {
13402 string cfg_path = "";
13403 string soundset = "";
13404 string type_name =
GetType();
13405
13408 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13409 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13410
13411 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13412 {
13413 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13414 {
13415 if (cfg_slot_array[i] == slot_type)
13416 {
13417 soundset = cfg_soundset_array[i];
13418 break;
13419 }
13420 }
13421 }
13422
13423 if (soundset != "")
13424 {
13425 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13427 }
13428 }
13429 }
13430 }
13431
13433 {
13434
13435 }
13436
13437 void OnApply(PlayerBase player);
13438
13440 {
13441 return 1.0;
13442 };
13443
13445 {
13447 }
13448
13450 {
13452 }
13453
13455
13457 {
13458 SetDynamicPhysicsLifeTime(0.01);
13460 }
13461
13463 {
13464 array<string> zone_names = new array<string>;
13465 GetDamageZones(zone_names);
13466 for (int i = 0; i < zone_names.Count(); i++)
13467 {
13468 SetHealthMax(zone_names.Get(i),"Health");
13469 }
13470 SetHealthMax("","Health");
13471 }
13472
13475 {
13476 float global_health = GetHealth01("","Health");
13477 array<string> zones = new array<string>;
13478 GetDamageZones(zones);
13479
13480 for (int i = 0; i < zones.Count(); i++)
13481 {
13482 SetHealth01(zones.Get(i),"Health",global_health);
13483 }
13484 }
13485
13488 {
13489 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13490 }
13491
13493 {
13494 if (!hasRootAsPlayer)
13495 {
13496 if (refParentIB)
13497 {
13498
13499 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13500 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13501
13502 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13503 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13504
13507 }
13508 else
13509 {
13510
13513 }
13514 }
13515 }
13516
13518 {
13520 {
13521 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13522 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13523 {
13524 float heatPermCoef = 1.0;
13526 while (ent)
13527 {
13528 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13529 ent = ent.GetHierarchyParent();
13530 }
13531
13532 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13533 }
13534 }
13535 }
13536
13538 {
13539
13540 EntityAI parent = GetHierarchyParent();
13541 if (!parent)
13542 {
13543 hasParent = false;
13544 hasRootAsPlayer = false;
13545 }
13546 else
13547 {
13548 hasParent = true;
13549 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13550 refParentIB =
ItemBase.Cast(parent);
13551 }
13552 }
13553
13554 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13555 {
13556
13557 }
13558
13560 {
13561
13562 return false;
13563 }
13564
13566 {
13567
13568
13569 return false;
13570 }
13571
13573 {
13574
13575 return false;
13576 }
13577
13580 {
13581 return !GetIsFrozen() &&
IsOpen();
13582 }
13583
13585 {
13586 bool hasParent = false, hasRootAsPlayer = false;
13588
13589 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13590 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13591
13592 if (wwtu || foodDecay)
13593 {
13597
13598 if (processWetness || processTemperature || processDecay)
13599 {
13601
13602 if (processWetness)
13603 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13604
13605 if (processTemperature)
13607
13608 if (processDecay)
13609 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13610 }
13611 }
13612 }
13613
13616 {
13618 }
13619
13621 {
13624
13625 return super.GetTemperatureFreezeThreshold();
13626 }
13627
13629 {
13632
13633 return super.GetTemperatureThawThreshold();
13634 }
13635
13637 {
13640
13641 return super.GetItemOverheatThreshold();
13642 }
13643
13645 {
13647 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13648
13649 return super.GetTemperatureFreezeTime();
13650 }
13651
13653 {
13655 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13656
13657 return super.GetTemperatureThawTime();
13658 }
13659
13664
13666 {
13667 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13668 }
13669
13671 {
13672 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13673 }
13674
13677 {
13679 }
13680
13682 {
13684 }
13685
13687 {
13689 }
13690
13693 {
13694 return null;
13695 }
13696
13699 {
13700 return false;
13701 }
13702
13704 {
13706 {
13709 if (!trg)
13710 {
13712 explosive = this;
13713 }
13714
13715 explosive.PairRemote(trg);
13717
13718 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13719 trg.SetPersistentPairID(persistentID);
13720 explosive.SetPersistentPairID(persistentID);
13721
13722 return true;
13723 }
13724 return false;
13725 }
13726
13729 {
13730 float ret = 1.0;
13733 ret *= GetHealth01();
13734
13735 return ret;
13736 }
13737
13738 #ifdef DEVELOPER
13739 override void SetDebugItem()
13740 {
13741 super.SetDebugItem();
13742 _itemBase = this;
13743 }
13744
13746 {
13747 string text = super.GetDebugText();
13748
13750 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13751
13752 return text;
13753 }
13754 #endif
13755
13757 {
13758 return true;
13759 }
13760
13762
13764
13766 {
13769 }
13770
13771
13779
13795}
13796
13798{
13800 if (entity)
13801 {
13802 bool is_item = entity.IsInherited(
ItemBase);
13803 if (is_item && full_quantity)
13804 {
13807 }
13808 }
13809 else
13810 {
13812 return NULL;
13813 }
13814 return entity;
13815}
13816
13818{
13819 if (item)
13820 {
13821 if (health > 0)
13822 item.SetHealth("", "", health);
13823
13824 if (item.CanHaveTemperature())
13825 {
13827 if (item.CanFreeze())
13828 item.SetFrozen(false);
13829 }
13830
13831 if (item.HasEnergyManager())
13832 {
13833 if (quantity >= 0)
13834 {
13835 item.GetCompEM().SetEnergy0To1(quantity);
13836 }
13837 else
13838 {
13840 }
13841 }
13842 else if (item.IsMagazine())
13843 {
13844 Magazine mag = Magazine.Cast(item);
13845 if (quantity >= 0)
13846 {
13847 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13848 }
13849 else
13850 {
13852 }
13853
13854 }
13855 else
13856 {
13857 if (quantity >= 0)
13858 {
13859 item.SetQuantityNormalized(quantity, false);
13860 }
13861 else
13862 {
13864 }
13865
13866 }
13867 }
13868}
13869
13870#ifdef DEVELOPER
13872#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.