9058{
9060 {
9061 return true;
9062 }
9063};
9064
9065
9066
9068{
9072
9074
9077
9078
9079
9080
9081
9090
9096
9101
9106
9127 protected bool m_IsResultOfSplit
9128
9130
9135
9136
9137
9139
9143
9144
9145
9147
9150
9151
9152
9158
9159
9167
9170
9171
9173
9174
9176
9177
9182
9183
9188
9189
9191
9192
9194 {
9199
9200 if (!
GetGame().IsDedicatedServer())
9201 {
9203 {
9205
9207 {
9209 }
9210 }
9211
9214 }
9215
9216 m_OldLocation = null;
9217
9219 {
9221 }
9222
9223 if (ConfigIsExisting("headSelectionsToHide"))
9224 {
9227 }
9228
9230 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9231 {
9233 }
9234
9236
9237 m_IsResultOfSplit = false;
9238
9240 }
9241
9243 {
9244 super.InitItemVariables();
9245
9251 m_Count = ConfigGetInt(
"count");
9252
9255
9260
9263
9268
9280
9284
9285
9288 if (ConfigIsExisting("canBeSplit"))
9289 {
9292 }
9293
9295 if (ConfigIsExisting("itemBehaviour"))
9297
9298
9301 RegisterNetSyncVariableInt("m_VarLiquidType");
9302 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9303
9304 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9305 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9306 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9307
9308 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9309 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9310 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9311 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9312
9313 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9314 RegisterNetSyncVariableBool("m_IsTakeable");
9315 RegisterNetSyncVariableBool("m_IsHologram");
9316
9319 {
9322 }
9323
9325
9327 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9329
9330 }
9331
9333 {
9335 }
9336
9338 {
9341 {
9346 }
9347 }
9348
9349 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9350 {
9352 {
9355 }
9356
9358 }
9359
9361 {
9367 }
9368
9370
9372 {
9374
9375 if (!action)
9376 {
9377 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9378 return;
9379 }
9380
9382 if (!ai)
9383 {
9385 return;
9386 }
9387
9389 if (!action_array)
9390 {
9391 action_array = new array<ActionBase_Basic>;
9393 }
9394 if (LogManager.IsActionLogEnable())
9395 {
9396 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9397 }
9398
9399 if (action_array.Find(action) != -1)
9400 {
9401 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9402 }
9403 else
9404 {
9405 action_array.Insert(action);
9406 }
9407 }
9408
9410 {
9412 ActionBase action = player.GetActionManager().GetAction(actionName);
9415
9416 if (action_array)
9417 {
9418 action_array.RemoveItem(action);
9419 }
9420 }
9421
9422
9423
9425 {
9426 ActionOverrideData overrideData = new ActionOverrideData();
9430
9432 if (!actionMap)
9433 {
9436 }
9437
9438 actionMap.Insert(this.
Type(), overrideData);
9439
9440 }
9441
9443
9445
9446
9448 {
9451
9454
9455 string config_to_search = "CfgVehicles";
9456 string muzzle_owner_config;
9457
9459 {
9460 if (IsInherited(Weapon))
9461 config_to_search = "CfgWeapons";
9462
9463 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9464
9465 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9466
9468
9469 if (config_OnFire_subclass_count > 0)
9470 {
9471 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9472
9473 for (int i = 0; i < config_OnFire_subclass_count; i++)
9474 {
9475 string particle_class = "";
9477 string config_OnFire_entry = config_OnFire_class + particle_class;
9478 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9479 WPOF_array.Insert(WPOF);
9480 }
9481
9482
9484 }
9485 }
9486
9488 {
9489 config_to_search = "CfgWeapons";
9490 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9491
9492 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9493
9495
9496 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9497 {
9498 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9499
9500 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9501 {
9502 string particle_class2 = "";
9504 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9505 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9506 WPOBE_array.Insert(WPOBE);
9507 }
9508
9509
9511 }
9512 }
9513 }
9514
9515
9517 {
9520
9522 {
9523 string config_to_search = "CfgVehicles";
9524
9525 if (IsInherited(Weapon))
9526 config_to_search = "CfgWeapons";
9527
9528 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9529 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9530
9531 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9532 {
9533
9535
9537 {
9539 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9541 return;
9542 }
9543
9546
9547
9548
9550 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9551
9552 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9553 {
9554 string particle_class = "";
9556 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9558
9559 if (entry_type == CT_CLASS)
9560 {
9561 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9562 WPOOH_array.Insert(WPOF);
9563 }
9564 }
9565
9566
9568 }
9569 }
9570 }
9571
9573 {
9575 }
9576
9578 {
9580 {
9582
9585
9588
9589 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9590 }
9591 }
9592
9594 {
9596 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9597
9599 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9600
9602 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9603
9605 {
9607 }
9608 }
9609
9611 {
9613 }
9614
9616 {
9619 else
9621
9623 {
9626 }
9627 else
9628 {
9631
9634 }
9635
9637 }
9638
9640 {
9642 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9643 }
9644
9646 {
9648 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9650 }
9651
9653 {
9655 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9656 }
9657
9659 {
9662
9663 OverheatingParticle OP = new OverheatingParticle();
9668
9670 }
9671
9673 {
9676
9677 return -1;
9678 }
9679
9681 {
9683 {
9686
9687 for (int i = count; i > 0; --i)
9688 {
9689 int id = i - 1;
9692
9695
9696 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9697 {
9698 if (p)
9699 {
9702 }
9703 }
9704 }
9705 }
9706 }
9707
9709 {
9711 {
9713 {
9714 int id = i - 1;
9716
9717 if (OP)
9718 {
9720
9721 if (p)
9722 {
9724 }
9725
9726 delete OP;
9727 }
9728 }
9729
9732 }
9733 }
9734
9737 {
9738 return 0.0;
9739 }
9740
9741
9743 {
9744 return 250;
9745 }
9746
9748 {
9749 return 0;
9750 }
9751
9754 {
9756 return true;
9757
9758 return false;
9759 }
9760
9763 {
9766
9768 {
9770 }
9771 else
9772 {
9773
9775 }
9776
9778 }
9779
9786 {
9787 return -1;
9788 }
9789
9790
9791
9792
9794 {
9796 {
9798 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9799
9800 if (r_index >= 0)
9801 {
9802 InventoryLocation r_il = new InventoryLocation;
9803 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9804
9805 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9808 {
9809 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9810 }
9812 {
9813 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9814 }
9815
9816 }
9817
9818 player.GetHumanInventory().ClearUserReservedLocation(this);
9819 }
9820
9823 }
9824
9825
9826
9827
9829 {
9830 return ItemBase.m_DebugActionsMask;
9831 }
9832
9834 {
9835 return ItemBase.m_DebugActionsMask & mask;
9836 }
9837
9839 {
9840 ItemBase.m_DebugActionsMask = mask;
9841 }
9842
9844 {
9845 ItemBase.m_DebugActionsMask |= mask;
9846 }
9847
9849 {
9850 ItemBase.m_DebugActionsMask &= ~mask;
9851 }
9852
9854 {
9856 {
9858 }
9859 else
9860 {
9862 }
9863 }
9864
9865
9867 {
9868 if (GetEconomyProfile())
9869 {
9870 float q_max = GetEconomyProfile().GetQuantityMax();
9871 if (q_max > 0)
9872 {
9873 float q_min = GetEconomyProfile().GetQuantityMin();
9874 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9875
9877 {
9878 ComponentEnergyManager comp = GetCompEM();
9880 {
9882 }
9883 }
9885 {
9887
9888 }
9889
9890 }
9891 }
9892 }
9893
9896 {
9897 EntityAI parent = GetHierarchyParent();
9898
9899 if (parent)
9900 {
9901 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9902 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9903 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9904 }
9905 }
9906
9909 {
9910 EntityAI parent = GetHierarchyParent();
9911
9912 if (parent)
9913 {
9914 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9915 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9916 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9917 }
9918 }
9919
9921 {
9922
9923
9924
9925
9927
9929 {
9930 if (ScriptInputUserData.CanStoreInputUserData())
9931 {
9932 ScriptInputUserData ctx = new ScriptInputUserData;
9938 ctx.
Write(use_stack_max);
9941
9943 {
9944 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9945 }
9946 }
9947 }
9948 else if (!
GetGame().IsMultiplayer())
9949 {
9951 }
9952 }
9953
9955 {
9957 }
9958
9960 {
9962 }
9963
9965 {
9967 }
9968
9970 {
9971
9972 return false;
9973 }
9974
9976 {
9977 return false;
9978 }
9979
9983 {
9984 return false;
9985 }
9986
9988 {
9989 return "";
9990 }
9991
9993
9995 {
9996 return false;
9997 }
9998
10000 {
10001 return true;
10002 }
10003
10004
10005
10007 {
10008 return true;
10009 }
10010
10012 {
10013 return true;
10014 }
10015
10017 {
10018 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10020 }
10021
10023 {
10025 }
10026
10028 {
10030 if (!is_being_placed)
10032 SetSynchDirty();
10033 }
10034
10035
10037
10039 {
10041 }
10042
10044 {
10046 }
10047
10049 {
10050 return 1;
10051 }
10052
10054 {
10055 return false;
10056 }
10057
10059 {
10061 SetSynchDirty();
10062 }
10063
10064
10065
10066
10067
10068
10069
10070
10071
10072
10073
10074
10075
10076
10077
10078
10079
10080
10081
10082
10083
10084
10085
10086
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
10099 {
10100 super.OnMovedInsideCargo(container);
10101
10102 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10103 }
10104
10105 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10106 {
10107 super.EEItemLocationChanged(oldLoc,newLoc);
10108
10109 PlayerBase new_player = null;
10110 PlayerBase old_player = null;
10111
10112 if (newLoc.GetParent())
10113 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10114
10115 if (oldLoc.GetParent())
10116 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10117
10119 {
10120 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10121
10122 if (r_index >= 0)
10123 {
10124 InventoryLocation r_il = new InventoryLocation;
10125 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10126
10127 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10130 {
10131 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10132 }
10134 {
10135 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10136 }
10137
10138 }
10139 }
10140
10142 {
10143 if (new_player)
10144 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10145
10146 if (new_player == old_player)
10147 {
10148
10149 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10150 {
10152 {
10153 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10154 {
10155 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10156 }
10157 }
10158 else
10159 {
10160 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10161 }
10162 }
10163
10164 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10165 {
10166 int type = oldLoc.GetType();
10168 {
10169 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10170 }
10172 {
10173 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10174 }
10175 }
10176 if (!m_OldLocation)
10177 {
10178 m_OldLocation = new InventoryLocation;
10179 }
10180 m_OldLocation.Copy(oldLoc);
10181 }
10182 else
10183 {
10184 if (m_OldLocation)
10185 {
10186 m_OldLocation.Reset();
10187 }
10188 }
10189
10191 }
10192 else
10193 {
10194 if (new_player)
10195 {
10196 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10197 if (res_index >= 0)
10198 {
10199 InventoryLocation il = new InventoryLocation;
10200 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10202 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10205 {
10206 il.
GetParent().GetOnReleaseLock().Invoke(it);
10207 }
10209 {
10211 }
10212
10213 }
10214 }
10216 {
10217
10219 }
10220
10221 if (m_OldLocation)
10222 {
10223 m_OldLocation.Reset();
10224 }
10225 }
10226 }
10227
10228 override void EOnContact(IEntity other, Contact extra)
10229 {
10231 {
10232 int liquidType = -1;
10234 if (impactSpeed > 0.0)
10235 {
10237 #ifndef SERVER
10239 #else
10241 SetSynchDirty();
10242 #endif
10244 }
10245 }
10246
10247 #ifdef SERVER
10248 if (GetCompEM() && GetCompEM().IsPlugged())
10249 {
10250 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10251 GetCompEM().UnplugThis();
10252 }
10253 #endif
10254 }
10255
10257
10259 {
10261 }
10262
10264 {
10265
10266 }
10267
10269 {
10270 super.OnItemLocationChanged(old_owner, new_owner);
10271
10272 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10273 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10274
10275 if (!relatedPlayer && playerNew)
10276 relatedPlayer = playerNew;
10277
10278 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10279 {
10281 if (actionMgr)
10282 {
10283 ActionBase currentAction = actionMgr.GetRunningAction();
10284 if (currentAction)
10286 }
10287 }
10288
10289 Man ownerPlayerOld = null;
10290 Man ownerPlayerNew = null;
10291
10292 if (old_owner)
10293 {
10294 if (old_owner.
IsMan())
10295 {
10296 ownerPlayerOld = Man.Cast(old_owner);
10297 }
10298 else
10299 {
10300 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10301 }
10302 }
10303 else
10304 {
10306 {
10308
10309 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10310 {
10311 GetCompEM().UnplugThis();
10312 }
10313 }
10314 }
10315
10316 if (new_owner)
10317 {
10318 if (new_owner.
IsMan())
10319 {
10320 ownerPlayerNew = Man.Cast(new_owner);
10321 }
10322 else
10323 {
10324 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10325 }
10326 }
10327
10328 if (ownerPlayerOld != ownerPlayerNew)
10329 {
10330 if (ownerPlayerOld)
10331 {
10332 array<EntityAI> subItemsExit = new array<EntityAI>;
10334 for (int i = 0; i < subItemsExit.Count(); i++)
10335 {
10338 }
10339 }
10340
10341 if (ownerPlayerNew)
10342 {
10343 array<EntityAI> subItemsEnter = new array<EntityAI>;
10345 for (int j = 0; j < subItemsEnter.Count(); j++)
10346 {
10349 }
10350 }
10351 }
10352 else if (ownerPlayerNew != null)
10353 {
10354 PlayerBase nplayer;
10355 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10356 {
10357 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10359 for (int k = 0; k < subItemsUpdate.Count(); k++)
10360 {
10362 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10363 }
10364 }
10365 }
10366
10367 if (old_owner)
10368 old_owner.OnChildItemRemoved(this);
10369 if (new_owner)
10370 new_owner.OnChildItemReceived(this);
10371 }
10372
10373
10375 {
10376 super.EEDelete(parent);
10377 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10378 if (player)
10379 {
10381
10382 if (player.IsAlive())
10383 {
10384 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10385 if (r_index >= 0)
10386 {
10387 InventoryLocation r_il = new InventoryLocation;
10388 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10389
10390 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10393 {
10394 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10395 }
10397 {
10398 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10399 }
10400
10401 }
10402
10403 player.RemoveQuickBarEntityShortcut(this);
10404 }
10405 }
10406 }
10407
10409 {
10410 super.EEKilled(killer);
10411
10414 {
10415 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10416 {
10417 if (IsMagazine())
10418 {
10419 if (Magazine.Cast(this).GetAmmoCount() > 0)
10420 {
10422 }
10423 }
10424 else
10425 {
10427 }
10428 }
10429 }
10430 }
10431
10433 {
10434 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10435
10436 super.OnWasAttached(parent, slot_id);
10437
10440
10442 }
10443
10445 {
10446 super.OnWasDetached(parent, slot_id);
10447
10450 }
10451
10453 {
10454 int idx;
10457
10458 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10459 if (inventory_slots.Count() < 1)
10460 {
10461 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10462 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10463 }
10464 else
10465 {
10466 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10467 }
10468
10469 idx = inventory_slots.Find(slot);
10470 if (idx < 0)
10471 return "";
10472
10473 return attach_types.Get(idx);
10474 }
10475
10477 {
10478 int idx = -1;
10479 string slot;
10480
10483
10484 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10485 if (inventory_slots.Count() < 1)
10486 {
10487 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10488 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10489 }
10490 else
10491 {
10492 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10493 if (detach_types.Count() < 1)
10494 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10495 }
10496
10497 for (int i = 0; i < inventory_slots.Count(); i++)
10498 {
10499 slot = inventory_slots.Get(i);
10500 }
10501
10502 if (slot != "")
10503 {
10504 if (detach_types.Count() == 1)
10505 idx = 0;
10506 else
10507 idx = inventory_slots.Find(slot);
10508 }
10509 if (idx < 0)
10510 return "";
10511
10512 return detach_types.Get(idx);
10513 }
10514
10516 {
10517
10519
10520
10521 float min_time = 1;
10522 float max_time = 3;
10523 float delay = Math.RandomFloat(min_time, max_time);
10524
10525 explode_timer.Run(delay, this, "DoAmmoExplosion");
10526 }
10527
10529 {
10530 Magazine magazine = Magazine.Cast(this);
10531 int pop_sounds_count = 6;
10532 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10533
10534
10535 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10536 string sound_name = pop_sounds[ sound_idx ];
10538
10539
10540 magazine.ServerAddAmmoCount(-1);
10541
10542
10543 float min_temp_to_explode = 100;
10544
10545 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10546 {
10548 }
10549 }
10550
10551
10552 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10553 {
10554 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10555
10556 const int CHANCE_DAMAGE_CARGO = 4;
10557 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10558 const int CHANCE_DAMAGE_NOTHING = 2;
10559
10561 {
10562 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10563 int chances;
10564 int rnd;
10565
10566 if (GetInventory().GetCargo())
10567 {
10568 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10569 rnd = Math.RandomInt(0,chances);
10570
10571 if (rnd < CHANCE_DAMAGE_CARGO)
10572 {
10574 }
10575 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10576 {
10578 }
10579 }
10580 else
10581 {
10582 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10583 rnd = Math.RandomInt(0,chances);
10584
10585 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10586 {
10588 }
10589 }
10590 }
10591 }
10592
10594 {
10595 if (GetInventory().GetCargo())
10596 {
10597 int item_count = GetInventory().GetCargo().GetItemCount();
10598 if (item_count > 0)
10599 {
10600 int random_pick = Math.RandomInt(0, item_count);
10602 if (!item.IsExplosive())
10603 {
10604 item.AddHealth("","",damage);
10605 return true;
10606 }
10607 }
10608 }
10609 return false;
10610 }
10611
10613 {
10614 int attachment_count = GetInventory().AttachmentCount();
10615 if (attachment_count > 0)
10616 {
10617 int random_pick = Math.RandomInt(0, attachment_count);
10618 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10619 if (!attachment.IsExplosive())
10620 {
10621 attachment.AddHealth("","",damage);
10622 return true;
10623 }
10624 }
10625 return false;
10626 }
10627
10629 {
10631 }
10632
10634 {
10636 return GetInventory().CanRemoveEntity();
10637
10638 return false;
10639 }
10640
10642 {
10644 return;
10645
10647 {
10648 if (ScriptInputUserData.CanStoreInputUserData())
10649 {
10650 ScriptInputUserData ctx = new ScriptInputUserData;
10655 ctx.
Write(destination_entity);
10657 ctx.
Write(slot_id);
10659 }
10660 }
10661 else if (!
GetGame().IsMultiplayer())
10662 {
10664 }
10665 }
10666
10668 {
10670 return;
10671
10672 float split_quantity_new;
10676 InventoryLocation loc = new InventoryLocation;
10677
10678 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10679 {
10681 split_quantity_new = stack_max;
10682 else
10684
10685 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10686 if (new_item)
10687 {
10688 new_item.SetResultOfSplit(true);
10689 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10691 new_item.SetQuantity(split_quantity_new);
10692 }
10693 }
10694 else if (destination_entity && slot_id == -1)
10695 {
10696 if (quantity > stack_max)
10697 split_quantity_new = stack_max;
10698 else
10699 split_quantity_new = quantity;
10700
10702 {
10705 }
10706
10707 if (new_item)
10708 {
10709 new_item.SetResultOfSplit(true);
10710 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10712 new_item.SetQuantity(split_quantity_new);
10713 }
10714 }
10715 else
10716 {
10717 if (stack_max != 0)
10718 {
10720 {
10722 }
10723
10724 if (split_quantity_new == 0)
10725 {
10726 if (!
GetGame().IsMultiplayer())
10727 player.PhysicalPredictiveDropItem(this);
10728 else
10729 player.ServerDropEntity(this);
10730 return;
10731 }
10732
10734
10735 if (new_item)
10736 {
10737 new_item.SetResultOfSplit(true);
10738 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10740 new_item.SetQuantity(stack_max);
10741 new_item.PlaceOnSurface();
10742 }
10743 }
10744 }
10745 }
10746
10748 {
10750 return;
10751
10752 float split_quantity_new;
10756 InventoryLocation loc = new InventoryLocation;
10757
10758 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10759 {
10761 split_quantity_new = stack_max;
10762 else
10764
10765 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10766 if (new_item)
10767 {
10768 new_item.SetResultOfSplit(true);
10769 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10771 new_item.SetQuantity(split_quantity_new);
10772 }
10773 }
10774 else if (destination_entity && slot_id == -1)
10775 {
10776 if (quantity > stack_max)
10777 split_quantity_new = stack_max;
10778 else
10779 split_quantity_new = quantity;
10780
10782 {
10785 }
10786
10787 if (new_item)
10788 {
10789 new_item.SetResultOfSplit(true);
10790 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10792 new_item.SetQuantity(split_quantity_new);
10793 }
10794 }
10795 else
10796 {
10797 if (stack_max != 0)
10798 {
10800 {
10802 }
10803
10805
10806 if (new_item)
10807 {
10808 new_item.SetResultOfSplit(true);
10809 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10811 new_item.SetQuantity(stack_max);
10812 new_item.PlaceOnSurface();
10813 }
10814 }
10815 }
10816 }
10817
10819 {
10821 return;
10822
10824 {
10825 if (ScriptInputUserData.CanStoreInputUserData())
10826 {
10827 ScriptInputUserData ctx = new ScriptInputUserData;
10832 dst.WriteToContext(ctx);
10834 }
10835 }
10836 else if (!
GetGame().IsMultiplayer())
10837 {
10839 }
10840 }
10841
10843 {
10845 return;
10846
10848 {
10849 if (ScriptInputUserData.CanStoreInputUserData())
10850 {
10851 ScriptInputUserData ctx = new ScriptInputUserData;
10856 ctx.
Write(destination_entity);
10862 }
10863 }
10864 else if (!
GetGame().IsMultiplayer())
10865 {
10867 }
10868 }
10869
10871 {
10873 }
10874
10876 {
10878 return this;
10879
10881 float split_quantity_new;
10883 if (dst.IsValid())
10884 {
10885 int slot_id = dst.GetSlot();
10887
10888 if (quantity > stack_max)
10889 split_quantity_new = stack_max;
10890 else
10891 split_quantity_new = quantity;
10892
10894
10895 if (new_item)
10896 {
10897 new_item.SetResultOfSplit(true);
10898 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10901 }
10902
10903 return new_item;
10904 }
10905
10906 return null;
10907 }
10908
10910 {
10912 return;
10913
10915 float split_quantity_new;
10917 if (destination_entity)
10918 {
10920 if (quantity > stackable)
10921 split_quantity_new = stackable;
10922 else
10923 split_quantity_new = quantity;
10924
10925 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10926 if (new_item)
10927 {
10928 new_item.SetResultOfSplit(true);
10929 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10931 new_item.SetQuantity(split_quantity_new);
10932 }
10933 }
10934 }
10935
10937 {
10939 return;
10940
10942 {
10943 if (ScriptInputUserData.CanStoreInputUserData())
10944 {
10945 ScriptInputUserData ctx = new ScriptInputUserData;
10950 ItemBase destination_entity =
this;
10951 ctx.
Write(destination_entity);
10955 }
10956 }
10957 else if (!
GetGame().IsMultiplayer())
10958 {
10960 }
10961 }
10962
10964 {
10966 return;
10967
10969 float split_quantity_new;
10971 if (player)
10972 {
10974 if (quantity > stackable)
10975 split_quantity_new = stackable;
10976 else
10977 split_quantity_new = quantity;
10978
10979 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10980 new_item =
ItemBase.Cast(in_hands);
10981 if (new_item)
10982 {
10983 new_item.SetResultOfSplit(true);
10984 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10986 new_item.SetQuantity(split_quantity_new);
10987 }
10988 }
10989 }
10990
10992 {
10994 return;
10995
10997 float split_quantity_new = Math.Floor(quantity * 0.5);
10998
11000
11001 if (new_item)
11002 {
11003 if (new_item.GetQuantityMax() < split_quantity_new)
11004 {
11005 split_quantity_new = new_item.GetQuantityMax();
11006 }
11007
11008 new_item.SetResultOfSplit(true);
11009 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11010
11012 {
11015 }
11016 else
11017 {
11020 }
11021 }
11022 }
11023
11025 {
11027 return;
11028
11030 float split_quantity_new = Math.Floor(quantity / 2);
11031
11032 InventoryLocation invloc = new InventoryLocation;
11034
11036 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11037
11038 if (new_item)
11039 {
11040 if (new_item.GetQuantityMax() < split_quantity_new)
11041 {
11042 split_quantity_new = new_item.GetQuantityMax();
11043 }
11045 {
11048 }
11049 else
11050 {
11053 }
11054 }
11055 }
11056
11059 {
11060 SetWeightDirty();
11062
11063 if (parent)
11064 parent.OnAttachmentQuantityChangedEx(this, delta);
11065
11067 {
11069 {
11071 }
11073 {
11074 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11076 }
11077 }
11078
11079 }
11080
11083 {
11084
11085 }
11086
11089 {
11091 }
11092
11094 {
11095 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11096
11098 {
11099 if (newLevel == GameConstants.STATE_RUINED)
11100 {
11102 EntityAI parent = GetHierarchyParent();
11103 if (parent && parent.IsFireplace())
11104 {
11105 CargoBase cargo = GetInventory().GetCargo();
11106 if (cargo)
11107 {
11109 {
11111 }
11112 }
11113 }
11114 }
11115
11117 {
11118
11120 return;
11121 }
11122
11123 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11124 {
11126 }
11127 }
11128 }
11129
11130
11132 {
11133 super.OnRightClick();
11134
11136 {
11138 {
11139 if (ScriptInputUserData.CanStoreInputUserData())
11140 {
11141 vector m4[4];
11143
11144 EntityAI root = GetHierarchyRoot();
11145
11146 InventoryLocation dst = new InventoryLocation;
11148 {
11149 if (root)
11150 {
11151 root.GetTransform(m4);
11153 }
11154 else
11155 GetInventory().GetCurrentInventoryLocation(dst);
11156 }
11157 else
11158 {
11160
11161
11162 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11163 {
11164 if (root)
11165 {
11166 root.GetTransform(m4);
11168 }
11169 else
11170 GetInventory().GetCurrentInventoryLocation(dst);
11171 }
11172 else
11173 {
11174 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11175 }
11176 }
11177
11178 ScriptInputUserData ctx = new ScriptInputUserData;
11186 }
11187 }
11188 else if (!
GetGame().IsMultiplayer())
11189 {
11191 }
11192 }
11193 }
11194
11195 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11196 {
11197
11198 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11199 return false;
11200
11201 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11202 return false;
11203
11204
11206 return false;
11207
11208
11209 Magazine mag = Magazine.Cast(this);
11210 if (mag)
11211 {
11212 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11213 return false;
11214
11215 if (stack_max_limit)
11216 {
11217 Magazine other_mag = Magazine.Cast(other_item);
11218 if (other_item)
11219 {
11220 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11221 return false;
11222 }
11223
11224 }
11225 }
11226 else
11227 {
11228
11230 return false;
11231
11233 return false;
11234 }
11235
11236 PlayerBase player = null;
11237 if (CastTo(player, GetHierarchyRootPlayer()))
11238 {
11239 if (player.GetInventory().HasAttachment(this))
11240 return false;
11241
11242 if (player.IsItemsToDelete())
11243 return false;
11244 }
11245
11246 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11247 return false;
11248
11249 int slotID;
11251 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11252 return false;
11253
11254 return true;
11255 }
11256
11258 {
11260 }
11261
11263 {
11264 return m_IsResultOfSplit;
11265 }
11266
11268 {
11269 m_IsResultOfSplit = value;
11270 }
11271
11273 {
11275 }
11276
11278 {
11279 float other_item_quantity = other_item.GetQuantity();
11280 float this_free_space;
11281
11283
11285
11286 if (other_item_quantity > this_free_space)
11287 {
11288 return this_free_space;
11289 }
11290 else
11291 {
11292 return other_item_quantity;
11293 }
11294 }
11295
11297 {
11299 }
11300
11302 {
11304 return;
11305
11306 if (!IsMagazine() && other_item)
11307 {
11309 if (quantity_used != 0)
11310 {
11311 float hp1 = GetHealth01("","");
11312 float hp2 = other_item.GetHealth01("","");
11313 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11314 hpResult = hpResult / (
GetQuantity() + quantity_used);
11315
11316 hpResult *= GetMaxHealth();
11317 Math.Round(hpResult);
11318 SetHealth("", "Health", hpResult);
11319
11321 other_item.AddQuantity(-quantity_used);
11322 }
11323 }
11325 }
11326
11328 {
11329 #ifdef SERVER
11330 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11331 GetHierarchyParent().IncreaseLifetimeUp();
11332 #endif
11333 };
11334
11336 {
11337 PlayerBase p = PlayerBase.Cast(player);
11338
11339 array<int> recipesIds = p.m_Recipes;
11340 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11341 if (moduleRecipesManager)
11342 {
11343 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11344 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11345 }
11346
11347 for (int i = 0;i < recipesIds.Count(); i++)
11348 {
11349 int key = recipesIds.Get(i);
11350 string recipeName = moduleRecipesManager.GetRecipeName(key);
11352 }
11353 }
11354
11355
11356 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11357 {
11358 super.GetDebugActions(outputList);
11359
11360
11365
11366
11370
11374
11375
11378
11379
11381 {
11384 }
11385
11387
11390
11394 }
11395
11396
11397
11398
11400 {
11401 super.OnAction(action_id, player, ctx);
11402 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11403 {
11404 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11405 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11406 PlayerBase p = PlayerBase.Cast(player);
11407 if (
EActions.RECIPES_RANGE_START < 1000)
11408 {
11409 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11410 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11411 }
11412 }
11413 #ifndef SERVER
11414 else if (action_id ==
EActions.WATCH_PLAYER)
11415 {
11416 PluginDeveloper.SetDeveloperItemClientEx(player);
11417 }
11418 #endif
11420 {
11421 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11422 {
11423 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11424 OnDebugButtonPressServer(id + 1);
11425 }
11426
11427 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11428 {
11429 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11431 }
11432
11433 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11434 {
11435 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11437 }
11438
11439 else if (action_id ==
EActions.ADD_QUANTITY)
11440 {
11441 if (IsMagazine())
11442 {
11443 Magazine mag = Magazine.Cast(this);
11444 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11445 }
11446 else
11447 {
11449 }
11450
11451 if (m_EM)
11452 {
11453 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11454 }
11455
11456 }
11457
11458 else if (action_id ==
EActions.REMOVE_QUANTITY)
11459 {
11460 if (IsMagazine())
11461 {
11462 Magazine mag2 = Magazine.Cast(this);
11463 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11464 }
11465 else
11466 {
11468 }
11469 if (m_EM)
11470 {
11471 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11472 }
11473
11474 }
11475
11476 else if (action_id ==
EActions.SET_QUANTITY_0)
11477 {
11479
11480 if (m_EM)
11481 {
11482 m_EM.SetEnergy(0);
11483 }
11484 }
11485
11486 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11487 {
11489
11490 if (m_EM)
11491 {
11492 m_EM.SetEnergy(m_EM.GetEnergyMax());
11493 }
11494 }
11495
11496 else if (action_id ==
EActions.ADD_HEALTH)
11497 {
11498 AddHealth("","",GetMaxHealth("","Health")/5);
11499 }
11500 else if (action_id ==
EActions.REMOVE_HEALTH)
11501 {
11502 AddHealth("","",-GetMaxHealth("","Health")/5);
11503 }
11504 else if (action_id ==
EActions.DESTROY_HEALTH)
11505 {
11506 SetHealth01("","",0);
11507 }
11508 else if (action_id ==
EActions.WATCH_ITEM)
11509 {
11511 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11512 #ifdef DEVELOPER
11513 SetDebugDeveloper_item(this);
11514 #endif
11515 }
11516
11517 else if (action_id ==
EActions.ADD_TEMPERATURE)
11518 {
11519 AddTemperature(20);
11520
11521 }
11522
11523 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11524 {
11525 AddTemperature(-20);
11526
11527 }
11528
11529 else if (action_id ==
EActions.FLIP_FROZEN)
11530 {
11531 SetFrozen(!GetIsFrozen());
11532
11533 }
11534
11535 else if (action_id ==
EActions.ADD_WETNESS)
11536 {
11538
11539 }
11540
11541 else if (action_id ==
EActions.REMOVE_WETNESS)
11542 {
11544
11545 }
11546
11547 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11548 {
11551
11552
11553 }
11554
11555 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11556 {
11559 }
11560
11561 else if (action_id ==
EActions.MAKE_SPECIAL)
11562 {
11563 auto debugParams = DebugSpawnParams.WithPlayer(player);
11564 OnDebugSpawnEx(debugParams);
11565 }
11566
11567 else if (action_id ==
EActions.DELETE)
11568 {
11569 Delete();
11570 }
11571
11572 }
11573
11574
11575 return false;
11576 }
11577
11578
11579
11580
11584
11587
11588
11589
11591 {
11592 return false;
11593 }
11594
11595
11597 {
11598 return true;
11599 }
11600
11601
11603 {
11604 return true;
11605 }
11606
11607
11608
11610 {
11611 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11613 }
11614
11617 {
11618 return null;
11619 }
11620
11622 {
11623 return false;
11624 }
11625
11627 {
11628 return false;
11629 }
11630
11634
11635
11637 {
11638 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11639 return module_repairing.CanRepair(this, item_repair_kit);
11640 }
11641
11642
11643 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11644 {
11645 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11646 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11647 }
11648
11649
11651 {
11652
11653
11654
11655
11656
11657
11658
11659
11660 return 1;
11661 }
11662
11663
11664
11666 {
11668 }
11669
11670
11671
11673 {
11675 }
11676
11677
11686 {
11687 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11688
11689 if (player)
11690 {
11691 player.MessageStatus(text);
11692 }
11693 }
11694
11695
11704 {
11705 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11706
11707 if (player)
11708 {
11709 player.MessageAction(text);
11710 }
11711 }
11712
11713
11722 {
11723 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11724
11725 if (player)
11726 {
11727 player.MessageFriendly(text);
11728 }
11729 }
11730
11731
11740 {
11741 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11742
11743 if (player)
11744 {
11745 player.MessageImportant(text);
11746 }
11747 }
11748
11750 {
11751 return true;
11752 }
11753
11754
11755 override bool KindOf(
string tag)
11756 {
11757 bool found = false;
11758 string item_name = this.
GetType();
11761
11762 int array_size = item_tag_array.Count();
11763 for (int i = 0; i < array_size; i++)
11764 {
11765 if (item_tag_array.Get(i) == tag)
11766 {
11767 found = true;
11768 break;
11769 }
11770 }
11771 return found;
11772 }
11773
11774
11776 {
11777
11778 super.OnRPC(sender, rpc_type,ctx);
11779
11780
11781 switch (rpc_type)
11782 {
11783 #ifndef SERVER
11784 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11785 Param2<bool, string> p = new Param2<bool, string>(false, "");
11786
11788 return;
11789
11790 bool play = p.param1;
11791 string soundSet = p.param2;
11792
11793 if (play)
11794 {
11796 {
11798 {
11800 }
11801 }
11802 else
11803 {
11805 }
11806 }
11807 else
11808 {
11810 }
11811
11812 break;
11813 #endif
11814
11815 }
11816
11818 {
11820 }
11821 }
11822
11823
11824
11825
11827 {
11828 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11829 return plugin.GetID(
name);
11830 }
11831
11833 {
11834 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11835 return plugin.GetName(id);
11836 }
11837
11840 {
11841
11842
11843 int varFlags;
11844 if (!ctx.
Read(varFlags))
11845 return;
11846
11847 if (varFlags & ItemVariableFlags.FLOAT)
11848 {
11850 }
11851 }
11852
11854 {
11855
11856 super.SerializeNumericalVars(floats_out);
11857
11858
11859
11861 {
11863 }
11864
11866 {
11868 }
11869
11871 {
11873 }
11874
11876 {
11881 }
11882
11884 {
11886 }
11887 }
11888
11890 {
11891
11892 super.DeSerializeNumericalVars(floats);
11893
11894
11895 int index = 0;
11896 int mask = Math.Round(floats.Get(index));
11897
11898 index++;
11899
11901 {
11903 {
11905 }
11906 else
11907 {
11908 float quantity = floats.Get(index);
11909 SetQuantity(quantity,
true,
false,
false,
false);
11910 }
11911 index++;
11912 }
11913
11915 {
11916 float wet = floats.Get(index);
11918 index++;
11919 }
11920
11922 {
11923 int liquidtype = Math.Round(floats.Get(index));
11925 index++;
11926 }
11927
11929 {
11931 index++;
11933 index++;
11935 index++;
11937 index++;
11938 }
11939
11941 {
11942 int cleanness = Math.Round(floats.Get(index));
11944 index++;
11945 }
11946 }
11947
11949 {
11950 super.WriteVarsToCTX(ctx);
11951
11952
11954 {
11956 }
11957
11959 {
11961 }
11962
11964 {
11966 }
11967
11969 {
11970 int r,g,b,a;
11976 }
11977
11979 {
11981 }
11982 }
11983
11985 {
11986 if (!super.ReadVarsFromCTX(ctx,version))
11987 return false;
11988
11989 int intValue;
11990 float value;
11991
11992 if (version < 140)
11993 {
11994 if (!ctx.
Read(intValue))
11995 return false;
11996
11997 m_VariablesMask = intValue;
11998 }
11999
12001 {
12002 if (!ctx.
Read(value))
12003 return false;
12004
12006 {
12008 }
12009 else
12010 {
12012 }
12013 }
12014
12015 if (version < 140)
12016 {
12018 {
12019 if (!ctx.
Read(value))
12020 return false;
12021 SetTemperatureDirect(value);
12022 }
12023 }
12024
12026 {
12027 if (!ctx.
Read(value))
12028 return false;
12030 }
12031
12033 {
12034 if (!ctx.
Read(intValue))
12035 return false;
12037 }
12038
12040 {
12041 int r,g,b,a;
12043 return false;
12045 return false;
12047 return false;
12049 return false;
12050
12052 }
12053
12055 {
12056 if (!ctx.
Read(intValue))
12057 return false;
12059 }
12060
12061 if (version >= 138 && version < 140)
12062 {
12064 {
12065 if (!ctx.
Read(intValue))
12066 return false;
12067 SetFrozen(intValue);
12068 }
12069 }
12070
12071 return true;
12072 }
12073
12074
12076 {
12079 {
12081 }
12082
12083 if (!super.OnStoreLoad(ctx, version))
12084 {
12086 return false;
12087 }
12088
12089 if (version >= 114)
12090 {
12091 bool hasQuickBarIndexSaved;
12092
12093 if (!ctx.
Read(hasQuickBarIndexSaved))
12094 {
12096 return false;
12097 }
12098
12099 if (hasQuickBarIndexSaved)
12100 {
12101 int itmQBIndex;
12102
12103
12104 if (!ctx.
Read(itmQBIndex))
12105 {
12107 return false;
12108 }
12109
12110 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12111 if (itmQBIndex != -1 && parentPlayer)
12112 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12113 }
12114 }
12115 else
12116 {
12117
12118 PlayerBase player;
12119 int itemQBIndex;
12120 if (version ==
int.
MAX)
12121 {
12122 if (!ctx.
Read(itemQBIndex))
12123 {
12125 return false;
12126 }
12127 }
12128 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12129 {
12130
12131 if (!ctx.
Read(itemQBIndex))
12132 {
12134 return false;
12135 }
12136 if (itemQBIndex != -1 && player)
12137 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12138 }
12139 }
12140
12141 if (version < 140)
12142 {
12143
12144 if (!LoadVariables(ctx, version))
12145 {
12147 return false;
12148 }
12149 }
12150
12151
12153 {
12155 return false;
12156 }
12157 if (version >= 132)
12158 {
12160 if (raib)
12161 {
12163 {
12165 return false;
12166 }
12167 }
12168 }
12169
12171 return true;
12172 }
12173
12174
12175
12177 {
12178 super.OnStoreSave(ctx);
12179
12180 PlayerBase player;
12181 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12182 {
12184
12185 int itemQBIndex = -1;
12186 itemQBIndex = player.FindQuickBarEntityIndex(this);
12187 ctx.
Write(itemQBIndex);
12188 }
12189 else
12190 {
12192 }
12193
12195
12197 if (raib)
12198 {
12200 }
12201 }
12202
12203
12205 {
12206 super.AfterStoreLoad();
12207
12209 {
12211 }
12212
12214 {
12217 }
12218 }
12219
12221 {
12222 super.EEOnAfterLoad();
12223
12225 {
12227 }
12228
12231 }
12232
12234 {
12235 return false;
12236 }
12237
12238
12239
12241 {
12243 {
12244 #ifdef PLATFORM_CONSOLE
12245
12247 {
12249 if (menu)
12250 {
12252 }
12253 }
12254 #endif
12255 }
12256
12258 {
12261 }
12262
12264 {
12265 SetWeightDirty();
12267 }
12269 {
12272 }
12273
12275 {
12278 }
12280 {
12283 }
12284
12285 super.OnVariablesSynchronized();
12286 }
12287
12288
12289
12291 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12292 {
12293 if (!IsServerCheck(allow_client))
12294 return false;
12295
12297 return false;
12298
12301
12302 if (value <= (min + 0.001))
12303 value = min;
12304
12305 if (value == min)
12306 {
12307 if (destroy_config)
12308 {
12309 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12310 if (dstr)
12311 {
12313 this.Delete();
12314 return true;
12315 }
12316 }
12317 else if (destroy_forced)
12318 {
12320 this.Delete();
12321 return true;
12322 }
12323
12325 }
12326
12329
12331 {
12333
12334 if (delta)
12336 }
12337
12339
12340 return false;
12341 }
12342
12343
12345 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12346 {
12348 }
12349
12351 {
12354 }
12355
12357 {
12360 }
12361
12364 {
12365 float value_clamped = Math.Clamp(value, 0, 1);
12367 SetQuantity(result, destroy_config, destroy_forced);
12368 }
12369
12370
12373 {
12375 }
12376
12378 {
12380 }
12381
12382
12383
12384
12385
12386
12387
12388
12389
12390
12392 {
12393 int slot = -1;
12394 if (GetInventory())
12395 {
12396 InventoryLocation il = new InventoryLocation;
12397 GetInventory().GetCurrentInventoryLocation(il);
12399 }
12400
12402 }
12403
12405 {
12406 float quantity_max = 0;
12407
12409 {
12410 if (attSlotID != -1)
12411 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12412
12413 if (quantity_max <= 0)
12415 }
12416
12417 if (quantity_max <= 0)
12419
12420 return quantity_max;
12421 }
12422
12424 {
12426 }
12427
12429 {
12431 }
12432
12433
12435 {
12437 }
12438
12440 {
12442 }
12443
12445 {
12447 }
12448
12449
12451 {
12452
12453 float weightEx = GetWeightEx();
12454 float special = GetInventoryAndCargoWeight();
12455 return weightEx - special;
12456 }
12457
12458
12460 {
12462 }
12463
12465 {
12467 {
12468 #ifdef DEVELOPER
12469 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12470 {
12471 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12473 }
12474 #endif
12475
12476 return GetQuantity() * GetConfigWeightModified();
12477 }
12478 else if (HasEnergyManager())
12479 {
12480 #ifdef DEVELOPER
12481 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12482 {
12483 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12484 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12485 }
12486 #endif
12487 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12488 }
12489 else
12490 {
12491 #ifdef DEVELOPER
12492 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12493 {
12494 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12495 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12496 }
12497 #endif
12498 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12499 }
12500 }
12501
12504 {
12505 int item_count = 0;
12507
12508 if (GetInventory().GetCargo() != NULL)
12509 {
12510 item_count = GetInventory().GetCargo().GetItemCount();
12511 }
12512
12513 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12514 {
12515 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12516 if (item)
12517 item_count += item.GetNumberOfItems();
12518 }
12519 return item_count;
12520 }
12521
12524 {
12525 float weight = 0;
12526 float wetness = 1;
12527 if (include_wetness)
12530 {
12531 weight = wetness * m_ConfigWeight;
12532 }
12534 {
12535 weight = 1;
12536 }
12537 return weight;
12538 }
12539
12540
12541
12543 {
12544 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12545 {
12546 GameInventory inv = GetInventory();
12547 array<EntityAI> items = new array<EntityAI>;
12549 for (int i = 0; i < items.Count(); i++)
12550 {
12552 if (item)
12553 {
12555 }
12556 }
12557 }
12558 }
12559
12560
12561
12562
12564 {
12565 float energy = 0;
12566 if (HasEnergyManager())
12567 {
12568 energy = GetCompEM().GetEnergy();
12569 }
12570 return energy;
12571 }
12572
12573
12575 {
12576 super.OnEnergyConsumed();
12577
12579 }
12580
12582 {
12583 super.OnEnergyAdded();
12584
12586 }
12587
12588
12590 {
12591 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12592 {
12594 {
12595 float energy_0to1 = GetCompEM().GetEnergy0To1();
12597 }
12598 }
12599 }
12600
12601
12603 {
12604 return ConfigGetFloat("heatIsolation");
12605 }
12606
12608 {
12610 }
12611
12613 {
12614 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12615 if (
GetGame().ConfigIsExisting(paramPath))
12617
12618 return 0.0;
12619 }
12620
12622 {
12623 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12624 if (
GetGame().ConfigIsExisting(paramPath))
12626
12627 return 0.0;
12628 }
12629
12630 override void SetWet(
float value,
bool allow_client =
false)
12631 {
12632 if (!IsServerCheck(allow_client))
12633 return;
12634
12637
12639
12640 m_VarWet = Math.Clamp(value, min, max);
12641
12643 {
12646 }
12647 }
12648
12649 override void AddWet(
float value)
12650 {
12652 }
12653
12655 {
12657 }
12658
12660 {
12662 }
12663
12665 {
12667 }
12668
12670 {
12672 }
12673
12675 {
12677 }
12678
12679 override void OnWetChanged(
float newVal,
float oldVal)
12680 {
12683 if (newLevel != oldLevel)
12684 {
12686 }
12687 }
12688
12690 {
12691 SetWeightDirty();
12692 }
12693
12695 {
12696 return GetWetLevelInternal(
m_VarWet);
12697 }
12698
12699
12700
12702 {
12704 }
12705
12707 {
12709 }
12710
12712 {
12714 }
12715
12717 {
12719 }
12720
12721
12722
12724 {
12725 if (ConfigIsExisting("itemModelLength"))
12726 {
12727 return ConfigGetFloat("itemModelLength");
12728 }
12729 return 0;
12730 }
12731
12733 {
12734 if (ConfigIsExisting("itemAttachOffset"))
12735 {
12736 return ConfigGetFloat("itemAttachOffset");
12737 }
12738 return 0;
12739 }
12740
12741 override void SetCleanness(
int value,
bool allow_client =
false)
12742 {
12743 if (!IsServerCheck(allow_client))
12744 return;
12745
12747
12749
12752 }
12753
12755 {
12757 }
12758
12760 {
12761 return true;
12762 }
12763
12764
12765
12766
12768 {
12770 }
12771
12773 {
12775 }
12776
12777
12778
12779
12780 override void SetColor(
int r,
int g,
int b,
int a)
12781 {
12787 }
12789 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12790 {
12795 }
12796
12798 {
12800 }
12801
12804 {
12805 int r,g,b,a;
12807 r = r/255;
12808 g = g/255;
12809 b = b/255;
12810 a = a/255;
12811 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12812 }
12813
12814
12815
12816 override void SetLiquidType(
int value,
bool allow_client =
false)
12817 {
12818 if (!IsServerCheck(allow_client))
12819 return;
12820
12825 }
12826
12828 {
12829 return ConfigGetInt("varLiquidTypeInit");
12830 }
12831
12833 {
12835 }
12836
12838 {
12840 SetFrozen(false);
12841 }
12842
12845 {
12846 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12847 }
12848
12849
12852 {
12853 PlayerBase nplayer;
12854 if (PlayerBase.CastTo(nplayer, player))
12855 {
12857
12858 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12859 }
12860 }
12861
12862
12865 {
12866 PlayerBase nplayer;
12867 if (PlayerBase.CastTo(nplayer,player))
12868 {
12869
12870 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12871
12872 }
12873
12874
12875 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12876
12877
12878 if (HasEnergyManager())
12879 {
12880 GetCompEM().UpdatePlugState();
12881 }
12882 }
12883
12884
12886 {
12887 super.OnPlacementStarted(player);
12888
12890 }
12891
12892 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12893 {
12895 {
12896 m_AdminLog.OnPlacementComplete(player,
this);
12897 }
12898
12899 super.OnPlacementComplete(player, position, orientation);
12900 }
12901
12902
12903
12904
12905
12907 {
12909 {
12910 return true;
12911 }
12912 else
12913 {
12914 return false;
12915 }
12916 }
12917
12918
12920 {
12922 {
12924 }
12925 }
12926
12927
12929 {
12931 }
12932
12934 {
12936 }
12937
12938 override void InsertAgent(
int agent,
float count = 1)
12939 {
12940 if (count < 1)
12941 return;
12942
12944 }
12945
12948 {
12950 }
12951
12952
12954 {
12956 }
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12969
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
13000 {
13002 return false;
13003 return true;
13004 }
13005
13007 {
13008
13010 }
13011
13012
13015 {
13016 super.CheckForRoofLimited(timeTresholdMS);
13017
13019 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13020 {
13021 m_PreviousRoofTestTime = time;
13022 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13023 }
13024 }
13025
13026
13028 {
13030 {
13031 return 0;
13032 }
13033
13034 if (GetInventory().GetAttachmentSlotsCount() != 0)
13035 {
13036 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13037 if (filter)
13038 return filter.GetProtectionLevel(type, false, system);
13039 else
13040 return 0;
13041 }
13042
13043 string subclassPath, entryName;
13044
13045 switch (type)
13046 {
13048 entryName = "biological";
13049 break;
13051 entryName = "chemical";
13052 break;
13053 default:
13054 entryName = "biological";
13055 break;
13056 }
13057
13058 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13059
13061 }
13062
13063
13064
13067 {
13068 if (!IsMagazine())
13070
13072 }
13073
13074
13075
13076
13077
13082 {
13083 return true;
13084 }
13085
13087 {
13089 }
13090
13091
13092
13093
13094
13096 {
13097 if (parent)
13098 {
13099 if (parent.IsInherited(DayZInfected))
13100 return true;
13101
13102 if (!parent.IsRuined())
13103 return true;
13104 }
13105
13106 return true;
13107 }
13108
13110 {
13111 if (!super.CanPutAsAttachment(parent))
13112 {
13113 return false;
13114 }
13115
13116 if (!IsRuined() && !parent.IsRuined())
13117 {
13118 return true;
13119 }
13120
13121 return false;
13122 }
13123
13125 {
13126
13127
13128
13129
13130 return super.CanReceiveItemIntoCargo(item);
13131 }
13132
13134 {
13135
13136
13137
13138
13139 GameInventory attachmentInv = attachment.GetInventory();
13141 {
13142 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13143 return false;
13144 }
13145
13146 InventoryLocation loc = new InventoryLocation();
13147 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13148 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13149 return false;
13150
13151 return super.CanReceiveAttachment(attachment, slotId);
13152 }
13153
13155 {
13156 if (!super.CanReleaseAttachment(attachment))
13157 return false;
13158
13159 return GetInventory().AreChildrenAccessible();
13160 }
13161
13162
13163
13164
13165
13166
13167
13168
13169
13170
13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13183 {
13184 int id = muzzle_owner.GetMuzzleID();
13185 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13186
13187 if (WPOF_array)
13188 {
13189 for (int i = 0; i < WPOF_array.Count(); i++)
13190 {
13191 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13192
13193 if (WPOF)
13194 {
13195 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13196 }
13197 }
13198 }
13199 }
13200
13201
13203 {
13204 int id = muzzle_owner.GetMuzzleID();
13206
13207 if (WPOBE_array)
13208 {
13209 for (int i = 0; i < WPOBE_array.Count(); i++)
13210 {
13211 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13212
13213 if (WPOBE)
13214 {
13215 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13216 }
13217 }
13218 }
13219 }
13220
13221
13223 {
13224 int id = muzzle_owner.GetMuzzleID();
13225 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13226
13227 if (WPOOH_array)
13228 {
13229 for (int i = 0; i < WPOOH_array.Count(); i++)
13230 {
13231 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13232
13233 if (WPOOH)
13234 {
13235 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13236 }
13237 }
13238 }
13239 }
13240
13241
13243 {
13244 int id = muzzle_owner.GetMuzzleID();
13245 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13246
13247 if (WPOOH_array)
13248 {
13249 for (int i = 0; i < WPOOH_array.Count(); i++)
13250 {
13251 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13252
13253 if (WPOOH)
13254 {
13255 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13256 }
13257 }
13258 }
13259 }
13260
13261
13263 {
13264 int id = muzzle_owner.GetMuzzleID();
13265 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13266
13267 if (WPOOH_array)
13268 {
13269 for (int i = 0; i < WPOOH_array.Count(); i++)
13270 {
13271 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13272
13273 if (WPOOH)
13274 {
13275 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13276 }
13277 }
13278 }
13279 }
13280
13281
13282
13284 {
13286 {
13287 return true;
13288 }
13289
13290 return false;
13291 }
13292
13294 {
13296 {
13297 return true;
13298 }
13299
13300 return false;
13301 }
13302
13304 {
13306 {
13307 return true;
13308 }
13309
13310 return false;
13311 }
13312
13314 {
13315 return false;
13316 }
13317
13320 {
13321 return UATimeSpent.DEFAULT_DEPLOY;
13322 }
13323
13324
13325
13326
13328 {
13330 SetSynchDirty();
13331 }
13332
13334 {
13336 }
13337
13338
13340 {
13341 return false;
13342 }
13343
13346 {
13347 string att_type = "None";
13348
13349 if (ConfigIsExisting("soundAttType"))
13350 {
13351 att_type = ConfigGetString("soundAttType");
13352 }
13353
13355 }
13356
13358 {
13360 }
13361
13362
13363
13364
13365
13369
13371 {
13374
13376 }
13377
13378
13380 {
13382 return;
13383
13385
13388
13391
13392 SoundParameters params = new SoundParameters();
13396 }
13397
13398
13400 {
13402 return;
13403
13405 SetSynchDirty();
13406
13409 }
13410
13411
13413 {
13415 return;
13416
13418 SetSynchDirty();
13419
13422 }
13423
13425 {
13427 }
13428
13430 {
13432 }
13433
13436 {
13437 if (!
GetGame().IsDedicatedServer())
13438 {
13439 if (ConfigIsExisting("attachSoundSet"))
13440 {
13441 string cfg_path = "";
13442 string soundset = "";
13443 string type_name =
GetType();
13444
13447 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13448 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13449
13450 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13451 {
13452 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13453 {
13454 if (cfg_slot_array[i] == slot_type)
13455 {
13456 soundset = cfg_soundset_array[i];
13457 break;
13458 }
13459 }
13460 }
13461
13462 if (soundset != "")
13463 {
13464 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13466 }
13467 }
13468 }
13469 }
13470
13472 {
13473
13474 }
13475
13476 void OnApply(PlayerBase player);
13477
13479 {
13480 return 1.0;
13481 };
13482
13484 {
13486 }
13487
13489 {
13491 }
13492
13494
13496 {
13497 SetDynamicPhysicsLifeTime(0.01);
13499 }
13500
13502 {
13503 array<string> zone_names = new array<string>;
13504 GetDamageZones(zone_names);
13505 for (int i = 0; i < zone_names.Count(); i++)
13506 {
13507 SetHealthMax(zone_names.Get(i),"Health");
13508 }
13509 SetHealthMax("","Health");
13510 }
13511
13514 {
13515 float global_health = GetHealth01("","Health");
13516 array<string> zones = new array<string>;
13517 GetDamageZones(zones);
13518
13519 for (int i = 0; i < zones.Count(); i++)
13520 {
13521 SetHealth01(zones.Get(i),"Health",global_health);
13522 }
13523 }
13524
13527 {
13528 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13529 }
13530
13532 {
13533 if (!hasRootAsPlayer)
13534 {
13535 if (refParentIB)
13536 {
13537
13538 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13539 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13540
13541 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13542 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13543
13546 }
13547 else
13548 {
13549
13552 }
13553 }
13554 }
13555
13557 {
13559 {
13560 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13561 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13562 {
13563 float heatPermCoef = 1.0;
13565 while (ent)
13566 {
13567 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13568 ent = ent.GetHierarchyParent();
13569 }
13570
13571 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13572 }
13573 }
13574 }
13575
13577 {
13578
13579 EntityAI parent = GetHierarchyParent();
13580 if (!parent)
13581 {
13582 hasParent = false;
13583 hasRootAsPlayer = false;
13584 }
13585 else
13586 {
13587 hasParent = true;
13588 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13589 refParentIB =
ItemBase.Cast(parent);
13590 }
13591 }
13592
13593 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13594 {
13595
13596 }
13597
13599 {
13600
13601 return false;
13602 }
13603
13605 {
13606
13607
13608 return false;
13609 }
13610
13612 {
13613
13614 return false;
13615 }
13616
13619 {
13620 return !GetIsFrozen() &&
IsOpen();
13621 }
13622
13624 {
13625 bool hasParent = false, hasRootAsPlayer = false;
13627
13628 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13629 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13630
13631 if (wwtu || foodDecay)
13632 {
13636
13637 if (processWetness || processTemperature || processDecay)
13638 {
13640
13641 if (processWetness)
13642 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13643
13644 if (processTemperature)
13646
13647 if (processDecay)
13648 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13649 }
13650 }
13651 }
13652
13655 {
13657 }
13658
13660 {
13663
13664 return super.GetTemperatureFreezeThreshold();
13665 }
13666
13668 {
13671
13672 return super.GetTemperatureThawThreshold();
13673 }
13674
13676 {
13679
13680 return super.GetItemOverheatThreshold();
13681 }
13682
13684 {
13686 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13687
13688 return super.GetTemperatureFreezeTime();
13689 }
13690
13692 {
13694 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13695
13696 return super.GetTemperatureThawTime();
13697 }
13698
13703
13705 {
13706 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13707 }
13708
13710 {
13711 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13712 }
13713
13716 {
13718 }
13719
13721 {
13723 }
13724
13726 {
13728 }
13729
13732 {
13733 return null;
13734 }
13735
13738 {
13739 return false;
13740 }
13741
13743 {
13745 {
13748 if (!trg)
13749 {
13751 explosive = this;
13752 }
13753
13754 explosive.PairRemote(trg);
13756
13757 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13758 trg.SetPersistentPairID(persistentID);
13759 explosive.SetPersistentPairID(persistentID);
13760
13761 return true;
13762 }
13763 return false;
13764 }
13765
13768 {
13769 float ret = 1.0;
13772 ret *= GetHealth01();
13773
13774 return ret;
13775 }
13776
13777 #ifdef DEVELOPER
13778 override void SetDebugItem()
13779 {
13780 super.SetDebugItem();
13781 _itemBase = this;
13782 }
13783
13785 {
13786 string text = super.GetDebugText();
13787
13789 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13790
13791 return text;
13792 }
13793 #endif
13794
13796 {
13797 return true;
13798 }
13799
13801
13803
13805 {
13808 }
13809
13810
13818
13834}
13835
13837{
13839 if (entity)
13840 {
13841 bool is_item = entity.IsInherited(
ItemBase);
13842 if (is_item && full_quantity)
13843 {
13846 }
13847 }
13848 else
13849 {
13851 return NULL;
13852 }
13853 return entity;
13854}
13855
13857{
13858 if (item)
13859 {
13860 if (health > 0)
13861 item.SetHealth("", "", health);
13862
13863 if (item.CanHaveTemperature())
13864 {
13866 if (item.CanFreeze())
13867 item.SetFrozen(false);
13868 }
13869
13870 if (item.HasEnergyManager())
13871 {
13872 if (quantity >= 0)
13873 {
13874 item.GetCompEM().SetEnergy0To1(quantity);
13875 }
13876 else
13877 {
13879 }
13880 }
13881 else if (item.IsMagazine())
13882 {
13883 Magazine mag = Magazine.Cast(item);
13884 if (quantity >= 0)
13885 {
13886 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13887 }
13888 else
13889 {
13891 }
13892
13893 }
13894 else
13895 {
13896 if (quantity >= 0)
13897 {
13898 item.SetQuantityNormalized(quantity, false);
13899 }
13900 else
13901 {
13903 }
13904
13905 }
13906 }
13907}
13908
13909#ifdef DEVELOPER
13911#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
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 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...
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)
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)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
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 EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
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 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 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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
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 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 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.