9123{
9125 {
9126 return true;
9127 }
9128};
9129
9130
9131
9133{
9137
9139
9142
9143
9144
9145
9146
9155
9161
9166
9171
9192 protected bool m_IsResultOfSplit
9193
9195
9200
9201
9202
9204
9208
9209
9210
9212
9215
9216
9217
9223
9224
9232
9235
9236
9238
9239
9241
9242
9247
9248
9253
9254
9256
9257
9259 {
9264
9265 if (!
GetGame().IsDedicatedServer())
9266 {
9268 {
9270
9272 {
9274 }
9275 }
9276
9279 }
9280
9281 m_OldLocation = null;
9282
9284 {
9286 }
9287
9288 if (ConfigIsExisting("headSelectionsToHide"))
9289 {
9292 }
9293
9295 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9296 {
9298 }
9299
9301
9302 m_IsResultOfSplit = false;
9303
9305 }
9306
9308 {
9309 super.InitItemVariables();
9310
9316 m_Count = ConfigGetInt(
"count");
9317
9320
9325
9328
9333
9345
9349
9350
9353 if (ConfigIsExisting("canBeSplit"))
9354 {
9357 }
9358
9360 if (ConfigIsExisting("itemBehaviour"))
9362
9363
9366 RegisterNetSyncVariableInt("m_VarLiquidType");
9367 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9368
9369 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9370 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9371 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9372
9373 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9374 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9375 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9376 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9377
9378 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9379 RegisterNetSyncVariableBool("m_IsTakeable");
9380 RegisterNetSyncVariableBool("m_IsHologram");
9381
9384 {
9387 }
9388
9390
9392 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9394
9395 }
9396
9398 {
9400 }
9401
9403 {
9406 {
9411 }
9412 }
9413
9414 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9415 {
9417 {
9420 }
9421
9423 }
9424
9426 {
9432 }
9433
9435
9437 {
9439
9440 if (!action)
9441 {
9442 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9443 return;
9444 }
9445
9447 if (!ai)
9448 {
9450 return;
9451 }
9452
9454 if (!action_array)
9455 {
9456 action_array = new array<ActionBase_Basic>;
9458 }
9459 if (LogManager.IsActionLogEnable())
9460 {
9461 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9462 }
9463
9464 if (action_array.Find(action) != -1)
9465 {
9466 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9467 }
9468 else
9469 {
9470 action_array.Insert(action);
9471 }
9472 }
9473
9475 {
9477 ActionBase action = player.GetActionManager().GetAction(actionName);
9480
9481 if (action_array)
9482 {
9483 action_array.RemoveItem(action);
9484 }
9485 }
9486
9487
9488
9490 {
9491 ActionOverrideData overrideData = new ActionOverrideData();
9495
9497 if (!actionMap)
9498 {
9501 }
9502
9503 actionMap.Insert(this.
Type(), overrideData);
9504
9505 }
9506
9508
9510
9511
9513 {
9516
9519
9520 string config_to_search = "CfgVehicles";
9521 string muzzle_owner_config;
9522
9524 {
9525 if (IsInherited(Weapon))
9526 config_to_search = "CfgWeapons";
9527
9528 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9529
9530 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9531
9533
9534 if (config_OnFire_subclass_count > 0)
9535 {
9536 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9537
9538 for (int i = 0; i < config_OnFire_subclass_count; i++)
9539 {
9540 string particle_class = "";
9542 string config_OnFire_entry = config_OnFire_class + particle_class;
9543 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9544 WPOF_array.Insert(WPOF);
9545 }
9546
9547
9549 }
9550 }
9551
9553 {
9554 config_to_search = "CfgWeapons";
9555 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9556
9557 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9558
9560
9561 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9562 {
9563 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9564
9565 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9566 {
9567 string particle_class2 = "";
9569 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9570 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9571 WPOBE_array.Insert(WPOBE);
9572 }
9573
9574
9576 }
9577 }
9578 }
9579
9580
9582 {
9585
9587 {
9588 string config_to_search = "CfgVehicles";
9589
9590 if (IsInherited(Weapon))
9591 config_to_search = "CfgWeapons";
9592
9593 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9594 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9595
9596 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9597 {
9598
9600
9602 {
9604 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9606 return;
9607 }
9608
9611
9612
9613
9615 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9616
9617 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9618 {
9619 string particle_class = "";
9621 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9623
9624 if (entry_type == CT_CLASS)
9625 {
9626 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9627 WPOOH_array.Insert(WPOF);
9628 }
9629 }
9630
9631
9633 }
9634 }
9635 }
9636
9638 {
9640 }
9641
9643 {
9645 {
9647
9650
9653
9654 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9655 }
9656 }
9657
9659 {
9661 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9662
9664 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9665
9667 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9668
9670 {
9672 }
9673 }
9674
9676 {
9678 }
9679
9681 {
9684 else
9686
9688 {
9691 }
9692 else
9693 {
9696
9699 }
9700
9702 }
9703
9705 {
9707 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9708 }
9709
9711 {
9713 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9715 }
9716
9718 {
9720 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9721 }
9722
9724 {
9727
9728 OverheatingParticle OP = new OverheatingParticle();
9733
9735 }
9736
9738 {
9741
9742 return -1;
9743 }
9744
9746 {
9748 {
9751
9752 for (int i = count; i > 0; --i)
9753 {
9754 int id = i - 1;
9757
9760
9761 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9762 {
9763 if (p)
9764 {
9767 }
9768 }
9769 }
9770 }
9771 }
9772
9774 {
9776 {
9778 {
9779 int id = i - 1;
9781
9782 if (OP)
9783 {
9785
9786 if (p)
9787 {
9789 }
9790
9791 delete OP;
9792 }
9793 }
9794
9797 }
9798 }
9799
9802 {
9803 return 0.0;
9804 }
9805
9806
9808 {
9809 return 250;
9810 }
9811
9813 {
9814 return 0;
9815 }
9816
9819 {
9821 return true;
9822
9823 return false;
9824 }
9825
9828 {
9831
9833 {
9835 }
9836 else
9837 {
9838
9840 }
9841
9843 }
9844
9851 {
9852 return -1;
9853 }
9854
9855
9856
9857
9859 {
9861 {
9863 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9864
9865 if (r_index >= 0)
9866 {
9867 InventoryLocation r_il = new InventoryLocation;
9868 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9869
9870 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9873 {
9874 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9875 }
9877 {
9878 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9879 }
9880
9881 }
9882
9883 player.GetHumanInventory().ClearUserReservedLocation(this);
9884 }
9885
9888 }
9889
9890
9891
9892
9894 {
9895 return ItemBase.m_DebugActionsMask;
9896 }
9897
9899 {
9900 return ItemBase.m_DebugActionsMask & mask;
9901 }
9902
9904 {
9905 ItemBase.m_DebugActionsMask = mask;
9906 }
9907
9909 {
9910 ItemBase.m_DebugActionsMask |= mask;
9911 }
9912
9914 {
9915 ItemBase.m_DebugActionsMask &= ~mask;
9916 }
9917
9919 {
9921 {
9923 }
9924 else
9925 {
9927 }
9928 }
9929
9930
9932 {
9933 if (GetEconomyProfile())
9934 {
9935 float q_max = GetEconomyProfile().GetQuantityMax();
9936 if (q_max > 0)
9937 {
9938 float q_min = GetEconomyProfile().GetQuantityMin();
9939 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9940
9942 {
9943 ComponentEnergyManager comp = GetCompEM();
9945 {
9947 }
9948 }
9950 {
9952
9953 }
9954
9955 }
9956 }
9957 }
9958
9961 {
9962 EntityAI parent = GetHierarchyParent();
9963
9964 if (parent)
9965 {
9966 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9967 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9968 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9969 }
9970 }
9971
9974 {
9975 EntityAI parent = GetHierarchyParent();
9976
9977 if (parent)
9978 {
9979 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9980 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9981 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9982 }
9983 }
9984
9986 {
9987
9988
9989
9990
9992
9994 {
9995 if (ScriptInputUserData.CanStoreInputUserData())
9996 {
9997 ScriptInputUserData ctx = new ScriptInputUserData;
10003 ctx.
Write(use_stack_max);
10006
10008 {
10009 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10010 }
10011 }
10012 }
10013 else if (!
GetGame().IsMultiplayer())
10014 {
10016 }
10017 }
10018
10020 {
10022 }
10023
10025 {
10027 }
10028
10030 {
10032 }
10033
10035 {
10036
10037 return false;
10038 }
10039
10041 {
10042 return false;
10043 }
10044
10048 {
10049 return false;
10050 }
10051
10053 {
10054 return "";
10055 }
10056
10058
10060 {
10061 return false;
10062 }
10063
10065 {
10066 return true;
10067 }
10068
10069
10070
10072 {
10073 return true;
10074 }
10075
10077 {
10078 return true;
10079 }
10080
10082 {
10083 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10085 }
10086
10088 {
10090 }
10091
10093 {
10095 if (!is_being_placed)
10097 SetSynchDirty();
10098 }
10099
10100
10102
10104 {
10106 }
10107
10109 {
10111 }
10112
10114 {
10115 return 1;
10116 }
10117
10119 {
10120 return false;
10121 }
10122
10124 {
10126 SetSynchDirty();
10127 }
10128
10129
10130
10131
10132
10133
10134
10135
10136
10137
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149
10150
10151
10152
10153
10154
10155
10156
10157
10158
10159
10160
10161
10162
10164 {
10165 super.OnMovedInsideCargo(container);
10166
10167 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10168 }
10169
10170 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10171 {
10172 super.EEItemLocationChanged(oldLoc,newLoc);
10173
10174 PlayerBase new_player = null;
10175 PlayerBase old_player = null;
10176
10177 if (newLoc.GetParent())
10178 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10179
10180 if (oldLoc.GetParent())
10181 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10182
10184 {
10185 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10186
10187 if (r_index >= 0)
10188 {
10189 InventoryLocation r_il = new InventoryLocation;
10190 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10191
10192 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10195 {
10196 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10197 }
10199 {
10200 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10201 }
10202
10203 }
10204 }
10205
10207 {
10208 if (new_player)
10209 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10210
10211 if (new_player == old_player)
10212 {
10213
10214 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10215 {
10217 {
10218 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10219 {
10220 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10221 }
10222 }
10223 else
10224 {
10225 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10226 }
10227 }
10228
10229 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10230 {
10231 int type = oldLoc.GetType();
10233 {
10234 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10235 }
10237 {
10238 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10239 }
10240 }
10241 if (!m_OldLocation)
10242 {
10243 m_OldLocation = new InventoryLocation;
10244 }
10245 m_OldLocation.Copy(oldLoc);
10246 }
10247 else
10248 {
10249 if (m_OldLocation)
10250 {
10251 m_OldLocation.Reset();
10252 }
10253 }
10254
10256 }
10257 else
10258 {
10259 if (new_player)
10260 {
10261 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10262 if (res_index >= 0)
10263 {
10264 InventoryLocation il = new InventoryLocation;
10265 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10267 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10270 {
10271 il.
GetParent().GetOnReleaseLock().Invoke(it);
10272 }
10274 {
10276 }
10277
10278 }
10279 }
10281 {
10282
10284 }
10285
10286 if (m_OldLocation)
10287 {
10288 m_OldLocation.Reset();
10289 }
10290 }
10291 }
10292
10293 override void EOnContact(IEntity other, Contact extra)
10294 {
10296 {
10297 int liquidType = -1;
10299 if (impactSpeed > 0.0)
10300 {
10302 #ifndef SERVER
10304 #else
10306 SetSynchDirty();
10307 #endif
10309 }
10310 }
10311
10312 #ifdef SERVER
10313 if (GetCompEM() && GetCompEM().IsPlugged())
10314 {
10315 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10316 GetCompEM().UnplugThis();
10317 }
10318 #endif
10319 }
10320
10322
10324 {
10326 }
10327
10329 {
10330
10331 }
10332
10334 {
10335 super.OnItemLocationChanged(old_owner, new_owner);
10336
10337 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10338 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10339
10340 if (!relatedPlayer && playerNew)
10341 relatedPlayer = playerNew;
10342
10343 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10344 {
10346 if (actionMgr)
10347 {
10348 ActionBase currentAction = actionMgr.GetRunningAction();
10349 if (currentAction)
10351 }
10352 }
10353
10354 Man ownerPlayerOld = null;
10355 Man ownerPlayerNew = null;
10356
10357 if (old_owner)
10358 {
10359 if (old_owner.
IsMan())
10360 {
10361 ownerPlayerOld = Man.Cast(old_owner);
10362 }
10363 else
10364 {
10365 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10366 }
10367 }
10368 else
10369 {
10371 {
10373
10374 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10375 {
10376 GetCompEM().UnplugThis();
10377 }
10378 }
10379 }
10380
10381 if (new_owner)
10382 {
10383 if (new_owner.
IsMan())
10384 {
10385 ownerPlayerNew = Man.Cast(new_owner);
10386 }
10387 else
10388 {
10389 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10390 }
10391 }
10392
10393 if (ownerPlayerOld != ownerPlayerNew)
10394 {
10395 if (ownerPlayerOld)
10396 {
10397 array<EntityAI> subItemsExit = new array<EntityAI>;
10399 for (int i = 0; i < subItemsExit.Count(); i++)
10400 {
10403 }
10404 }
10405
10406 if (ownerPlayerNew)
10407 {
10408 array<EntityAI> subItemsEnter = new array<EntityAI>;
10410 for (int j = 0; j < subItemsEnter.Count(); j++)
10411 {
10414 }
10415 }
10416 }
10417 else if (ownerPlayerNew != null)
10418 {
10419 PlayerBase nplayer;
10420 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10421 {
10422 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10424 for (int k = 0; k < subItemsUpdate.Count(); k++)
10425 {
10427 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10428 }
10429 }
10430 }
10431
10432 if (old_owner)
10433 old_owner.OnChildItemRemoved(this);
10434 if (new_owner)
10435 new_owner.OnChildItemReceived(this);
10436 }
10437
10438
10440 {
10441 super.EEDelete(parent);
10442 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10443 if (player)
10444 {
10446
10447 if (player.IsAlive())
10448 {
10449 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10450 if (r_index >= 0)
10451 {
10452 InventoryLocation r_il = new InventoryLocation;
10453 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10454
10455 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10458 {
10459 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10460 }
10462 {
10463 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10464 }
10465
10466 }
10467
10468 player.RemoveQuickBarEntityShortcut(this);
10469 }
10470 }
10471 }
10472
10474 {
10475 super.EEKilled(killer);
10476
10479 {
10480 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10481 {
10482 if (IsMagazine())
10483 {
10484 if (Magazine.Cast(this).GetAmmoCount() > 0)
10485 {
10487 }
10488 }
10489 else
10490 {
10492 }
10493 }
10494 }
10495 }
10496
10498 {
10499 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10500
10501 super.OnWasAttached(parent, slot_id);
10502
10505
10507 }
10508
10510 {
10511 super.OnWasDetached(parent, slot_id);
10512
10515 }
10516
10518 {
10519 int idx;
10522
10523 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10524 if (inventory_slots.Count() < 1)
10525 {
10526 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10527 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10528 }
10529 else
10530 {
10531 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10532 }
10533
10534 idx = inventory_slots.Find(slot);
10535 if (idx < 0)
10536 return "";
10537
10538 return attach_types.Get(idx);
10539 }
10540
10542 {
10543 int idx = -1;
10544 string slot;
10545
10548
10549 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10550 if (inventory_slots.Count() < 1)
10551 {
10552 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10553 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10554 }
10555 else
10556 {
10557 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10558 if (detach_types.Count() < 1)
10559 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10560 }
10561
10562 for (int i = 0; i < inventory_slots.Count(); i++)
10563 {
10564 slot = inventory_slots.Get(i);
10565 }
10566
10567 if (slot != "")
10568 {
10569 if (detach_types.Count() == 1)
10570 idx = 0;
10571 else
10572 idx = inventory_slots.Find(slot);
10573 }
10574 if (idx < 0)
10575 return "";
10576
10577 return detach_types.Get(idx);
10578 }
10579
10581 {
10582
10584
10585
10586 float min_time = 1;
10587 float max_time = 3;
10588 float delay = Math.RandomFloat(min_time, max_time);
10589
10590 explode_timer.Run(delay, this, "DoAmmoExplosion");
10591 }
10592
10594 {
10595 Magazine magazine = Magazine.Cast(this);
10596 int pop_sounds_count = 6;
10597 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10598
10599
10600 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10601 string sound_name = pop_sounds[ sound_idx ];
10603
10604
10605 magazine.ServerAddAmmoCount(-1);
10606
10607
10608 float min_temp_to_explode = 100;
10609
10610 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10611 {
10613 }
10614 }
10615
10616
10617 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10618 {
10619 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10620
10621 const int CHANCE_DAMAGE_CARGO = 4;
10622 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10623 const int CHANCE_DAMAGE_NOTHING = 2;
10624
10626 {
10627 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10628 int chances;
10629 int rnd;
10630
10631 if (GetInventory().GetCargo())
10632 {
10633 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10634 rnd = Math.RandomInt(0,chances);
10635
10636 if (rnd < CHANCE_DAMAGE_CARGO)
10637 {
10639 }
10640 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10641 {
10643 }
10644 }
10645 else
10646 {
10647 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10648 rnd = Math.RandomInt(0,chances);
10649
10650 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10651 {
10653 }
10654 }
10655 }
10656 }
10657
10659 {
10660 if (GetInventory().GetCargo())
10661 {
10662 int item_count = GetInventory().GetCargo().GetItemCount();
10663 if (item_count > 0)
10664 {
10665 int random_pick = Math.RandomInt(0, item_count);
10667 if (!item.IsExplosive())
10668 {
10669 item.AddHealth("","",damage);
10670 return true;
10671 }
10672 }
10673 }
10674 return false;
10675 }
10676
10678 {
10679 int attachment_count = GetInventory().AttachmentCount();
10680 if (attachment_count > 0)
10681 {
10682 int random_pick = Math.RandomInt(0, attachment_count);
10683 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10684 if (!attachment.IsExplosive())
10685 {
10686 attachment.AddHealth("","",damage);
10687 return true;
10688 }
10689 }
10690 return false;
10691 }
10692
10694 {
10696 }
10697
10699 {
10701 return GetInventory().CanRemoveEntity();
10702
10703 return false;
10704 }
10705
10707 {
10708
10710 return false;
10711
10712
10714 return false;
10715
10716
10717
10719 if (delta == 0)
10720 return false;
10721
10722
10723 return true;
10724 }
10725
10727 {
10729 {
10730 if (ScriptInputUserData.CanStoreInputUserData())
10731 {
10732 ScriptInputUserData ctx = new ScriptInputUserData;
10737 ctx.
Write(destination_entity);
10739 ctx.
Write(slot_id);
10741 }
10742 }
10743 else if (!
GetGame().IsMultiplayer())
10744 {
10746 }
10747 }
10748
10750 {
10751 float split_quantity_new;
10755 InventoryLocation loc = new InventoryLocation;
10756
10757 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10758 {
10760 split_quantity_new = stack_max;
10761 else
10763
10765 {
10766 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10767 if (new_item)
10768 {
10769 new_item.SetResultOfSplit(true);
10770 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10772 new_item.
SetQuantity(split_quantity_new,
false,
true);
10773 }
10774 }
10775 }
10776 else if (destination_entity && slot_id == -1)
10777 {
10778 if (quantity > stack_max)
10779 split_quantity_new = stack_max;
10780 else
10781 split_quantity_new = quantity;
10782
10784 {
10786 {
10789 }
10790
10791 if (new_item)
10792 {
10793 new_item.SetResultOfSplit(true);
10794 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10796 new_item.
SetQuantity(split_quantity_new,
false,
true);
10797 }
10798 }
10799 }
10800 else
10801 {
10802 if (stack_max != 0)
10803 {
10805 {
10807 }
10808
10809 if (split_quantity_new == 0)
10810 {
10811 if (!
GetGame().IsMultiplayer())
10812 player.PhysicalPredictiveDropItem(this);
10813 else
10814 player.ServerDropEntity(this);
10815 return;
10816 }
10817
10819 {
10821
10822 if (new_item)
10823 {
10824 new_item.SetResultOfSplit(true);
10825 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10828 new_item.PlaceOnSurface();
10829 }
10830 }
10831 }
10832 }
10833 }
10834
10836 {
10837 float split_quantity_new;
10841 InventoryLocation loc = new InventoryLocation;
10842
10843 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10844 {
10846 split_quantity_new = stack_max;
10847 else
10849
10851 {
10852 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10853 if (new_item)
10854 {
10855 new_item.SetResultOfSplit(true);
10856 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10858 new_item.
SetQuantity(split_quantity_new,
false,
true);
10859 }
10860 }
10861 }
10862 else if (destination_entity && slot_id == -1)
10863 {
10864 if (quantity > stack_max)
10865 split_quantity_new = stack_max;
10866 else
10867 split_quantity_new = quantity;
10868
10870 {
10872 {
10875 }
10876
10877 if (new_item)
10878 {
10879 new_item.SetResultOfSplit(true);
10880 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10882 new_item.
SetQuantity(split_quantity_new,
false,
true);
10883 }
10884 }
10885 }
10886 else
10887 {
10888 if (stack_max != 0)
10889 {
10891 {
10893 }
10894
10896 {
10898
10899 if (new_item)
10900 {
10901 new_item.SetResultOfSplit(true);
10902 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10905 new_item.PlaceOnSurface();
10906 }
10907 }
10908 }
10909 }
10910 }
10911
10913 {
10915 {
10916 if (ScriptInputUserData.CanStoreInputUserData())
10917 {
10918 ScriptInputUserData ctx = new ScriptInputUserData;
10923 dst.WriteToContext(ctx);
10925 }
10926 }
10927 else if (!
GetGame().IsMultiplayer())
10928 {
10930 }
10931 }
10932
10934 {
10936 {
10937 if (ScriptInputUserData.CanStoreInputUserData())
10938 {
10939 ScriptInputUserData ctx = new ScriptInputUserData;
10944 ctx.
Write(destination_entity);
10950 }
10951 }
10952 else if (!
GetGame().IsMultiplayer())
10953 {
10955 }
10956 }
10957
10959 {
10961 }
10962
10964 {
10966 float split_quantity_new;
10968 if (dst.IsValid())
10969 {
10970 int slot_id = dst.GetSlot();
10972
10973 if (quantity > stack_max)
10974 split_quantity_new = stack_max;
10975 else
10976 split_quantity_new = quantity;
10977
10979 {
10981
10982 if (new_item)
10983 {
10984 new_item.SetResultOfSplit(true);
10985 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10987 new_item.
SetQuantity(split_quantity_new,
false,
true);
10988 }
10989
10990 return new_item;
10991 }
10992 }
10993
10994 return null;
10995 }
10996
10998 {
11000 float split_quantity_new;
11002 if (destination_entity)
11003 {
11005 if (quantity > stackable)
11006 split_quantity_new = stackable;
11007 else
11008 split_quantity_new = quantity;
11009
11011 {
11012 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11013 if (new_item)
11014 {
11015 new_item.SetResultOfSplit(true);
11016 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11018 new_item.
SetQuantity(split_quantity_new,
false,
true);
11019 }
11020 }
11021 }
11022 }
11023
11025 {
11027 {
11028 if (ScriptInputUserData.CanStoreInputUserData())
11029 {
11030 ScriptInputUserData ctx = new ScriptInputUserData;
11035 ItemBase destination_entity =
this;
11036 ctx.
Write(destination_entity);
11040 }
11041 }
11042 else if (!
GetGame().IsMultiplayer())
11043 {
11045 }
11046 }
11047
11049 {
11051 float split_quantity_new;
11053 if (player)
11054 {
11056 if (quantity > stackable)
11057 split_quantity_new = stackable;
11058 else
11059 split_quantity_new = quantity;
11060
11062 {
11063 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11064 new_item =
ItemBase.Cast(in_hands);
11065 if (new_item)
11066 {
11067 new_item.SetResultOfSplit(true);
11068 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11070 new_item.SetQuantity(split_quantity_new, false, true);
11071 }
11072 }
11073 }
11074 }
11075
11077 {
11079 float split_quantity_new = Math.Floor(quantity * 0.5);
11080
11082 return;
11083
11085
11086 if (new_item)
11087 {
11088 if (new_item.GetQuantityMax() < split_quantity_new)
11089 {
11090 split_quantity_new = new_item.GetQuantityMax();
11091 }
11092
11093 new_item.SetResultOfSplit(true);
11094 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11095
11097 {
11100 }
11101 else
11102 {
11104 new_item.
SetQuantity(split_quantity_new,
false,
true);
11105 }
11106 }
11107 }
11108
11110 {
11112 float split_quantity_new = Math.Floor(quantity / 2);
11113
11115 return;
11116
11117 InventoryLocation invloc = new InventoryLocation;
11119
11121 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11122
11123 if (new_item)
11124 {
11125 if (new_item.GetQuantityMax() < split_quantity_new)
11126 {
11127 split_quantity_new = new_item.GetQuantityMax();
11128 }
11130 {
11133 }
11134 else if (split_quantity_new > 1)
11135 {
11137 new_item.
SetQuantity(split_quantity_new,
false,
true);
11138 }
11139 }
11140 }
11141
11144 {
11145 SetWeightDirty();
11147
11148 if (parent)
11149 parent.OnAttachmentQuantityChangedEx(this, delta);
11150
11152 {
11154 {
11156 }
11158 {
11159 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11161 }
11162 }
11163
11164 }
11165
11168 {
11169
11170 }
11171
11174 {
11176 }
11177
11179 {
11180 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11181
11183 {
11184 if (newLevel == GameConstants.STATE_RUINED)
11185 {
11187 EntityAI parent = GetHierarchyParent();
11188 if (parent && parent.IsFireplace())
11189 {
11190 CargoBase cargo = GetInventory().GetCargo();
11191 if (cargo)
11192 {
11194 {
11196 }
11197 }
11198 }
11199 }
11200
11202 {
11203
11205 return;
11206 }
11207
11208 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11209 {
11211 }
11212 }
11213 }
11214
11215
11217 {
11218 super.OnRightClick();
11219
11221 {
11223 {
11224 if (ScriptInputUserData.CanStoreInputUserData())
11225 {
11226 EntityAI root = GetHierarchyRoot();
11227 Man playerOwner = GetHierarchyRootPlayer();
11228 InventoryLocation dst = new InventoryLocation;
11229
11230
11231 if (!playerOwner && root && root == this)
11232 {
11234 }
11235 else
11236 {
11237
11238 GetInventory().GetCurrentInventoryLocation(dst);
11240 {
11243 {
11245 }
11246 else
11247 {
11249
11250
11251 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11252 {
11254 }
11255 else
11256 {
11257 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11258 }
11259 }
11260 }
11261 }
11262
11263 ScriptInputUserData ctx = new ScriptInputUserData;
11271 }
11272 }
11273 else if (!
GetGame().IsMultiplayer())
11274 {
11276 }
11277 }
11278 }
11279
11281 {
11282 if (root)
11283 {
11284 vector m4[4];
11285 root.GetTransform(m4);
11286 dst.SetGround(this, m4);
11287 }
11288 else
11289 {
11290 GetInventory().GetCurrentInventoryLocation(dst);
11291 }
11292 }
11293
11294 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11295 {
11296
11297 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11298 return false;
11299
11300 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11301 return false;
11302
11303
11305 return false;
11306
11307
11308 Magazine mag = Magazine.Cast(this);
11309 if (mag)
11310 {
11311 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11312 return false;
11313
11314 if (stack_max_limit)
11315 {
11316 Magazine other_mag = Magazine.Cast(other_item);
11317 if (other_item)
11318 {
11319 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11320 return false;
11321 }
11322
11323 }
11324 }
11325 else
11326 {
11327
11329 return false;
11330
11332 return false;
11333 }
11334
11335 PlayerBase player = null;
11336 if (CastTo(player, GetHierarchyRootPlayer()))
11337 {
11338 if (player.GetInventory().HasAttachment(this))
11339 return false;
11340
11341 if (player.IsItemsToDelete())
11342 return false;
11343 }
11344
11345 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11346 return false;
11347
11348 int slotID;
11350 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11351 return false;
11352
11353 return true;
11354 }
11355
11357 {
11359 }
11360
11362 {
11363 return m_IsResultOfSplit;
11364 }
11365
11367 {
11368 m_IsResultOfSplit = value;
11369 }
11370
11372 {
11374 }
11375
11377 {
11378 float other_item_quantity = other_item.GetQuantity();
11379 float this_free_space;
11380
11382
11384
11385 if (other_item_quantity > this_free_space)
11386 {
11387 return this_free_space;
11388 }
11389 else
11390 {
11391 return other_item_quantity;
11392 }
11393 }
11394
11396 {
11398 }
11399
11401 {
11403 return;
11404
11405 if (!IsMagazine() && other_item)
11406 {
11408 if (quantity_used != 0)
11409 {
11410 float hp1 = GetHealth01("","");
11411 float hp2 = other_item.GetHealth01("","");
11412 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11413 hpResult = hpResult / (
GetQuantity() + quantity_used);
11414
11415 hpResult *= GetMaxHealth();
11416 Math.Round(hpResult);
11417 SetHealth("", "Health", hpResult);
11418
11420 other_item.AddQuantity(-quantity_used);
11421 }
11422 }
11424 }
11425
11427 {
11428 #ifdef SERVER
11429 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11430 GetHierarchyParent().IncreaseLifetimeUp();
11431 #endif
11432 };
11433
11435 {
11436 PlayerBase p = PlayerBase.Cast(player);
11437
11438 array<int> recipesIds = p.m_Recipes;
11439 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11440 if (moduleRecipesManager)
11441 {
11442 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11443 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11444 }
11445
11446 for (int i = 0;i < recipesIds.Count(); i++)
11447 {
11448 int key = recipesIds.Get(i);
11449 string recipeName = moduleRecipesManager.GetRecipeName(key);
11451 }
11452 }
11453
11454
11455 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11456 {
11457 super.GetDebugActions(outputList);
11458
11459
11465
11466
11471
11476
11477
11481
11482
11484 {
11488 }
11489
11492
11493
11497
11499
11500 InventoryLocation loc = new InventoryLocation();
11501 GetInventory().GetCurrentInventoryLocation(loc);
11503 {
11504 if (Gizmo_IsSupported())
11507 }
11508
11510 }
11511
11512
11513
11514
11516 {
11517 super.OnAction(action_id, player, ctx);
11518
11520 {
11521 switch (action_id)
11522 {
11525 return true;
11528 return true;
11529 }
11530 }
11531
11533 {
11534 switch (action_id)
11535 {
11537 Delete();
11538 return true;
11539 }
11540 }
11541
11542 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11543 {
11544 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11545 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11546 PlayerBase p = PlayerBase.Cast(player);
11547 if (
EActions.RECIPES_RANGE_START < 1000)
11548 {
11549 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11550 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11551 }
11552 }
11553 #ifndef SERVER
11554 else if (action_id ==
EActions.WATCH_PLAYER)
11555 {
11556 PluginDeveloper.SetDeveloperItemClientEx(player);
11557 }
11558 #endif
11560 {
11561 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11562 {
11563 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11564 OnDebugButtonPressServer(id + 1);
11565 }
11566
11567 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11568 {
11569 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11571 }
11572
11573 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11574 {
11575 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11577 }
11578
11579 else if (action_id ==
EActions.ADD_QUANTITY)
11580 {
11581 if (IsMagazine())
11582 {
11583 Magazine mag = Magazine.Cast(this);
11584 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11585 }
11586 else
11587 {
11589 }
11590
11591 if (m_EM)
11592 {
11593 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11594 }
11595
11596 }
11597
11598 else if (action_id ==
EActions.REMOVE_QUANTITY)
11599 {
11600 if (IsMagazine())
11601 {
11602 Magazine mag2 = Magazine.Cast(this);
11603 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11604 }
11605 else
11606 {
11608 }
11609 if (m_EM)
11610 {
11611 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11612 }
11613
11614 }
11615
11616 else if (action_id ==
EActions.SET_QUANTITY_0)
11617 {
11619
11620 if (m_EM)
11621 {
11622 m_EM.SetEnergy(0);
11623 }
11624 }
11625
11626 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11627 {
11629
11630 if (m_EM)
11631 {
11632 m_EM.SetEnergy(m_EM.GetEnergyMax());
11633 }
11634 }
11635
11636 else if (action_id ==
EActions.ADD_HEALTH)
11637 {
11638 AddHealth("","",GetMaxHealth("","Health")/5);
11639 }
11640 else if (action_id ==
EActions.REMOVE_HEALTH)
11641 {
11642 AddHealth("","",-GetMaxHealth("","Health")/5);
11643 }
11644 else if (action_id ==
EActions.DESTROY_HEALTH)
11645 {
11646 SetHealth01("","",0);
11647 }
11648 else if (action_id ==
EActions.WATCH_ITEM)
11649 {
11651 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11652 #ifdef DEVELOPER
11653 SetDebugDeveloper_item(this);
11654 #endif
11655 }
11656
11657 else if (action_id ==
EActions.ADD_TEMPERATURE)
11658 {
11659 AddTemperature(20);
11660
11661 }
11662
11663 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11664 {
11665 AddTemperature(-20);
11666
11667 }
11668
11669 else if (action_id ==
EActions.FLIP_FROZEN)
11670 {
11671 SetFrozen(!GetIsFrozen());
11672
11673 }
11674
11675 else if (action_id ==
EActions.ADD_WETNESS)
11676 {
11678
11679 }
11680
11681 else if (action_id ==
EActions.REMOVE_WETNESS)
11682 {
11684
11685 }
11686
11687 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11688 {
11691
11692
11693 }
11694
11695 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11696 {
11699 }
11700
11701 else if (action_id ==
EActions.MAKE_SPECIAL)
11702 {
11703 auto debugParams = DebugSpawnParams.WithPlayer(player);
11704 OnDebugSpawnEx(debugParams);
11705 }
11706
11707 }
11708
11709
11710 return false;
11711 }
11712
11713
11714
11715
11719
11722
11723
11724
11726 {
11727 return false;
11728 }
11729
11730
11732 {
11733 return true;
11734 }
11735
11736
11738 {
11739 return true;
11740 }
11741
11742
11743
11745 {
11746 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11748 }
11749
11752 {
11753 return null;
11754 }
11755
11757 {
11758 return false;
11759 }
11760
11762 {
11763 return false;
11764 }
11765
11769
11770
11772 {
11773 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11774 return module_repairing.CanRepair(this, item_repair_kit);
11775 }
11776
11777
11778 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11779 {
11780 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11781 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11782 }
11783
11784
11786 {
11787
11788
11789
11790
11791
11792
11793
11794
11795 return 1;
11796 }
11797
11798
11799
11801 {
11803 }
11804
11805
11806
11808 {
11810 }
11811
11812
11821 {
11822 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11823
11824 if (player)
11825 {
11826 player.MessageStatus(text);
11827 }
11828 }
11829
11830
11839 {
11840 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11841
11842 if (player)
11843 {
11844 player.MessageAction(text);
11845 }
11846 }
11847
11848
11857 {
11858 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11859
11860 if (player)
11861 {
11862 player.MessageFriendly(text);
11863 }
11864 }
11865
11866
11875 {
11876 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11877
11878 if (player)
11879 {
11880 player.MessageImportant(text);
11881 }
11882 }
11883
11885 {
11886 return true;
11887 }
11888
11889
11890 override bool KindOf(
string tag)
11891 {
11892 bool found = false;
11893 string item_name = this.
GetType();
11896
11897 int array_size = item_tag_array.Count();
11898 for (int i = 0; i < array_size; i++)
11899 {
11900 if (item_tag_array.Get(i) == tag)
11901 {
11902 found = true;
11903 break;
11904 }
11905 }
11906 return found;
11907 }
11908
11909
11911 {
11912
11913 super.OnRPC(sender, rpc_type,ctx);
11914
11915
11916 switch (rpc_type)
11917 {
11918 #ifndef SERVER
11919 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11920 Param2<bool, string> p = new Param2<bool, string>(false, "");
11921
11923 return;
11924
11925 bool play = p.param1;
11926 string soundSet = p.param2;
11927
11928 if (play)
11929 {
11931 {
11933 {
11935 }
11936 }
11937 else
11938 {
11940 }
11941 }
11942 else
11943 {
11945 }
11946
11947 break;
11948 #endif
11949
11950 }
11951
11953 {
11955 }
11956 }
11957
11958
11959
11960
11962 {
11963 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11964 return plugin.GetID(
name);
11965 }
11966
11968 {
11969 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11970 return plugin.GetName(id);
11971 }
11972
11975 {
11976
11977
11978 int varFlags;
11979 if (!ctx.
Read(varFlags))
11980 return;
11981
11982 if (varFlags & ItemVariableFlags.FLOAT)
11983 {
11985 }
11986 }
11987
11989 {
11990
11991 super.SerializeNumericalVars(floats_out);
11992
11993
11994
11996 {
11998 }
11999
12001 {
12003 }
12004
12006 {
12008 }
12009
12011 {
12016 }
12017
12019 {
12021 }
12022 }
12023
12025 {
12026
12027 super.DeSerializeNumericalVars(floats);
12028
12029
12030 int index = 0;
12031 int mask = Math.Round(floats.Get(index));
12032
12033 index++;
12034
12036 {
12038 {
12040 }
12041 else
12042 {
12043 float quantity = floats.Get(index);
12044 SetQuantity(quantity,
true,
false,
false,
false);
12045 }
12046 index++;
12047 }
12048
12050 {
12051 float wet = floats.Get(index);
12053 index++;
12054 }
12055
12057 {
12058 int liquidtype = Math.Round(floats.Get(index));
12060 index++;
12061 }
12062
12064 {
12066 index++;
12068 index++;
12070 index++;
12072 index++;
12073 }
12074
12076 {
12077 int cleanness = Math.Round(floats.Get(index));
12079 index++;
12080 }
12081 }
12082
12084 {
12085 super.WriteVarsToCTX(ctx);
12086
12087
12089 {
12091 }
12092
12094 {
12096 }
12097
12099 {
12101 }
12102
12104 {
12105 int r,g,b,a;
12111 }
12112
12114 {
12116 }
12117 }
12118
12120 {
12121 if (!super.ReadVarsFromCTX(ctx,version))
12122 return false;
12123
12124 int intValue;
12125 float value;
12126
12127 if (version < 140)
12128 {
12129 if (!ctx.
Read(intValue))
12130 return false;
12131
12132 m_VariablesMask = intValue;
12133 }
12134
12136 {
12137 if (!ctx.
Read(value))
12138 return false;
12139
12141 {
12143 }
12144 else
12145 {
12147 }
12148 }
12149
12150 if (version < 140)
12151 {
12153 {
12154 if (!ctx.
Read(value))
12155 return false;
12156 SetTemperatureDirect(value);
12157 }
12158 }
12159
12161 {
12162 if (!ctx.
Read(value))
12163 return false;
12165 }
12166
12168 {
12169 if (!ctx.
Read(intValue))
12170 return false;
12172 }
12173
12175 {
12176 int r,g,b,a;
12178 return false;
12180 return false;
12182 return false;
12184 return false;
12185
12187 }
12188
12190 {
12191 if (!ctx.
Read(intValue))
12192 return false;
12194 }
12195
12196 if (version >= 138 && version < 140)
12197 {
12199 {
12200 if (!ctx.
Read(intValue))
12201 return false;
12202 SetFrozen(intValue);
12203 }
12204 }
12205
12206 return true;
12207 }
12208
12209
12211 {
12214 {
12216 }
12217
12218 if (!super.OnStoreLoad(ctx, version))
12219 {
12221 return false;
12222 }
12223
12224 if (version >= 114)
12225 {
12226 bool hasQuickBarIndexSaved;
12227
12228 if (!ctx.
Read(hasQuickBarIndexSaved))
12229 {
12231 return false;
12232 }
12233
12234 if (hasQuickBarIndexSaved)
12235 {
12236 int itmQBIndex;
12237
12238
12239 if (!ctx.
Read(itmQBIndex))
12240 {
12242 return false;
12243 }
12244
12245 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12246 if (itmQBIndex != -1 && parentPlayer)
12247 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12248 }
12249 }
12250 else
12251 {
12252
12253 PlayerBase player;
12254 int itemQBIndex;
12255 if (version ==
int.
MAX)
12256 {
12257 if (!ctx.
Read(itemQBIndex))
12258 {
12260 return false;
12261 }
12262 }
12263 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12264 {
12265
12266 if (!ctx.
Read(itemQBIndex))
12267 {
12269 return false;
12270 }
12271 if (itemQBIndex != -1 && player)
12272 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12273 }
12274 }
12275
12276 if (version < 140)
12277 {
12278
12279 if (!LoadVariables(ctx, version))
12280 {
12282 return false;
12283 }
12284 }
12285
12286
12288 {
12290 return false;
12291 }
12292 if (version >= 132)
12293 {
12295 if (raib)
12296 {
12298 {
12300 return false;
12301 }
12302 }
12303 }
12304
12306 return true;
12307 }
12308
12309
12310
12312 {
12313 super.OnStoreSave(ctx);
12314
12315 PlayerBase player;
12316 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12317 {
12319
12320 int itemQBIndex = -1;
12321 itemQBIndex = player.FindQuickBarEntityIndex(this);
12322 ctx.
Write(itemQBIndex);
12323 }
12324 else
12325 {
12327 }
12328
12330
12332 if (raib)
12333 {
12335 }
12336 }
12337
12338
12340 {
12341 super.AfterStoreLoad();
12342
12344 {
12346 }
12347
12349 {
12352 }
12353 }
12354
12356 {
12357 super.EEOnAfterLoad();
12358
12360 {
12362 }
12363
12366 }
12367
12369 {
12370 return false;
12371 }
12372
12373
12374
12376 {
12378 {
12379 #ifdef PLATFORM_CONSOLE
12380
12382 {
12384 if (menu)
12385 {
12387 }
12388 }
12389 #endif
12390 }
12391
12393 {
12396 }
12397
12399 {
12400 SetWeightDirty();
12402 }
12404 {
12407 }
12408
12410 {
12413 }
12415 {
12418 }
12419
12420 super.OnVariablesSynchronized();
12421 }
12422
12423
12424
12426 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12427 {
12428 if (!IsServerCheck(allow_client))
12429 return false;
12430
12432 return false;
12433
12436
12437 if (value <= (min + 0.001))
12438 value = min;
12439
12440 if (value == min)
12441 {
12442 if (destroy_config)
12443 {
12444 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12445 if (dstr)
12446 {
12448 this.Delete();
12449 return true;
12450 }
12451 }
12452 else if (destroy_forced)
12453 {
12455 this.Delete();
12456 return true;
12457 }
12458
12460 }
12461
12464
12466 {
12468
12469 if (delta)
12471 }
12472
12474
12475 return false;
12476 }
12477
12478
12480 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12481 {
12483 }
12484
12486 {
12489 }
12490
12492 {
12495 }
12496
12498 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12499 {
12500 float value_clamped = Math.Clamp(value, 0, 1);
12502 SetQuantity(result, destroy_config, destroy_forced);
12503 }
12504
12505
12508 {
12510 }
12511
12513 {
12515 }
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12527 {
12528 int slot = -1;
12529 if (GetInventory())
12530 {
12531 InventoryLocation il = new InventoryLocation;
12532 GetInventory().GetCurrentInventoryLocation(il);
12534 }
12535
12537 }
12538
12540 {
12541 float quantity_max = 0;
12542
12544 {
12545 if (attSlotID != -1)
12546 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12547
12548 if (quantity_max <= 0)
12550 }
12551
12552 if (quantity_max <= 0)
12554
12555 return quantity_max;
12556 }
12557
12559 {
12561 }
12562
12564 {
12566 }
12567
12568
12570 {
12572 }
12573
12575 {
12577 }
12578
12580 {
12582 }
12583
12584
12586 {
12587
12588 float weightEx = GetWeightEx();
12589 float special = GetInventoryAndCargoWeight();
12590 return weightEx - special;
12591 }
12592
12593
12595 {
12597 }
12598
12600 {
12602 {
12603 #ifdef DEVELOPER
12604 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12605 {
12606 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12608 }
12609 #endif
12610
12611 return GetQuantity() * GetConfigWeightModified();
12612 }
12613 else if (HasEnergyManager())
12614 {
12615 #ifdef DEVELOPER
12616 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12617 {
12618 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12619 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12620 }
12621 #endif
12622 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12623 }
12624 else
12625 {
12626 #ifdef DEVELOPER
12627 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12628 {
12629 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12630 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12631 }
12632 #endif
12633 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12634 }
12635 }
12636
12639 {
12640 int item_count = 0;
12642
12643 if (GetInventory().GetCargo() != NULL)
12644 {
12645 item_count = GetInventory().GetCargo().GetItemCount();
12646 }
12647
12648 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12649 {
12650 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12651 if (item)
12652 item_count += item.GetNumberOfItems();
12653 }
12654 return item_count;
12655 }
12656
12659 {
12660 float weight = 0;
12661 float wetness = 1;
12662 if (include_wetness)
12665 {
12666 weight = wetness * m_ConfigWeight;
12667 }
12669 {
12670 weight = 1;
12671 }
12672 return weight;
12673 }
12674
12675
12676
12678 {
12679 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12680 {
12681 GameInventory inv = GetInventory();
12682 array<EntityAI> items = new array<EntityAI>;
12684 for (int i = 0; i < items.Count(); i++)
12685 {
12687 if (item)
12688 {
12690 }
12691 }
12692 }
12693 }
12694
12695
12696
12697
12699 {
12700 float energy = 0;
12701 if (HasEnergyManager())
12702 {
12703 energy = GetCompEM().GetEnergy();
12704 }
12705 return energy;
12706 }
12707
12708
12710 {
12711 super.OnEnergyConsumed();
12712
12714 }
12715
12717 {
12718 super.OnEnergyAdded();
12719
12721 }
12722
12723
12725 {
12726 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12727 {
12729 {
12730 float energy_0to1 = GetCompEM().GetEnergy0To1();
12732 }
12733 }
12734 }
12735
12736
12738 {
12739 return ConfigGetFloat("heatIsolation");
12740 }
12741
12743 {
12745 }
12746
12748 {
12749 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12750 if (
GetGame().ConfigIsExisting(paramPath))
12752
12753 return 0.0;
12754 }
12755
12757 {
12758 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12759 if (
GetGame().ConfigIsExisting(paramPath))
12761
12762 return 0.0;
12763 }
12764
12765 override void SetWet(
float value,
bool allow_client =
false)
12766 {
12767 if (!IsServerCheck(allow_client))
12768 return;
12769
12772
12774
12775 m_VarWet = Math.Clamp(value, min, max);
12776
12778 {
12781 }
12782 }
12783
12784 override void AddWet(
float value)
12785 {
12787 }
12788
12790 {
12792 }
12793
12795 {
12797 }
12798
12800 {
12802 }
12803
12805 {
12807 }
12808
12810 {
12812 }
12813
12814 override void OnWetChanged(
float newVal,
float oldVal)
12815 {
12818 if (newLevel != oldLevel)
12819 {
12821 }
12822 }
12823
12825 {
12826 SetWeightDirty();
12827 }
12828
12830 {
12831 return GetWetLevelInternal(
m_VarWet);
12832 }
12833
12834
12835
12837 {
12839 }
12840
12842 {
12844 }
12845
12847 {
12849 }
12850
12852 {
12854 }
12855
12856
12857
12859 {
12860 if (ConfigIsExisting("itemModelLength"))
12861 {
12862 return ConfigGetFloat("itemModelLength");
12863 }
12864 return 0;
12865 }
12866
12868 {
12869 if (ConfigIsExisting("itemAttachOffset"))
12870 {
12871 return ConfigGetFloat("itemAttachOffset");
12872 }
12873 return 0;
12874 }
12875
12876 override void SetCleanness(
int value,
bool allow_client =
false)
12877 {
12878 if (!IsServerCheck(allow_client))
12879 return;
12880
12882
12884
12887 }
12888
12890 {
12892 }
12893
12895 {
12896 return true;
12897 }
12898
12899
12900
12901
12903 {
12905 }
12906
12908 {
12910 }
12911
12912
12913
12914
12915 override void SetColor(
int r,
int g,
int b,
int a)
12916 {
12922 }
12924 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12925 {
12930 }
12931
12933 {
12935 }
12936
12939 {
12940 int r,g,b,a;
12942 r = r/255;
12943 g = g/255;
12944 b = b/255;
12945 a = a/255;
12946 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12947 }
12948
12949
12950
12951 override void SetLiquidType(
int value,
bool allow_client =
false)
12952 {
12953 if (!IsServerCheck(allow_client))
12954 return;
12955
12960 }
12961
12963 {
12964 return ConfigGetInt("varLiquidTypeInit");
12965 }
12966
12968 {
12970 }
12971
12973 {
12975 SetFrozen(false);
12976 }
12977
12980 {
12981 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12982 }
12983
12984
12987 {
12988 PlayerBase nplayer;
12989 if (PlayerBase.CastTo(nplayer, player))
12990 {
12992
12993 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12994 }
12995 }
12996
12997
13000 {
13001 PlayerBase nplayer;
13002 if (PlayerBase.CastTo(nplayer,player))
13003 {
13004
13005 nplayer.SetEnableQuickBarEntityShortcut(this,false);
13006
13007 }
13008
13009
13010 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13011
13012
13013 if (HasEnergyManager())
13014 {
13015 GetCompEM().UpdatePlugState();
13016 }
13017 }
13018
13019
13021 {
13022 super.OnPlacementStarted(player);
13023
13025 }
13026
13027 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13028 {
13030 {
13031 m_AdminLog.OnPlacementComplete(player,
this);
13032 }
13033
13034 super.OnPlacementComplete(player, position, orientation);
13035 }
13036
13037
13038
13039
13040
13042 {
13044 {
13045 return true;
13046 }
13047 else
13048 {
13049 return false;
13050 }
13051 }
13052
13053
13055 {
13057 {
13059 }
13060 }
13061
13062
13064 {
13066 }
13067
13069 {
13071 }
13072
13073 override void InsertAgent(
int agent,
float count = 1)
13074 {
13075 if (count < 1)
13076 return;
13077
13079 }
13080
13083 {
13085 }
13086
13087
13089 {
13091 }
13092
13093
13094
13095
13096
13097
13098
13099
13100
13101
13102
13103
13104
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13126
13127
13128
13129
13130
13131
13132
13133
13135 {
13137 return false;
13138 return true;
13139 }
13140
13142 {
13143
13145 }
13146
13147
13150 {
13151 super.CheckForRoofLimited(timeTresholdMS);
13152
13154 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13155 {
13156 m_PreviousRoofTestTime = time;
13157 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13158 }
13159 }
13160
13161
13163 {
13165 {
13166 return 0;
13167 }
13168
13169 if (GetInventory().GetAttachmentSlotsCount() != 0)
13170 {
13171 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13172 if (filter)
13173 return filter.GetProtectionLevel(type, false, system);
13174 else
13175 return 0;
13176 }
13177
13178 string subclassPath, entryName;
13179
13180 switch (type)
13181 {
13183 entryName = "biological";
13184 break;
13186 entryName = "chemical";
13187 break;
13188 default:
13189 entryName = "biological";
13190 break;
13191 }
13192
13193 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13194
13196 }
13197
13198
13199
13202 {
13203 if (!IsMagazine())
13205
13207 }
13208
13209
13210
13211
13212
13217 {
13218 return true;
13219 }
13220
13222 {
13224 }
13225
13226
13227
13228
13229
13231 {
13232 if (parent)
13233 {
13234 if (parent.IsInherited(DayZInfected))
13235 return true;
13236
13237 if (!parent.IsRuined())
13238 return true;
13239 }
13240
13241 return true;
13242 }
13243
13245 {
13246 if (!super.CanPutAsAttachment(parent))
13247 {
13248 return false;
13249 }
13250
13251 if (!IsRuined() && !parent.IsRuined())
13252 {
13253 return true;
13254 }
13255
13256 return false;
13257 }
13258
13260 {
13261
13262
13263
13264
13265 return super.CanReceiveItemIntoCargo(item);
13266 }
13267
13269 {
13270
13271
13272
13273
13274 GameInventory attachmentInv = attachment.GetInventory();
13276 {
13277 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13278 return false;
13279 }
13280
13281 InventoryLocation loc = new InventoryLocation();
13282 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13283 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13284 return false;
13285
13286 return super.CanReceiveAttachment(attachment, slotId);
13287 }
13288
13290 {
13291 if (!super.CanReleaseAttachment(attachment))
13292 return false;
13293
13294 return GetInventory().AreChildrenAccessible();
13295 }
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13318 {
13319 int id = muzzle_owner.GetMuzzleID();
13320 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13321
13322 if (WPOF_array)
13323 {
13324 for (int i = 0; i < WPOF_array.Count(); i++)
13325 {
13326 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13327
13328 if (WPOF)
13329 {
13330 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13331 }
13332 }
13333 }
13334 }
13335
13336
13338 {
13339 int id = muzzle_owner.GetMuzzleID();
13341
13342 if (WPOBE_array)
13343 {
13344 for (int i = 0; i < WPOBE_array.Count(); i++)
13345 {
13346 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13347
13348 if (WPOBE)
13349 {
13350 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13351 }
13352 }
13353 }
13354 }
13355
13356
13358 {
13359 int id = muzzle_owner.GetMuzzleID();
13360 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13361
13362 if (WPOOH_array)
13363 {
13364 for (int i = 0; i < WPOOH_array.Count(); i++)
13365 {
13366 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13367
13368 if (WPOOH)
13369 {
13370 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13371 }
13372 }
13373 }
13374 }
13375
13376
13378 {
13379 int id = muzzle_owner.GetMuzzleID();
13380 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13381
13382 if (WPOOH_array)
13383 {
13384 for (int i = 0; i < WPOOH_array.Count(); i++)
13385 {
13386 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13387
13388 if (WPOOH)
13389 {
13390 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13391 }
13392 }
13393 }
13394 }
13395
13396
13398 {
13399 int id = muzzle_owner.GetMuzzleID();
13400 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13401
13402 if (WPOOH_array)
13403 {
13404 for (int i = 0; i < WPOOH_array.Count(); i++)
13405 {
13406 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13407
13408 if (WPOOH)
13409 {
13410 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13411 }
13412 }
13413 }
13414 }
13415
13416
13417
13419 {
13421 {
13422 return true;
13423 }
13424
13425 return false;
13426 }
13427
13429 {
13431 {
13432 return true;
13433 }
13434
13435 return false;
13436 }
13437
13439 {
13441 {
13442 return true;
13443 }
13444
13445 return false;
13446 }
13447
13449 {
13450 return false;
13451 }
13452
13455 {
13456 return UATimeSpent.DEFAULT_DEPLOY;
13457 }
13458
13459
13460
13461
13463 {
13465 SetSynchDirty();
13466 }
13467
13469 {
13471 }
13472
13473
13475 {
13476 return false;
13477 }
13478
13481 {
13482 string att_type = "None";
13483
13484 if (ConfigIsExisting("soundAttType"))
13485 {
13486 att_type = ConfigGetString("soundAttType");
13487 }
13488
13490 }
13491
13493 {
13495 }
13496
13497
13498
13499
13500
13506
13508 {
13511
13513 }
13514
13515
13517 {
13519 return;
13520
13522
13525
13528
13529 SoundParameters params = new SoundParameters();
13533 }
13534
13535
13537 {
13539 return;
13540
13542 SetSynchDirty();
13543
13546 }
13547
13548
13550 {
13552 return;
13553
13555 SetSynchDirty();
13556
13559 }
13560
13562 {
13564 }
13565
13567 {
13569 }
13570
13573 {
13574 if (!
GetGame().IsDedicatedServer())
13575 {
13576 if (ConfigIsExisting("attachSoundSet"))
13577 {
13578 string cfg_path = "";
13579 string soundset = "";
13580 string type_name =
GetType();
13581
13584 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13585 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13586
13587 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13588 {
13589 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13590 {
13591 if (cfg_slot_array[i] == slot_type)
13592 {
13593 soundset = cfg_soundset_array[i];
13594 break;
13595 }
13596 }
13597 }
13598
13599 if (soundset != "")
13600 {
13601 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13603 }
13604 }
13605 }
13606 }
13607
13609 {
13610
13611 }
13612
13613 void OnApply(PlayerBase player);
13614
13616 {
13617 return 1.0;
13618 };
13619
13621 {
13623 }
13624
13626 {
13628 }
13629
13631
13633 {
13634 SetDynamicPhysicsLifeTime(0.01);
13636 }
13637
13639 {
13640 array<string> zone_names = new array<string>;
13641 GetDamageZones(zone_names);
13642 for (int i = 0; i < zone_names.Count(); i++)
13643 {
13644 SetHealthMax(zone_names.Get(i),"Health");
13645 }
13646 SetHealthMax("","Health");
13647 }
13648
13651 {
13652 float global_health = GetHealth01("","Health");
13653 array<string> zones = new array<string>;
13654 GetDamageZones(zones);
13655
13656 for (int i = 0; i < zones.Count(); i++)
13657 {
13658 SetHealth01(zones.Get(i),"Health",global_health);
13659 }
13660 }
13661
13664 {
13665 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13666 }
13667
13669 {
13670 if (!hasRootAsPlayer)
13671 {
13672 if (refParentIB)
13673 {
13674
13675 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13676 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13677
13678 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13679 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13680
13683 }
13684 else
13685 {
13686
13689 }
13690 }
13691 }
13692
13694 {
13696 {
13697 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13698 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13699 {
13700 float heatPermCoef = 1.0;
13702 while (ent)
13703 {
13704 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13705 ent = ent.GetHierarchyParent();
13706 }
13707
13708 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13709 }
13710 }
13711 }
13712
13714 {
13715
13716 EntityAI parent = GetHierarchyParent();
13717 if (!parent)
13718 {
13719 hasParent = false;
13720 hasRootAsPlayer = false;
13721 }
13722 else
13723 {
13724 hasParent = true;
13725 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13726 refParentIB =
ItemBase.Cast(parent);
13727 }
13728 }
13729
13730 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13731 {
13732
13733 }
13734
13736 {
13737
13738 return false;
13739 }
13740
13742 {
13743
13744
13745 return false;
13746 }
13747
13749 {
13750
13751 return false;
13752 }
13753
13756 {
13757 return !GetIsFrozen() &&
IsOpen();
13758 }
13759
13761 {
13762 bool hasParent = false, hasRootAsPlayer = false;
13764
13765 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13766 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13767
13768 if (wwtu || foodDecay)
13769 {
13773
13774 if (processWetness || processTemperature || processDecay)
13775 {
13777
13778 if (processWetness)
13779 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13780
13781 if (processTemperature)
13783
13784 if (processDecay)
13785 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13786 }
13787 }
13788 }
13789
13792 {
13794 }
13795
13797 {
13800
13801 return super.GetTemperatureFreezeThreshold();
13802 }
13803
13805 {
13808
13809 return super.GetTemperatureThawThreshold();
13810 }
13811
13813 {
13816
13817 return super.GetItemOverheatThreshold();
13818 }
13819
13821 {
13823 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13824
13825 return super.GetTemperatureFreezeTime();
13826 }
13827
13829 {
13831 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13832
13833 return super.GetTemperatureThawTime();
13834 }
13835
13840
13842 {
13843 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13844 }
13845
13847 {
13848 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13849 }
13850
13853 {
13855 }
13856
13858 {
13860 }
13861
13863 {
13865 }
13866
13869 {
13870 return null;
13871 }
13872
13875 {
13876 return false;
13877 }
13878
13880 {
13882 {
13885 if (!trg)
13886 {
13888 explosive = this;
13889 }
13890
13891 explosive.PairRemote(trg);
13893
13894 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13895 trg.SetPersistentPairID(persistentID);
13896 explosive.SetPersistentPairID(persistentID);
13897
13898 return true;
13899 }
13900 return false;
13901 }
13902
13905 {
13906 float ret = 1.0;
13909 ret *= GetHealth01();
13910
13911 return ret;
13912 }
13913
13914 #ifdef DEVELOPER
13915 override void SetDebugItem()
13916 {
13917 super.SetDebugItem();
13918 _itemBase = this;
13919 }
13920
13922 {
13923 string text = super.GetDebugText();
13924
13926 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13927
13928 return text;
13929 }
13930 #endif
13931
13933 {
13934 return true;
13935 }
13936
13938
13940
13942 {
13945 }
13946
13947
13955
13971}
13972
13974{
13976 if (entity)
13977 {
13978 bool is_item = entity.IsInherited(
ItemBase);
13979 if (is_item && full_quantity)
13980 {
13983 }
13984 }
13985 else
13986 {
13988 return NULL;
13989 }
13990 return entity;
13991}
13992
13994{
13995 if (item)
13996 {
13997 if (health > 0)
13998 item.SetHealth("", "", health);
13999
14000 if (item.CanHaveTemperature())
14001 {
14003 if (item.CanFreeze())
14004 item.SetFrozen(false);
14005 }
14006
14007 if (item.HasEnergyManager())
14008 {
14009 if (quantity >= 0)
14010 {
14011 item.GetCompEM().SetEnergy0To1(quantity);
14012 }
14013 else
14014 {
14016 }
14017 }
14018 else if (item.IsMagazine())
14019 {
14020 Magazine mag = Magazine.Cast(item);
14021 if (quantity >= 0)
14022 {
14023 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14024 }
14025 else
14026 {
14028 }
14029
14030 }
14031 else
14032 {
14033 if (quantity >= 0)
14034 {
14035 item.SetQuantityNormalized(quantity, false);
14036 }
14037 else
14038 {
14040 }
14041
14042 }
14043 }
14044}
14045
14046#ifdef DEVELOPER
14048#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.