9131{
9133 {
9134 return true;
9135 }
9136};
9137
9138
9139
9141{
9145
9147
9150
9151
9152
9153
9154
9163
9169
9174
9179
9200 protected bool m_IsResultOfSplit
9201
9203
9208
9209
9210
9212
9216
9217
9218
9220
9223
9224
9225
9231
9232
9240
9243
9244
9246
9247
9249
9250
9255
9256
9261
9262
9264
9265
9267 {
9272
9273 if (!
GetGame().IsDedicatedServer())
9274 {
9276 {
9278
9280 {
9282 }
9283 }
9284
9287 }
9288
9289 m_OldLocation = null;
9290
9292 {
9294 }
9295
9296 if (ConfigIsExisting("headSelectionsToHide"))
9297 {
9300 }
9301
9303 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9304 {
9306 }
9307
9309
9310 m_IsResultOfSplit = false;
9311
9313 }
9314
9316 {
9317 super.InitItemVariables();
9318
9324 m_Count = ConfigGetInt(
"count");
9325
9328
9333
9336
9341
9353
9357
9358
9361 if (ConfigIsExisting("canBeSplit"))
9362 {
9365 }
9366
9368 if (ConfigIsExisting("itemBehaviour"))
9370
9371
9374 RegisterNetSyncVariableInt("m_VarLiquidType");
9375 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9376
9377 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9378 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9379 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9380
9381 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9382 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9383 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9384 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9385
9386 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9387 RegisterNetSyncVariableBool("m_IsTakeable");
9388 RegisterNetSyncVariableBool("m_IsHologram");
9389
9392 {
9395 }
9396
9398
9400 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9402
9403 }
9404
9406 {
9408 }
9409
9411 {
9414 {
9419 }
9420 }
9421
9422 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9423 {
9425 {
9428 }
9429
9431 }
9432
9434 {
9440 }
9441
9443
9445 {
9447
9448 if (!action)
9449 {
9450 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9451 return;
9452 }
9453
9455 if (!ai)
9456 {
9458 return;
9459 }
9460
9462 if (!action_array)
9463 {
9464 action_array = new array<ActionBase_Basic>;
9466 }
9467 if (LogManager.IsActionLogEnable())
9468 {
9469 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9470 }
9471
9472 if (action_array.Find(action) != -1)
9473 {
9474 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9475 }
9476 else
9477 {
9478 action_array.Insert(action);
9479 }
9480 }
9481
9483 {
9485 ActionBase action = player.GetActionManager().GetAction(actionName);
9488
9489 if (action_array)
9490 {
9491 action_array.RemoveItem(action);
9492 }
9493 }
9494
9495
9496
9498 {
9499 ActionOverrideData overrideData = new ActionOverrideData();
9503
9505 if (!actionMap)
9506 {
9509 }
9510
9511 actionMap.Insert(this.
Type(), overrideData);
9512
9513 }
9514
9516
9518
9519
9521 {
9524
9527
9528 string config_to_search = "CfgVehicles";
9529 string muzzle_owner_config;
9530
9532 {
9533 if (IsInherited(Weapon))
9534 config_to_search = "CfgWeapons";
9535
9536 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9537
9538 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9539
9541
9542 if (config_OnFire_subclass_count > 0)
9543 {
9544 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9545
9546 for (int i = 0; i < config_OnFire_subclass_count; i++)
9547 {
9548 string particle_class = "";
9550 string config_OnFire_entry = config_OnFire_class + particle_class;
9551 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9552 WPOF_array.Insert(WPOF);
9553 }
9554
9555
9557 }
9558 }
9559
9561 {
9562 config_to_search = "CfgWeapons";
9563 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9564
9565 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9566
9568
9569 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9570 {
9571 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9572
9573 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9574 {
9575 string particle_class2 = "";
9577 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9578 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9579 WPOBE_array.Insert(WPOBE);
9580 }
9581
9582
9584 }
9585 }
9586 }
9587
9588
9590 {
9593
9595 {
9596 string config_to_search = "CfgVehicles";
9597
9598 if (IsInherited(Weapon))
9599 config_to_search = "CfgWeapons";
9600
9601 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9602 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9603
9604 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9605 {
9606
9608
9610 {
9612 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9614 return;
9615 }
9616
9619
9620
9621
9623 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9624
9625 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9626 {
9627 string particle_class = "";
9629 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9631
9632 if (entry_type == CT_CLASS)
9633 {
9634 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9635 WPOOH_array.Insert(WPOF);
9636 }
9637 }
9638
9639
9641 }
9642 }
9643 }
9644
9646 {
9648 }
9649
9651 {
9653 {
9655
9658
9661
9662 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9663 }
9664 }
9665
9667 {
9669 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9670
9672 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9673
9675 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9676
9678 {
9680 }
9681 }
9682
9684 {
9686 }
9687
9689 {
9692 else
9694
9696 {
9699 }
9700 else
9701 {
9704
9707 }
9708
9710 }
9711
9713 {
9715 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9716 }
9717
9719 {
9721 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9723 }
9724
9726 {
9728 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9729 }
9730
9732 {
9735
9736 OverheatingParticle OP = new OverheatingParticle();
9741
9743 }
9744
9746 {
9749
9750 return -1;
9751 }
9752
9754 {
9756 {
9759
9760 for (int i = count; i > 0; --i)
9761 {
9762 int id = i - 1;
9765
9768
9769 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9770 {
9771 if (p)
9772 {
9775 }
9776 }
9777 }
9778 }
9779 }
9780
9782 {
9784 {
9786 {
9787 int id = i - 1;
9789
9790 if (OP)
9791 {
9793
9794 if (p)
9795 {
9797 }
9798
9799 delete OP;
9800 }
9801 }
9802
9805 }
9806 }
9807
9810 {
9811 return 0.0;
9812 }
9813
9814
9816 {
9817 return 250;
9818 }
9819
9821 {
9822 return 0;
9823 }
9824
9827 {
9829 return true;
9830
9831 return false;
9832 }
9833
9836 {
9839
9841 {
9843 }
9844 else
9845 {
9846
9848 }
9849
9851 }
9852
9859 {
9860 return -1;
9861 }
9862
9863
9864
9865
9867 {
9869 {
9871 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9872
9873 if (r_index >= 0)
9874 {
9875 InventoryLocation r_il = new InventoryLocation;
9876 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9877
9878 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9881 {
9882 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9883 }
9885 {
9886 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9887 }
9888
9889 }
9890
9891 player.GetHumanInventory().ClearUserReservedLocation(this);
9892 }
9893
9896 }
9897
9898
9899
9900
9902 {
9903 return ItemBase.m_DebugActionsMask;
9904 }
9905
9907 {
9908 return ItemBase.m_DebugActionsMask & mask;
9909 }
9910
9912 {
9913 ItemBase.m_DebugActionsMask = mask;
9914 }
9915
9917 {
9918 ItemBase.m_DebugActionsMask |= mask;
9919 }
9920
9922 {
9923 ItemBase.m_DebugActionsMask &= ~mask;
9924 }
9925
9927 {
9929 {
9931 }
9932 else
9933 {
9935 }
9936 }
9937
9938
9940 {
9941 if (GetEconomyProfile())
9942 {
9943 float q_max = GetEconomyProfile().GetQuantityMax();
9944 if (q_max > 0)
9945 {
9946 float q_min = GetEconomyProfile().GetQuantityMin();
9947 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9948
9950 {
9951 ComponentEnergyManager comp = GetCompEM();
9953 {
9955 }
9956 }
9958 {
9960
9961 }
9962
9963 }
9964 }
9965 }
9966
9969 {
9970 EntityAI parent = GetHierarchyParent();
9971
9972 if (parent)
9973 {
9974 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9975 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9976 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9977 }
9978 }
9979
9982 {
9983 EntityAI parent = GetHierarchyParent();
9984
9985 if (parent)
9986 {
9987 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9988 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9989 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9990 }
9991 }
9992
9994 {
9995
9996
9997
9998
10000
10002 {
10003 if (ScriptInputUserData.CanStoreInputUserData())
10004 {
10005 ScriptInputUserData ctx = new ScriptInputUserData;
10011 ctx.
Write(use_stack_max);
10014
10016 {
10017 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10018 }
10019 }
10020 }
10021 else if (!
GetGame().IsMultiplayer())
10022 {
10024 }
10025 }
10026
10028 {
10030 }
10031
10033 {
10035 }
10036
10038 {
10040 }
10041
10043 {
10044
10045 return false;
10046 }
10047
10049 {
10050 return false;
10051 }
10052
10056 {
10057 return false;
10058 }
10059
10061 {
10062 return "";
10063 }
10064
10066
10068 {
10069 return false;
10070 }
10071
10073 {
10074 return true;
10075 }
10076
10077
10078
10080 {
10081 return true;
10082 }
10083
10085 {
10086 return true;
10087 }
10088
10090 {
10091 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10093 }
10094
10096 {
10098 }
10099
10101 {
10103 if (!is_being_placed)
10105 SetSynchDirty();
10106 }
10107
10108
10110
10112 {
10114 }
10115
10117 {
10119 }
10120
10122 {
10123 return 1;
10124 }
10125
10127 {
10128 return false;
10129 }
10130
10132 {
10134 SetSynchDirty();
10135 }
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10163
10164
10165
10166
10167
10168
10169
10170
10172 {
10173 super.OnMovedInsideCargo(container);
10174
10175 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10176 }
10177
10178 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10179 {
10180 super.EEItemLocationChanged(oldLoc,newLoc);
10181
10182 PlayerBase new_player = null;
10183 PlayerBase old_player = null;
10184
10185 if (newLoc.GetParent())
10186 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10187
10188 if (oldLoc.GetParent())
10189 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10190
10192 {
10193 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10194
10195 if (r_index >= 0)
10196 {
10197 InventoryLocation r_il = new InventoryLocation;
10198 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10199
10200 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10203 {
10204 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10205 }
10207 {
10208 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10209 }
10210
10211 }
10212 }
10213
10215 {
10216 if (new_player)
10217 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10218
10219 if (new_player == old_player)
10220 {
10221
10222 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10223 {
10225 {
10226 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10227 {
10228 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10229 }
10230 }
10231 else
10232 {
10233 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10234 }
10235 }
10236
10237 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10238 {
10239 int type = oldLoc.GetType();
10241 {
10242 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10243 }
10245 {
10246 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10247 }
10248 }
10249 if (!m_OldLocation)
10250 {
10251 m_OldLocation = new InventoryLocation;
10252 }
10253 m_OldLocation.Copy(oldLoc);
10254 }
10255 else
10256 {
10257 if (m_OldLocation)
10258 {
10259 m_OldLocation.Reset();
10260 }
10261 }
10262
10264 }
10265 else
10266 {
10267 if (new_player)
10268 {
10269 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10270 if (res_index >= 0)
10271 {
10272 InventoryLocation il = new InventoryLocation;
10273 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10275 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10278 {
10279 il.
GetParent().GetOnReleaseLock().Invoke(it);
10280 }
10282 {
10284 }
10285
10286 }
10287 }
10289 {
10290
10292 }
10293
10294 if (m_OldLocation)
10295 {
10296 m_OldLocation.Reset();
10297 }
10298 }
10299 }
10300
10301 override void EOnContact(IEntity other, Contact extra)
10302 {
10304 {
10305 int liquidType = -1;
10307 if (impactSpeed > 0.0)
10308 {
10310 #ifndef SERVER
10312 #else
10314 SetSynchDirty();
10315 #endif
10317 }
10318 }
10319
10320 #ifdef SERVER
10321 if (GetCompEM() && GetCompEM().IsPlugged())
10322 {
10323 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10324 GetCompEM().UnplugThis();
10325 }
10326 #endif
10327 }
10328
10330
10332 {
10334 }
10335
10337 {
10338
10339 }
10340
10342 {
10343 super.OnItemLocationChanged(old_owner, new_owner);
10344
10345 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10346 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10347
10348 if (!relatedPlayer && playerNew)
10349 relatedPlayer = playerNew;
10350
10351 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10352 {
10354 if (actionMgr)
10355 {
10356 ActionBase currentAction = actionMgr.GetRunningAction();
10357 if (currentAction)
10359 }
10360 }
10361
10362 Man ownerPlayerOld = null;
10363 Man ownerPlayerNew = null;
10364
10365 if (old_owner)
10366 {
10367 if (old_owner.
IsMan())
10368 {
10369 ownerPlayerOld = Man.Cast(old_owner);
10370 }
10371 else
10372 {
10373 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10374 }
10375 }
10376 else
10377 {
10379 {
10381
10382 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10383 {
10384 GetCompEM().UnplugThis();
10385 }
10386 }
10387 }
10388
10389 if (new_owner)
10390 {
10391 if (new_owner.
IsMan())
10392 {
10393 ownerPlayerNew = Man.Cast(new_owner);
10394 }
10395 else
10396 {
10397 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10398 }
10399 }
10400
10401 if (ownerPlayerOld != ownerPlayerNew)
10402 {
10403 if (ownerPlayerOld)
10404 {
10405 array<EntityAI> subItemsExit = new array<EntityAI>;
10407 for (int i = 0; i < subItemsExit.Count(); i++)
10408 {
10411 }
10412 }
10413
10414 if (ownerPlayerNew)
10415 {
10416 array<EntityAI> subItemsEnter = new array<EntityAI>;
10418 for (int j = 0; j < subItemsEnter.Count(); j++)
10419 {
10422 }
10423 }
10424 }
10425 else if (ownerPlayerNew != null)
10426 {
10427 PlayerBase nplayer;
10428 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10429 {
10430 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10432 for (int k = 0; k < subItemsUpdate.Count(); k++)
10433 {
10435 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10436 }
10437 }
10438 }
10439
10440 if (old_owner)
10441 old_owner.OnChildItemRemoved(this);
10442 if (new_owner)
10443 new_owner.OnChildItemReceived(this);
10444 }
10445
10446
10448 {
10449 super.EEDelete(parent);
10450 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10451 if (player)
10452 {
10454
10455 if (player.IsAlive())
10456 {
10457 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10458 if (r_index >= 0)
10459 {
10460 InventoryLocation r_il = new InventoryLocation;
10461 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10462
10463 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10466 {
10467 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10468 }
10470 {
10471 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10472 }
10473
10474 }
10475
10476 player.RemoveQuickBarEntityShortcut(this);
10477 }
10478 }
10479 }
10480
10482 {
10483 super.EEKilled(killer);
10484
10487 {
10488 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10489 {
10490 if (IsMagazine())
10491 {
10492 if (Magazine.Cast(this).GetAmmoCount() > 0)
10493 {
10495 }
10496 }
10497 else
10498 {
10500 }
10501 }
10502 }
10503 }
10504
10506 {
10507 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10508
10509 super.OnWasAttached(parent, slot_id);
10510
10513
10515 }
10516
10518 {
10519 super.OnWasDetached(parent, slot_id);
10520
10523 }
10524
10526 {
10527 int idx;
10530
10531 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10532 if (inventory_slots.Count() < 1)
10533 {
10534 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10535 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10536 }
10537 else
10538 {
10539 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10540 }
10541
10542 idx = inventory_slots.Find(slot);
10543 if (idx < 0)
10544 return "";
10545
10546 return attach_types.Get(idx);
10547 }
10548
10550 {
10551 int idx = -1;
10552 string slot;
10553
10556
10557 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10558 if (inventory_slots.Count() < 1)
10559 {
10560 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10561 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10562 }
10563 else
10564 {
10565 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10566 if (detach_types.Count() < 1)
10567 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10568 }
10569
10570 for (int i = 0; i < inventory_slots.Count(); i++)
10571 {
10572 slot = inventory_slots.Get(i);
10573 }
10574
10575 if (slot != "")
10576 {
10577 if (detach_types.Count() == 1)
10578 idx = 0;
10579 else
10580 idx = inventory_slots.Find(slot);
10581 }
10582 if (idx < 0)
10583 return "";
10584
10585 return detach_types.Get(idx);
10586 }
10587
10589 {
10590
10592
10593
10594 float min_time = 1;
10595 float max_time = 3;
10596 float delay = Math.RandomFloat(min_time, max_time);
10597
10598 explode_timer.Run(delay, this, "DoAmmoExplosion");
10599 }
10600
10602 {
10603 Magazine magazine = Magazine.Cast(this);
10604 int pop_sounds_count = 6;
10605 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10606
10607
10608 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10609 string sound_name = pop_sounds[ sound_idx ];
10611
10612
10613 magazine.ServerAddAmmoCount(-1);
10614
10615
10616 float min_temp_to_explode = 100;
10617
10618 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10619 {
10621 }
10622 }
10623
10624
10625 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10626 {
10627 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10628
10629 const int CHANCE_DAMAGE_CARGO = 4;
10630 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10631 const int CHANCE_DAMAGE_NOTHING = 2;
10632
10634 {
10635 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10636 int chances;
10637 int rnd;
10638
10639 if (GetInventory().GetCargo())
10640 {
10641 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10642 rnd = Math.RandomInt(0,chances);
10643
10644 if (rnd < CHANCE_DAMAGE_CARGO)
10645 {
10647 }
10648 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10649 {
10651 }
10652 }
10653 else
10654 {
10655 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10656 rnd = Math.RandomInt(0,chances);
10657
10658 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10659 {
10661 }
10662 }
10663 }
10664 }
10665
10667 {
10668 if (GetInventory().GetCargo())
10669 {
10670 int item_count = GetInventory().GetCargo().GetItemCount();
10671 if (item_count > 0)
10672 {
10673 int random_pick = Math.RandomInt(0, item_count);
10675 if (!item.IsExplosive())
10676 {
10677 item.AddHealth("","",damage);
10678 return true;
10679 }
10680 }
10681 }
10682 return false;
10683 }
10684
10686 {
10687 int attachment_count = GetInventory().AttachmentCount();
10688 if (attachment_count > 0)
10689 {
10690 int random_pick = Math.RandomInt(0, attachment_count);
10691 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10692 if (!attachment.IsExplosive())
10693 {
10694 attachment.AddHealth("","",damage);
10695 return true;
10696 }
10697 }
10698 return false;
10699 }
10700
10702 {
10704 }
10705
10707 {
10709 return GetInventory().CanRemoveEntity();
10710
10711 return false;
10712 }
10713
10715 {
10717 return;
10718
10720 {
10721 if (ScriptInputUserData.CanStoreInputUserData())
10722 {
10723 ScriptInputUserData ctx = new ScriptInputUserData;
10728 ctx.
Write(destination_entity);
10730 ctx.
Write(slot_id);
10732 }
10733 }
10734 else if (!
GetGame().IsMultiplayer())
10735 {
10737 }
10738 }
10739
10741 {
10743 return;
10744
10745 float split_quantity_new;
10749 InventoryLocation loc = new InventoryLocation;
10750
10751 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10752 {
10754 split_quantity_new = stack_max;
10755 else
10757
10758 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10759 if (new_item)
10760 {
10761 new_item.SetResultOfSplit(true);
10762 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10764 new_item.SetQuantity(split_quantity_new);
10765 }
10766 }
10767 else if (destination_entity && slot_id == -1)
10768 {
10769 if (quantity > stack_max)
10770 split_quantity_new = stack_max;
10771 else
10772 split_quantity_new = quantity;
10773
10775 {
10778 }
10779
10780 if (new_item)
10781 {
10782 new_item.SetResultOfSplit(true);
10783 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10785 new_item.SetQuantity(split_quantity_new);
10786 }
10787 }
10788 else
10789 {
10790 if (stack_max != 0)
10791 {
10793 {
10795 }
10796
10797 if (split_quantity_new == 0)
10798 {
10799 if (!
GetGame().IsMultiplayer())
10800 player.PhysicalPredictiveDropItem(this);
10801 else
10802 player.ServerDropEntity(this);
10803 return;
10804 }
10805
10807
10808 if (new_item)
10809 {
10810 new_item.SetResultOfSplit(true);
10811 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10813 new_item.SetQuantity(stack_max);
10814 new_item.PlaceOnSurface();
10815 }
10816 }
10817 }
10818 }
10819
10821 {
10823 return;
10824
10825 float split_quantity_new;
10829 InventoryLocation loc = new InventoryLocation;
10830
10831 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10832 {
10834 split_quantity_new = stack_max;
10835 else
10837
10838 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10839 if (new_item)
10840 {
10841 new_item.SetResultOfSplit(true);
10842 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10844 new_item.SetQuantity(split_quantity_new);
10845 }
10846 }
10847 else if (destination_entity && slot_id == -1)
10848 {
10849 if (quantity > stack_max)
10850 split_quantity_new = stack_max;
10851 else
10852 split_quantity_new = quantity;
10853
10855 {
10858 }
10859
10860 if (new_item)
10861 {
10862 new_item.SetResultOfSplit(true);
10863 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10865 new_item.SetQuantity(split_quantity_new);
10866 }
10867 }
10868 else
10869 {
10870 if (stack_max != 0)
10871 {
10873 {
10875 }
10876
10878
10879 if (new_item)
10880 {
10881 new_item.SetResultOfSplit(true);
10882 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10884 new_item.SetQuantity(stack_max);
10885 new_item.PlaceOnSurface();
10886 }
10887 }
10888 }
10889 }
10890
10892 {
10894 return;
10895
10897 {
10898 if (ScriptInputUserData.CanStoreInputUserData())
10899 {
10900 ScriptInputUserData ctx = new ScriptInputUserData;
10905 dst.WriteToContext(ctx);
10907 }
10908 }
10909 else if (!
GetGame().IsMultiplayer())
10910 {
10912 }
10913 }
10914
10916 {
10918 return;
10919
10921 {
10922 if (ScriptInputUserData.CanStoreInputUserData())
10923 {
10924 ScriptInputUserData ctx = new ScriptInputUserData;
10929 ctx.
Write(destination_entity);
10935 }
10936 }
10937 else if (!
GetGame().IsMultiplayer())
10938 {
10940 }
10941 }
10942
10944 {
10946 }
10947
10949 {
10951 return this;
10952
10954 float split_quantity_new;
10956 if (dst.IsValid())
10957 {
10958 int slot_id = dst.GetSlot();
10960
10961 if (quantity > stack_max)
10962 split_quantity_new = stack_max;
10963 else
10964 split_quantity_new = quantity;
10965
10967
10968 if (new_item)
10969 {
10970 new_item.SetResultOfSplit(true);
10971 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10974 }
10975
10976 return new_item;
10977 }
10978
10979 return null;
10980 }
10981
10983 {
10985 return;
10986
10988 float split_quantity_new;
10990 if (destination_entity)
10991 {
10993 if (quantity > stackable)
10994 split_quantity_new = stackable;
10995 else
10996 split_quantity_new = quantity;
10997
10998 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10999 if (new_item)
11000 {
11001 new_item.SetResultOfSplit(true);
11002 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11004 new_item.SetQuantity(split_quantity_new);
11005 }
11006 }
11007 }
11008
11010 {
11012 return;
11013
11015 {
11016 if (ScriptInputUserData.CanStoreInputUserData())
11017 {
11018 ScriptInputUserData ctx = new ScriptInputUserData;
11023 ItemBase destination_entity =
this;
11024 ctx.
Write(destination_entity);
11028 }
11029 }
11030 else if (!
GetGame().IsMultiplayer())
11031 {
11033 }
11034 }
11035
11037 {
11039 return;
11040
11042 float split_quantity_new;
11044 if (player)
11045 {
11047 if (quantity > stackable)
11048 split_quantity_new = stackable;
11049 else
11050 split_quantity_new = quantity;
11051
11052 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11053 new_item =
ItemBase.Cast(in_hands);
11054 if (new_item)
11055 {
11056 new_item.SetResultOfSplit(true);
11057 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11059 new_item.SetQuantity(split_quantity_new);
11060 }
11061 }
11062 }
11063
11065 {
11067 return;
11068
11070 float split_quantity_new = Math.Floor(quantity * 0.5);
11071
11073
11074 if (new_item)
11075 {
11076 if (new_item.GetQuantityMax() < split_quantity_new)
11077 {
11078 split_quantity_new = new_item.GetQuantityMax();
11079 }
11080
11081 new_item.SetResultOfSplit(true);
11082 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11083
11085 {
11088 }
11089 else
11090 {
11093 }
11094 }
11095 }
11096
11098 {
11100 return;
11101
11103 float split_quantity_new = Math.Floor(quantity / 2);
11104
11105 InventoryLocation invloc = new InventoryLocation;
11107
11109 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11110
11111 if (new_item)
11112 {
11113 if (new_item.GetQuantityMax() < split_quantity_new)
11114 {
11115 split_quantity_new = new_item.GetQuantityMax();
11116 }
11118 {
11121 }
11122 else
11123 {
11126 }
11127 }
11128 }
11129
11132 {
11133 SetWeightDirty();
11135
11136 if (parent)
11137 parent.OnAttachmentQuantityChangedEx(this, delta);
11138
11140 {
11142 {
11144 }
11146 {
11147 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11149 }
11150 }
11151
11152 }
11153
11156 {
11157
11158 }
11159
11162 {
11164 }
11165
11167 {
11168 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11169
11171 {
11172 if (newLevel == GameConstants.STATE_RUINED)
11173 {
11175 EntityAI parent = GetHierarchyParent();
11176 if (parent && parent.IsFireplace())
11177 {
11178 CargoBase cargo = GetInventory().GetCargo();
11179 if (cargo)
11180 {
11182 {
11184 }
11185 }
11186 }
11187 }
11188
11190 {
11191
11193 return;
11194 }
11195
11196 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11197 {
11199 }
11200 }
11201 }
11202
11203
11205 {
11206 super.OnRightClick();
11207
11209 {
11211 {
11212 if (ScriptInputUserData.CanStoreInputUserData())
11213 {
11214 vector m4[4];
11216
11217 EntityAI root = GetHierarchyRoot();
11218
11219 InventoryLocation dst = new InventoryLocation;
11221 {
11222 if (root)
11223 {
11224 root.GetTransform(m4);
11226 }
11227 else
11228 GetInventory().GetCurrentInventoryLocation(dst);
11229 }
11230 else
11231 {
11233
11234
11235 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11236 {
11237 if (root)
11238 {
11239 root.GetTransform(m4);
11241 }
11242 else
11243 GetInventory().GetCurrentInventoryLocation(dst);
11244 }
11245 else
11246 {
11247 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11248 }
11249 }
11250
11251 ScriptInputUserData ctx = new ScriptInputUserData;
11259 }
11260 }
11261 else if (!
GetGame().IsMultiplayer())
11262 {
11264 }
11265 }
11266 }
11267
11268 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11269 {
11270
11271 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11272 return false;
11273
11274 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11275 return false;
11276
11277
11279 return false;
11280
11281
11282 Magazine mag = Magazine.Cast(this);
11283 if (mag)
11284 {
11285 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11286 return false;
11287
11288 if (stack_max_limit)
11289 {
11290 Magazine other_mag = Magazine.Cast(other_item);
11291 if (other_item)
11292 {
11293 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11294 return false;
11295 }
11296
11297 }
11298 }
11299 else
11300 {
11301
11303 return false;
11304
11306 return false;
11307 }
11308
11309 PlayerBase player = null;
11310 if (CastTo(player, GetHierarchyRootPlayer()))
11311 {
11312 if (player.GetInventory().HasAttachment(this))
11313 return false;
11314
11315 if (player.IsItemsToDelete())
11316 return false;
11317 }
11318
11319 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11320 return false;
11321
11322 int slotID;
11324 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11325 return false;
11326
11327 return true;
11328 }
11329
11331 {
11333 }
11334
11336 {
11337 return m_IsResultOfSplit;
11338 }
11339
11341 {
11342 m_IsResultOfSplit = value;
11343 }
11344
11346 {
11348 }
11349
11351 {
11352 float other_item_quantity = other_item.GetQuantity();
11353 float this_free_space;
11354
11356
11358
11359 if (other_item_quantity > this_free_space)
11360 {
11361 return this_free_space;
11362 }
11363 else
11364 {
11365 return other_item_quantity;
11366 }
11367 }
11368
11370 {
11372 }
11373
11375 {
11377 return;
11378
11379 if (!IsMagazine() && other_item)
11380 {
11382 if (quantity_used != 0)
11383 {
11384 float hp1 = GetHealth01("","");
11385 float hp2 = other_item.GetHealth01("","");
11386 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11387 hpResult = hpResult / (
GetQuantity() + quantity_used);
11388
11389 hpResult *= GetMaxHealth();
11390 Math.Round(hpResult);
11391 SetHealth("", "Health", hpResult);
11392
11394 other_item.AddQuantity(-quantity_used);
11395 }
11396 }
11398 }
11399
11401 {
11402 #ifdef SERVER
11403 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11404 GetHierarchyParent().IncreaseLifetimeUp();
11405 #endif
11406 };
11407
11409 {
11410 PlayerBase p = PlayerBase.Cast(player);
11411
11412 array<int> recipesIds = p.m_Recipes;
11413 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11414 if (moduleRecipesManager)
11415 {
11416 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11417 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11418 }
11419
11420 for (int i = 0;i < recipesIds.Count(); i++)
11421 {
11422 int key = recipesIds.Get(i);
11423 string recipeName = moduleRecipesManager.GetRecipeName(key);
11425 }
11426 }
11427
11428
11429 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11430 {
11431 super.GetDebugActions(outputList);
11432
11433
11438
11439
11443
11447
11448
11451
11452
11454 {
11457 }
11458
11460
11463
11467 }
11468
11469
11470
11471
11473 {
11474 super.OnAction(action_id, player, ctx);
11475 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11476 {
11477 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11478 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11479 PlayerBase p = PlayerBase.Cast(player);
11480 if (
EActions.RECIPES_RANGE_START < 1000)
11481 {
11482 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11483 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11484 }
11485 }
11486 #ifndef SERVER
11487 else if (action_id ==
EActions.WATCH_PLAYER)
11488 {
11489 PluginDeveloper.SetDeveloperItemClientEx(player);
11490 }
11491 #endif
11493 {
11494 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11495 {
11496 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11497 OnDebugButtonPressServer(id + 1);
11498 }
11499
11500 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11501 {
11502 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11504 }
11505
11506 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11507 {
11508 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11510 }
11511
11512 else if (action_id ==
EActions.ADD_QUANTITY)
11513 {
11514 if (IsMagazine())
11515 {
11516 Magazine mag = Magazine.Cast(this);
11517 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11518 }
11519 else
11520 {
11522 }
11523
11524 if (m_EM)
11525 {
11526 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11527 }
11528
11529 }
11530
11531 else if (action_id ==
EActions.REMOVE_QUANTITY)
11532 {
11533 if (IsMagazine())
11534 {
11535 Magazine mag2 = Magazine.Cast(this);
11536 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11537 }
11538 else
11539 {
11541 }
11542 if (m_EM)
11543 {
11544 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11545 }
11546
11547 }
11548
11549 else if (action_id ==
EActions.SET_QUANTITY_0)
11550 {
11552
11553 if (m_EM)
11554 {
11555 m_EM.SetEnergy(0);
11556 }
11557 }
11558
11559 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11560 {
11562
11563 if (m_EM)
11564 {
11565 m_EM.SetEnergy(m_EM.GetEnergyMax());
11566 }
11567 }
11568
11569 else if (action_id ==
EActions.ADD_HEALTH)
11570 {
11571 AddHealth("","",GetMaxHealth("","Health")/5);
11572 }
11573 else if (action_id ==
EActions.REMOVE_HEALTH)
11574 {
11575 AddHealth("","",-GetMaxHealth("","Health")/5);
11576 }
11577 else if (action_id ==
EActions.DESTROY_HEALTH)
11578 {
11579 SetHealth01("","",0);
11580 }
11581 else if (action_id ==
EActions.WATCH_ITEM)
11582 {
11584 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11585 #ifdef DEVELOPER
11586 SetDebugDeveloper_item(this);
11587 #endif
11588 }
11589
11590 else if (action_id ==
EActions.ADD_TEMPERATURE)
11591 {
11592 AddTemperature(20);
11593
11594 }
11595
11596 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11597 {
11598 AddTemperature(-20);
11599
11600 }
11601
11602 else if (action_id ==
EActions.FLIP_FROZEN)
11603 {
11604 SetFrozen(!GetIsFrozen());
11605
11606 }
11607
11608 else if (action_id ==
EActions.ADD_WETNESS)
11609 {
11611
11612 }
11613
11614 else if (action_id ==
EActions.REMOVE_WETNESS)
11615 {
11617
11618 }
11619
11620 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11621 {
11624
11625
11626 }
11627
11628 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11629 {
11632 }
11633
11634 else if (action_id ==
EActions.MAKE_SPECIAL)
11635 {
11636 auto debugParams = DebugSpawnParams.WithPlayer(player);
11637 OnDebugSpawnEx(debugParams);
11638 }
11639
11640 else if (action_id ==
EActions.DELETE)
11641 {
11642 Delete();
11643 }
11644
11645 }
11646
11647
11648 return false;
11649 }
11650
11651
11652
11653
11657
11660
11661
11662
11664 {
11665 return false;
11666 }
11667
11668
11670 {
11671 return true;
11672 }
11673
11674
11676 {
11677 return true;
11678 }
11679
11680
11681
11683 {
11684 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11686 }
11687
11690 {
11691 return null;
11692 }
11693
11695 {
11696 return false;
11697 }
11698
11700 {
11701 return false;
11702 }
11703
11707
11708
11710 {
11711 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11712 return module_repairing.CanRepair(this, item_repair_kit);
11713 }
11714
11715
11716 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11717 {
11718 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11719 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11720 }
11721
11722
11724 {
11725
11726
11727
11728
11729
11730
11731
11732
11733 return 1;
11734 }
11735
11736
11737
11739 {
11741 }
11742
11743
11744
11746 {
11748 }
11749
11750
11759 {
11760 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11761
11762 if (player)
11763 {
11764 player.MessageStatus(text);
11765 }
11766 }
11767
11768
11777 {
11778 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11779
11780 if (player)
11781 {
11782 player.MessageAction(text);
11783 }
11784 }
11785
11786
11795 {
11796 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11797
11798 if (player)
11799 {
11800 player.MessageFriendly(text);
11801 }
11802 }
11803
11804
11813 {
11814 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11815
11816 if (player)
11817 {
11818 player.MessageImportant(text);
11819 }
11820 }
11821
11823 {
11824 return true;
11825 }
11826
11827
11828 override bool KindOf(
string tag)
11829 {
11830 bool found = false;
11831 string item_name = this.
GetType();
11834
11835 int array_size = item_tag_array.Count();
11836 for (int i = 0; i < array_size; i++)
11837 {
11838 if (item_tag_array.Get(i) == tag)
11839 {
11840 found = true;
11841 break;
11842 }
11843 }
11844 return found;
11845 }
11846
11847
11849 {
11850
11851 super.OnRPC(sender, rpc_type,ctx);
11852
11853
11854 switch (rpc_type)
11855 {
11856 #ifndef SERVER
11857 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11858 Param2<bool, string> p = new Param2<bool, string>(false, "");
11859
11861 return;
11862
11863 bool play = p.param1;
11864 string soundSet = p.param2;
11865
11866 if (play)
11867 {
11869 {
11871 {
11873 }
11874 }
11875 else
11876 {
11878 }
11879 }
11880 else
11881 {
11883 }
11884
11885 break;
11886 #endif
11887
11888 }
11889
11891 {
11893 }
11894 }
11895
11896
11897
11898
11900 {
11901 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11902 return plugin.GetID(
name);
11903 }
11904
11906 {
11907 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11908 return plugin.GetName(id);
11909 }
11910
11913 {
11914
11915
11916 int varFlags;
11917 if (!ctx.
Read(varFlags))
11918 return;
11919
11920 if (varFlags & ItemVariableFlags.FLOAT)
11921 {
11923 }
11924 }
11925
11927 {
11928
11929 super.SerializeNumericalVars(floats_out);
11930
11931
11932
11934 {
11936 }
11937
11939 {
11941 }
11942
11944 {
11946 }
11947
11949 {
11954 }
11955
11957 {
11959 }
11960 }
11961
11963 {
11964
11965 super.DeSerializeNumericalVars(floats);
11966
11967
11968 int index = 0;
11969 int mask = Math.Round(floats.Get(index));
11970
11971 index++;
11972
11974 {
11976 {
11978 }
11979 else
11980 {
11981 float quantity = floats.Get(index);
11982 SetQuantity(quantity,
true,
false,
false,
false);
11983 }
11984 index++;
11985 }
11986
11988 {
11989 float wet = floats.Get(index);
11991 index++;
11992 }
11993
11995 {
11996 int liquidtype = Math.Round(floats.Get(index));
11998 index++;
11999 }
12000
12002 {
12004 index++;
12006 index++;
12008 index++;
12010 index++;
12011 }
12012
12014 {
12015 int cleanness = Math.Round(floats.Get(index));
12017 index++;
12018 }
12019 }
12020
12022 {
12023 super.WriteVarsToCTX(ctx);
12024
12025
12027 {
12029 }
12030
12032 {
12034 }
12035
12037 {
12039 }
12040
12042 {
12043 int r,g,b,a;
12049 }
12050
12052 {
12054 }
12055 }
12056
12058 {
12059 if (!super.ReadVarsFromCTX(ctx,version))
12060 return false;
12061
12062 int intValue;
12063 float value;
12064
12065 if (version < 140)
12066 {
12067 if (!ctx.
Read(intValue))
12068 return false;
12069
12070 m_VariablesMask = intValue;
12071 }
12072
12074 {
12075 if (!ctx.
Read(value))
12076 return false;
12077
12079 {
12081 }
12082 else
12083 {
12085 }
12086 }
12087
12088 if (version < 140)
12089 {
12091 {
12092 if (!ctx.
Read(value))
12093 return false;
12094 SetTemperatureDirect(value);
12095 }
12096 }
12097
12099 {
12100 if (!ctx.
Read(value))
12101 return false;
12103 }
12104
12106 {
12107 if (!ctx.
Read(intValue))
12108 return false;
12110 }
12111
12113 {
12114 int r,g,b,a;
12116 return false;
12118 return false;
12120 return false;
12122 return false;
12123
12125 }
12126
12128 {
12129 if (!ctx.
Read(intValue))
12130 return false;
12132 }
12133
12134 if (version >= 138 && version < 140)
12135 {
12137 {
12138 if (!ctx.
Read(intValue))
12139 return false;
12140 SetFrozen(intValue);
12141 }
12142 }
12143
12144 return true;
12145 }
12146
12147
12149 {
12152 {
12154 }
12155
12156 if (!super.OnStoreLoad(ctx, version))
12157 {
12159 return false;
12160 }
12161
12162 if (version >= 114)
12163 {
12164 bool hasQuickBarIndexSaved;
12165
12166 if (!ctx.
Read(hasQuickBarIndexSaved))
12167 {
12169 return false;
12170 }
12171
12172 if (hasQuickBarIndexSaved)
12173 {
12174 int itmQBIndex;
12175
12176
12177 if (!ctx.
Read(itmQBIndex))
12178 {
12180 return false;
12181 }
12182
12183 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12184 if (itmQBIndex != -1 && parentPlayer)
12185 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12186 }
12187 }
12188 else
12189 {
12190
12191 PlayerBase player;
12192 int itemQBIndex;
12193 if (version ==
int.
MAX)
12194 {
12195 if (!ctx.
Read(itemQBIndex))
12196 {
12198 return false;
12199 }
12200 }
12201 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12202 {
12203
12204 if (!ctx.
Read(itemQBIndex))
12205 {
12207 return false;
12208 }
12209 if (itemQBIndex != -1 && player)
12210 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12211 }
12212 }
12213
12214 if (version < 140)
12215 {
12216
12217 if (!LoadVariables(ctx, version))
12218 {
12220 return false;
12221 }
12222 }
12223
12224
12226 {
12228 return false;
12229 }
12230 if (version >= 132)
12231 {
12233 if (raib)
12234 {
12236 {
12238 return false;
12239 }
12240 }
12241 }
12242
12244 return true;
12245 }
12246
12247
12248
12250 {
12251 super.OnStoreSave(ctx);
12252
12253 PlayerBase player;
12254 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12255 {
12257
12258 int itemQBIndex = -1;
12259 itemQBIndex = player.FindQuickBarEntityIndex(this);
12260 ctx.
Write(itemQBIndex);
12261 }
12262 else
12263 {
12265 }
12266
12268
12270 if (raib)
12271 {
12273 }
12274 }
12275
12276
12278 {
12279 super.AfterStoreLoad();
12280
12282 {
12284 }
12285
12287 {
12290 }
12291 }
12292
12294 {
12295 super.EEOnAfterLoad();
12296
12298 {
12300 }
12301
12304 }
12305
12307 {
12308 return false;
12309 }
12310
12311
12312
12314 {
12316 {
12317 #ifdef PLATFORM_CONSOLE
12318
12320 {
12322 if (menu)
12323 {
12325 }
12326 }
12327 #endif
12328 }
12329
12331 {
12334 }
12335
12337 {
12338 SetWeightDirty();
12340 }
12342 {
12345 }
12346
12348 {
12351 }
12353 {
12356 }
12357
12358 super.OnVariablesSynchronized();
12359 }
12360
12361
12362
12364 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12365 {
12366 if (!IsServerCheck(allow_client))
12367 return false;
12368
12370 return false;
12371
12374
12375 if (value <= (min + 0.001))
12376 value = min;
12377
12378 if (value == min)
12379 {
12380 if (destroy_config)
12381 {
12382 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12383 if (dstr)
12384 {
12386 this.Delete();
12387 return true;
12388 }
12389 }
12390 else if (destroy_forced)
12391 {
12393 this.Delete();
12394 return true;
12395 }
12396
12398 }
12399
12402
12404 {
12406
12407 if (delta)
12409 }
12410
12412
12413 return false;
12414 }
12415
12416
12418 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12419 {
12421 }
12422
12424 {
12427 }
12428
12430 {
12433 }
12434
12437 {
12438 float value_clamped = Math.Clamp(value, 0, 1);
12440 SetQuantity(result, destroy_config, destroy_forced);
12441 }
12442
12443
12446 {
12448 }
12449
12451 {
12453 }
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12465 {
12466 int slot = -1;
12467 if (GetInventory())
12468 {
12469 InventoryLocation il = new InventoryLocation;
12470 GetInventory().GetCurrentInventoryLocation(il);
12472 }
12473
12475 }
12476
12478 {
12479 float quantity_max = 0;
12480
12482 {
12483 if (attSlotID != -1)
12484 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12485
12486 if (quantity_max <= 0)
12488 }
12489
12490 if (quantity_max <= 0)
12492
12493 return quantity_max;
12494 }
12495
12497 {
12499 }
12500
12502 {
12504 }
12505
12506
12508 {
12510 }
12511
12513 {
12515 }
12516
12518 {
12520 }
12521
12522
12524 {
12525
12526 float weightEx = GetWeightEx();
12527 float special = GetInventoryAndCargoWeight();
12528 return weightEx - special;
12529 }
12530
12531
12533 {
12535 }
12536
12538 {
12540 {
12541 #ifdef DEVELOPER
12542 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12543 {
12544 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12546 }
12547 #endif
12548
12549 return GetQuantity() * GetConfigWeightModified();
12550 }
12551 else if (HasEnergyManager())
12552 {
12553 #ifdef DEVELOPER
12554 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12555 {
12556 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12557 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12558 }
12559 #endif
12560 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12561 }
12562 else
12563 {
12564 #ifdef DEVELOPER
12565 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12566 {
12567 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12568 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12569 }
12570 #endif
12571 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12572 }
12573 }
12574
12577 {
12578 int item_count = 0;
12580
12581 if (GetInventory().GetCargo() != NULL)
12582 {
12583 item_count = GetInventory().GetCargo().GetItemCount();
12584 }
12585
12586 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12587 {
12588 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12589 if (item)
12590 item_count += item.GetNumberOfItems();
12591 }
12592 return item_count;
12593 }
12594
12597 {
12598 float weight = 0;
12599 float wetness = 1;
12600 if (include_wetness)
12603 {
12604 weight = wetness * m_ConfigWeight;
12605 }
12607 {
12608 weight = 1;
12609 }
12610 return weight;
12611 }
12612
12613
12614
12616 {
12617 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12618 {
12619 GameInventory inv = GetInventory();
12620 array<EntityAI> items = new array<EntityAI>;
12622 for (int i = 0; i < items.Count(); i++)
12623 {
12625 if (item)
12626 {
12628 }
12629 }
12630 }
12631 }
12632
12633
12634
12635
12637 {
12638 float energy = 0;
12639 if (HasEnergyManager())
12640 {
12641 energy = GetCompEM().GetEnergy();
12642 }
12643 return energy;
12644 }
12645
12646
12648 {
12649 super.OnEnergyConsumed();
12650
12652 }
12653
12655 {
12656 super.OnEnergyAdded();
12657
12659 }
12660
12661
12663 {
12664 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12665 {
12667 {
12668 float energy_0to1 = GetCompEM().GetEnergy0To1();
12670 }
12671 }
12672 }
12673
12674
12676 {
12677 return ConfigGetFloat("heatIsolation");
12678 }
12679
12681 {
12683 }
12684
12686 {
12687 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12688 if (
GetGame().ConfigIsExisting(paramPath))
12690
12691 return 0.0;
12692 }
12693
12695 {
12696 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12697 if (
GetGame().ConfigIsExisting(paramPath))
12699
12700 return 0.0;
12701 }
12702
12703 override void SetWet(
float value,
bool allow_client =
false)
12704 {
12705 if (!IsServerCheck(allow_client))
12706 return;
12707
12710
12712
12713 m_VarWet = Math.Clamp(value, min, max);
12714
12716 {
12719 }
12720 }
12721
12722 override void AddWet(
float value)
12723 {
12725 }
12726
12728 {
12730 }
12731
12733 {
12735 }
12736
12738 {
12740 }
12741
12743 {
12745 }
12746
12748 {
12750 }
12751
12752 override void OnWetChanged(
float newVal,
float oldVal)
12753 {
12756 if (newLevel != oldLevel)
12757 {
12759 }
12760 }
12761
12763 {
12764 SetWeightDirty();
12765 }
12766
12768 {
12769 return GetWetLevelInternal(
m_VarWet);
12770 }
12771
12772
12773
12775 {
12777 }
12778
12780 {
12782 }
12783
12785 {
12787 }
12788
12790 {
12792 }
12793
12794
12795
12797 {
12798 if (ConfigIsExisting("itemModelLength"))
12799 {
12800 return ConfigGetFloat("itemModelLength");
12801 }
12802 return 0;
12803 }
12804
12806 {
12807 if (ConfigIsExisting("itemAttachOffset"))
12808 {
12809 return ConfigGetFloat("itemAttachOffset");
12810 }
12811 return 0;
12812 }
12813
12814 override void SetCleanness(
int value,
bool allow_client =
false)
12815 {
12816 if (!IsServerCheck(allow_client))
12817 return;
12818
12820
12822
12825 }
12826
12828 {
12830 }
12831
12833 {
12834 return true;
12835 }
12836
12837
12838
12839
12841 {
12843 }
12844
12846 {
12848 }
12849
12850
12851
12852
12853 override void SetColor(
int r,
int g,
int b,
int a)
12854 {
12860 }
12862 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12863 {
12868 }
12869
12871 {
12873 }
12874
12877 {
12878 int r,g,b,a;
12880 r = r/255;
12881 g = g/255;
12882 b = b/255;
12883 a = a/255;
12884 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12885 }
12886
12887
12888
12889 override void SetLiquidType(
int value,
bool allow_client =
false)
12890 {
12891 if (!IsServerCheck(allow_client))
12892 return;
12893
12898 }
12899
12901 {
12902 return ConfigGetInt("varLiquidTypeInit");
12903 }
12904
12906 {
12908 }
12909
12911 {
12913 SetFrozen(false);
12914 }
12915
12918 {
12919 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12920 }
12921
12922
12925 {
12926 PlayerBase nplayer;
12927 if (PlayerBase.CastTo(nplayer, player))
12928 {
12930
12931 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12932 }
12933 }
12934
12935
12938 {
12939 PlayerBase nplayer;
12940 if (PlayerBase.CastTo(nplayer,player))
12941 {
12942
12943 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12944
12945 }
12946
12947
12948 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12949
12950
12951 if (HasEnergyManager())
12952 {
12953 GetCompEM().UpdatePlugState();
12954 }
12955 }
12956
12957
12959 {
12960 super.OnPlacementStarted(player);
12961
12963 }
12964
12965 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12966 {
12968 {
12969 m_AdminLog.OnPlacementComplete(player,
this);
12970 }
12971
12972 super.OnPlacementComplete(player, position, orientation);
12973 }
12974
12975
12976
12977
12978
12980 {
12982 {
12983 return true;
12984 }
12985 else
12986 {
12987 return false;
12988 }
12989 }
12990
12991
12993 {
12995 {
12997 }
12998 }
12999
13000
13002 {
13004 }
13005
13007 {
13009 }
13010
13011 override void InsertAgent(
int agent,
float count = 1)
13012 {
13013 if (count < 1)
13014 return;
13015
13017 }
13018
13021 {
13023 }
13024
13025
13027 {
13029 }
13030
13031
13032
13033
13034
13035
13036
13037
13038
13039
13040
13041
13042
13043
13044
13045
13046
13047
13048
13049
13050
13051
13052
13053
13054
13055
13056
13057
13058
13059
13060
13061
13062
13063
13064
13065
13066
13067
13068
13069
13070
13071
13073 {
13075 return false;
13076 return true;
13077 }
13078
13080 {
13081
13083 }
13084
13085
13088 {
13089 super.CheckForRoofLimited(timeTresholdMS);
13090
13092 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13093 {
13094 m_PreviousRoofTestTime = time;
13095 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13096 }
13097 }
13098
13099
13101 {
13103 {
13104 return 0;
13105 }
13106
13107 if (GetInventory().GetAttachmentSlotsCount() != 0)
13108 {
13109 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13110 if (filter)
13111 return filter.GetProtectionLevel(type, false, system);
13112 else
13113 return 0;
13114 }
13115
13116 string subclassPath, entryName;
13117
13118 switch (type)
13119 {
13121 entryName = "biological";
13122 break;
13124 entryName = "chemical";
13125 break;
13126 default:
13127 entryName = "biological";
13128 break;
13129 }
13130
13131 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13132
13134 }
13135
13136
13137
13140 {
13141 if (!IsMagazine())
13143
13145 }
13146
13147
13148
13149
13150
13155 {
13156 return true;
13157 }
13158
13160 {
13162 }
13163
13164
13165
13166
13167
13169 {
13170 if (parent)
13171 {
13172 if (parent.IsInherited(DayZInfected))
13173 return true;
13174
13175 if (!parent.IsRuined())
13176 return true;
13177 }
13178
13179 return true;
13180 }
13181
13183 {
13184 if (!super.CanPutAsAttachment(parent))
13185 {
13186 return false;
13187 }
13188
13189 if (!IsRuined() && !parent.IsRuined())
13190 {
13191 return true;
13192 }
13193
13194 return false;
13195 }
13196
13198 {
13199
13200
13201
13202
13203 return super.CanReceiveItemIntoCargo(item);
13204 }
13205
13207 {
13208
13209
13210
13211
13212 GameInventory attachmentInv = attachment.GetInventory();
13214 {
13215 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13216 return false;
13217 }
13218
13219 InventoryLocation loc = new InventoryLocation();
13220 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13221 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13222 return false;
13223
13224 return super.CanReceiveAttachment(attachment, slotId);
13225 }
13226
13228 {
13229 if (!super.CanReleaseAttachment(attachment))
13230 return false;
13231
13232 return GetInventory().AreChildrenAccessible();
13233 }
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13256 {
13257 int id = muzzle_owner.GetMuzzleID();
13258 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13259
13260 if (WPOF_array)
13261 {
13262 for (int i = 0; i < WPOF_array.Count(); i++)
13263 {
13264 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13265
13266 if (WPOF)
13267 {
13268 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13269 }
13270 }
13271 }
13272 }
13273
13274
13276 {
13277 int id = muzzle_owner.GetMuzzleID();
13279
13280 if (WPOBE_array)
13281 {
13282 for (int i = 0; i < WPOBE_array.Count(); i++)
13283 {
13284 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13285
13286 if (WPOBE)
13287 {
13288 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13289 }
13290 }
13291 }
13292 }
13293
13294
13296 {
13297 int id = muzzle_owner.GetMuzzleID();
13298 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13299
13300 if (WPOOH_array)
13301 {
13302 for (int i = 0; i < WPOOH_array.Count(); i++)
13303 {
13304 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13305
13306 if (WPOOH)
13307 {
13308 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13309 }
13310 }
13311 }
13312 }
13313
13314
13316 {
13317 int id = muzzle_owner.GetMuzzleID();
13318 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13319
13320 if (WPOOH_array)
13321 {
13322 for (int i = 0; i < WPOOH_array.Count(); i++)
13323 {
13324 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13325
13326 if (WPOOH)
13327 {
13328 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13329 }
13330 }
13331 }
13332 }
13333
13334
13336 {
13337 int id = muzzle_owner.GetMuzzleID();
13338 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13339
13340 if (WPOOH_array)
13341 {
13342 for (int i = 0; i < WPOOH_array.Count(); i++)
13343 {
13344 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13345
13346 if (WPOOH)
13347 {
13348 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13349 }
13350 }
13351 }
13352 }
13353
13354
13355
13357 {
13359 {
13360 return true;
13361 }
13362
13363 return false;
13364 }
13365
13367 {
13369 {
13370 return true;
13371 }
13372
13373 return false;
13374 }
13375
13377 {
13379 {
13380 return true;
13381 }
13382
13383 return false;
13384 }
13385
13387 {
13388 return false;
13389 }
13390
13393 {
13394 return UATimeSpent.DEFAULT_DEPLOY;
13395 }
13396
13397
13398
13399
13401 {
13403 SetSynchDirty();
13404 }
13405
13407 {
13409 }
13410
13411
13413 {
13414 return false;
13415 }
13416
13419 {
13420 string att_type = "None";
13421
13422 if (ConfigIsExisting("soundAttType"))
13423 {
13424 att_type = ConfigGetString("soundAttType");
13425 }
13426
13428 }
13429
13431 {
13433 }
13434
13435
13436
13437
13438
13442
13444 {
13447
13449 }
13450
13451
13453 {
13455 return;
13456
13458
13461
13464
13465 SoundParameters params = new SoundParameters();
13469 }
13470
13471
13473 {
13475 return;
13476
13478 SetSynchDirty();
13479
13482 }
13483
13484
13486 {
13488 return;
13489
13491 SetSynchDirty();
13492
13495 }
13496
13498 {
13500 }
13501
13503 {
13505 }
13506
13509 {
13510 if (!
GetGame().IsDedicatedServer())
13511 {
13512 if (ConfigIsExisting("attachSoundSet"))
13513 {
13514 string cfg_path = "";
13515 string soundset = "";
13516 string type_name =
GetType();
13517
13520 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13521 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13522
13523 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13524 {
13525 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13526 {
13527 if (cfg_slot_array[i] == slot_type)
13528 {
13529 soundset = cfg_soundset_array[i];
13530 break;
13531 }
13532 }
13533 }
13534
13535 if (soundset != "")
13536 {
13537 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13539 }
13540 }
13541 }
13542 }
13543
13545 {
13546
13547 }
13548
13549 void OnApply(PlayerBase player);
13550
13552 {
13553 return 1.0;
13554 };
13555
13557 {
13559 }
13560
13562 {
13564 }
13565
13567
13569 {
13570 SetDynamicPhysicsLifeTime(0.01);
13572 }
13573
13575 {
13576 array<string> zone_names = new array<string>;
13577 GetDamageZones(zone_names);
13578 for (int i = 0; i < zone_names.Count(); i++)
13579 {
13580 SetHealthMax(zone_names.Get(i),"Health");
13581 }
13582 SetHealthMax("","Health");
13583 }
13584
13587 {
13588 float global_health = GetHealth01("","Health");
13589 array<string> zones = new array<string>;
13590 GetDamageZones(zones);
13591
13592 for (int i = 0; i < zones.Count(); i++)
13593 {
13594 SetHealth01(zones.Get(i),"Health",global_health);
13595 }
13596 }
13597
13600 {
13601 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13602 }
13603
13605 {
13606 if (!hasRootAsPlayer)
13607 {
13608 if (refParentIB)
13609 {
13610
13611 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13612 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13613
13614 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13615 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13616
13619 }
13620 else
13621 {
13622
13625 }
13626 }
13627 }
13628
13630 {
13632 {
13633 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13634 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13635 {
13636 float heatPermCoef = 1.0;
13638 while (ent)
13639 {
13640 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13641 ent = ent.GetHierarchyParent();
13642 }
13643
13644 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13645 }
13646 }
13647 }
13648
13650 {
13651
13652 EntityAI parent = GetHierarchyParent();
13653 if (!parent)
13654 {
13655 hasParent = false;
13656 hasRootAsPlayer = false;
13657 }
13658 else
13659 {
13660 hasParent = true;
13661 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13662 refParentIB =
ItemBase.Cast(parent);
13663 }
13664 }
13665
13666 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13667 {
13668
13669 }
13670
13672 {
13673
13674 return false;
13675 }
13676
13678 {
13679
13680
13681 return false;
13682 }
13683
13685 {
13686
13687 return false;
13688 }
13689
13692 {
13693 return !GetIsFrozen() &&
IsOpen();
13694 }
13695
13697 {
13698 bool hasParent = false, hasRootAsPlayer = false;
13700
13701 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13702 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13703
13704 if (wwtu || foodDecay)
13705 {
13709
13710 if (processWetness || processTemperature || processDecay)
13711 {
13713
13714 if (processWetness)
13715 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13716
13717 if (processTemperature)
13719
13720 if (processDecay)
13721 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13722 }
13723 }
13724 }
13725
13728 {
13730 }
13731
13733 {
13736
13737 return super.GetTemperatureFreezeThreshold();
13738 }
13739
13741 {
13744
13745 return super.GetTemperatureThawThreshold();
13746 }
13747
13749 {
13752
13753 return super.GetItemOverheatThreshold();
13754 }
13755
13757 {
13759 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13760
13761 return super.GetTemperatureFreezeTime();
13762 }
13763
13765 {
13767 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13768
13769 return super.GetTemperatureThawTime();
13770 }
13771
13776
13778 {
13779 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13780 }
13781
13783 {
13784 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13785 }
13786
13789 {
13791 }
13792
13794 {
13796 }
13797
13799 {
13801 }
13802
13805 {
13806 return null;
13807 }
13808
13811 {
13812 return false;
13813 }
13814
13816 {
13818 {
13821 if (!trg)
13822 {
13824 explosive = this;
13825 }
13826
13827 explosive.PairRemote(trg);
13829
13830 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13831 trg.SetPersistentPairID(persistentID);
13832 explosive.SetPersistentPairID(persistentID);
13833
13834 return true;
13835 }
13836 return false;
13837 }
13838
13841 {
13842 float ret = 1.0;
13845 ret *= GetHealth01();
13846
13847 return ret;
13848 }
13849
13850 #ifdef DEVELOPER
13851 override void SetDebugItem()
13852 {
13853 super.SetDebugItem();
13854 _itemBase = this;
13855 }
13856
13858 {
13859 string text = super.GetDebugText();
13860
13862 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13863
13864 return text;
13865 }
13866 #endif
13867
13869 {
13870 return true;
13871 }
13872
13874
13876
13878 {
13881 }
13882
13883
13891
13907}
13908
13910{
13912 if (entity)
13913 {
13914 bool is_item = entity.IsInherited(
ItemBase);
13915 if (is_item && full_quantity)
13916 {
13919 }
13920 }
13921 else
13922 {
13924 return NULL;
13925 }
13926 return entity;
13927}
13928
13930{
13931 if (item)
13932 {
13933 if (health > 0)
13934 item.SetHealth("", "", health);
13935
13936 if (item.CanHaveTemperature())
13937 {
13939 if (item.CanFreeze())
13940 item.SetFrozen(false);
13941 }
13942
13943 if (item.HasEnergyManager())
13944 {
13945 if (quantity >= 0)
13946 {
13947 item.GetCompEM().SetEnergy0To1(quantity);
13948 }
13949 else
13950 {
13952 }
13953 }
13954 else if (item.IsMagazine())
13955 {
13956 Magazine mag = Magazine.Cast(item);
13957 if (quantity >= 0)
13958 {
13959 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13960 }
13961 else
13962 {
13964 }
13965
13966 }
13967 else
13968 {
13969 if (quantity >= 0)
13970 {
13971 item.SetQuantityNormalized(quantity, false);
13972 }
13973 else
13974 {
13976 }
13977
13978 }
13979 }
13980}
13981
13982#ifdef DEVELOPER
13984#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.