9154{
9156 {
9157 return true;
9158 }
9159};
9160
9161
9162
9164{
9168
9170
9173
9174
9175
9176
9177
9186
9192
9197
9202
9223 protected bool m_IsResultOfSplit
9224
9226
9231
9232
9233
9235
9239
9240
9241
9243
9246
9247
9248
9254
9255
9263
9266
9267
9269
9270
9272
9273
9278
9279
9284
9285
9287
9288
9290 {
9295
9296 if (!
GetGame().IsDedicatedServer())
9297 {
9299 {
9301
9303 {
9305 }
9306 }
9307
9310 }
9311
9312 m_OldLocation = null;
9313
9315 {
9317 }
9318
9319 if (ConfigIsExisting("headSelectionsToHide"))
9320 {
9323 }
9324
9326 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9327 {
9329 }
9330
9332
9333 m_IsResultOfSplit = false;
9334
9336 }
9337
9339 {
9340 super.InitItemVariables();
9341
9347 m_Count = ConfigGetInt(
"count");
9348
9351
9356
9359
9364
9376
9380
9381
9384 if (ConfigIsExisting("canBeSplit"))
9385 {
9388 }
9389
9391 if (ConfigIsExisting("itemBehaviour"))
9393
9394
9397 RegisterNetSyncVariableInt("m_VarLiquidType");
9398 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9399
9400 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9401 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9402 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9403
9404 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9405 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9406 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9407 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9408
9409 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9410 RegisterNetSyncVariableBool("m_IsTakeable");
9411 RegisterNetSyncVariableBool("m_IsHologram");
9412
9415 {
9418 }
9419
9421
9423 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9425
9426 }
9427
9429 {
9431 }
9432
9434 {
9437 {
9442 }
9443 }
9444
9445 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9446 {
9448 {
9451 }
9452
9454 }
9455
9457 {
9463 }
9464
9466
9468 {
9470
9471 if (!action)
9472 {
9473 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9474 return;
9475 }
9476
9478 if (!ai)
9479 {
9481 return;
9482 }
9483
9485 if (!action_array)
9486 {
9487 action_array = new array<ActionBase_Basic>;
9489 }
9490 if (LogManager.IsActionLogEnable())
9491 {
9492 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9493 }
9494
9495 if (action_array.Find(action) != -1)
9496 {
9497 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9498 }
9499 else
9500 {
9501 action_array.Insert(action);
9502 }
9503 }
9504
9506 {
9508 ActionBase action = player.GetActionManager().GetAction(actionName);
9511
9512 if (action_array)
9513 {
9514 action_array.RemoveItem(action);
9515 }
9516 }
9517
9518
9519
9521 {
9522 ActionOverrideData overrideData = new ActionOverrideData();
9526
9528 if (!actionMap)
9529 {
9532 }
9533
9534 actionMap.Insert(this.
Type(), overrideData);
9535
9536 }
9537
9539
9541
9542
9544 {
9547
9550
9551 string config_to_search = "CfgVehicles";
9552 string muzzle_owner_config;
9553
9555 {
9556 if (IsInherited(Weapon))
9557 config_to_search = "CfgWeapons";
9558
9559 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9560
9561 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9562
9564
9565 if (config_OnFire_subclass_count > 0)
9566 {
9567 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9568
9569 for (int i = 0; i < config_OnFire_subclass_count; i++)
9570 {
9571 string particle_class = "";
9573 string config_OnFire_entry = config_OnFire_class + particle_class;
9574 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9575 WPOF_array.Insert(WPOF);
9576 }
9577
9578
9580 }
9581 }
9582
9584 {
9585 config_to_search = "CfgWeapons";
9586 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9587
9588 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9589
9591
9592 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9593 {
9594 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9595
9596 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9597 {
9598 string particle_class2 = "";
9600 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9601 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9602 WPOBE_array.Insert(WPOBE);
9603 }
9604
9605
9607 }
9608 }
9609 }
9610
9611
9613 {
9616
9618 {
9619 string config_to_search = "CfgVehicles";
9620
9621 if (IsInherited(Weapon))
9622 config_to_search = "CfgWeapons";
9623
9624 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9625 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9626
9627 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9628 {
9629
9631
9633 {
9635 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9637 return;
9638 }
9639
9642
9643
9644
9646 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9647
9648 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9649 {
9650 string particle_class = "";
9652 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9654
9655 if (entry_type == CT_CLASS)
9656 {
9657 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9658 WPOOH_array.Insert(WPOF);
9659 }
9660 }
9661
9662
9664 }
9665 }
9666 }
9667
9669 {
9671 }
9672
9674 {
9676 {
9678
9681
9684
9685 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9686 }
9687 }
9688
9690 {
9692 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9693
9695 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9696
9698 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9699
9701 {
9703 }
9704 }
9705
9707 {
9709 }
9710
9712 {
9715 else
9717
9719 {
9722 }
9723 else
9724 {
9727
9730 }
9731
9733 }
9734
9736 {
9738 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9739 }
9740
9742 {
9744 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9746 }
9747
9749 {
9751 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9752 }
9753
9755 {
9758
9759 OverheatingParticle OP = new OverheatingParticle();
9764
9766 }
9767
9769 {
9772
9773 return -1;
9774 }
9775
9777 {
9779 {
9782
9783 for (int i = count; i > 0; --i)
9784 {
9785 int id = i - 1;
9788
9791
9792 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9793 {
9794 if (p)
9795 {
9798 }
9799 }
9800 }
9801 }
9802 }
9803
9805 {
9807 {
9809 {
9810 int id = i - 1;
9812
9813 if (OP)
9814 {
9816
9817 if (p)
9818 {
9820 }
9821
9822 delete OP;
9823 }
9824 }
9825
9828 }
9829 }
9830
9833 {
9834 return 0.0;
9835 }
9836
9837
9839 {
9840 return 250;
9841 }
9842
9844 {
9845 return 0;
9846 }
9847
9850 {
9852 return true;
9853
9854 return false;
9855 }
9856
9859 {
9862
9864 {
9866 }
9867 else
9868 {
9869
9871 }
9872
9874 }
9875
9882 {
9883 return -1;
9884 }
9885
9886
9887
9888
9890 {
9892 {
9894 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9895
9896 if (r_index >= 0)
9897 {
9898 InventoryLocation r_il = new InventoryLocation;
9899 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9900
9901 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9904 {
9905 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9906 }
9908 {
9909 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9910 }
9911
9912 }
9913
9914 player.GetHumanInventory().ClearUserReservedLocation(this);
9915 }
9916
9919 }
9920
9921
9922
9923
9925 {
9926 return ItemBase.m_DebugActionsMask;
9927 }
9928
9930 {
9931 return ItemBase.m_DebugActionsMask & mask;
9932 }
9933
9935 {
9936 ItemBase.m_DebugActionsMask = mask;
9937 }
9938
9940 {
9941 ItemBase.m_DebugActionsMask |= mask;
9942 }
9943
9945 {
9946 ItemBase.m_DebugActionsMask &= ~mask;
9947 }
9948
9950 {
9952 {
9954 }
9955 else
9956 {
9958 }
9959 }
9960
9961
9963 {
9964 if (GetEconomyProfile())
9965 {
9966 float q_max = GetEconomyProfile().GetQuantityMax();
9967 if (q_max > 0)
9968 {
9969 float q_min = GetEconomyProfile().GetQuantityMin();
9970 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9971
9973 {
9974 ComponentEnergyManager comp = GetCompEM();
9976 {
9978 }
9979 }
9981 {
9983
9984 }
9985
9986 }
9987 }
9988 }
9989
9992 {
9993 EntityAI parent = GetHierarchyParent();
9994
9995 if (parent)
9996 {
9997 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9998 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9999 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10000 }
10001 }
10002
10005 {
10006 EntityAI parent = GetHierarchyParent();
10007
10008 if (parent)
10009 {
10010 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10011 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10012 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10013 }
10014 }
10015
10017 {
10018
10019
10020
10021
10023
10025 {
10026 if (ScriptInputUserData.CanStoreInputUserData())
10027 {
10028 ScriptInputUserData ctx = new ScriptInputUserData;
10034 ctx.
Write(use_stack_max);
10037
10039 {
10040 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10041 }
10042 }
10043 }
10044 else if (!
GetGame().IsMultiplayer())
10045 {
10047 }
10048 }
10049
10051 {
10053 }
10054
10056 {
10058 }
10059
10061 {
10063 }
10064
10066 {
10067
10068 return false;
10069 }
10070
10072 {
10073 return false;
10074 }
10075
10079 {
10080 return false;
10081 }
10082
10084 {
10085 return "";
10086 }
10087
10089
10091 {
10092 return false;
10093 }
10094
10096 {
10097 return true;
10098 }
10099
10100
10101
10103 {
10104 return true;
10105 }
10106
10108 {
10109 return true;
10110 }
10111
10113 {
10114 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10116 }
10117
10119 {
10121 }
10122
10124 {
10126 if (!is_being_placed)
10128 SetSynchDirty();
10129 }
10130
10131
10133
10135 {
10137 }
10138
10140 {
10142 }
10143
10145 {
10146 return 1;
10147 }
10148
10150 {
10151 return false;
10152 }
10153
10155 {
10157 SetSynchDirty();
10158 }
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
10191
10192
10193
10195 {
10196 super.OnMovedInsideCargo(container);
10197
10198 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10199 }
10200
10201 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10202 {
10203 super.EEItemLocationChanged(oldLoc,newLoc);
10204
10205 PlayerBase new_player = null;
10206 PlayerBase old_player = null;
10207
10208 if (newLoc.GetParent())
10209 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10210
10211 if (oldLoc.GetParent())
10212 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10213
10215 {
10216 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10217
10218 if (r_index >= 0)
10219 {
10220 InventoryLocation r_il = new InventoryLocation;
10221 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10222
10223 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10226 {
10227 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10228 }
10230 {
10231 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10232 }
10233
10234 }
10235 }
10236
10238 {
10239 if (new_player)
10240 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10241
10242 if (new_player == old_player)
10243 {
10244
10245 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10246 {
10248 {
10249 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10250 {
10251 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10252 }
10253 }
10254 else
10255 {
10256 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10257 }
10258 }
10259
10260 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10261 {
10262 int type = oldLoc.GetType();
10264 {
10265 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10266 }
10268 {
10269 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10270 }
10271 }
10272 if (!m_OldLocation)
10273 {
10274 m_OldLocation = new InventoryLocation;
10275 }
10276 m_OldLocation.Copy(oldLoc);
10277 }
10278 else
10279 {
10280 if (m_OldLocation)
10281 {
10282 m_OldLocation.Reset();
10283 }
10284 }
10285
10287 }
10288 else
10289 {
10290 if (new_player)
10291 {
10292 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10293 if (res_index >= 0)
10294 {
10295 InventoryLocation il = new InventoryLocation;
10296 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10298 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10301 {
10302 il.
GetParent().GetOnReleaseLock().Invoke(it);
10303 }
10305 {
10307 }
10308
10309 }
10310 }
10312 {
10313
10315 }
10316
10317 if (m_OldLocation)
10318 {
10319 m_OldLocation.Reset();
10320 }
10321 }
10322 }
10323
10324 override void EOnContact(IEntity other, Contact extra)
10325 {
10327 {
10328 int liquidType = -1;
10330 if (impactSpeed > 0.0)
10331 {
10333 #ifndef SERVER
10335 #else
10337 SetSynchDirty();
10338 #endif
10340 }
10341 }
10342
10343 #ifdef SERVER
10344 if (GetCompEM() && GetCompEM().IsPlugged())
10345 {
10346 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10347 GetCompEM().UnplugThis();
10348 }
10349 #endif
10350 }
10351
10353
10355 {
10357 }
10358
10360 {
10361
10362 }
10363
10365 {
10366 super.OnItemLocationChanged(old_owner, new_owner);
10367
10368 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10369 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10370
10371 if (!relatedPlayer && playerNew)
10372 relatedPlayer = playerNew;
10373
10374 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10375 {
10377 if (actionMgr)
10378 {
10379 ActionBase currentAction = actionMgr.GetRunningAction();
10380 if (currentAction)
10382 }
10383 }
10384
10385 Man ownerPlayerOld = null;
10386 Man ownerPlayerNew = null;
10387
10388 if (old_owner)
10389 {
10390 if (old_owner.
IsMan())
10391 {
10392 ownerPlayerOld = Man.Cast(old_owner);
10393 }
10394 else
10395 {
10396 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10397 }
10398 }
10399 else
10400 {
10402 {
10404
10405 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10406 {
10407 GetCompEM().UnplugThis();
10408 }
10409 }
10410 }
10411
10412 if (new_owner)
10413 {
10414 if (new_owner.
IsMan())
10415 {
10416 ownerPlayerNew = Man.Cast(new_owner);
10417 }
10418 else
10419 {
10420 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10421 }
10422 }
10423
10424 if (ownerPlayerOld != ownerPlayerNew)
10425 {
10426 if (ownerPlayerOld)
10427 {
10428 array<EntityAI> subItemsExit = new array<EntityAI>;
10430 for (int i = 0; i < subItemsExit.Count(); i++)
10431 {
10434 }
10435 }
10436
10437 if (ownerPlayerNew)
10438 {
10439 array<EntityAI> subItemsEnter = new array<EntityAI>;
10441 for (int j = 0; j < subItemsEnter.Count(); j++)
10442 {
10445 }
10446 }
10447 }
10448 else if (ownerPlayerNew != null)
10449 {
10450 PlayerBase nplayer;
10451 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10452 {
10453 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10455 for (int k = 0; k < subItemsUpdate.Count(); k++)
10456 {
10458 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10459 }
10460 }
10461 }
10462
10463 if (old_owner)
10464 old_owner.OnChildItemRemoved(this);
10465 if (new_owner)
10466 new_owner.OnChildItemReceived(this);
10467 }
10468
10469
10471 {
10472 super.EEDelete(parent);
10473 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10474 if (player)
10475 {
10477
10478 if (player.IsAlive())
10479 {
10480 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10481 if (r_index >= 0)
10482 {
10483 InventoryLocation r_il = new InventoryLocation;
10484 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10485
10486 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10489 {
10490 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10491 }
10493 {
10494 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10495 }
10496
10497 }
10498
10499 player.RemoveQuickBarEntityShortcut(this);
10500 }
10501 }
10502 }
10503
10505 {
10506 super.EEKilled(killer);
10507
10510 {
10511 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10512 {
10513 if (IsMagazine())
10514 {
10515 if (Magazine.Cast(this).GetAmmoCount() > 0)
10516 {
10518 }
10519 }
10520 else
10521 {
10523 }
10524 }
10525 }
10526 }
10527
10529 {
10530 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10531
10532 super.OnWasAttached(parent, slot_id);
10533
10536
10538 }
10539
10541 {
10542 super.OnWasDetached(parent, slot_id);
10543
10546 }
10547
10549 {
10550 int idx;
10553
10554 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10555 if (inventory_slots.Count() < 1)
10556 {
10557 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10558 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10559 }
10560 else
10561 {
10562 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10563 }
10564
10565 idx = inventory_slots.Find(slot);
10566 if (idx < 0)
10567 return "";
10568
10569 return attach_types.Get(idx);
10570 }
10571
10573 {
10574 int idx = -1;
10575 string slot;
10576
10579
10580 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10581 if (inventory_slots.Count() < 1)
10582 {
10583 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10584 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10585 }
10586 else
10587 {
10588 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10589 if (detach_types.Count() < 1)
10590 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10591 }
10592
10593 for (int i = 0; i < inventory_slots.Count(); i++)
10594 {
10595 slot = inventory_slots.Get(i);
10596 }
10597
10598 if (slot != "")
10599 {
10600 if (detach_types.Count() == 1)
10601 idx = 0;
10602 else
10603 idx = inventory_slots.Find(slot);
10604 }
10605 if (idx < 0)
10606 return "";
10607
10608 return detach_types.Get(idx);
10609 }
10610
10612 {
10613
10615
10616
10617 float min_time = 1;
10618 float max_time = 3;
10619 float delay = Math.RandomFloat(min_time, max_time);
10620
10621 explode_timer.Run(delay, this, "DoAmmoExplosion");
10622 }
10623
10625 {
10626 Magazine magazine = Magazine.Cast(this);
10627 int pop_sounds_count = 6;
10628 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10629
10630
10631 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10632 string sound_name = pop_sounds[ sound_idx ];
10634
10635
10636 magazine.ServerAddAmmoCount(-1);
10637
10638
10639 float min_temp_to_explode = 100;
10640
10641 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10642 {
10644 }
10645 }
10646
10647
10648 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10649 {
10650 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10651
10652 const int CHANCE_DAMAGE_CARGO = 4;
10653 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10654 const int CHANCE_DAMAGE_NOTHING = 2;
10655
10657 {
10658 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10659 int chances;
10660 int rnd;
10661
10662 if (GetInventory().GetCargo())
10663 {
10664 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10665 rnd = Math.RandomInt(0,chances);
10666
10667 if (rnd < CHANCE_DAMAGE_CARGO)
10668 {
10670 }
10671 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10672 {
10674 }
10675 }
10676 else
10677 {
10678 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10679 rnd = Math.RandomInt(0,chances);
10680
10681 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10682 {
10684 }
10685 }
10686 }
10687 }
10688
10690 {
10691 if (GetInventory().GetCargo())
10692 {
10693 int item_count = GetInventory().GetCargo().GetItemCount();
10694 if (item_count > 0)
10695 {
10696 int random_pick = Math.RandomInt(0, item_count);
10698 if (!item.IsExplosive())
10699 {
10700 item.AddHealth("","",damage);
10701 return true;
10702 }
10703 }
10704 }
10705 return false;
10706 }
10707
10709 {
10710 int attachment_count = GetInventory().AttachmentCount();
10711 if (attachment_count > 0)
10712 {
10713 int random_pick = Math.RandomInt(0, attachment_count);
10714 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10715 if (!attachment.IsExplosive())
10716 {
10717 attachment.AddHealth("","",damage);
10718 return true;
10719 }
10720 }
10721 return false;
10722 }
10723
10725 {
10727 }
10728
10730 {
10732 return GetInventory().CanRemoveEntity();
10733
10734 return false;
10735 }
10736
10738 {
10739
10741 return false;
10742
10743
10745 return false;
10746
10747
10748
10750 if (delta == 0)
10751 return false;
10752
10753
10754 return true;
10755 }
10756
10758 {
10760 {
10761 if (ScriptInputUserData.CanStoreInputUserData())
10762 {
10763 ScriptInputUserData ctx = new ScriptInputUserData;
10768 ctx.
Write(destination_entity);
10770 ctx.
Write(slot_id);
10772 }
10773 }
10774 else if (!
GetGame().IsMultiplayer())
10775 {
10777 }
10778 }
10779
10781 {
10782 float split_quantity_new;
10786 InventoryLocation loc = new InventoryLocation;
10787
10788 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10789 {
10791 split_quantity_new = stack_max;
10792 else
10794
10796 {
10797 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10798 if (new_item)
10799 {
10800 new_item.SetResultOfSplit(true);
10801 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10803 new_item.
SetQuantity(split_quantity_new,
false,
true);
10804 }
10805 }
10806 }
10807 else if (destination_entity && slot_id == -1)
10808 {
10809 if (quantity > stack_max)
10810 split_quantity_new = stack_max;
10811 else
10812 split_quantity_new = quantity;
10813
10815 {
10817 {
10820 }
10821
10822 if (new_item)
10823 {
10824 new_item.SetResultOfSplit(true);
10825 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10827 new_item.
SetQuantity(split_quantity_new,
false,
true);
10828 }
10829 }
10830 }
10831 else
10832 {
10833 if (stack_max != 0)
10834 {
10836 {
10838 }
10839
10840 if (split_quantity_new == 0)
10841 {
10842 if (!
GetGame().IsMultiplayer())
10843 player.PhysicalPredictiveDropItem(this);
10844 else
10845 player.ServerDropEntity(this);
10846 return;
10847 }
10848
10850 {
10852
10853 if (new_item)
10854 {
10855 new_item.SetResultOfSplit(true);
10856 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10859 new_item.PlaceOnSurface();
10860 }
10861 }
10862 }
10863 }
10864 }
10865
10867 {
10868 float split_quantity_new;
10872 InventoryLocation loc = new InventoryLocation;
10873
10874 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10875 {
10877 split_quantity_new = stack_max;
10878 else
10880
10882 {
10883 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10884 if (new_item)
10885 {
10886 new_item.SetResultOfSplit(true);
10887 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10889 new_item.
SetQuantity(split_quantity_new,
false,
true);
10890 }
10891 }
10892 }
10893 else if (destination_entity && slot_id == -1)
10894 {
10895 if (quantity > stack_max)
10896 split_quantity_new = stack_max;
10897 else
10898 split_quantity_new = quantity;
10899
10901 {
10903 {
10906 }
10907
10908 if (new_item)
10909 {
10910 new_item.SetResultOfSplit(true);
10911 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10913 new_item.
SetQuantity(split_quantity_new,
false,
true);
10914 }
10915 }
10916 }
10917 else
10918 {
10919 if (stack_max != 0)
10920 {
10922 {
10924 }
10925
10927 {
10929
10930 if (new_item)
10931 {
10932 new_item.SetResultOfSplit(true);
10933 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10936 new_item.PlaceOnSurface();
10937 }
10938 }
10939 }
10940 }
10941 }
10942
10944 {
10946 {
10947 if (ScriptInputUserData.CanStoreInputUserData())
10948 {
10949 ScriptInputUserData ctx = new ScriptInputUserData;
10954 dst.WriteToContext(ctx);
10956 }
10957 }
10958 else if (!
GetGame().IsMultiplayer())
10959 {
10961 }
10962 }
10963
10965 {
10967 {
10968 if (ScriptInputUserData.CanStoreInputUserData())
10969 {
10970 ScriptInputUserData ctx = new ScriptInputUserData;
10975 ctx.
Write(destination_entity);
10981 }
10982 }
10983 else if (!
GetGame().IsMultiplayer())
10984 {
10986 }
10987 }
10988
10990 {
10992 }
10993
10995 {
10997 float split_quantity_new;
10999 if (dst.IsValid())
11000 {
11001 int slot_id = dst.GetSlot();
11003
11004 if (quantity > stack_max)
11005 split_quantity_new = stack_max;
11006 else
11007 split_quantity_new = quantity;
11008
11010 {
11012
11013 if (new_item)
11014 {
11015 new_item.SetResultOfSplit(true);
11016 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11018 new_item.
SetQuantity(split_quantity_new,
false,
true);
11019 }
11020
11021 return new_item;
11022 }
11023 }
11024
11025 return null;
11026 }
11027
11029 {
11031 float split_quantity_new;
11033 if (destination_entity)
11034 {
11036 if (quantity > stackable)
11037 split_quantity_new = stackable;
11038 else
11039 split_quantity_new = quantity;
11040
11042 {
11043 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11044 if (new_item)
11045 {
11046 new_item.SetResultOfSplit(true);
11047 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11049 new_item.
SetQuantity(split_quantity_new,
false,
true);
11050 }
11051 }
11052 }
11053 }
11054
11056 {
11058 {
11059 if (ScriptInputUserData.CanStoreInputUserData())
11060 {
11061 ScriptInputUserData ctx = new ScriptInputUserData;
11066 ItemBase destination_entity =
this;
11067 ctx.
Write(destination_entity);
11071 }
11072 }
11073 else if (!
GetGame().IsMultiplayer())
11074 {
11076 }
11077 }
11078
11080 {
11082 float split_quantity_new;
11084 if (player)
11085 {
11087 if (quantity > stackable)
11088 split_quantity_new = stackable;
11089 else
11090 split_quantity_new = quantity;
11091
11093 {
11094 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11095 new_item =
ItemBase.Cast(in_hands);
11096 if (new_item)
11097 {
11098 new_item.SetResultOfSplit(true);
11099 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11101 new_item.SetQuantity(split_quantity_new, false, true);
11102 }
11103 }
11104 }
11105 }
11106
11108 {
11110 float split_quantity_new = Math.Floor(quantity * 0.5);
11111
11113 return;
11114
11116
11117 if (new_item)
11118 {
11119 if (new_item.GetQuantityMax() < split_quantity_new)
11120 {
11121 split_quantity_new = new_item.GetQuantityMax();
11122 }
11123
11124 new_item.SetResultOfSplit(true);
11125 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11126
11128 {
11131 }
11132 else
11133 {
11135 new_item.
SetQuantity(split_quantity_new,
false,
true);
11136 }
11137 }
11138 }
11139
11141 {
11143 float split_quantity_new = Math.Floor(quantity / 2);
11144
11146 return;
11147
11148 InventoryLocation invloc = new InventoryLocation;
11150
11152 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11153
11154 if (new_item)
11155 {
11156 if (new_item.GetQuantityMax() < split_quantity_new)
11157 {
11158 split_quantity_new = new_item.GetQuantityMax();
11159 }
11161 {
11164 }
11165 else if (split_quantity_new > 1)
11166 {
11168 new_item.
SetQuantity(split_quantity_new,
false,
true);
11169 }
11170 }
11171 }
11172
11175 {
11176 SetWeightDirty();
11178
11179 if (parent)
11180 parent.OnAttachmentQuantityChangedEx(this, delta);
11181
11183 {
11185 {
11187 }
11189 {
11190 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11192 }
11193 }
11194
11195 }
11196
11199 {
11200
11201 }
11202
11205 {
11207 }
11208
11210 {
11211 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11212
11214 {
11215 if (newLevel == GameConstants.STATE_RUINED)
11216 {
11218 EntityAI parent = GetHierarchyParent();
11219 if (parent && parent.IsFireplace())
11220 {
11221 CargoBase cargo = GetInventory().GetCargo();
11222 if (cargo)
11223 {
11225 {
11227 }
11228 }
11229 }
11230 }
11231
11233 {
11234
11236 return;
11237 }
11238
11239 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11240 {
11242 }
11243 }
11244 }
11245
11246
11248 {
11249 super.OnRightClick();
11250
11252 {
11254 {
11255 if (ScriptInputUserData.CanStoreInputUserData())
11256 {
11257 EntityAI root = GetHierarchyRoot();
11258 Man playerOwner = GetHierarchyRootPlayer();
11259 InventoryLocation dst = new InventoryLocation;
11260
11261
11262 if (!playerOwner && root && root == this)
11263 {
11265 }
11266 else
11267 {
11268
11269 GetInventory().GetCurrentInventoryLocation(dst);
11271 {
11274 {
11276 }
11277 else
11278 {
11280
11281
11282 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11283 {
11285 }
11286 else
11287 {
11288 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11289 }
11290 }
11291 }
11292 }
11293
11294 ScriptInputUserData ctx = new ScriptInputUserData;
11302 }
11303 }
11304 else if (!
GetGame().IsMultiplayer())
11305 {
11307 }
11308 }
11309 }
11310
11312 {
11313 if (root)
11314 {
11315 vector m4[4];
11316 root.GetTransform(m4);
11317 dst.SetGround(this, m4);
11318 }
11319 else
11320 {
11321 GetInventory().GetCurrentInventoryLocation(dst);
11322 }
11323 }
11324
11325 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11326 {
11327
11328 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11329 return false;
11330
11331 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11332 return false;
11333
11334
11336 return false;
11337
11338
11339 Magazine mag = Magazine.Cast(this);
11340 if (mag)
11341 {
11342 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11343 return false;
11344
11345 if (stack_max_limit)
11346 {
11347 Magazine other_mag = Magazine.Cast(other_item);
11348 if (other_item)
11349 {
11350 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11351 return false;
11352 }
11353
11354 }
11355 }
11356 else
11357 {
11358
11360 return false;
11361
11363 return false;
11364 }
11365
11366 PlayerBase player = null;
11367 if (CastTo(player, GetHierarchyRootPlayer()))
11368 {
11369 if (player.GetInventory().HasAttachment(this))
11370 return false;
11371
11372 if (player.IsItemsToDelete())
11373 return false;
11374 }
11375
11376 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11377 return false;
11378
11379 int slotID;
11381 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11382 return false;
11383
11384 return true;
11385 }
11386
11388 {
11390 }
11391
11393 {
11394 return m_IsResultOfSplit;
11395 }
11396
11398 {
11399 m_IsResultOfSplit = value;
11400 }
11401
11403 {
11405 }
11406
11408 {
11409 float other_item_quantity = other_item.GetQuantity();
11410 float this_free_space;
11411
11413
11415
11416 if (other_item_quantity > this_free_space)
11417 {
11418 return this_free_space;
11419 }
11420 else
11421 {
11422 return other_item_quantity;
11423 }
11424 }
11425
11427 {
11429 }
11430
11432 {
11434 return;
11435
11436 if (!IsMagazine() && other_item)
11437 {
11439 if (quantity_used != 0)
11440 {
11441 float hp1 = GetHealth01("","");
11442 float hp2 = other_item.GetHealth01("","");
11443 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11444 hpResult = hpResult / (
GetQuantity() + quantity_used);
11445
11446 hpResult *= GetMaxHealth();
11447 Math.Round(hpResult);
11448 SetHealth("", "Health", hpResult);
11449
11451 other_item.AddQuantity(-quantity_used);
11452 }
11453 }
11455 }
11456
11458 {
11459 #ifdef SERVER
11460 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11461 GetHierarchyParent().IncreaseLifetimeUp();
11462 #endif
11463 };
11464
11466 {
11467 PlayerBase p = PlayerBase.Cast(player);
11468
11469 array<int> recipesIds = p.m_Recipes;
11470 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11471 if (moduleRecipesManager)
11472 {
11473 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11474 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11475 }
11476
11477 for (int i = 0;i < recipesIds.Count(); i++)
11478 {
11479 int key = recipesIds.Get(i);
11480 string recipeName = moduleRecipesManager.GetRecipeName(key);
11482 }
11483 }
11484
11485
11486 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11487 {
11488 super.GetDebugActions(outputList);
11489
11490
11496
11497
11502
11507
11508
11512
11513
11515 {
11519 }
11520
11523
11524
11528
11530
11531 InventoryLocation loc = new InventoryLocation();
11532 GetInventory().GetCurrentInventoryLocation(loc);
11534 {
11535 if (Gizmo_IsSupported())
11538 }
11539
11541 }
11542
11543
11544
11545
11547 {
11548 super.OnAction(action_id, player, ctx);
11549
11551 {
11552 switch (action_id)
11553 {
11556 return true;
11559 return true;
11560 }
11561 }
11562
11564 {
11565 switch (action_id)
11566 {
11568 Delete();
11569 return true;
11570 }
11571 }
11572
11573 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11574 {
11575 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11576 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11577 PlayerBase p = PlayerBase.Cast(player);
11578 if (
EActions.RECIPES_RANGE_START < 1000)
11579 {
11580 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11581 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11582 }
11583 }
11584 #ifndef SERVER
11585 else if (action_id ==
EActions.WATCH_PLAYER)
11586 {
11587 PluginDeveloper.SetDeveloperItemClientEx(player);
11588 }
11589 #endif
11591 {
11592 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11593 {
11594 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11595 OnDebugButtonPressServer(id + 1);
11596 }
11597
11598 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11599 {
11600 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11602 }
11603
11604 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11605 {
11606 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11608 }
11609
11610 else if (action_id ==
EActions.ADD_QUANTITY)
11611 {
11612 if (IsMagazine())
11613 {
11614 Magazine mag = Magazine.Cast(this);
11615 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11616 }
11617 else
11618 {
11620 }
11621
11622 if (m_EM)
11623 {
11624 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11625 }
11626
11627 }
11628
11629 else if (action_id ==
EActions.REMOVE_QUANTITY)
11630 {
11631 if (IsMagazine())
11632 {
11633 Magazine mag2 = Magazine.Cast(this);
11634 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11635 }
11636 else
11637 {
11639 }
11640 if (m_EM)
11641 {
11642 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11643 }
11644
11645 }
11646
11647 else if (action_id ==
EActions.SET_QUANTITY_0)
11648 {
11650
11651 if (m_EM)
11652 {
11653 m_EM.SetEnergy(0);
11654 }
11655 }
11656
11657 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11658 {
11660
11661 if (m_EM)
11662 {
11663 m_EM.SetEnergy(m_EM.GetEnergyMax());
11664 }
11665 }
11666
11667 else if (action_id ==
EActions.ADD_HEALTH)
11668 {
11669 AddHealth("","",GetMaxHealth("","Health")/5);
11670 }
11671 else if (action_id ==
EActions.REMOVE_HEALTH)
11672 {
11673 AddHealth("","",-GetMaxHealth("","Health")/5);
11674 }
11675 else if (action_id ==
EActions.DESTROY_HEALTH)
11676 {
11677 SetHealth01("","",0);
11678 }
11679 else if (action_id ==
EActions.WATCH_ITEM)
11680 {
11682 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11683 #ifdef DEVELOPER
11684 SetDebugDeveloper_item(this);
11685 #endif
11686 }
11687
11688 else if (action_id ==
EActions.ADD_TEMPERATURE)
11689 {
11690 AddTemperature(20);
11691
11692 }
11693
11694 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11695 {
11696 AddTemperature(-20);
11697
11698 }
11699
11700 else if (action_id ==
EActions.FLIP_FROZEN)
11701 {
11702 SetFrozen(!GetIsFrozen());
11703
11704 }
11705
11706 else if (action_id ==
EActions.ADD_WETNESS)
11707 {
11709
11710 }
11711
11712 else if (action_id ==
EActions.REMOVE_WETNESS)
11713 {
11715
11716 }
11717
11718 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11719 {
11722
11723
11724 }
11725
11726 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11727 {
11730 }
11731
11732 else if (action_id ==
EActions.MAKE_SPECIAL)
11733 {
11734 auto debugParams = DebugSpawnParams.WithPlayer(player);
11735 OnDebugSpawnEx(debugParams);
11736 }
11737
11738 }
11739
11740
11741 return false;
11742 }
11743
11744
11745
11746
11750
11753
11754
11755
11757 {
11758 return false;
11759 }
11760
11761
11763 {
11764 return true;
11765 }
11766
11767
11769 {
11770 return true;
11771 }
11772
11773
11774
11776 {
11777 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11779 }
11780
11783 {
11784 return null;
11785 }
11786
11788 {
11789 return false;
11790 }
11791
11793 {
11794 return false;
11795 }
11796
11800
11801
11803 {
11804 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11805 return module_repairing.CanRepair(this, item_repair_kit);
11806 }
11807
11808
11809 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11810 {
11811 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11812 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11813 }
11814
11815
11817 {
11818
11819
11820
11821
11822
11823
11824
11825
11826 return 1;
11827 }
11828
11829
11830
11832 {
11834 }
11835
11836
11837
11839 {
11841 }
11842
11843
11852 {
11853 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11854
11855 if (player)
11856 {
11857 player.MessageStatus(text);
11858 }
11859 }
11860
11861
11870 {
11871 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11872
11873 if (player)
11874 {
11875 player.MessageAction(text);
11876 }
11877 }
11878
11879
11888 {
11889 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11890
11891 if (player)
11892 {
11893 player.MessageFriendly(text);
11894 }
11895 }
11896
11897
11906 {
11907 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11908
11909 if (player)
11910 {
11911 player.MessageImportant(text);
11912 }
11913 }
11914
11916 {
11917 return true;
11918 }
11919
11920
11921 override bool KindOf(
string tag)
11922 {
11923 bool found = false;
11924 string item_name = this.
GetType();
11927
11928 int array_size = item_tag_array.Count();
11929 for (int i = 0; i < array_size; i++)
11930 {
11931 if (item_tag_array.Get(i) == tag)
11932 {
11933 found = true;
11934 break;
11935 }
11936 }
11937 return found;
11938 }
11939
11940
11942 {
11943
11944 super.OnRPC(sender, rpc_type,ctx);
11945
11946
11947 switch (rpc_type)
11948 {
11949 #ifndef SERVER
11950 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11951 Param2<bool, string> p = new Param2<bool, string>(false, "");
11952
11954 return;
11955
11956 bool play = p.param1;
11957 string soundSet = p.param2;
11958
11959 if (play)
11960 {
11962 {
11964 {
11966 }
11967 }
11968 else
11969 {
11971 }
11972 }
11973 else
11974 {
11976 }
11977
11978 break;
11979 #endif
11980
11981 }
11982
11984 {
11986 }
11987 }
11988
11989
11990
11991
11993 {
11994 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11995 return plugin.GetID(
name);
11996 }
11997
11999 {
12000 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12001 return plugin.GetName(id);
12002 }
12003
12006 {
12007
12008
12009 int varFlags;
12010 if (!ctx.
Read(varFlags))
12011 return;
12012
12013 if (varFlags & ItemVariableFlags.FLOAT)
12014 {
12016 }
12017 }
12018
12020 {
12021
12022 super.SerializeNumericalVars(floats_out);
12023
12024
12025
12027 {
12029 }
12030
12032 {
12034 }
12035
12037 {
12039 }
12040
12042 {
12047 }
12048
12050 {
12052 }
12053 }
12054
12056 {
12057
12058 super.DeSerializeNumericalVars(floats);
12059
12060
12061 int index = 0;
12062 int mask = Math.Round(floats.Get(index));
12063
12064 index++;
12065
12067 {
12069 {
12071 }
12072 else
12073 {
12074 float quantity = floats.Get(index);
12075 SetQuantity(quantity,
true,
false,
false,
false);
12076 }
12077 index++;
12078 }
12079
12081 {
12082 float wet = floats.Get(index);
12084 index++;
12085 }
12086
12088 {
12089 int liquidtype = Math.Round(floats.Get(index));
12091 index++;
12092 }
12093
12095 {
12097 index++;
12099 index++;
12101 index++;
12103 index++;
12104 }
12105
12107 {
12108 int cleanness = Math.Round(floats.Get(index));
12110 index++;
12111 }
12112 }
12113
12115 {
12116 super.WriteVarsToCTX(ctx);
12117
12118
12120 {
12122 }
12123
12125 {
12127 }
12128
12130 {
12132 }
12133
12135 {
12136 int r,g,b,a;
12142 }
12143
12145 {
12147 }
12148 }
12149
12151 {
12152 if (!super.ReadVarsFromCTX(ctx,version))
12153 return false;
12154
12155 int intValue;
12156 float value;
12157
12158 if (version < 140)
12159 {
12160 if (!ctx.
Read(intValue))
12161 return false;
12162
12163 m_VariablesMask = intValue;
12164 }
12165
12167 {
12168 if (!ctx.
Read(value))
12169 return false;
12170
12172 {
12174 }
12175 else
12176 {
12178 }
12179 }
12180
12181 if (version < 140)
12182 {
12184 {
12185 if (!ctx.
Read(value))
12186 return false;
12187 SetTemperatureDirect(value);
12188 }
12189 }
12190
12192 {
12193 if (!ctx.
Read(value))
12194 return false;
12196 }
12197
12199 {
12200 if (!ctx.
Read(intValue))
12201 return false;
12203 }
12204
12206 {
12207 int r,g,b,a;
12209 return false;
12211 return false;
12213 return false;
12215 return false;
12216
12218 }
12219
12221 {
12222 if (!ctx.
Read(intValue))
12223 return false;
12225 }
12226
12227 if (version >= 138 && version < 140)
12228 {
12230 {
12231 if (!ctx.
Read(intValue))
12232 return false;
12233 SetFrozen(intValue);
12234 }
12235 }
12236
12237 return true;
12238 }
12239
12240
12242 {
12245 {
12247 }
12248
12249 if (!super.OnStoreLoad(ctx, version))
12250 {
12252 return false;
12253 }
12254
12255 if (version >= 114)
12256 {
12257 bool hasQuickBarIndexSaved;
12258
12259 if (!ctx.
Read(hasQuickBarIndexSaved))
12260 {
12262 return false;
12263 }
12264
12265 if (hasQuickBarIndexSaved)
12266 {
12267 int itmQBIndex;
12268
12269
12270 if (!ctx.
Read(itmQBIndex))
12271 {
12273 return false;
12274 }
12275
12276 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12277 if (itmQBIndex != -1 && parentPlayer)
12278 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12279 }
12280 }
12281 else
12282 {
12283
12284 PlayerBase player;
12285 int itemQBIndex;
12286 if (version ==
int.
MAX)
12287 {
12288 if (!ctx.
Read(itemQBIndex))
12289 {
12291 return false;
12292 }
12293 }
12294 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12295 {
12296
12297 if (!ctx.
Read(itemQBIndex))
12298 {
12300 return false;
12301 }
12302 if (itemQBIndex != -1 && player)
12303 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12304 }
12305 }
12306
12307 if (version < 140)
12308 {
12309
12310 if (!LoadVariables(ctx, version))
12311 {
12313 return false;
12314 }
12315 }
12316
12317
12319 {
12321 return false;
12322 }
12323 if (version >= 132)
12324 {
12326 if (raib)
12327 {
12329 {
12331 return false;
12332 }
12333 }
12334 }
12335
12337 return true;
12338 }
12339
12340
12341
12343 {
12344 super.OnStoreSave(ctx);
12345
12346 PlayerBase player;
12347 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12348 {
12350
12351 int itemQBIndex = -1;
12352 itemQBIndex = player.FindQuickBarEntityIndex(this);
12353 ctx.
Write(itemQBIndex);
12354 }
12355 else
12356 {
12358 }
12359
12361
12363 if (raib)
12364 {
12366 }
12367 }
12368
12369
12371 {
12372 super.AfterStoreLoad();
12373
12375 {
12377 }
12378
12380 {
12383 }
12384 }
12385
12387 {
12388 super.EEOnAfterLoad();
12389
12391 {
12393 }
12394
12397 }
12398
12400 {
12401 return false;
12402 }
12403
12404
12405
12407 {
12409 {
12410 #ifdef PLATFORM_CONSOLE
12411
12413 {
12415 if (menu)
12416 {
12418 }
12419 }
12420 #endif
12421 }
12422
12424 {
12427 }
12428
12430 {
12431 SetWeightDirty();
12433 }
12435 {
12438 }
12439
12441 {
12444 }
12446 {
12449 }
12450
12451 super.OnVariablesSynchronized();
12452 }
12453
12454
12455
12457 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12458 {
12459 if (!IsServerCheck(allow_client))
12460 return false;
12461
12463 return false;
12464
12467
12468 if (value <= (min + 0.001))
12469 value = min;
12470
12471 if (value == min)
12472 {
12473 if (destroy_config)
12474 {
12475 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12476 if (dstr)
12477 {
12479 this.Delete();
12480 return true;
12481 }
12482 }
12483 else if (destroy_forced)
12484 {
12486 this.Delete();
12487 return true;
12488 }
12489
12491 }
12492
12495
12497 {
12499
12500 if (delta)
12502 }
12503
12505
12506 return false;
12507 }
12508
12509
12511 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12512 {
12514 }
12515
12517 {
12520 }
12521
12523 {
12526 }
12527
12529 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12530 {
12531 float value_clamped = Math.Clamp(value, 0, 1);
12533 SetQuantity(result, destroy_config, destroy_forced);
12534 }
12535
12536
12539 {
12541 }
12542
12544 {
12546 }
12547
12548
12549
12550
12551
12552
12553
12554
12555
12556
12558 {
12559 int slot = -1;
12560 if (GetInventory())
12561 {
12562 InventoryLocation il = new InventoryLocation;
12563 GetInventory().GetCurrentInventoryLocation(il);
12565 }
12566
12568 }
12569
12571 {
12572 float quantity_max = 0;
12573
12575 {
12576 if (attSlotID != -1)
12577 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12578
12579 if (quantity_max <= 0)
12581 }
12582
12583 if (quantity_max <= 0)
12585
12586 return quantity_max;
12587 }
12588
12590 {
12592 }
12593
12595 {
12597 }
12598
12599
12601 {
12603 }
12604
12606 {
12608 }
12609
12611 {
12613 }
12614
12615
12617 {
12618
12619 float weightEx = GetWeightEx();
12620 float special = GetInventoryAndCargoWeight();
12621 return weightEx - special;
12622 }
12623
12624
12626 {
12628 }
12629
12631 {
12633 {
12634 #ifdef DEVELOPER
12635 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12636 {
12637 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12639 }
12640 #endif
12641
12642 return GetQuantity() * GetConfigWeightModified();
12643 }
12644 else if (HasEnergyManager())
12645 {
12646 #ifdef DEVELOPER
12647 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12648 {
12649 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12650 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12651 }
12652 #endif
12653 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12654 }
12655 else
12656 {
12657 #ifdef DEVELOPER
12658 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12659 {
12660 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12661 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12662 }
12663 #endif
12664 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12665 }
12666 }
12667
12670 {
12671 int item_count = 0;
12673
12674 if (GetInventory().GetCargo() != NULL)
12675 {
12676 item_count = GetInventory().GetCargo().GetItemCount();
12677 }
12678
12679 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12680 {
12681 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12682 if (item)
12683 item_count += item.GetNumberOfItems();
12684 }
12685 return item_count;
12686 }
12687
12690 {
12691 float weight = 0;
12692 float wetness = 1;
12693 if (include_wetness)
12696 {
12697 weight = wetness * m_ConfigWeight;
12698 }
12700 {
12701 weight = 1;
12702 }
12703 return weight;
12704 }
12705
12706
12707
12709 {
12710 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12711 {
12712 GameInventory inv = GetInventory();
12713 array<EntityAI> items = new array<EntityAI>;
12715 for (int i = 0; i < items.Count(); i++)
12716 {
12718 if (item)
12719 {
12721 }
12722 }
12723 }
12724 }
12725
12726
12727
12728
12730 {
12731 float energy = 0;
12732 if (HasEnergyManager())
12733 {
12734 energy = GetCompEM().GetEnergy();
12735 }
12736 return energy;
12737 }
12738
12739
12741 {
12742 super.OnEnergyConsumed();
12743
12745 }
12746
12748 {
12749 super.OnEnergyAdded();
12750
12752 }
12753
12754
12756 {
12757 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12758 {
12760 {
12761 float energy_0to1 = GetCompEM().GetEnergy0To1();
12763 }
12764 }
12765 }
12766
12767
12769 {
12770 return ConfigGetFloat("heatIsolation");
12771 }
12772
12774 {
12776 }
12777
12779 {
12780 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12781 if (
GetGame().ConfigIsExisting(paramPath))
12783
12784 return 0.0;
12785 }
12786
12788 {
12789 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12790 if (
GetGame().ConfigIsExisting(paramPath))
12792
12793 return 0.0;
12794 }
12795
12796 override void SetWet(
float value,
bool allow_client =
false)
12797 {
12798 if (!IsServerCheck(allow_client))
12799 return;
12800
12803
12805
12806 m_VarWet = Math.Clamp(value, min, max);
12807
12809 {
12812 }
12813 }
12814
12815 override void AddWet(
float value)
12816 {
12818 }
12819
12821 {
12823 }
12824
12826 {
12828 }
12829
12831 {
12833 }
12834
12836 {
12838 }
12839
12841 {
12843 }
12844
12845 override void OnWetChanged(
float newVal,
float oldVal)
12846 {
12849 if (newLevel != oldLevel)
12850 {
12852 }
12853 }
12854
12856 {
12857 SetWeightDirty();
12858 }
12859
12861 {
12862 return GetWetLevelInternal(
m_VarWet);
12863 }
12864
12865
12866
12868 {
12870 }
12871
12873 {
12875 }
12876
12878 {
12880 }
12881
12883 {
12885 }
12886
12887
12888
12890 {
12891 if (ConfigIsExisting("itemModelLength"))
12892 {
12893 return ConfigGetFloat("itemModelLength");
12894 }
12895 return 0;
12896 }
12897
12899 {
12900 if (ConfigIsExisting("itemAttachOffset"))
12901 {
12902 return ConfigGetFloat("itemAttachOffset");
12903 }
12904 return 0;
12905 }
12906
12907 override void SetCleanness(
int value,
bool allow_client =
false)
12908 {
12909 if (!IsServerCheck(allow_client))
12910 return;
12911
12913
12915
12918 }
12919
12921 {
12923 }
12924
12926 {
12927 return true;
12928 }
12929
12930
12931
12932
12934 {
12936 }
12937
12939 {
12941 }
12942
12943
12944
12945
12946 override void SetColor(
int r,
int g,
int b,
int a)
12947 {
12953 }
12955 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12956 {
12961 }
12962
12964 {
12966 }
12967
12970 {
12971 int r,g,b,a;
12973 r = r/255;
12974 g = g/255;
12975 b = b/255;
12976 a = a/255;
12977 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12978 }
12979
12980
12981
12982 override void SetLiquidType(
int value,
bool allow_client =
false)
12983 {
12984 if (!IsServerCheck(allow_client))
12985 return;
12986
12991 }
12992
12994 {
12995 return ConfigGetInt("varLiquidTypeInit");
12996 }
12997
12999 {
13001 }
13002
13004 {
13006 SetFrozen(false);
13007 }
13008
13011 {
13012 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13013 }
13014
13015
13018 {
13019 PlayerBase nplayer;
13020 if (PlayerBase.CastTo(nplayer, player))
13021 {
13023
13024 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13025 }
13026 }
13027
13028
13031 {
13032 PlayerBase nplayer;
13033 if (PlayerBase.CastTo(nplayer,player))
13034 {
13035
13036 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13037
13038 }
13039
13040
13041 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13042
13043
13044 if (HasEnergyManager())
13045 {
13046 GetCompEM().UpdatePlugState();
13047 }
13048 }
13049
13050
13052 {
13053 super.OnPlacementStarted(player);
13054
13056 }
13057
13058 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13059 {
13061 {
13062 m_AdminLog.OnPlacementComplete(player,
this);
13063 }
13064
13065 super.OnPlacementComplete(player, position, orientation);
13066 }
13067
13068
13069
13070
13071
13073 {
13075 {
13076 return true;
13077 }
13078 else
13079 {
13080 return false;
13081 }
13082 }
13083
13084
13086 {
13088 {
13090 }
13091 }
13092
13093
13095 {
13097 }
13098
13100 {
13102 }
13103
13104 override void InsertAgent(
int agent,
float count = 1)
13105 {
13106 if (count < 1)
13107 return;
13108
13110 }
13111
13114 {
13116 }
13117
13118
13120 {
13122 }
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
13154
13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13166 {
13168 return false;
13169 return true;
13170 }
13171
13173 {
13174
13176 }
13177
13178
13181 {
13182 super.CheckForRoofLimited(timeTresholdMS);
13183
13185 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13186 {
13187 m_PreviousRoofTestTime = time;
13188 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13189 }
13190 }
13191
13192
13194 {
13196 {
13197 return 0;
13198 }
13199
13200 if (GetInventory().GetAttachmentSlotsCount() != 0)
13201 {
13202 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13203 if (filter)
13204 return filter.GetProtectionLevel(type, false, system);
13205 else
13206 return 0;
13207 }
13208
13209 string subclassPath, entryName;
13210
13211 switch (type)
13212 {
13214 entryName = "biological";
13215 break;
13217 entryName = "chemical";
13218 break;
13219 default:
13220 entryName = "biological";
13221 break;
13222 }
13223
13224 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13225
13227 }
13228
13229
13230
13233 {
13234 if (!IsMagazine())
13236
13238 }
13239
13240
13241
13242
13243
13248 {
13249 return true;
13250 }
13251
13253 {
13255 }
13256
13257
13258
13259
13260
13262 {
13263 if (parent)
13264 {
13265 if (parent.IsInherited(DayZInfected))
13266 return true;
13267
13268 if (!parent.IsRuined())
13269 return true;
13270 }
13271
13272 return true;
13273 }
13274
13276 {
13277 if (!super.CanPutAsAttachment(parent))
13278 {
13279 return false;
13280 }
13281
13282 if (!IsRuined() && !parent.IsRuined())
13283 {
13284 return true;
13285 }
13286
13287 return false;
13288 }
13289
13291 {
13292
13293
13294
13295
13296 return super.CanReceiveItemIntoCargo(item);
13297 }
13298
13300 {
13301
13302
13303
13304
13305 GameInventory attachmentInv = attachment.GetInventory();
13307 {
13308 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13309 return false;
13310 }
13311
13312 InventoryLocation loc = new InventoryLocation();
13313 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13314 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13315 return false;
13316
13317 return super.CanReceiveAttachment(attachment, slotId);
13318 }
13319
13321 {
13322 if (!super.CanReleaseAttachment(attachment))
13323 return false;
13324
13325 return GetInventory().AreChildrenAccessible();
13326 }
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
13341
13342
13343
13344
13345
13346
13347
13349 {
13350 int id = muzzle_owner.GetMuzzleID();
13351 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13352
13353 if (WPOF_array)
13354 {
13355 for (int i = 0; i < WPOF_array.Count(); i++)
13356 {
13357 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13358
13359 if (WPOF)
13360 {
13361 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13362 }
13363 }
13364 }
13365 }
13366
13367
13369 {
13370 int id = muzzle_owner.GetMuzzleID();
13372
13373 if (WPOBE_array)
13374 {
13375 for (int i = 0; i < WPOBE_array.Count(); i++)
13376 {
13377 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13378
13379 if (WPOBE)
13380 {
13381 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13382 }
13383 }
13384 }
13385 }
13386
13387
13389 {
13390 int id = muzzle_owner.GetMuzzleID();
13391 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13392
13393 if (WPOOH_array)
13394 {
13395 for (int i = 0; i < WPOOH_array.Count(); i++)
13396 {
13397 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13398
13399 if (WPOOH)
13400 {
13401 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13402 }
13403 }
13404 }
13405 }
13406
13407
13409 {
13410 int id = muzzle_owner.GetMuzzleID();
13411 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13412
13413 if (WPOOH_array)
13414 {
13415 for (int i = 0; i < WPOOH_array.Count(); i++)
13416 {
13417 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13418
13419 if (WPOOH)
13420 {
13421 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13422 }
13423 }
13424 }
13425 }
13426
13427
13429 {
13430 int id = muzzle_owner.GetMuzzleID();
13431 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13432
13433 if (WPOOH_array)
13434 {
13435 for (int i = 0; i < WPOOH_array.Count(); i++)
13436 {
13437 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13438
13439 if (WPOOH)
13440 {
13441 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13442 }
13443 }
13444 }
13445 }
13446
13447
13448
13450 {
13452 {
13453 return true;
13454 }
13455
13456 return false;
13457 }
13458
13460 {
13462 {
13463 return true;
13464 }
13465
13466 return false;
13467 }
13468
13470 {
13472 {
13473 return true;
13474 }
13475
13476 return false;
13477 }
13478
13480 {
13481 return false;
13482 }
13483
13486 {
13487 return UATimeSpent.DEFAULT_DEPLOY;
13488 }
13489
13490
13491
13492
13494 {
13496 SetSynchDirty();
13497 }
13498
13500 {
13502 }
13503
13504
13506 {
13507 return false;
13508 }
13509
13512 {
13513 string att_type = "None";
13514
13515 if (ConfigIsExisting("soundAttType"))
13516 {
13517 att_type = ConfigGetString("soundAttType");
13518 }
13519
13521 }
13522
13524 {
13526 }
13527
13528
13529
13530
13531
13537
13539 {
13542
13544 }
13545
13546
13548 {
13550 return;
13551
13553
13556
13559
13560 SoundParameters params = new SoundParameters();
13564 }
13565
13566
13568 {
13570 return;
13571
13573 SetSynchDirty();
13574
13577 }
13578
13579
13581 {
13583 return;
13584
13586 SetSynchDirty();
13587
13590 }
13591
13593 {
13595 }
13596
13598 {
13600 }
13601
13604 {
13605 if (!
GetGame().IsDedicatedServer())
13606 {
13607 if (ConfigIsExisting("attachSoundSet"))
13608 {
13609 string cfg_path = "";
13610 string soundset = "";
13611 string type_name =
GetType();
13612
13615 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13616 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13617
13618 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13619 {
13620 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13621 {
13622 if (cfg_slot_array[i] == slot_type)
13623 {
13624 soundset = cfg_soundset_array[i];
13625 break;
13626 }
13627 }
13628 }
13629
13630 if (soundset != "")
13631 {
13632 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13634 }
13635 }
13636 }
13637 }
13638
13640 {
13641
13642 }
13643
13644 void OnApply(PlayerBase player);
13645
13647 {
13648 return 1.0;
13649 };
13650
13652 {
13654 }
13655
13657 {
13659 }
13660
13662
13664 {
13665 SetDynamicPhysicsLifeTime(0.01);
13667 }
13668
13670 {
13671 array<string> zone_names = new array<string>;
13672 GetDamageZones(zone_names);
13673 for (int i = 0; i < zone_names.Count(); i++)
13674 {
13675 SetHealthMax(zone_names.Get(i),"Health");
13676 }
13677 SetHealthMax("","Health");
13678 }
13679
13682 {
13683 float global_health = GetHealth01("","Health");
13684 array<string> zones = new array<string>;
13685 GetDamageZones(zones);
13686
13687 for (int i = 0; i < zones.Count(); i++)
13688 {
13689 SetHealth01(zones.Get(i),"Health",global_health);
13690 }
13691 }
13692
13695 {
13696 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13697 }
13698
13700 {
13701 if (!hasRootAsPlayer)
13702 {
13703 if (refParentIB)
13704 {
13705
13706 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13707 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13708
13709 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13710 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13711
13714 }
13715 else
13716 {
13717
13720 }
13721 }
13722 }
13723
13725 {
13727 {
13728 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13729 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13730 {
13731 float heatPermCoef = 1.0;
13733 while (ent)
13734 {
13735 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13736 ent = ent.GetHierarchyParent();
13737 }
13738
13739 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13740 }
13741 }
13742 }
13743
13745 {
13746
13747 EntityAI parent = GetHierarchyParent();
13748 if (!parent)
13749 {
13750 hasParent = false;
13751 hasRootAsPlayer = false;
13752 }
13753 else
13754 {
13755 hasParent = true;
13756 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13757 refParentIB =
ItemBase.Cast(parent);
13758 }
13759 }
13760
13761 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13762 {
13763
13764 }
13765
13767 {
13768
13769 return false;
13770 }
13771
13773 {
13774
13775
13776 return false;
13777 }
13778
13780 {
13781
13782 return false;
13783 }
13784
13787 {
13788 return !GetIsFrozen() &&
IsOpen();
13789 }
13790
13792 {
13793 bool hasParent = false, hasRootAsPlayer = false;
13795
13796 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13797 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13798
13799 if (wwtu || foodDecay)
13800 {
13804
13805 if (processWetness || processTemperature || processDecay)
13806 {
13808
13809 if (processWetness)
13810 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13811
13812 if (processTemperature)
13814
13815 if (processDecay)
13816 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13817 }
13818 }
13819 }
13820
13823 {
13825 }
13826
13828 {
13831
13832 return super.GetTemperatureFreezeThreshold();
13833 }
13834
13836 {
13839
13840 return super.GetTemperatureThawThreshold();
13841 }
13842
13844 {
13847
13848 return super.GetItemOverheatThreshold();
13849 }
13850
13852 {
13854 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13855
13856 return super.GetTemperatureFreezeTime();
13857 }
13858
13860 {
13862 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13863
13864 return super.GetTemperatureThawTime();
13865 }
13866
13871
13873 {
13874 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13875 }
13876
13878 {
13879 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13880 }
13881
13884 {
13886 }
13887
13889 {
13891 }
13892
13894 {
13896 }
13897
13900 {
13901 return null;
13902 }
13903
13906 {
13907 return false;
13908 }
13909
13911 {
13913 {
13916 if (!trg)
13917 {
13919 explosive = this;
13920 }
13921
13922 explosive.PairRemote(trg);
13924
13925 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13926 trg.SetPersistentPairID(persistentID);
13927 explosive.SetPersistentPairID(persistentID);
13928
13929 return true;
13930 }
13931 return false;
13932 }
13933
13936 {
13937 float ret = 1.0;
13940 ret *= GetHealth01();
13941
13942 return ret;
13943 }
13944
13945 #ifdef DEVELOPER
13946 override void SetDebugItem()
13947 {
13948 super.SetDebugItem();
13949 _itemBase = this;
13950 }
13951
13953 {
13954 string text = super.GetDebugText();
13955
13957 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13958
13959 return text;
13960 }
13961 #endif
13962
13964 {
13965 return true;
13966 }
13967
13969
13971
13973 {
13976 }
13977
13978
13986
14002}
14003
14005{
14007 if (entity)
14008 {
14009 bool is_item = entity.IsInherited(
ItemBase);
14010 if (is_item && full_quantity)
14011 {
14014 }
14015 }
14016 else
14017 {
14019 return NULL;
14020 }
14021 return entity;
14022}
14023
14025{
14026 if (item)
14027 {
14028 if (health > 0)
14029 item.SetHealth("", "", health);
14030
14031 if (item.CanHaveTemperature())
14032 {
14034 if (item.CanFreeze())
14035 item.SetFrozen(false);
14036 }
14037
14038 if (item.HasEnergyManager())
14039 {
14040 if (quantity >= 0)
14041 {
14042 item.GetCompEM().SetEnergy0To1(quantity);
14043 }
14044 else
14045 {
14047 }
14048 }
14049 else if (item.IsMagazine())
14050 {
14051 Magazine mag = Magazine.Cast(item);
14052 if (quantity >= 0)
14053 {
14054 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14055 }
14056 else
14057 {
14059 }
14060
14061 }
14062 else
14063 {
14064 if (quantity >= 0)
14065 {
14066 item.SetQuantityNormalized(quantity, false);
14067 }
14068 else
14069 {
14071 }
14072
14073 }
14074 }
14075}
14076
14077#ifdef DEVELOPER
14079#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.