9180{
9182 {
9183 return true;
9184 }
9185};
9186
9187
9188
9190{
9194
9196
9199
9200
9201
9202
9203
9212
9218
9223
9228
9249 protected bool m_IsResultOfSplit
9250
9252
9257
9258
9259
9261
9265
9266
9267
9269
9272
9273
9274
9280
9281
9289
9292
9293
9295
9296
9298
9299
9304
9305
9310
9311
9313
9314
9316 {
9321
9322 if (!
GetGame().IsDedicatedServer())
9323 {
9325 {
9327
9329 {
9331 }
9332 }
9333
9336 }
9337
9338 m_OldLocation = null;
9339
9341 {
9343 }
9344
9345 if (ConfigIsExisting("headSelectionsToHide"))
9346 {
9349 }
9350
9352 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9353 {
9355 }
9356
9358
9359 m_IsResultOfSplit = false;
9360
9362 }
9363
9365 {
9366 super.InitItemVariables();
9367
9373 m_Count = ConfigGetInt(
"count");
9374
9377
9382
9385
9390
9402
9406
9407
9410 if (ConfigIsExisting("canBeSplit"))
9411 {
9414 }
9415
9417 if (ConfigIsExisting("itemBehaviour"))
9419
9420
9423 RegisterNetSyncVariableInt("m_VarLiquidType");
9424 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9425
9426 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9427 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9428 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9429
9430 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9431 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9432 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9433 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9434
9435 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9436 RegisterNetSyncVariableBool("m_IsTakeable");
9437 RegisterNetSyncVariableBool("m_IsHologram");
9438
9441 {
9444 }
9445
9447
9449 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9451
9452 }
9453
9455 {
9457 }
9458
9460 {
9463 {
9468 }
9469 }
9470
9471 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9472 {
9474 {
9477 }
9478
9480 }
9481
9483 {
9489 }
9490
9492
9494 {
9496
9497 if (!action)
9498 {
9499 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9500 return;
9501 }
9502
9504 if (!ai)
9505 {
9507 return;
9508 }
9509
9511 if (!action_array)
9512 {
9513 action_array = new array<ActionBase_Basic>;
9515 }
9516 if (LogManager.IsActionLogEnable())
9517 {
9518 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9519 }
9520
9521 if (action_array.Find(action) != -1)
9522 {
9523 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9524 }
9525 else
9526 {
9527 action_array.Insert(action);
9528 }
9529 }
9530
9532 {
9534 ActionBase action = player.GetActionManager().GetAction(actionName);
9537
9538 if (action_array)
9539 {
9540 action_array.RemoveItem(action);
9541 }
9542 }
9543
9544
9545
9547 {
9548 ActionOverrideData overrideData = new ActionOverrideData();
9552
9554 if (!actionMap)
9555 {
9558 }
9559
9560 actionMap.Insert(this.
Type(), overrideData);
9561
9562 }
9563
9565
9567
9568
9570 {
9573
9576
9577 string config_to_search = "CfgVehicles";
9578 string muzzle_owner_config;
9579
9581 {
9582 if (IsInherited(Weapon))
9583 config_to_search = "CfgWeapons";
9584
9585 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9586
9587 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9588
9590
9591 if (config_OnFire_subclass_count > 0)
9592 {
9593 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9594
9595 for (int i = 0; i < config_OnFire_subclass_count; i++)
9596 {
9597 string particle_class = "";
9599 string config_OnFire_entry = config_OnFire_class + particle_class;
9600 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9601 WPOF_array.Insert(WPOF);
9602 }
9603
9604
9606 }
9607 }
9608
9610 {
9611 config_to_search = "CfgWeapons";
9612 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9613
9614 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9615
9617
9618 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9619 {
9620 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9621
9622 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9623 {
9624 string particle_class2 = "";
9626 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9627 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9628 WPOBE_array.Insert(WPOBE);
9629 }
9630
9631
9633 }
9634 }
9635 }
9636
9637
9639 {
9642
9644 {
9645 string config_to_search = "CfgVehicles";
9646
9647 if (IsInherited(Weapon))
9648 config_to_search = "CfgWeapons";
9649
9650 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9651 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9652
9653 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9654 {
9655
9657
9659 {
9661 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9663 return;
9664 }
9665
9668
9669
9670
9672 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9673
9674 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9675 {
9676 string particle_class = "";
9678 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9680
9681 if (entry_type == CT_CLASS)
9682 {
9683 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9684 WPOOH_array.Insert(WPOF);
9685 }
9686 }
9687
9688
9690 }
9691 }
9692 }
9693
9695 {
9697 }
9698
9700 {
9702 {
9704
9707
9710
9711 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9712 }
9713 }
9714
9716 {
9718 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9719
9721 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9722
9724 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9725
9727 {
9729 }
9730 }
9731
9733 {
9735 }
9736
9738 {
9741 else
9743
9745 {
9748 }
9749 else
9750 {
9753
9756 }
9757
9759 }
9760
9762 {
9764 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9765 }
9766
9768 {
9770 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9772 }
9773
9775 {
9777 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9778 }
9779
9781 {
9784
9785 OverheatingParticle OP = new OverheatingParticle();
9790
9792 }
9793
9795 {
9798
9799 return -1;
9800 }
9801
9803 {
9805 {
9808
9809 for (int i = count; i > 0; --i)
9810 {
9811 int id = i - 1;
9814
9817
9818 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9819 {
9820 if (p)
9821 {
9824 }
9825 }
9826 }
9827 }
9828 }
9829
9831 {
9833 {
9835 {
9836 int id = i - 1;
9838
9839 if (OP)
9840 {
9842
9843 if (p)
9844 {
9846 }
9847
9848 delete OP;
9849 }
9850 }
9851
9854 }
9855 }
9856
9859 {
9860 return 0.0;
9861 }
9862
9863
9865 {
9866 return 250;
9867 }
9868
9870 {
9871 return 0;
9872 }
9873
9876 {
9878 return true;
9879
9880 return false;
9881 }
9882
9885 {
9888
9890 {
9892 }
9893 else
9894 {
9895
9897 }
9898
9900 }
9901
9908 {
9909 return -1;
9910 }
9911
9912
9913
9914
9916 {
9918 {
9920 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9921
9922 if (r_index >= 0)
9923 {
9924 InventoryLocation r_il = new InventoryLocation;
9925 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9926
9927 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9930 {
9931 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9932 }
9934 {
9935 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9936 }
9937
9938 }
9939
9940 player.GetHumanInventory().ClearUserReservedLocation(this);
9941 }
9942
9945 }
9946
9947
9948
9949
9951 {
9952 return ItemBase.m_DebugActionsMask;
9953 }
9954
9956 {
9957 return ItemBase.m_DebugActionsMask & mask;
9958 }
9959
9961 {
9962 ItemBase.m_DebugActionsMask = mask;
9963 }
9964
9966 {
9967 ItemBase.m_DebugActionsMask |= mask;
9968 }
9969
9971 {
9972 ItemBase.m_DebugActionsMask &= ~mask;
9973 }
9974
9976 {
9978 {
9980 }
9981 else
9982 {
9984 }
9985 }
9986
9987
9989 {
9990 if (GetEconomyProfile())
9991 {
9992 float q_max = GetEconomyProfile().GetQuantityMax();
9993 if (q_max > 0)
9994 {
9995 float q_min = GetEconomyProfile().GetQuantityMin();
9996 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9997
9999 {
10000 ComponentEnergyManager comp = GetCompEM();
10002 {
10004 }
10005 }
10007 {
10009
10010 }
10011
10012 }
10013 }
10014 }
10015
10018 {
10019 EntityAI parent = GetHierarchyParent();
10020
10021 if (parent)
10022 {
10023 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10024 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10025 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10026 }
10027 }
10028
10031 {
10032 EntityAI parent = GetHierarchyParent();
10033
10034 if (parent)
10035 {
10036 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10037 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10038 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10039 }
10040 }
10041
10043 {
10044
10045
10046
10047
10049
10051 {
10052 if (ScriptInputUserData.CanStoreInputUserData())
10053 {
10054 ScriptInputUserData ctx = new ScriptInputUserData;
10060 ctx.
Write(use_stack_max);
10063
10065 {
10066 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10067 }
10068 }
10069 }
10070 else if (!
GetGame().IsMultiplayer())
10071 {
10073 }
10074 }
10075
10077 {
10079 }
10080
10082 {
10084 }
10085
10087 {
10089 }
10090
10092 {
10093
10094 return false;
10095 }
10096
10098 {
10099 return false;
10100 }
10101
10105 {
10106 return false;
10107 }
10108
10110 {
10111 return "";
10112 }
10113
10115
10117 {
10118 return false;
10119 }
10120
10122 {
10123 return true;
10124 }
10125
10126
10127
10129 {
10130 return true;
10131 }
10132
10134 {
10135 return true;
10136 }
10137
10139 {
10140 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10142 }
10143
10145 {
10147 }
10148
10150 {
10152 if (!is_being_placed)
10154 SetSynchDirty();
10155 }
10156
10157
10159
10161 {
10163 }
10164
10166 {
10168 }
10169
10171 {
10172 return 1;
10173 }
10174
10176 {
10177 return false;
10178 }
10179
10181 {
10183 SetSynchDirty();
10184 }
10185
10186
10187
10188
10189
10190
10191
10192
10193
10194
10195
10196
10197
10198
10199
10200
10201
10202
10203
10204
10205
10206
10207
10208
10209
10210
10211
10212
10213
10214
10215
10216
10217
10218
10219
10221 {
10222 super.OnMovedInsideCargo(container);
10223
10224 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10225 }
10226
10227 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10228 {
10229 super.EEItemLocationChanged(oldLoc,newLoc);
10230
10231 PlayerBase new_player = null;
10232 PlayerBase old_player = null;
10233
10234 if (newLoc.GetParent())
10235 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10236
10237 if (oldLoc.GetParent())
10238 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10239
10241 {
10242 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10243
10244 if (r_index >= 0)
10245 {
10246 InventoryLocation r_il = new InventoryLocation;
10247 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10248
10249 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10252 {
10253 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10254 }
10256 {
10257 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10258 }
10259
10260 }
10261 }
10262
10264 {
10265 if (new_player)
10266 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10267
10268 if (new_player == old_player)
10269 {
10270
10271 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10272 {
10274 {
10275 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10276 {
10277 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10278 }
10279 }
10280 else
10281 {
10282 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10283 }
10284 }
10285
10286 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10287 {
10288 int type = oldLoc.GetType();
10290 {
10291 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10292 }
10294 {
10295 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10296 }
10297 }
10298 if (!m_OldLocation)
10299 {
10300 m_OldLocation = new InventoryLocation;
10301 }
10302 m_OldLocation.Copy(oldLoc);
10303 }
10304 else
10305 {
10306 if (m_OldLocation)
10307 {
10308 m_OldLocation.Reset();
10309 }
10310 }
10311
10313 }
10314 else
10315 {
10316 if (new_player)
10317 {
10318 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10319 if (res_index >= 0)
10320 {
10321 InventoryLocation il = new InventoryLocation;
10322 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10324 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10327 {
10328 il.
GetParent().GetOnReleaseLock().Invoke(it);
10329 }
10331 {
10333 }
10334
10335 }
10336 }
10338 {
10339
10341 }
10342
10343 if (m_OldLocation)
10344 {
10345 m_OldLocation.Reset();
10346 }
10347 }
10348 }
10349
10350 override void EOnContact(IEntity other, Contact extra)
10351 {
10353 {
10354 int liquidType = -1;
10356 if (impactSpeed > 0.0)
10357 {
10359 #ifndef SERVER
10361 #else
10363 SetSynchDirty();
10364 #endif
10366 }
10367 }
10368
10369 #ifdef SERVER
10370 if (GetCompEM() && GetCompEM().IsPlugged())
10371 {
10372 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10373 GetCompEM().UnplugThis();
10374 }
10375 #endif
10376 }
10377
10379
10381 {
10383 }
10384
10386 {
10387
10388 }
10389
10391 {
10392 super.OnItemLocationChanged(old_owner, new_owner);
10393
10394 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10395 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10396
10397 if (!relatedPlayer && playerNew)
10398 relatedPlayer = playerNew;
10399
10400 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10401 {
10403 if (actionMgr)
10404 {
10405 ActionBase currentAction = actionMgr.GetRunningAction();
10406 if (currentAction)
10408 }
10409 }
10410
10411 Man ownerPlayerOld = null;
10412 Man ownerPlayerNew = null;
10413
10414 if (old_owner)
10415 {
10416 if (old_owner.
IsMan())
10417 {
10418 ownerPlayerOld = Man.Cast(old_owner);
10419 }
10420 else
10421 {
10422 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10423 }
10424 }
10425 else
10426 {
10428 {
10430
10431 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10432 {
10433 GetCompEM().UnplugThis();
10434 }
10435 }
10436 }
10437
10438 if (new_owner)
10439 {
10440 if (new_owner.
IsMan())
10441 {
10442 ownerPlayerNew = Man.Cast(new_owner);
10443 }
10444 else
10445 {
10446 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10447 }
10448 }
10449
10450 if (ownerPlayerOld != ownerPlayerNew)
10451 {
10452 if (ownerPlayerOld)
10453 {
10454 array<EntityAI> subItemsExit = new array<EntityAI>;
10456 for (int i = 0; i < subItemsExit.Count(); i++)
10457 {
10460 }
10461 }
10462
10463 if (ownerPlayerNew)
10464 {
10465 array<EntityAI> subItemsEnter = new array<EntityAI>;
10467 for (int j = 0; j < subItemsEnter.Count(); j++)
10468 {
10471 }
10472 }
10473 }
10474 else if (ownerPlayerNew != null)
10475 {
10476 PlayerBase nplayer;
10477 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10478 {
10479 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10481 for (int k = 0; k < subItemsUpdate.Count(); k++)
10482 {
10484 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10485 }
10486 }
10487 }
10488
10489 if (old_owner)
10490 old_owner.OnChildItemRemoved(this);
10491 if (new_owner)
10492 new_owner.OnChildItemReceived(this);
10493 }
10494
10495
10497 {
10498 super.EEDelete(parent);
10499 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10500 if (player)
10501 {
10503
10504 if (player.IsAlive())
10505 {
10506 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10507 if (r_index >= 0)
10508 {
10509 InventoryLocation r_il = new InventoryLocation;
10510 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10511
10512 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10515 {
10516 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10517 }
10519 {
10520 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10521 }
10522
10523 }
10524
10525 player.RemoveQuickBarEntityShortcut(this);
10526 }
10527 }
10528 }
10529
10531 {
10532 super.EEKilled(killer);
10533
10536 {
10537 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10538 {
10539 if (IsMagazine())
10540 {
10541 if (Magazine.Cast(this).GetAmmoCount() > 0)
10542 {
10544 }
10545 }
10546 else
10547 {
10549 }
10550 }
10551 }
10552 }
10553
10555 {
10556 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10557
10558 super.OnWasAttached(parent, slot_id);
10559
10562
10564 }
10565
10567 {
10568 super.OnWasDetached(parent, slot_id);
10569
10572 }
10573
10575 {
10576 int idx;
10579
10580 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10581 if (inventory_slots.Count() < 1)
10582 {
10583 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10584 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10585 }
10586 else
10587 {
10588 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10589 }
10590
10591 idx = inventory_slots.Find(slot);
10592 if (idx < 0)
10593 return "";
10594
10595 return attach_types.Get(idx);
10596 }
10597
10599 {
10600 int idx = -1;
10601 string slot;
10602
10605
10606 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10607 if (inventory_slots.Count() < 1)
10608 {
10609 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10610 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10611 }
10612 else
10613 {
10614 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10615 if (detach_types.Count() < 1)
10616 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10617 }
10618
10619 for (int i = 0; i < inventory_slots.Count(); i++)
10620 {
10621 slot = inventory_slots.Get(i);
10622 }
10623
10624 if (slot != "")
10625 {
10626 if (detach_types.Count() == 1)
10627 idx = 0;
10628 else
10629 idx = inventory_slots.Find(slot);
10630 }
10631 if (idx < 0)
10632 return "";
10633
10634 return detach_types.Get(idx);
10635 }
10636
10638 {
10639
10641
10642
10643 float min_time = 1;
10644 float max_time = 3;
10645 float delay = Math.RandomFloat(min_time, max_time);
10646
10647 explode_timer.Run(delay, this, "DoAmmoExplosion");
10648 }
10649
10651 {
10652 Magazine magazine = Magazine.Cast(this);
10653 int pop_sounds_count = 6;
10654 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10655
10656
10657 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10658 string sound_name = pop_sounds[ sound_idx ];
10660
10661
10662 magazine.ServerAddAmmoCount(-1);
10663
10664
10665 float min_temp_to_explode = 100;
10666
10667 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10668 {
10670 }
10671 }
10672
10673
10674 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10675 {
10676 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10677
10678 const int CHANCE_DAMAGE_CARGO = 4;
10679 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10680 const int CHANCE_DAMAGE_NOTHING = 2;
10681
10683 {
10684 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10685 int chances;
10686 int rnd;
10687
10688 if (GetInventory().GetCargo())
10689 {
10690 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10691 rnd = Math.RandomInt(0,chances);
10692
10693 if (rnd < CHANCE_DAMAGE_CARGO)
10694 {
10696 }
10697 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10698 {
10700 }
10701 }
10702 else
10703 {
10704 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10705 rnd = Math.RandomInt(0,chances);
10706
10707 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10708 {
10710 }
10711 }
10712 }
10713 }
10714
10716 {
10717 if (GetInventory().GetCargo())
10718 {
10719 int item_count = GetInventory().GetCargo().GetItemCount();
10720 if (item_count > 0)
10721 {
10722 int random_pick = Math.RandomInt(0, item_count);
10724 if (!item.IsExplosive())
10725 {
10726 item.AddHealth("","",damage);
10727 return true;
10728 }
10729 }
10730 }
10731 return false;
10732 }
10733
10735 {
10736 int attachment_count = GetInventory().AttachmentCount();
10737 if (attachment_count > 0)
10738 {
10739 int random_pick = Math.RandomInt(0, attachment_count);
10740 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10741 if (!attachment.IsExplosive())
10742 {
10743 attachment.AddHealth("","",damage);
10744 return true;
10745 }
10746 }
10747 return false;
10748 }
10749
10751 {
10753 }
10754
10756 {
10758 return GetInventory().CanRemoveEntity();
10759
10760 return false;
10761 }
10762
10764 {
10765
10767 return false;
10768
10769
10771 return false;
10772
10773
10774
10776 if (delta == 0)
10777 return false;
10778
10779
10780 return true;
10781 }
10782
10784 {
10786 {
10787 if (ScriptInputUserData.CanStoreInputUserData())
10788 {
10789 ScriptInputUserData ctx = new ScriptInputUserData;
10794 ctx.
Write(destination_entity);
10796 ctx.
Write(slot_id);
10798 }
10799 }
10800 else if (!
GetGame().IsMultiplayer())
10801 {
10803 }
10804 }
10805
10807 {
10808 float split_quantity_new;
10812 InventoryLocation loc = new InventoryLocation;
10813
10814 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10815 {
10817 split_quantity_new = stack_max;
10818 else
10820
10822 {
10823 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10824 if (new_item)
10825 {
10826 new_item.SetResultOfSplit(true);
10827 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10829 new_item.
SetQuantity(split_quantity_new,
false,
true);
10830 }
10831 }
10832 }
10833 else if (destination_entity && slot_id == -1)
10834 {
10835 if (quantity > stack_max)
10836 split_quantity_new = stack_max;
10837 else
10838 split_quantity_new = quantity;
10839
10841 {
10843 {
10846 }
10847
10848 if (new_item)
10849 {
10850 new_item.SetResultOfSplit(true);
10851 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10853 new_item.
SetQuantity(split_quantity_new,
false,
true);
10854 }
10855 }
10856 }
10857 else
10858 {
10859 if (stack_max != 0)
10860 {
10862 {
10864 }
10865
10866 if (split_quantity_new == 0)
10867 {
10868 if (!
GetGame().IsMultiplayer())
10869 player.PhysicalPredictiveDropItem(this);
10870 else
10871 player.ServerDropEntity(this);
10872 return;
10873 }
10874
10876 {
10878
10879 if (new_item)
10880 {
10881 new_item.SetResultOfSplit(true);
10882 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10885 new_item.PlaceOnSurface();
10886 }
10887 }
10888 }
10889 }
10890 }
10891
10893 {
10894 float split_quantity_new;
10898 InventoryLocation loc = new InventoryLocation;
10899
10900 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10901 {
10903 split_quantity_new = stack_max;
10904 else
10906
10908 {
10909 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10910 if (new_item)
10911 {
10912 new_item.SetResultOfSplit(true);
10913 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10915 new_item.
SetQuantity(split_quantity_new,
false,
true);
10916 }
10917 }
10918 }
10919 else if (destination_entity && slot_id == -1)
10920 {
10921 if (quantity > stack_max)
10922 split_quantity_new = stack_max;
10923 else
10924 split_quantity_new = quantity;
10925
10927 {
10929 {
10932 }
10933
10934 if (new_item)
10935 {
10936 new_item.SetResultOfSplit(true);
10937 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10939 new_item.
SetQuantity(split_quantity_new,
false,
true);
10940 }
10941 }
10942 }
10943 else
10944 {
10945 if (stack_max != 0)
10946 {
10948 {
10950 }
10951
10953 {
10955
10956 if (new_item)
10957 {
10958 new_item.SetResultOfSplit(true);
10959 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10962 new_item.PlaceOnSurface();
10963 }
10964 }
10965 }
10966 }
10967 }
10968
10970 {
10972 {
10973 if (ScriptInputUserData.CanStoreInputUserData())
10974 {
10975 ScriptInputUserData ctx = new ScriptInputUserData;
10980 dst.WriteToContext(ctx);
10982 }
10983 }
10984 else if (!
GetGame().IsMultiplayer())
10985 {
10987 }
10988 }
10989
10991 {
10993 {
10994 if (ScriptInputUserData.CanStoreInputUserData())
10995 {
10996 ScriptInputUserData ctx = new ScriptInputUserData;
11001 ctx.
Write(destination_entity);
11007 }
11008 }
11009 else if (!
GetGame().IsMultiplayer())
11010 {
11012 }
11013 }
11014
11016 {
11018 }
11019
11021 {
11023 float split_quantity_new;
11025 if (dst.IsValid())
11026 {
11027 int slot_id = dst.GetSlot();
11029
11030 if (quantity > stack_max)
11031 split_quantity_new = stack_max;
11032 else
11033 split_quantity_new = quantity;
11034
11036 {
11038
11039 if (new_item)
11040 {
11041 new_item.SetResultOfSplit(true);
11042 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11044 new_item.
SetQuantity(split_quantity_new,
false,
true);
11045 }
11046
11047 return new_item;
11048 }
11049 }
11050
11051 return null;
11052 }
11053
11055 {
11057 float split_quantity_new;
11059 if (destination_entity)
11060 {
11062 if (quantity > stackable)
11063 split_quantity_new = stackable;
11064 else
11065 split_quantity_new = quantity;
11066
11068 {
11069 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11070 if (new_item)
11071 {
11072 new_item.SetResultOfSplit(true);
11073 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11075 new_item.
SetQuantity(split_quantity_new,
false,
true);
11076 }
11077 }
11078 }
11079 }
11080
11082 {
11084 {
11085 if (ScriptInputUserData.CanStoreInputUserData())
11086 {
11087 ScriptInputUserData ctx = new ScriptInputUserData;
11092 ItemBase destination_entity =
this;
11093 ctx.
Write(destination_entity);
11097 }
11098 }
11099 else if (!
GetGame().IsMultiplayer())
11100 {
11102 }
11103 }
11104
11106 {
11108 float split_quantity_new;
11110 if (player)
11111 {
11113 if (quantity > stackable)
11114 split_quantity_new = stackable;
11115 else
11116 split_quantity_new = quantity;
11117
11119 {
11120 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11121 new_item =
ItemBase.Cast(in_hands);
11122 if (new_item)
11123 {
11124 new_item.SetResultOfSplit(true);
11125 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11127 new_item.SetQuantity(split_quantity_new, false, true);
11128 }
11129 }
11130 }
11131 }
11132
11134 {
11136 float split_quantity_new = Math.Floor(quantity * 0.5);
11137
11139 return;
11140
11142
11143 if (new_item)
11144 {
11145 if (new_item.GetQuantityMax() < split_quantity_new)
11146 {
11147 split_quantity_new = new_item.GetQuantityMax();
11148 }
11149
11150 new_item.SetResultOfSplit(true);
11151 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11152
11154 {
11157 }
11158 else
11159 {
11161 new_item.
SetQuantity(split_quantity_new,
false,
true);
11162 }
11163 }
11164 }
11165
11167 {
11169 float split_quantity_new = Math.Floor(quantity / 2);
11170
11172 return;
11173
11174 InventoryLocation invloc = new InventoryLocation;
11176
11178 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11179
11180 if (new_item)
11181 {
11182 if (new_item.GetQuantityMax() < split_quantity_new)
11183 {
11184 split_quantity_new = new_item.GetQuantityMax();
11185 }
11187 {
11190 }
11191 else if (split_quantity_new > 1)
11192 {
11194 new_item.
SetQuantity(split_quantity_new,
false,
true);
11195 }
11196 }
11197 }
11198
11201 {
11202 SetWeightDirty();
11204
11205 if (parent)
11206 parent.OnAttachmentQuantityChangedEx(this, delta);
11207
11209 {
11211 {
11213 }
11215 {
11216 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11218 }
11219 }
11220
11221 }
11222
11225 {
11226
11227 }
11228
11231 {
11233 }
11234
11236 {
11237 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11238
11240 {
11241 if (newLevel == GameConstants.STATE_RUINED)
11242 {
11244 EntityAI parent = GetHierarchyParent();
11245 if (parent && parent.IsFireplace())
11246 {
11247 CargoBase cargo = GetInventory().GetCargo();
11248 if (cargo)
11249 {
11251 {
11253 }
11254 }
11255 }
11256 }
11257
11259 {
11260
11262 return;
11263 }
11264
11265 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11266 {
11268 }
11269 }
11270 }
11271
11272
11274 {
11275 super.OnRightClick();
11276
11278 {
11280 {
11281 if (ScriptInputUserData.CanStoreInputUserData())
11282 {
11283 EntityAI root = GetHierarchyRoot();
11284 Man playerOwner = GetHierarchyRootPlayer();
11285 InventoryLocation dst = new InventoryLocation;
11286
11287
11288 if (!playerOwner && root && root == this)
11289 {
11291 }
11292 else
11293 {
11294
11295 GetInventory().GetCurrentInventoryLocation(dst);
11297 {
11300 {
11302 }
11303 else
11304 {
11306
11307
11308 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11309 {
11311 }
11312 else
11313 {
11314 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11315 }
11316 }
11317 }
11318 }
11319
11320 ScriptInputUserData ctx = new ScriptInputUserData;
11328 }
11329 }
11330 else if (!
GetGame().IsMultiplayer())
11331 {
11333 }
11334 }
11335 }
11336
11338 {
11339 if (root)
11340 {
11341 vector m4[4];
11342 root.GetTransform(m4);
11343 dst.SetGround(this, m4);
11344 }
11345 else
11346 {
11347 GetInventory().GetCurrentInventoryLocation(dst);
11348 }
11349 }
11350
11351 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11352 {
11353
11354 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11355 return false;
11356
11357 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11358 return false;
11359
11360
11362 return false;
11363
11364
11365 Magazine mag = Magazine.Cast(this);
11366 if (mag)
11367 {
11368 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11369 return false;
11370
11371 if (stack_max_limit)
11372 {
11373 Magazine other_mag = Magazine.Cast(other_item);
11374 if (other_item)
11375 {
11376 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11377 return false;
11378 }
11379
11380 }
11381 }
11382 else
11383 {
11384
11386 return false;
11387
11389 return false;
11390 }
11391
11392 PlayerBase player = null;
11393 if (CastTo(player, GetHierarchyRootPlayer()))
11394 {
11395 if (player.GetInventory().HasAttachment(this))
11396 return false;
11397
11398 if (player.IsItemsToDelete())
11399 return false;
11400 }
11401
11402 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11403 return false;
11404
11405 int slotID;
11407 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11408 return false;
11409
11410 return true;
11411 }
11412
11414 {
11416 }
11417
11419 {
11420 return m_IsResultOfSplit;
11421 }
11422
11424 {
11425 m_IsResultOfSplit = value;
11426 }
11427
11429 {
11431 }
11432
11434 {
11435 float other_item_quantity = other_item.GetQuantity();
11436 float this_free_space;
11437
11439
11441
11442 if (other_item_quantity > this_free_space)
11443 {
11444 return this_free_space;
11445 }
11446 else
11447 {
11448 return other_item_quantity;
11449 }
11450 }
11451
11453 {
11455 }
11456
11458 {
11460 return;
11461
11462 if (!IsMagazine() && other_item)
11463 {
11465 if (quantity_used != 0)
11466 {
11467 float hp1 = GetHealth01("","");
11468 float hp2 = other_item.GetHealth01("","");
11469 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11470 hpResult = hpResult / (
GetQuantity() + quantity_used);
11471
11472 hpResult *= GetMaxHealth();
11473 Math.Round(hpResult);
11474 SetHealth("", "Health", hpResult);
11475
11477 other_item.AddQuantity(-quantity_used);
11478 }
11479 }
11481 }
11482
11484 {
11485 #ifdef SERVER
11486 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11487 GetHierarchyParent().IncreaseLifetimeUp();
11488 #endif
11489 };
11490
11492 {
11493 PlayerBase p = PlayerBase.Cast(player);
11494
11495 array<int> recipesIds = p.m_Recipes;
11496 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11497 if (moduleRecipesManager)
11498 {
11499 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11500 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11501 }
11502
11503 for (int i = 0;i < recipesIds.Count(); i++)
11504 {
11505 int key = recipesIds.Get(i);
11506 string recipeName = moduleRecipesManager.GetRecipeName(key);
11508 }
11509 }
11510
11511
11512 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11513 {
11514 super.GetDebugActions(outputList);
11515
11516
11522
11523
11528
11533
11534
11538
11539
11541 {
11545 }
11546
11549
11550
11554
11556
11557 InventoryLocation loc = new InventoryLocation();
11558 GetInventory().GetCurrentInventoryLocation(loc);
11560 {
11561 if (Gizmo_IsSupported())
11564 }
11565
11567 }
11568
11569
11570
11571
11573 {
11574 super.OnAction(action_id, player, ctx);
11575
11577 {
11578 switch (action_id)
11579 {
11582 return true;
11585 return true;
11586 }
11587 }
11588
11590 {
11591 switch (action_id)
11592 {
11594 Delete();
11595 return true;
11596 }
11597 }
11598
11599 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11600 {
11601 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11602 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11603 PlayerBase p = PlayerBase.Cast(player);
11604 if (
EActions.RECIPES_RANGE_START < 1000)
11605 {
11606 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11607 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11608 }
11609 }
11610 #ifndef SERVER
11611 else if (action_id ==
EActions.WATCH_PLAYER)
11612 {
11613 PluginDeveloper.SetDeveloperItemClientEx(player);
11614 }
11615 #endif
11617 {
11618 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11619 {
11620 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11621 OnDebugButtonPressServer(id + 1);
11622 }
11623
11624 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11625 {
11626 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11628 }
11629
11630 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11631 {
11632 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11634 }
11635
11636 else if (action_id ==
EActions.ADD_QUANTITY)
11637 {
11638 if (IsMagazine())
11639 {
11640 Magazine mag = Magazine.Cast(this);
11641 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11642 }
11643 else
11644 {
11646 }
11647
11648 if (m_EM)
11649 {
11650 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11651 }
11652
11653 }
11654
11655 else if (action_id ==
EActions.REMOVE_QUANTITY)
11656 {
11657 if (IsMagazine())
11658 {
11659 Magazine mag2 = Magazine.Cast(this);
11660 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11661 }
11662 else
11663 {
11665 }
11666 if (m_EM)
11667 {
11668 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11669 }
11670
11671 }
11672
11673 else if (action_id ==
EActions.SET_QUANTITY_0)
11674 {
11676
11677 if (m_EM)
11678 {
11679 m_EM.SetEnergy(0);
11680 }
11681 }
11682
11683 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11684 {
11686
11687 if (m_EM)
11688 {
11689 m_EM.SetEnergy(m_EM.GetEnergyMax());
11690 }
11691 }
11692
11693 else if (action_id ==
EActions.ADD_HEALTH)
11694 {
11695 AddHealth("","",GetMaxHealth("","Health")/5);
11696 }
11697 else if (action_id ==
EActions.REMOVE_HEALTH)
11698 {
11699 AddHealth("","",-GetMaxHealth("","Health")/5);
11700 }
11701 else if (action_id ==
EActions.DESTROY_HEALTH)
11702 {
11703 SetHealth01("","",0);
11704 }
11705 else if (action_id ==
EActions.WATCH_ITEM)
11706 {
11708 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11709 #ifdef DEVELOPER
11710 SetDebugDeveloper_item(this);
11711 #endif
11712 }
11713
11714 else if (action_id ==
EActions.ADD_TEMPERATURE)
11715 {
11716 AddTemperature(20);
11717
11718 }
11719
11720 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11721 {
11722 AddTemperature(-20);
11723
11724 }
11725
11726 else if (action_id ==
EActions.FLIP_FROZEN)
11727 {
11728 SetFrozen(!GetIsFrozen());
11729
11730 }
11731
11732 else if (action_id ==
EActions.ADD_WETNESS)
11733 {
11735
11736 }
11737
11738 else if (action_id ==
EActions.REMOVE_WETNESS)
11739 {
11741
11742 }
11743
11744 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11745 {
11748
11749
11750 }
11751
11752 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11753 {
11756 }
11757
11758 else if (action_id ==
EActions.MAKE_SPECIAL)
11759 {
11760 auto debugParams = DebugSpawnParams.WithPlayer(player);
11761 OnDebugSpawnEx(debugParams);
11762 }
11763
11764 }
11765
11766
11767 return false;
11768 }
11769
11770
11771
11772
11776
11779
11780
11781
11783 {
11784 return false;
11785 }
11786
11787
11789 {
11790 return true;
11791 }
11792
11793
11795 {
11796 return true;
11797 }
11798
11799
11800
11802 {
11803 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11805 }
11806
11809 {
11810 return null;
11811 }
11812
11814 {
11815 return false;
11816 }
11817
11819 {
11820 return false;
11821 }
11822
11826
11827
11829 {
11830 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11831 return module_repairing.CanRepair(this, item_repair_kit);
11832 }
11833
11834
11835 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11836 {
11837 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11838 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11839 }
11840
11841
11843 {
11844
11845
11846
11847
11848
11849
11850
11851
11852 return 1;
11853 }
11854
11855
11856
11858 {
11860 }
11861
11862
11863
11865 {
11867 }
11868
11869
11878 {
11879 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11880
11881 if (player)
11882 {
11883 player.MessageStatus(text);
11884 }
11885 }
11886
11887
11896 {
11897 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11898
11899 if (player)
11900 {
11901 player.MessageAction(text);
11902 }
11903 }
11904
11905
11914 {
11915 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11916
11917 if (player)
11918 {
11919 player.MessageFriendly(text);
11920 }
11921 }
11922
11923
11932 {
11933 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11934
11935 if (player)
11936 {
11937 player.MessageImportant(text);
11938 }
11939 }
11940
11942 {
11943 return true;
11944 }
11945
11946
11947 override bool KindOf(
string tag)
11948 {
11949 bool found = false;
11950 string item_name = this.
GetType();
11953
11954 int array_size = item_tag_array.Count();
11955 for (int i = 0; i < array_size; i++)
11956 {
11957 if (item_tag_array.Get(i) == tag)
11958 {
11959 found = true;
11960 break;
11961 }
11962 }
11963 return found;
11964 }
11965
11966
11968 {
11969
11970 super.OnRPC(sender, rpc_type,ctx);
11971
11972
11973 switch (rpc_type)
11974 {
11975 #ifndef SERVER
11976 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11977 Param2<bool, string> p = new Param2<bool, string>(false, "");
11978
11980 return;
11981
11982 bool play = p.param1;
11983 string soundSet = p.param2;
11984
11985 if (play)
11986 {
11988 {
11990 {
11992 }
11993 }
11994 else
11995 {
11997 }
11998 }
11999 else
12000 {
12002 }
12003
12004 break;
12005 #endif
12006
12007 }
12008
12010 {
12012 }
12013 }
12014
12015
12016
12017
12019 {
12020 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12021 return plugin.GetID(
name);
12022 }
12023
12025 {
12026 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12027 return plugin.GetName(id);
12028 }
12029
12032 {
12033
12034
12035 int varFlags;
12036 if (!ctx.
Read(varFlags))
12037 return;
12038
12039 if (varFlags & ItemVariableFlags.FLOAT)
12040 {
12042 }
12043 }
12044
12046 {
12047
12048 super.SerializeNumericalVars(floats_out);
12049
12050
12051
12053 {
12055 }
12056
12058 {
12060 }
12061
12063 {
12065 }
12066
12068 {
12073 }
12074
12076 {
12078 }
12079 }
12080
12082 {
12083
12084 super.DeSerializeNumericalVars(floats);
12085
12086
12087 int index = 0;
12088 int mask = Math.Round(floats.Get(index));
12089
12090 index++;
12091
12093 {
12095 {
12097 }
12098 else
12099 {
12100 float quantity = floats.Get(index);
12101 SetQuantity(quantity,
true,
false,
false,
false);
12102 }
12103 index++;
12104 }
12105
12107 {
12108 float wet = floats.Get(index);
12110 index++;
12111 }
12112
12114 {
12115 int liquidtype = Math.Round(floats.Get(index));
12117 index++;
12118 }
12119
12121 {
12123 index++;
12125 index++;
12127 index++;
12129 index++;
12130 }
12131
12133 {
12134 int cleanness = Math.Round(floats.Get(index));
12136 index++;
12137 }
12138 }
12139
12141 {
12142 super.WriteVarsToCTX(ctx);
12143
12144
12146 {
12148 }
12149
12151 {
12153 }
12154
12156 {
12158 }
12159
12161 {
12162 int r,g,b,a;
12168 }
12169
12171 {
12173 }
12174 }
12175
12177 {
12178 if (!super.ReadVarsFromCTX(ctx,version))
12179 return false;
12180
12181 int intValue;
12182 float value;
12183
12184 if (version < 140)
12185 {
12186 if (!ctx.
Read(intValue))
12187 return false;
12188
12189 m_VariablesMask = intValue;
12190 }
12191
12193 {
12194 if (!ctx.
Read(value))
12195 return false;
12196
12198 {
12200 }
12201 else
12202 {
12204 }
12205 }
12206
12207 if (version < 140)
12208 {
12210 {
12211 if (!ctx.
Read(value))
12212 return false;
12213 SetTemperatureDirect(value);
12214 }
12215 }
12216
12218 {
12219 if (!ctx.
Read(value))
12220 return false;
12222 }
12223
12225 {
12226 if (!ctx.
Read(intValue))
12227 return false;
12229 }
12230
12232 {
12233 int r,g,b,a;
12235 return false;
12237 return false;
12239 return false;
12241 return false;
12242
12244 }
12245
12247 {
12248 if (!ctx.
Read(intValue))
12249 return false;
12251 }
12252
12253 if (version >= 138 && version < 140)
12254 {
12256 {
12257 if (!ctx.
Read(intValue))
12258 return false;
12259 SetFrozen(intValue);
12260 }
12261 }
12262
12263 return true;
12264 }
12265
12266
12268 {
12271 {
12273 }
12274
12275 if (!super.OnStoreLoad(ctx, version))
12276 {
12278 return false;
12279 }
12280
12281 if (version >= 114)
12282 {
12283 bool hasQuickBarIndexSaved;
12284
12285 if (!ctx.
Read(hasQuickBarIndexSaved))
12286 {
12288 return false;
12289 }
12290
12291 if (hasQuickBarIndexSaved)
12292 {
12293 int itmQBIndex;
12294
12295
12296 if (!ctx.
Read(itmQBIndex))
12297 {
12299 return false;
12300 }
12301
12302 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12303 if (itmQBIndex != -1 && parentPlayer)
12304 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12305 }
12306 }
12307 else
12308 {
12309
12310 PlayerBase player;
12311 int itemQBIndex;
12312 if (version ==
int.
MAX)
12313 {
12314 if (!ctx.
Read(itemQBIndex))
12315 {
12317 return false;
12318 }
12319 }
12320 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12321 {
12322
12323 if (!ctx.
Read(itemQBIndex))
12324 {
12326 return false;
12327 }
12328 if (itemQBIndex != -1 && player)
12329 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12330 }
12331 }
12332
12333 if (version < 140)
12334 {
12335
12336 if (!LoadVariables(ctx, version))
12337 {
12339 return false;
12340 }
12341 }
12342
12343
12345 {
12347 return false;
12348 }
12349 if (version >= 132)
12350 {
12352 if (raib)
12353 {
12355 {
12357 return false;
12358 }
12359 }
12360 }
12361
12363 return true;
12364 }
12365
12366
12367
12369 {
12370 super.OnStoreSave(ctx);
12371
12372 PlayerBase player;
12373 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12374 {
12376
12377 int itemQBIndex = -1;
12378 itemQBIndex = player.FindQuickBarEntityIndex(this);
12379 ctx.
Write(itemQBIndex);
12380 }
12381 else
12382 {
12384 }
12385
12387
12389 if (raib)
12390 {
12392 }
12393 }
12394
12395
12397 {
12398 super.AfterStoreLoad();
12399
12401 {
12403 }
12404
12406 {
12409 }
12410 }
12411
12413 {
12414 super.EEOnAfterLoad();
12415
12417 {
12419 }
12420
12423 }
12424
12426 {
12427 return false;
12428 }
12429
12430
12431
12433 {
12435 {
12436 #ifdef PLATFORM_CONSOLE
12437
12439 {
12441 if (menu)
12442 {
12444 }
12445 }
12446 #endif
12447 }
12448
12450 {
12453 }
12454
12456 {
12457 SetWeightDirty();
12459 }
12461 {
12464 }
12465
12467 {
12470 }
12472 {
12475 }
12476
12477 super.OnVariablesSynchronized();
12478 }
12479
12480
12481
12483 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12484 {
12485 if (!IsServerCheck(allow_client))
12486 return false;
12487
12489 return false;
12490
12493
12494 if (value <= (min + 0.001))
12495 value = min;
12496
12497 if (value == min)
12498 {
12499 if (destroy_config)
12500 {
12501 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12502 if (dstr)
12503 {
12505 this.Delete();
12506 return true;
12507 }
12508 }
12509 else if (destroy_forced)
12510 {
12512 this.Delete();
12513 return true;
12514 }
12515
12517 }
12518
12521
12523 {
12525
12526 if (delta)
12528 }
12529
12531
12532 return false;
12533 }
12534
12535
12537 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12538 {
12540 }
12541
12543 {
12546 }
12547
12549 {
12552 }
12553
12555 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12556 {
12557 float value_clamped = Math.Clamp(value, 0, 1);
12559 SetQuantity(result, destroy_config, destroy_forced);
12560 }
12561
12562
12565 {
12567 }
12568
12570 {
12572 }
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12584 {
12585 int slot = -1;
12586 if (GetInventory())
12587 {
12588 InventoryLocation il = new InventoryLocation;
12589 GetInventory().GetCurrentInventoryLocation(il);
12591 }
12592
12594 }
12595
12597 {
12598 float quantity_max = 0;
12599
12601 {
12602 if (attSlotID != -1)
12603 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12604
12605 if (quantity_max <= 0)
12607 }
12608
12609 if (quantity_max <= 0)
12611
12612 return quantity_max;
12613 }
12614
12616 {
12618 }
12619
12621 {
12623 }
12624
12625
12627 {
12629 }
12630
12632 {
12634 }
12635
12637 {
12639 }
12640
12641
12643 {
12644
12645 float weightEx = GetWeightEx();
12646 float special = GetInventoryAndCargoWeight();
12647 return weightEx - special;
12648 }
12649
12650
12652 {
12654 }
12655
12657 {
12659 {
12660 #ifdef DEVELOPER
12661 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12662 {
12663 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12665 }
12666 #endif
12667
12668 return GetQuantity() * GetConfigWeightModified();
12669 }
12670 else if (HasEnergyManager())
12671 {
12672 #ifdef DEVELOPER
12673 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12674 {
12675 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12676 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12677 }
12678 #endif
12679 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12680 }
12681 else
12682 {
12683 #ifdef DEVELOPER
12684 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12685 {
12686 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12687 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12688 }
12689 #endif
12690 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12691 }
12692 }
12693
12696 {
12697 int item_count = 0;
12699
12700 if (GetInventory().GetCargo() != NULL)
12701 {
12702 item_count = GetInventory().GetCargo().GetItemCount();
12703 }
12704
12705 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12706 {
12707 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12708 if (item)
12709 item_count += item.GetNumberOfItems();
12710 }
12711 return item_count;
12712 }
12713
12716 {
12717 float weight = 0;
12718 float wetness = 1;
12719 if (include_wetness)
12722 {
12723 weight = wetness * m_ConfigWeight;
12724 }
12726 {
12727 weight = 1;
12728 }
12729 return weight;
12730 }
12731
12732
12733
12735 {
12736 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12737 {
12738 GameInventory inv = GetInventory();
12739 array<EntityAI> items = new array<EntityAI>;
12741 for (int i = 0; i < items.Count(); i++)
12742 {
12744 if (item)
12745 {
12747 }
12748 }
12749 }
12750 }
12751
12752
12753
12754
12756 {
12757 float energy = 0;
12758 if (HasEnergyManager())
12759 {
12760 energy = GetCompEM().GetEnergy();
12761 }
12762 return energy;
12763 }
12764
12765
12767 {
12768 super.OnEnergyConsumed();
12769
12771 }
12772
12774 {
12775 super.OnEnergyAdded();
12776
12778 }
12779
12780
12782 {
12783 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12784 {
12786 {
12787 float energy_0to1 = GetCompEM().GetEnergy0To1();
12789 }
12790 }
12791 }
12792
12793
12795 {
12796 return ConfigGetFloat("heatIsolation");
12797 }
12798
12800 {
12802 }
12803
12805 {
12806 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12807 if (
GetGame().ConfigIsExisting(paramPath))
12809
12810 return 0.0;
12811 }
12812
12814 {
12815 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12816 if (
GetGame().ConfigIsExisting(paramPath))
12818
12819 return 0.0;
12820 }
12821
12822 override void SetWet(
float value,
bool allow_client =
false)
12823 {
12824 if (!IsServerCheck(allow_client))
12825 return;
12826
12829
12831
12832 m_VarWet = Math.Clamp(value, min, max);
12833
12835 {
12838 }
12839 }
12840
12841 override void AddWet(
float value)
12842 {
12844 }
12845
12847 {
12849 }
12850
12852 {
12854 }
12855
12857 {
12859 }
12860
12862 {
12864 }
12865
12867 {
12869 }
12870
12871 override void OnWetChanged(
float newVal,
float oldVal)
12872 {
12875 if (newLevel != oldLevel)
12876 {
12878 }
12879 }
12880
12882 {
12883 SetWeightDirty();
12884 }
12885
12887 {
12888 return GetWetLevelInternal(
m_VarWet);
12889 }
12890
12891
12892
12894 {
12896 }
12897
12899 {
12901 }
12902
12904 {
12906 }
12907
12909 {
12911 }
12912
12913
12914
12916 {
12917 if (ConfigIsExisting("itemModelLength"))
12918 {
12919 return ConfigGetFloat("itemModelLength");
12920 }
12921 return 0;
12922 }
12923
12925 {
12926 if (ConfigIsExisting("itemAttachOffset"))
12927 {
12928 return ConfigGetFloat("itemAttachOffset");
12929 }
12930 return 0;
12931 }
12932
12933 override void SetCleanness(
int value,
bool allow_client =
false)
12934 {
12935 if (!IsServerCheck(allow_client))
12936 return;
12937
12939
12941
12944 }
12945
12947 {
12949 }
12950
12952 {
12953 return true;
12954 }
12955
12956
12957
12958
12960 {
12962 }
12963
12965 {
12967 }
12968
12969
12970
12971
12972 override void SetColor(
int r,
int g,
int b,
int a)
12973 {
12979 }
12981 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12982 {
12987 }
12988
12990 {
12992 }
12993
12996 {
12997 int r,g,b,a;
12999 r = r/255;
13000 g = g/255;
13001 b = b/255;
13002 a = a/255;
13003 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13004 }
13005
13006
13007
13008 override void SetLiquidType(
int value,
bool allow_client =
false)
13009 {
13010 if (!IsServerCheck(allow_client))
13011 return;
13012
13017 }
13018
13020 {
13021 return ConfigGetInt("varLiquidTypeInit");
13022 }
13023
13025 {
13027 }
13028
13030 {
13032 SetFrozen(false);
13033 }
13034
13037 {
13038 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13039 }
13040
13041
13044 {
13045 PlayerBase nplayer;
13046 if (PlayerBase.CastTo(nplayer, player))
13047 {
13049
13050 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13051 }
13052 }
13053
13054
13057 {
13058 PlayerBase nplayer;
13059 if (PlayerBase.CastTo(nplayer,player))
13060 {
13061
13062 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13063
13064 }
13065
13066
13067 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13068
13069
13070 if (HasEnergyManager())
13071 {
13072 GetCompEM().UpdatePlugState();
13073 }
13074 }
13075
13076
13078 {
13079 super.OnPlacementStarted(player);
13080
13082 }
13083
13084 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13085 {
13087 {
13088 m_AdminLog.OnPlacementComplete(player,
this);
13089 }
13090
13091 super.OnPlacementComplete(player, position, orientation);
13092 }
13093
13094
13095
13096
13097
13099 {
13101 {
13102 return true;
13103 }
13104 else
13105 {
13106 return false;
13107 }
13108 }
13109
13110
13112 {
13114 {
13116 }
13117 }
13118
13119
13121 {
13123 }
13124
13126 {
13128 }
13129
13130 override void InsertAgent(
int agent,
float count = 1)
13131 {
13132 if (count < 1)
13133 return;
13134
13136 }
13137
13140 {
13142 }
13143
13144
13146 {
13148 }
13149
13150
13151
13152
13153
13154
13155
13156
13157
13158
13159
13160
13161
13162
13163
13164
13165
13166
13167
13168
13169
13170
13171
13172
13173
13174
13175
13176
13177
13178
13179
13180
13181
13182
13183
13184
13185
13186
13187
13188
13189
13190
13192 {
13194 return false;
13195 return true;
13196 }
13197
13199 {
13200
13202 }
13203
13204
13207 {
13208 super.CheckForRoofLimited(timeTresholdMS);
13209
13211 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13212 {
13213 m_PreviousRoofTestTime = time;
13214 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13215 }
13216 }
13217
13218
13220 {
13222 {
13223 return 0;
13224 }
13225
13226 if (GetInventory().GetAttachmentSlotsCount() != 0)
13227 {
13228 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13229 if (filter)
13230 return filter.GetProtectionLevel(type, false, system);
13231 else
13232 return 0;
13233 }
13234
13235 string subclassPath, entryName;
13236
13237 switch (type)
13238 {
13240 entryName = "biological";
13241 break;
13243 entryName = "chemical";
13244 break;
13245 default:
13246 entryName = "biological";
13247 break;
13248 }
13249
13250 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13251
13253 }
13254
13255
13256
13259 {
13260 if (!IsMagazine())
13262
13264 }
13265
13266
13267
13268
13269
13274 {
13275 return true;
13276 }
13277
13279 {
13281 }
13282
13283
13284
13285
13286
13288 {
13289 if (parent)
13290 {
13291 if (parent.IsInherited(DayZInfected))
13292 return true;
13293
13294 if (!parent.IsRuined())
13295 return true;
13296 }
13297
13298 return true;
13299 }
13300
13302 {
13303 if (!super.CanPutAsAttachment(parent))
13304 {
13305 return false;
13306 }
13307
13308 if (!IsRuined() && !parent.IsRuined())
13309 {
13310 return true;
13311 }
13312
13313 return false;
13314 }
13315
13317 {
13318
13319
13320
13321
13322 return super.CanReceiveItemIntoCargo(item);
13323 }
13324
13326 {
13327
13328
13329
13330
13331 GameInventory attachmentInv = attachment.GetInventory();
13333 {
13334 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13335 return false;
13336 }
13337
13338 InventoryLocation loc = new InventoryLocation();
13339 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13340 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13341 return false;
13342
13343 return super.CanReceiveAttachment(attachment, slotId);
13344 }
13345
13347 {
13348 if (!super.CanReleaseAttachment(attachment))
13349 return false;
13350
13351 return GetInventory().AreChildrenAccessible();
13352 }
13353
13354
13355
13356
13357
13358
13359
13360
13361
13362
13363
13364
13365
13366
13367
13368
13369
13370
13371
13372
13373
13375 {
13376 int id = muzzle_owner.GetMuzzleID();
13377 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13378
13379 if (WPOF_array)
13380 {
13381 for (int i = 0; i < WPOF_array.Count(); i++)
13382 {
13383 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13384
13385 if (WPOF)
13386 {
13387 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13388 }
13389 }
13390 }
13391 }
13392
13393
13395 {
13396 int id = muzzle_owner.GetMuzzleID();
13398
13399 if (WPOBE_array)
13400 {
13401 for (int i = 0; i < WPOBE_array.Count(); i++)
13402 {
13403 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13404
13405 if (WPOBE)
13406 {
13407 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13408 }
13409 }
13410 }
13411 }
13412
13413
13415 {
13416 int id = muzzle_owner.GetMuzzleID();
13417 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13418
13419 if (WPOOH_array)
13420 {
13421 for (int i = 0; i < WPOOH_array.Count(); i++)
13422 {
13423 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13424
13425 if (WPOOH)
13426 {
13427 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13428 }
13429 }
13430 }
13431 }
13432
13433
13435 {
13436 int id = muzzle_owner.GetMuzzleID();
13437 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13438
13439 if (WPOOH_array)
13440 {
13441 for (int i = 0; i < WPOOH_array.Count(); i++)
13442 {
13443 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13444
13445 if (WPOOH)
13446 {
13447 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13448 }
13449 }
13450 }
13451 }
13452
13453
13455 {
13456 int id = muzzle_owner.GetMuzzleID();
13457 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13458
13459 if (WPOOH_array)
13460 {
13461 for (int i = 0; i < WPOOH_array.Count(); i++)
13462 {
13463 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13464
13465 if (WPOOH)
13466 {
13467 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13468 }
13469 }
13470 }
13471 }
13472
13473
13474
13476 {
13478 {
13479 return true;
13480 }
13481
13482 return false;
13483 }
13484
13486 {
13488 {
13489 return true;
13490 }
13491
13492 return false;
13493 }
13494
13496 {
13498 {
13499 return true;
13500 }
13501
13502 return false;
13503 }
13504
13506 {
13507 return false;
13508 }
13509
13512 {
13513 return UATimeSpent.DEFAULT_DEPLOY;
13514 }
13515
13516
13517
13518
13520 {
13522 SetSynchDirty();
13523 }
13524
13526 {
13528 }
13529
13530
13532 {
13533 return false;
13534 }
13535
13538 {
13539 string att_type = "None";
13540
13541 if (ConfigIsExisting("soundAttType"))
13542 {
13543 att_type = ConfigGetString("soundAttType");
13544 }
13545
13547 }
13548
13550 {
13552 }
13553
13554
13555
13556
13557
13563
13565 {
13568
13570 }
13571
13572
13574 {
13576 return;
13577
13579
13582
13585
13586 SoundParameters params = new SoundParameters();
13590 }
13591
13592
13594 {
13596 return;
13597
13599 SetSynchDirty();
13600
13603 }
13604
13605
13607 {
13609 return;
13610
13612 SetSynchDirty();
13613
13616 }
13617
13619 {
13621 }
13622
13624 {
13626 }
13627
13630 {
13631 if (!
GetGame().IsDedicatedServer())
13632 {
13633 if (ConfigIsExisting("attachSoundSet"))
13634 {
13635 string cfg_path = "";
13636 string soundset = "";
13637 string type_name =
GetType();
13638
13641 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13642 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13643
13644 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13645 {
13646 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13647 {
13648 if (cfg_slot_array[i] == slot_type)
13649 {
13650 soundset = cfg_soundset_array[i];
13651 break;
13652 }
13653 }
13654 }
13655
13656 if (soundset != "")
13657 {
13658 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13660 }
13661 }
13662 }
13663 }
13664
13666 {
13667
13668 }
13669
13670 void OnApply(PlayerBase player);
13671
13673 {
13674 return 1.0;
13675 };
13676
13678 {
13680 }
13681
13683 {
13685 }
13686
13688
13690 {
13691 SetDynamicPhysicsLifeTime(0.01);
13693 }
13694
13696 {
13697 array<string> zone_names = new array<string>;
13698 GetDamageZones(zone_names);
13699 for (int i = 0; i < zone_names.Count(); i++)
13700 {
13701 SetHealthMax(zone_names.Get(i),"Health");
13702 }
13703 SetHealthMax("","Health");
13704 }
13705
13708 {
13709 float global_health = GetHealth01("","Health");
13710 array<string> zones = new array<string>;
13711 GetDamageZones(zones);
13712
13713 for (int i = 0; i < zones.Count(); i++)
13714 {
13715 SetHealth01(zones.Get(i),"Health",global_health);
13716 }
13717 }
13718
13721 {
13722 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13723 }
13724
13726 {
13727 if (!hasRootAsPlayer)
13728 {
13729 if (refParentIB)
13730 {
13731
13732 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13733 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13734
13735 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13736 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13737
13740 }
13741 else
13742 {
13743
13746 }
13747 }
13748 }
13749
13751 {
13753 {
13754 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13755 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13756 {
13757 float heatPermCoef = 1.0;
13759 while (ent)
13760 {
13761 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13762 ent = ent.GetHierarchyParent();
13763 }
13764
13765 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13766 }
13767 }
13768 }
13769
13771 {
13772
13773 EntityAI parent = GetHierarchyParent();
13774 if (!parent)
13775 {
13776 hasParent = false;
13777 hasRootAsPlayer = false;
13778 }
13779 else
13780 {
13781 hasParent = true;
13782 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13783 refParentIB =
ItemBase.Cast(parent);
13784 }
13785 }
13786
13787 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13788 {
13789
13790 }
13791
13793 {
13794
13795 return false;
13796 }
13797
13799 {
13800
13801
13802 return false;
13803 }
13804
13806 {
13807
13808 return false;
13809 }
13810
13813 {
13814 return !GetIsFrozen() &&
IsOpen();
13815 }
13816
13818 {
13819 bool hasParent = false, hasRootAsPlayer = false;
13821
13822 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13823 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13824
13825 if (wwtu || foodDecay)
13826 {
13830
13831 if (processWetness || processTemperature || processDecay)
13832 {
13834
13835 if (processWetness)
13836 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13837
13838 if (processTemperature)
13840
13841 if (processDecay)
13842 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13843 }
13844 }
13845 }
13846
13849 {
13851 }
13852
13854 {
13857
13858 return super.GetTemperatureFreezeThreshold();
13859 }
13860
13862 {
13865
13866 return super.GetTemperatureThawThreshold();
13867 }
13868
13870 {
13873
13874 return super.GetItemOverheatThreshold();
13875 }
13876
13878 {
13880 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13881
13882 return super.GetTemperatureFreezeTime();
13883 }
13884
13886 {
13888 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13889
13890 return super.GetTemperatureThawTime();
13891 }
13892
13897
13899 {
13900 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13901 }
13902
13904 {
13905 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13906 }
13907
13910 {
13912 }
13913
13915 {
13917 }
13918
13920 {
13922 }
13923
13926 {
13927 return null;
13928 }
13929
13932 {
13933 return false;
13934 }
13935
13937 {
13939 {
13942 if (!trg)
13943 {
13945 explosive = this;
13946 }
13947
13948 explosive.PairRemote(trg);
13950
13951 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13952 trg.SetPersistentPairID(persistentID);
13953 explosive.SetPersistentPairID(persistentID);
13954
13955 return true;
13956 }
13957 return false;
13958 }
13959
13962 {
13963 float ret = 1.0;
13966 ret *= GetHealth01();
13967
13968 return ret;
13969 }
13970
13971 #ifdef DEVELOPER
13972 override void SetDebugItem()
13973 {
13974 super.SetDebugItem();
13975 _itemBase = this;
13976 }
13977
13979 {
13980 string text = super.GetDebugText();
13981
13983 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13984
13985 return text;
13986 }
13987 #endif
13988
13990 {
13991 return true;
13992 }
13993
13995
13997
13999 {
14002 }
14003
14004
14012
14028}
14029
14031{
14033 if (entity)
14034 {
14035 bool is_item = entity.IsInherited(
ItemBase);
14036 if (is_item && full_quantity)
14037 {
14040 }
14041 }
14042 else
14043 {
14045 return NULL;
14046 }
14047 return entity;
14048}
14049
14051{
14052 if (item)
14053 {
14054 if (health > 0)
14055 item.SetHealth("", "", health);
14056
14057 if (item.CanHaveTemperature())
14058 {
14060 if (item.CanFreeze())
14061 item.SetFrozen(false);
14062 }
14063
14064 if (item.HasEnergyManager())
14065 {
14066 if (quantity >= 0)
14067 {
14068 item.GetCompEM().SetEnergy0To1(quantity);
14069 }
14070 else
14071 {
14073 }
14074 }
14075 else if (item.IsMagazine())
14076 {
14077 Magazine mag = Magazine.Cast(item);
14078 if (quantity >= 0)
14079 {
14080 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14081 }
14082 else
14083 {
14085 }
14086
14087 }
14088 else
14089 {
14090 if (quantity >= 0)
14091 {
14092 item.SetQuantityNormalized(quantity, false);
14093 }
14094 else
14095 {
14097 }
14098
14099 }
14100 }
14101}
14102
14103#ifdef DEVELOPER
14105#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.