9224{
9226 {
9227 return true;
9228 }
9229};
9230
9232{
9233
9234};
9235
9236
9237
9239{
9243
9245
9248
9249
9250
9251
9252
9261
9267
9272
9277
9298 protected bool m_IsResultOfSplit
9299
9301
9306
9307
9308
9310
9314
9315
9316
9318
9321
9322
9323
9329
9330
9338
9341
9342
9344
9345
9347
9348
9353
9354
9359
9361
9362
9364
9365
9367 {
9372
9373 if (!
g_Game.IsDedicatedServer())
9374 {
9376 {
9378
9380 {
9382 }
9383 }
9384
9387 }
9388
9389 m_OldLocation = null;
9390
9392 {
9394 }
9395
9396 if (ConfigIsExisting("headSelectionsToHide"))
9397 {
9400 }
9401
9403 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9404 {
9406 }
9407
9409
9410 m_IsResultOfSplit = false;
9411
9413 }
9414
9416 {
9417 super.InitItemVariables();
9418
9424 m_Count = ConfigGetInt(
"count");
9425
9428
9433
9436
9441
9453
9457
9458
9461 if (ConfigIsExisting("canBeSplit"))
9462 {
9465 }
9466
9468 if (ConfigIsExisting("itemBehaviour"))
9470
9471
9474 RegisterNetSyncVariableInt("m_VarLiquidType");
9475 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9476
9477 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9478 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9479 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9480
9481 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9482 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9483 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9484 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9485
9486 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9487 RegisterNetSyncVariableBool("m_IsTakeable");
9488 RegisterNetSyncVariableBool("m_IsHologram");
9489
9492 {
9495 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9496 }
9497
9499
9501 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9503
9505 }
9506
9508 {
9510 }
9511
9513 {
9516 {
9521 }
9522 }
9523
9524 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9525 {
9527 {
9530 }
9531
9533 }
9534
9536 {
9542 }
9543
9545
9547 {
9549
9550 if (!action)
9551 {
9552 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9553 return;
9554 }
9555
9557 if (!ai)
9558 {
9560 return;
9561 }
9562
9564 if (!action_array)
9565 {
9566 action_array = new array<ActionBase_Basic>;
9568 }
9569 if (LogManager.IsActionLogEnable())
9570 {
9571 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9572 }
9573
9574 if (action_array.Find(action) != -1)
9575 {
9576 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9577 }
9578 else
9579 {
9580 action_array.Insert(action);
9581 }
9582 }
9583
9585 {
9586 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9587 ActionBase action = player.GetActionManager().GetAction(actionName);
9590
9591 if (action_array)
9592 {
9593 action_array.RemoveItem(action);
9594 }
9595 }
9596
9597
9598
9600 {
9601 ActionOverrideData overrideData = new ActionOverrideData();
9605
9607 if (!actionMap)
9608 {
9611 }
9612
9613 actionMap.Insert(this.
Type(), overrideData);
9614
9615 }
9616
9618
9620
9621
9623 {
9626
9629
9630 string config_to_search = "CfgVehicles";
9631 string muzzle_owner_config;
9632
9634 {
9635 if (IsInherited(Weapon))
9636 config_to_search = "CfgWeapons";
9637
9638 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9639
9640 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9641
9642 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9643
9644 if (config_OnFire_subclass_count > 0)
9645 {
9646 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9647
9648 for (int i = 0; i < config_OnFire_subclass_count; i++)
9649 {
9650 string particle_class = "";
9651 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9652 string config_OnFire_entry = config_OnFire_class + particle_class;
9653 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9654 WPOF_array.Insert(WPOF);
9655 }
9656
9657
9659 }
9660 }
9661
9663 {
9664 config_to_search = "CfgWeapons";
9665 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9666
9667 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9668
9669 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9670
9671 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9672 {
9673 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9674
9675 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9676 {
9677 string particle_class2 = "";
9678 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9679 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9680 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9681 WPOBE_array.Insert(WPOBE);
9682 }
9683
9684
9686 }
9687 }
9688 }
9689
9690
9692 {
9695
9697 {
9698 string config_to_search = "CfgVehicles";
9699
9700 if (IsInherited(Weapon))
9701 config_to_search = "CfgWeapons";
9702
9703 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9704 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9705
9706 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9707 {
9708
9710
9712 {
9714 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9716 return;
9717 }
9718
9721
9722
9723
9724 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9725 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9726
9727 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9728 {
9729 string particle_class = "";
9730 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9731 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9732 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9733
9734 if (entry_type == CT_CLASS)
9735 {
9736 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9737 WPOOH_array.Insert(WPOF);
9738 }
9739 }
9740
9741
9743 }
9744 }
9745 }
9746
9748 {
9750 }
9751
9753 {
9755 {
9757
9760
9763
9764 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9765 }
9766 }
9767
9769 {
9771 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9772
9774 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9775
9777 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9778
9780 {
9782 }
9783 }
9784
9786 {
9788 }
9789
9791 {
9794 else
9796
9798 {
9801 }
9802 else
9803 {
9806
9809 }
9810
9812 }
9813
9815 {
9817 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9818 }
9819
9821 {
9823 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9825 }
9826
9828 {
9830 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9831 }
9832
9834 {
9837
9838 OverheatingParticle OP = new OverheatingParticle();
9843
9845 }
9846
9848 {
9851
9852 return -1;
9853 }
9854
9856 {
9858 {
9861
9862 for (int i = count; i > 0; --i)
9863 {
9864 int id = i - 1;
9867
9870
9871 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9872 {
9873 if (p)
9874 {
9877 }
9878 }
9879 }
9880 }
9881 }
9882
9884 {
9886 {
9888 {
9889 int id = i - 1;
9891
9892 if (OP)
9893 {
9895
9896 if (p)
9897 {
9899 }
9900
9901 delete OP;
9902 }
9903 }
9904
9907 }
9908 }
9909
9912 {
9913 return 0.0;
9914 }
9915
9916
9918 {
9919 return 250;
9920 }
9921
9923 {
9924 return 0;
9925 }
9926
9929 {
9931 return true;
9932
9933 return false;
9934 }
9935
9938 {
9941
9943 {
9945 }
9946 else
9947 {
9948
9950 }
9951
9953 }
9954
9961 {
9962 return -1;
9963 }
9964
9965
9966
9967
9969 {
9971 {
9972 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9973 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9974
9975 if (r_index >= 0)
9976 {
9977 InventoryLocation r_il = new InventoryLocation;
9978 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9979
9980 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9983 {
9984 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9985 }
9987 {
9988 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9989 }
9990
9991 }
9992
9993 player.GetHumanInventory().ClearUserReservedLocation(this);
9994 }
9995
9998 }
9999
10000
10001
10002
10004 {
10005 return ItemBase.m_DebugActionsMask;
10006 }
10007
10009 {
10010 return ItemBase.m_DebugActionsMask & mask;
10011 }
10012
10014 {
10015 ItemBase.m_DebugActionsMask = mask;
10016 }
10017
10019 {
10020 ItemBase.m_DebugActionsMask |= mask;
10021 }
10022
10024 {
10025 ItemBase.m_DebugActionsMask &= ~mask;
10026 }
10027
10029 {
10031 {
10033 }
10034 else
10035 {
10037 }
10038 }
10039
10040
10042 {
10043 if (GetEconomyProfile())
10044 {
10045 float q_max = GetEconomyProfile().GetQuantityMax();
10046 if (q_max > 0)
10047 {
10048 float q_min = GetEconomyProfile().GetQuantityMin();
10049 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
10050
10052 {
10053 ComponentEnergyManager comp = GetCompEM();
10055 {
10057 }
10058 }
10060 {
10062
10063 }
10064
10065 }
10066 }
10067 }
10068
10071 {
10072 EntityAI parent = GetHierarchyParent();
10073
10074 if (parent)
10075 {
10076 InventoryLocation inventory_location_to_lock = new InventoryLocation;
10077 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
10078 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
10079 }
10080 }
10081
10084 {
10085 EntityAI parent = GetHierarchyParent();
10086
10087 if (parent)
10088 {
10089 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
10090 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
10091 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
10092 }
10093 }
10094
10096 {
10097
10098
10099
10100
10102
10104 {
10105 if (ScriptInputUserData.CanStoreInputUserData())
10106 {
10107 ScriptInputUserData ctx = new ScriptInputUserData;
10113 ctx.
Write(use_stack_max);
10116
10118 {
10119 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
10120 }
10121 }
10122 }
10123 else if (!
g_Game.IsMultiplayer())
10124 {
10126 }
10127 }
10128
10130 {
10132 }
10133
10135 {
10137 }
10138
10140 {
10142 }
10143
10145 {
10146
10147 return false;
10148 }
10149
10151 {
10152 return false;
10153 }
10154
10158 {
10159 return false;
10160 }
10161
10163 {
10164 return "";
10165 }
10166
10168
10170 {
10171 return false;
10172 }
10173
10175 {
10176 return true;
10177 }
10178
10179
10180
10182 {
10183 return true;
10184 }
10185
10187 {
10188 return true;
10189 }
10190
10192 {
10193 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10195 }
10196
10198 {
10200 }
10201
10203 {
10205 if (!is_being_placed)
10207 SetSynchDirty();
10208 }
10209
10210
10212
10214 {
10216 }
10217
10219 {
10221 }
10222
10224 {
10225 return 1;
10226 }
10227
10229 {
10230 return false;
10231 }
10232
10234 {
10236 SetSynchDirty();
10237 }
10238
10239
10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267
10268
10269
10270
10271
10272
10274 {
10275 super.OnMovedInsideCargo(container);
10276
10277 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10278 }
10279
10280 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10281 {
10282 super.EEItemLocationChanged(oldLoc, newLoc);
10283
10284 PlayerBase newPlayer = null;
10285 PlayerBase oldPlayer = null;
10286
10287 if (newLoc.GetParent())
10288 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10289
10290 if (oldLoc.GetParent())
10291 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10292
10294 {
10295 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10296
10297 if (rIndex >= 0)
10298 {
10299 InventoryLocation rIl = new InventoryLocation;
10300 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10301
10302 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10305 {
10306 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10307 }
10309 {
10311 }
10312
10313 }
10314 }
10315
10317 {
10318 if (newPlayer)
10319 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10320
10321 if (newPlayer == oldPlayer)
10322 {
10323 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10324 {
10326 {
10327 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10328 {
10329 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10330 }
10331 }
10332 else
10333 {
10334 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10335 }
10336 }
10337
10338 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10339 {
10340 int type = oldLoc.GetType();
10342 {
10343 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10344 }
10346 {
10347 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10348 }
10349 }
10350 if (!m_OldLocation)
10351 {
10352 m_OldLocation = new InventoryLocation;
10353 }
10354 m_OldLocation.Copy(oldLoc);
10355 }
10356 else
10357 {
10358 if (m_OldLocation)
10359 {
10360 m_OldLocation.Reset();
10361 }
10362 }
10363
10364 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10365 }
10366 else
10367 {
10368 if (newPlayer)
10369 {
10370 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10371 if (resIndex >= 0)
10372 {
10373 InventoryLocation il = new InventoryLocation;
10374 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10376 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10379 {
10380 il.
GetParent().GetOnReleaseLock().Invoke(it);
10381 }
10383 {
10385 }
10386
10387 }
10388 }
10390 {
10391
10393 }
10394
10395 if (m_OldLocation)
10396 {
10397 m_OldLocation.Reset();
10398 }
10399 }
10400
10402 {
10403 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10404 }
10405
10407 {
10408 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10409 }
10410 }
10411
10412 override void EOnContact(IEntity other, Contact extra)
10413 {
10415 {
10416 int liquidType = -1;
10418 if (impactSpeed > 0.0)
10419 {
10421 #ifndef SERVER
10423 #else
10425 SetSynchDirty();
10426 #endif
10428 }
10429 }
10430
10431 #ifdef SERVER
10432 if (GetCompEM() && GetCompEM().IsPlugged())
10433 {
10434 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10435 GetCompEM().UnplugThis();
10436 }
10437 #endif
10438 }
10439
10441
10443 {
10445 }
10446
10448 {
10449
10450 }
10451
10453 {
10454 super.OnItemLocationChanged(old_owner, new_owner);
10455
10456 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10457 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10458
10459 if (!relatedPlayer && playerNew)
10460 relatedPlayer = playerNew;
10461
10462 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10463 {
10465 if (actionMgr)
10466 {
10467 ActionBase currentAction = actionMgr.GetRunningAction();
10468 if (currentAction)
10470 }
10471 }
10472
10473 Man ownerPlayerOld = null;
10474 Man ownerPlayerNew = null;
10475
10476 if (old_owner)
10477 {
10478 if (old_owner.
IsMan())
10479 {
10480 ownerPlayerOld = Man.Cast(old_owner);
10481 }
10482 else
10483 {
10484 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10485 }
10486 }
10487 else
10488 {
10490 {
10492
10493 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10494 {
10495 GetCompEM().UnplugThis();
10496 }
10497 }
10498 }
10499
10500 if (new_owner)
10501 {
10502 if (new_owner.
IsMan())
10503 {
10504 ownerPlayerNew = Man.Cast(new_owner);
10505 }
10506 else
10507 {
10508 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10509 }
10510 }
10511
10512 if (ownerPlayerOld != ownerPlayerNew)
10513 {
10514 if (ownerPlayerOld)
10515 {
10516 array<EntityAI> subItemsExit = new array<EntityAI>;
10518 for (int i = 0; i < subItemsExit.Count(); i++)
10519 {
10522 }
10523 }
10524
10525 if (ownerPlayerNew)
10526 {
10527 array<EntityAI> subItemsEnter = new array<EntityAI>;
10529 for (int j = 0; j < subItemsEnter.Count(); j++)
10530 {
10533 }
10534 }
10535 }
10536 else if (ownerPlayerNew != null)
10537 {
10538 PlayerBase nplayer;
10539 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10540 {
10541 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10543 for (int k = 0; k < subItemsUpdate.Count(); k++)
10544 {
10546 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10547 }
10548 }
10549 }
10550
10551 if (old_owner)
10552 old_owner.OnChildItemRemoved(this);
10553 if (new_owner)
10554 new_owner.OnChildItemReceived(this);
10555 }
10556
10557
10559 {
10560 super.EEDelete(parent);
10561 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10562 if (player)
10563 {
10565
10566 if (player.IsAlive())
10567 {
10568 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10569 if (r_index >= 0)
10570 {
10571 InventoryLocation r_il = new InventoryLocation;
10572 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10573
10574 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10577 {
10578 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10579 }
10581 {
10582 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10583 }
10584
10585 }
10586
10587 player.RemoveQuickBarEntityShortcut(this);
10588 }
10589 }
10590 }
10591
10593 {
10594 super.EEKilled(killer);
10595
10598 {
10599 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10600 {
10601 if (IsMagazine())
10602 {
10603 if (Magazine.Cast(this).GetAmmoCount() > 0)
10604 {
10606 }
10607 }
10608 else
10609 {
10611 }
10612 }
10613 }
10614 }
10615
10617 {
10618 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10619
10620 super.OnWasAttached(parent, slot_id);
10621
10624
10627 }
10628
10630 {
10631 super.OnWasDetached(parent, slot_id);
10632
10635
10638 }
10639
10641 {
10642 int idx;
10645
10646 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10647 if (inventory_slots.Count() < 1)
10648 {
10649 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10650 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10651 }
10652 else
10653 {
10654 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10655 }
10656
10657 idx = inventory_slots.Find(slot);
10658 if (idx < 0)
10659 return "";
10660
10661 return attach_types.Get(idx);
10662 }
10663
10665 {
10666 int idx = -1;
10667 string slot;
10668
10671
10672 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10673 if (inventory_slots.Count() < 1)
10674 {
10675 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10676 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10677 }
10678 else
10679 {
10680 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10681 if (detach_types.Count() < 1)
10682 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10683 }
10684
10685 for (int i = 0; i < inventory_slots.Count(); i++)
10686 {
10687 slot = inventory_slots.Get(i);
10688 }
10689
10690 if (slot != "")
10691 {
10692 if (detach_types.Count() == 1)
10693 idx = 0;
10694 else
10695 idx = inventory_slots.Find(slot);
10696 }
10697 if (idx < 0)
10698 return "";
10699
10700 return detach_types.Get(idx);
10701 }
10702
10704 {
10705
10707
10708
10709 float min_time = 1;
10710 float max_time = 3;
10711 float delay = Math.RandomFloat(min_time, max_time);
10712
10713 explode_timer.Run(delay, this, "DoAmmoExplosion");
10714 }
10715
10717 {
10718 Magazine magazine = Magazine.Cast(this);
10719 int pop_sounds_count = 6;
10720 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10721
10722
10723 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10724 string sound_name = pop_sounds[ sound_idx ];
10725 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10726
10727
10728 magazine.ServerAddAmmoCount(-1);
10729
10730
10731 float min_temp_to_explode = 100;
10732
10733 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10734 {
10736 }
10737 }
10738
10739
10740 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10741 {
10742 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10743
10744 const int CHANCE_DAMAGE_CARGO = 4;
10745 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10746 const int CHANCE_DAMAGE_NOTHING = 2;
10747
10749 {
10750 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10751 int chances;
10752 int rnd;
10753
10754 if (GetInventory().GetCargo())
10755 {
10756 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10757 rnd = Math.RandomInt(0,chances);
10758
10759 if (rnd < CHANCE_DAMAGE_CARGO)
10760 {
10762 }
10763 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10764 {
10766 }
10767 }
10768 else
10769 {
10770 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10771 rnd = Math.RandomInt(0,chances);
10772
10773 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10774 {
10776 }
10777 }
10778 }
10779 }
10780
10782 {
10783 CargoBase cargo = GetInventory().GetCargo();
10784 if (cargo)
10785 {
10787 if (item_count > 0)
10788 {
10789 int random_pick = Math.RandomInt(0, item_count);
10791 if (!item.IsExplosive())
10792 {
10793 item.AddHealth("","",damage);
10794 return true;
10795 }
10796 }
10797 }
10798 return false;
10799 }
10800
10802 {
10803 GameInventory inventory = GetInventory();
10805 if (attachment_count > 0)
10806 {
10807 int random_pick = Math.RandomInt(0, attachment_count);
10809 if (!attachment.IsExplosive())
10810 {
10811 attachment.AddHealth("","",damage);
10812 return true;
10813 }
10814 }
10815 return false;
10816 }
10817
10819 {
10821 }
10822
10824 {
10826 return GetInventory().CanRemoveEntity();
10827
10828 return false;
10829 }
10830
10832 {
10833
10835 return false;
10836
10837
10839 return false;
10840
10841
10842
10844 if (delta == 0)
10845 return false;
10846
10847
10848 return true;
10849 }
10850
10852 {
10854 {
10855 if (ScriptInputUserData.CanStoreInputUserData())
10856 {
10857 ScriptInputUserData ctx = new ScriptInputUserData;
10862 ctx.
Write(destination_entity);
10864 ctx.
Write(slot_id);
10866 }
10867 }
10868 else if (!
g_Game.IsMultiplayer())
10869 {
10871 }
10872 }
10873
10875 {
10876 float split_quantity_new;
10880 InventoryLocation loc = new InventoryLocation;
10881
10882 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10883 {
10885 split_quantity_new = stack_max;
10886 else
10888
10890 {
10891 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10892 if (new_item)
10893 {
10894 new_item.SetResultOfSplit(true);
10895 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10897 new_item.
SetQuantity(split_quantity_new,
false,
true);
10898 }
10899 }
10900 }
10901 else if (destination_entity && slot_id == -1)
10902 {
10903 if (quantity > stack_max)
10904 split_quantity_new = stack_max;
10905 else
10906 split_quantity_new = quantity;
10907
10909 {
10910 GameInventory destinationInventory = destination_entity.GetInventory();
10912 {
10915 }
10916
10917 if (new_item)
10918 {
10919 new_item.SetResultOfSplit(true);
10920 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10922 new_item.
SetQuantity(split_quantity_new,
false,
true);
10923 }
10924 }
10925 }
10926 else
10927 {
10928 if (stack_max != 0)
10929 {
10931 {
10933 }
10934
10935 if (split_quantity_new == 0)
10936 {
10937 if (!
g_Game.IsMultiplayer())
10938 player.PhysicalPredictiveDropItem(this);
10939 else
10940 player.ServerDropEntity(this);
10941 return;
10942 }
10943
10945 {
10947
10948 if (new_item)
10949 {
10950 new_item.SetResultOfSplit(true);
10951 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10954 new_item.PlaceOnSurface();
10955 }
10956 }
10957 }
10958 }
10959 }
10960
10962 {
10963 float split_quantity_new;
10967 InventoryLocation loc = new InventoryLocation;
10968
10969 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10970 {
10972 split_quantity_new = stack_max;
10973 else
10975
10977 {
10978 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10979 if (new_item)
10980 {
10981 new_item.SetResultOfSplit(true);
10982 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10984 new_item.
SetQuantity(split_quantity_new,
false,
true);
10985 }
10986 }
10987 }
10988 else if (destination_entity && slot_id == -1)
10989 {
10990 if (quantity > stack_max)
10991 split_quantity_new = stack_max;
10992 else
10993 split_quantity_new = quantity;
10994
10996 {
10997 GameInventory destinationInventory = destination_entity.GetInventory();
10999 {
11002 }
11003
11004 if (new_item)
11005 {
11006 new_item.SetResultOfSplit(true);
11007 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11009 new_item.
SetQuantity(split_quantity_new,
false,
true);
11010 }
11011 }
11012 }
11013 else
11014 {
11015 if (stack_max != 0)
11016 {
11018 {
11020 }
11021
11023 {
11025
11026 if (new_item)
11027 {
11028 new_item.SetResultOfSplit(true);
11029 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11032 new_item.PlaceOnSurface();
11033 }
11034 }
11035 }
11036 }
11037 }
11038
11040 {
11042 {
11043 if (ScriptInputUserData.CanStoreInputUserData())
11044 {
11045 ScriptInputUserData ctx = new ScriptInputUserData;
11050 dst.WriteToContext(ctx);
11052 }
11053 }
11054 else if (!
g_Game.IsMultiplayer())
11055 {
11057 }
11058 }
11059
11061 {
11063 {
11064 if (ScriptInputUserData.CanStoreInputUserData())
11065 {
11066 ScriptInputUserData ctx = new ScriptInputUserData;
11071 ctx.
Write(destination_entity);
11077 }
11078 }
11079 else if (!
g_Game.IsMultiplayer())
11080 {
11082 }
11083 }
11084
11086 {
11088 }
11089
11091 {
11093 float split_quantity_new;
11095 if (dst.IsValid())
11096 {
11097 int slot_id = dst.GetSlot();
11099
11100 if (quantity > stack_max)
11101 split_quantity_new = stack_max;
11102 else
11103 split_quantity_new = quantity;
11104
11106 {
11108
11109 if (new_item)
11110 {
11111 new_item.SetResultOfSplit(true);
11112 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11114 new_item.
SetQuantity(split_quantity_new,
false,
true);
11115 }
11116
11117 return new_item;
11118 }
11119 }
11120
11121 return null;
11122 }
11123
11125 {
11127 float split_quantity_new;
11129 if (destination_entity)
11130 {
11132 if (quantity > stackable)
11133 split_quantity_new = stackable;
11134 else
11135 split_quantity_new = quantity;
11136
11138 {
11139 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
11140 if (new_item)
11141 {
11142 new_item.SetResultOfSplit(true);
11143 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11145 new_item.
SetQuantity(split_quantity_new,
false,
true);
11146 }
11147 }
11148 }
11149 }
11150
11152 {
11154 {
11155 if (ScriptInputUserData.CanStoreInputUserData())
11156 {
11157 ScriptInputUserData ctx = new ScriptInputUserData;
11162 ItemBase destination_entity =
this;
11163 ctx.
Write(destination_entity);
11167 }
11168 }
11169 else if (!
g_Game.IsMultiplayer())
11170 {
11172 }
11173 }
11174
11176 {
11178 float split_quantity_new;
11180 if (player)
11181 {
11183 if (quantity > stackable)
11184 split_quantity_new = stackable;
11185 else
11186 split_quantity_new = quantity;
11187
11189 {
11190 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
11191 new_item =
ItemBase.Cast(in_hands);
11192 if (new_item)
11193 {
11194 new_item.SetResultOfSplit(true);
11195 MiscGameplayFunctions.TransferItemProperties(this,new_item);
11197 new_item.SetQuantity(split_quantity_new, false, true);
11198 }
11199 }
11200 }
11201 }
11202
11204 {
11206 float split_quantity_new = Math.Floor(quantity * 0.5);
11207
11209 return;
11210
11212
11213 if (new_item)
11214 {
11215 if (new_item.GetQuantityMax() < split_quantity_new)
11216 {
11217 split_quantity_new = new_item.GetQuantityMax();
11218 }
11219
11220 new_item.SetResultOfSplit(true);
11221 MiscGameplayFunctions.TransferItemProperties(this, new_item);
11222
11224 {
11227 }
11228 else
11229 {
11231 new_item.
SetQuantity(split_quantity_new,
false,
true);
11232 }
11233 }
11234 }
11235
11237 {
11239 float split_quantity_new = Math.Floor(quantity / 2);
11240
11242 return;
11243
11244 InventoryLocation invloc = new InventoryLocation;
11246
11248 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11249
11250 if (new_item)
11251 {
11252 if (new_item.GetQuantityMax() < split_quantity_new)
11253 {
11254 split_quantity_new = new_item.GetQuantityMax();
11255 }
11257 {
11260 }
11261 else if (split_quantity_new > 1)
11262 {
11264 new_item.
SetQuantity(split_quantity_new,
false,
true);
11265 }
11266 }
11267 }
11268
11271 {
11272 SetWeightDirty();
11274
11275 if (parent)
11276 parent.OnAttachmentQuantityChangedEx(this, delta);
11277
11279 {
11281 {
11283 }
11285 {
11286 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11288 }
11289 }
11290 }
11291
11294 {
11295
11296 }
11297
11300 {
11302 }
11303
11305 {
11306 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11307
11309 {
11310 if (newLevel == GameConstants.STATE_RUINED)
11311 {
11313 EntityAI parent = GetHierarchyParent();
11314 if (parent && parent.IsFireplace())
11315 {
11316 CargoBase cargo = GetInventory().GetCargo();
11317 if (cargo)
11318 {
11320 {
11322 }
11323 }
11324 }
11325 }
11326
11328 {
11329
11331 return;
11332 }
11333
11334 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11335 {
11337 }
11338 }
11339 }
11340
11341
11343 {
11344 super.OnRightClick();
11345
11347 {
11349 {
11350 if (ScriptInputUserData.CanStoreInputUserData())
11351 {
11352 EntityAI root = GetHierarchyRoot();
11353 Man playerOwner = GetHierarchyRootPlayer();
11354 InventoryLocation dst = new InventoryLocation;
11355
11356
11357 if (!playerOwner && root && root == this)
11358 {
11360 }
11361 else
11362 {
11363
11364 GetInventory().GetCurrentInventoryLocation(dst);
11366 {
11367 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11369 {
11371 }
11372 else
11373 {
11375
11376
11377 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11378 {
11380 }
11381 else
11382 {
11383 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11384 }
11385 }
11386 }
11387 }
11388
11389 ScriptInputUserData ctx = new ScriptInputUserData;
11397 }
11398 }
11399 else if (!
g_Game.IsMultiplayer())
11400 {
11402 }
11403 }
11404 }
11405
11407 {
11408 if (root)
11409 {
11410 vector m4[4];
11411 root.GetTransform(m4);
11412 dst.SetGround(this, m4);
11413 }
11414 else
11415 {
11416 GetInventory().GetCurrentInventoryLocation(dst);
11417 }
11418 }
11419
11420 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11421 {
11422
11423 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11424 return false;
11425
11426 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11427 return false;
11428
11429
11431 return false;
11432
11433
11434 Magazine mag = Magazine.Cast(this);
11435 if (mag)
11436 {
11437 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11438 return false;
11439
11440 if (stack_max_limit)
11441 {
11442 Magazine other_mag = Magazine.Cast(other_item);
11443 if (other_item)
11444 {
11445 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11446 return false;
11447 }
11448
11449 }
11450 }
11451 else
11452 {
11453
11455 return false;
11456
11458 return false;
11459 }
11460
11461 PlayerBase player = null;
11462 if (CastTo(player, GetHierarchyRootPlayer()))
11463 {
11464 if (player.GetInventory().HasAttachment(this))
11465 return false;
11466
11467 if (player.IsItemsToDelete())
11468 return false;
11469 }
11470
11471 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11472 return false;
11473
11474 int slotID;
11476 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11477 return false;
11478
11479 return true;
11480 }
11481
11483 {
11485 }
11486
11488 {
11489 return m_IsResultOfSplit;
11490 }
11491
11493 {
11494 m_IsResultOfSplit = value;
11495 }
11496
11498 {
11500 }
11501
11503 {
11504 float other_item_quantity = other_item.GetQuantity();
11505 float this_free_space;
11506
11508
11510
11511 if (other_item_quantity > this_free_space)
11512 {
11513 return this_free_space;
11514 }
11515 else
11516 {
11517 return other_item_quantity;
11518 }
11519 }
11520
11522 {
11524 }
11525
11527 {
11529 return;
11530
11531 if (!IsMagazine() && other_item)
11532 {
11534 if (quantity_used != 0)
11535 {
11536 float hp1 = GetHealth01("","");
11537 float hp2 = other_item.GetHealth01("","");
11538 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11539 hpResult = hpResult / (
GetQuantity() + quantity_used);
11540
11541 hpResult *= GetMaxHealth();
11542 Math.Round(hpResult);
11543 SetHealth("", "Health", hpResult);
11544
11546 other_item.AddQuantity(-quantity_used);
11547 }
11548 }
11550 }
11551
11553 {
11554 #ifdef SERVER
11555 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11556 GetHierarchyParent().IncreaseLifetimeUp();
11557 #endif
11558 };
11559
11561 {
11562 PlayerBase p = PlayerBase.Cast(player);
11563
11564 array<int> recipesIds = p.m_Recipes;
11565 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11566 if (moduleRecipesManager)
11567 {
11568 EntityAI itemInHands = player.GetEntityInHands();
11569 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11570 }
11571
11572 for (int i = 0;i < recipesIds.Count(); i++)
11573 {
11574 int key = recipesIds.Get(i);
11575 string recipeName = moduleRecipesManager.GetRecipeName(key);
11577 }
11578 }
11579
11580
11581 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11582 {
11583 super.GetDebugActions(outputList);
11584
11585
11591
11592
11597
11602
11603
11607
11608
11610 {
11614 }
11615
11618
11619
11623
11625
11626 InventoryLocation loc = new InventoryLocation();
11627 GetInventory().GetCurrentInventoryLocation(loc);
11629 {
11630 if (Gizmo_IsSupported())
11633 }
11634
11636 }
11637
11638
11639
11640
11642 {
11643 super.OnAction(action_id, player, ctx);
11644
11646 {
11647 switch (action_id)
11648 {
11652 return true;
11656 return true;
11657 }
11658 }
11659
11661 {
11662 switch (action_id)
11663 {
11665 Delete();
11666 return true;
11667 }
11668 }
11669
11670 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11671 {
11672 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11673 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11674 PlayerBase p = PlayerBase.Cast(player);
11675 if (
EActions.RECIPES_RANGE_START < 1000)
11676 {
11677 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11678 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11679 }
11680 }
11681 #ifndef SERVER
11682 else if (action_id ==
EActions.WATCH_PLAYER)
11683 {
11684 PluginDeveloper.SetDeveloperItemClientEx(player);
11685 }
11686 #endif
11688 {
11689 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11690 {
11691 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11692 OnDebugButtonPressServer(id + 1);
11693 }
11694
11695 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11696 {
11697 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11699 }
11700
11701 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11702 {
11703 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11705 }
11706
11707 else if (action_id ==
EActions.ADD_QUANTITY)
11708 {
11709 if (IsMagazine())
11710 {
11711 Magazine mag = Magazine.Cast(this);
11712 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11713 }
11714 else
11715 {
11717 }
11718
11719 if (m_EM)
11720 {
11721 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11722 }
11723
11724 }
11725
11726 else if (action_id ==
EActions.REMOVE_QUANTITY)
11727 {
11728 if (IsMagazine())
11729 {
11730 Magazine mag2 = Magazine.Cast(this);
11731 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11732 }
11733 else
11734 {
11736 }
11737 if (m_EM)
11738 {
11739 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11740 }
11741
11742 }
11743
11744 else if (action_id ==
EActions.SET_QUANTITY_0)
11745 {
11747
11748 if (m_EM)
11749 {
11750 m_EM.SetEnergy(0);
11751 }
11752 }
11753
11754 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11755 {
11757
11758 if (m_EM)
11759 {
11760 m_EM.SetEnergy(m_EM.GetEnergyMax());
11761 }
11762 }
11763
11764 else if (action_id ==
EActions.ADD_HEALTH)
11765 {
11766 AddHealth("","",GetMaxHealth("","Health")/5);
11767 }
11768 else if (action_id ==
EActions.REMOVE_HEALTH)
11769 {
11770 AddHealth("","",-GetMaxHealth("","Health")/5);
11771 }
11772 else if (action_id ==
EActions.DESTROY_HEALTH)
11773 {
11774 SetHealth01("","",0);
11775 }
11776 else if (action_id ==
EActions.WATCH_ITEM)
11777 {
11779 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11780 #ifdef DEVELOPER
11781 SetDebugDeveloper_item(this);
11782 #endif
11783 }
11784
11785 else if (action_id ==
EActions.ADD_TEMPERATURE)
11786 {
11787 AddTemperature(20);
11788
11789 }
11790
11791 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11792 {
11793 AddTemperature(-20);
11794
11795 }
11796
11797 else if (action_id ==
EActions.FLIP_FROZEN)
11798 {
11799 SetFrozen(!GetIsFrozen());
11800
11801 }
11802
11803 else if (action_id ==
EActions.ADD_WETNESS)
11804 {
11806
11807 }
11808
11809 else if (action_id ==
EActions.REMOVE_WETNESS)
11810 {
11812
11813 }
11814
11815 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11816 {
11819
11820
11821 }
11822
11823 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11824 {
11827 }
11828
11829 else if (action_id ==
EActions.MAKE_SPECIAL)
11830 {
11831 auto debugParams = DebugSpawnParams.WithPlayer(player);
11832 OnDebugSpawnEx(debugParams);
11833 }
11834
11835 }
11836
11837
11838 return false;
11839 }
11840
11841
11842
11843
11847
11850
11851
11852
11854 {
11855 return false;
11856 }
11857
11858
11860 {
11861 return true;
11862 }
11863
11864
11866 {
11867 return true;
11868 }
11869
11870
11871
11873 {
11874 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11875 return g_Game.ConfigIsExisting(config_path);
11876 }
11877
11880 {
11881 return null;
11882 }
11883
11885 {
11886 return false;
11887 }
11888
11890 {
11891 return false;
11892 }
11893
11897
11898
11900 {
11901 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11902 return module_repairing.CanRepair(this, item_repair_kit);
11903 }
11904
11905
11906 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11907 {
11908 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11909 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11910 }
11911
11912
11914 {
11915
11916
11917
11918
11919
11920
11921
11922
11923 return 1;
11924 }
11925
11926
11927
11929 {
11931 }
11932
11933
11934
11936 {
11938 }
11939
11940
11949 {
11950 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11951
11952 if (player)
11953 {
11954 player.MessageStatus(text);
11955 }
11956 }
11957
11958
11967 {
11968 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11969
11970 if (player)
11971 {
11972 player.MessageAction(text);
11973 }
11974 }
11975
11976
11985 {
11986 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11987
11988 if (player)
11989 {
11990 player.MessageFriendly(text);
11991 }
11992 }
11993
11994
12003 {
12004 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
12005
12006 if (player)
12007 {
12008 player.MessageImportant(text);
12009 }
12010 }
12011
12013 {
12014 return true;
12015 }
12016
12017
12018 override bool KindOf(
string tag)
12019 {
12020 bool found = false;
12021 string item_name = this.
GetType();
12023 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
12024
12025 int array_size = item_tag_array.Count();
12026 for (int i = 0; i < array_size; i++)
12027 {
12028 if (item_tag_array.Get(i) == tag)
12029 {
12030 found = true;
12031 break;
12032 }
12033 }
12034 return found;
12035 }
12036
12037
12039 {
12040
12041 super.OnRPC(sender, rpc_type,ctx);
12042
12043
12044 switch (rpc_type)
12045 {
12046 #ifndef SERVER
12047 case ERPCs.RPC_SOUND_LOCK_ATTACH:
12048 Param2<bool, string> p = new Param2<bool, string>(false, "");
12049
12051 return;
12052
12053 bool play = p.param1;
12054 string soundSet = p.param2;
12055
12056 if (play)
12057 {
12059 {
12061 {
12063 }
12064 }
12065 else
12066 {
12068 }
12069 }
12070 else
12071 {
12073 }
12074
12075 break;
12076 #endif
12077
12078 }
12079
12081 {
12083 }
12084 }
12085
12086
12087
12088
12090 {
12091 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12092 return plugin.GetID(
name);
12093 }
12094
12096 {
12097 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
12098 return plugin.GetName(id);
12099 }
12100
12103 {
12104
12105
12106 int varFlags;
12107 if (!ctx.
Read(varFlags))
12108 return;
12109
12110 if (varFlags & ItemVariableFlags.FLOAT)
12111 {
12113 }
12114 }
12115
12117 {
12118
12119 super.SerializeNumericalVars(floats_out);
12120
12121
12122
12124 {
12126 }
12127
12129 {
12131 }
12132
12134 {
12136 }
12137
12139 {
12144 }
12145
12147 {
12149 }
12150 }
12151
12153 {
12154
12155 super.DeSerializeNumericalVars(floats);
12156
12157
12158 int index = 0;
12159 int mask = Math.Round(floats.Get(index));
12160
12161 index++;
12162
12164 {
12166 {
12168 }
12169 else
12170 {
12171 float quantity = floats.Get(index);
12172 SetQuantity(quantity,
true,
false,
false,
false);
12173 }
12174 index++;
12175 }
12176
12178 {
12179 float wet = floats.Get(index);
12181 index++;
12182 }
12183
12185 {
12186 int liquidtype = Math.Round(floats.Get(index));
12188 index++;
12189 }
12190
12192 {
12194 index++;
12196 index++;
12198 index++;
12200 index++;
12201 }
12202
12204 {
12205 int cleanness = Math.Round(floats.Get(index));
12207 index++;
12208 }
12209 }
12210
12212 {
12213 super.WriteVarsToCTX(ctx);
12214
12215
12217 {
12219 }
12220
12222 {
12224 }
12225
12227 {
12229 }
12230
12232 {
12233 int r,g,b,a;
12239 }
12240
12242 {
12244 }
12245 }
12246
12248 {
12249 if (!super.ReadVarsFromCTX(ctx,version))
12250 return false;
12251
12252 int intValue;
12253 float value;
12254
12255 if (version < 140)
12256 {
12257 if (!ctx.
Read(intValue))
12258 return false;
12259
12260 m_VariablesMask = intValue;
12261 }
12262
12264 {
12265 if (!ctx.
Read(value))
12266 return false;
12267
12269 {
12271 }
12272 else
12273 {
12275 }
12276 }
12277
12278 if (version < 140)
12279 {
12281 {
12282 if (!ctx.
Read(value))
12283 return false;
12284 SetTemperatureDirect(value);
12285 }
12286 }
12287
12289 {
12290 if (!ctx.
Read(value))
12291 return false;
12293 }
12294
12296 {
12297 if (!ctx.
Read(intValue))
12298 return false;
12300 }
12301
12303 {
12304 int r,g,b,a;
12306 return false;
12308 return false;
12310 return false;
12312 return false;
12313
12315 }
12316
12318 {
12319 if (!ctx.
Read(intValue))
12320 return false;
12322 }
12323
12324 if (version >= 138 && version < 140)
12325 {
12327 {
12328 if (!ctx.
Read(intValue))
12329 return false;
12330 SetFrozen(intValue);
12331 }
12332 }
12333
12334 return true;
12335 }
12336
12337
12339 {
12342 {
12344 }
12345
12346 if (!super.OnStoreLoad(ctx, version))
12347 {
12349 return false;
12350 }
12351
12352 if (version >= 114)
12353 {
12354 bool hasQuickBarIndexSaved;
12355
12356 if (!ctx.
Read(hasQuickBarIndexSaved))
12357 {
12359 return false;
12360 }
12361
12362 if (hasQuickBarIndexSaved)
12363 {
12364 int itmQBIndex;
12365
12366
12367 if (!ctx.
Read(itmQBIndex))
12368 {
12370 return false;
12371 }
12372
12373 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12374 if (itmQBIndex != -1 && parentPlayer)
12375 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12376 }
12377 }
12378 else
12379 {
12380
12381 PlayerBase player;
12382 int itemQBIndex;
12383 if (version ==
int.
MAX)
12384 {
12385 if (!ctx.
Read(itemQBIndex))
12386 {
12388 return false;
12389 }
12390 }
12391 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12392 {
12393
12394 if (!ctx.
Read(itemQBIndex))
12395 {
12397 return false;
12398 }
12399 if (itemQBIndex != -1 && player)
12400 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12401 }
12402 }
12403
12404 if (version < 140)
12405 {
12406
12407 if (!LoadVariables(ctx, version))
12408 {
12410 return false;
12411 }
12412 }
12413
12414
12416 {
12418 return false;
12419 }
12420 if (version >= 132)
12421 {
12423 if (raib)
12424 {
12426 {
12428 return false;
12429 }
12430 }
12431 }
12432
12434 return true;
12435 }
12436
12437
12438
12440 {
12441 super.OnStoreSave(ctx);
12442
12443 PlayerBase player;
12444 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12445 {
12447
12448 int itemQBIndex = -1;
12449 itemQBIndex = player.FindQuickBarEntityIndex(this);
12450 ctx.
Write(itemQBIndex);
12451 }
12452 else
12453 {
12455 }
12456
12458
12460 if (raib)
12461 {
12463 }
12464 }
12465
12466
12468 {
12469 super.AfterStoreLoad();
12470
12472 {
12474 }
12475
12477 {
12480 }
12481 }
12482
12484 {
12485 super.EEOnAfterLoad();
12486
12488 {
12490 }
12491
12494 }
12495
12497 {
12498 return false;
12499 }
12500
12501
12502
12504 {
12506 {
12507 #ifdef PLATFORM_CONSOLE
12508
12510 {
12512 if (menu)
12513 {
12515 }
12516 }
12517 #endif
12518 }
12519
12521 {
12524 }
12525
12527 {
12528 SetWeightDirty();
12530 }
12532 {
12535 }
12536
12538 {
12541
12544 }
12546 {
12550 }
12551
12552 super.OnVariablesSynchronized();
12553 }
12554
12555
12556
12558 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12559 {
12560 if (!IsServerCheck(allow_client))
12561 return false;
12562
12564 return false;
12565
12568
12569 if (value <= (min + 0.001))
12570 value = min;
12571
12572 if (value == min)
12573 {
12574 if (destroy_config)
12575 {
12576 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12577 if (dstr)
12578 {
12580 this.Delete();
12581 return true;
12582 }
12583 }
12584 else if (destroy_forced)
12585 {
12587 this.Delete();
12588 return true;
12589 }
12590
12592 }
12593
12596
12598 {
12599 EntityAI parent = GetHierarchyRoot();
12600 InventoryLocation iLoc = new InventoryLocation();
12601 GetInventory().GetCurrentInventoryLocation(iLoc);
12603 {
12604 int iLocSlot = iLoc.
GetSlot();
12606 {
12608 }
12610 {
12612 }
12613 }
12614 }
12615
12617 {
12619
12620 if (delta)
12622 }
12623
12625
12626 return false;
12627 }
12628
12629
12631 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12632 {
12634 }
12635
12637 {
12640 }
12641
12643 {
12646 }
12647
12649 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12650 {
12651 float value_clamped = Math.Clamp(value, 0, 1);
12653 SetQuantity(result, destroy_config, destroy_forced);
12654 }
12655
12656
12659 {
12661 }
12662
12664 {
12666 }
12667
12668
12669
12670
12671
12672
12673
12674
12675
12676
12678 {
12679 int slot = -1;
12680 GameInventory inventory = GetInventory();
12681 if (inventory)
12682 {
12683 InventoryLocation il = new InventoryLocation;
12686 }
12687
12689 }
12690
12692 {
12693 float quantity_max = 0;
12694
12696 {
12697 if (attSlotID != -1)
12698 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12699
12700 if (quantity_max <= 0)
12702 }
12703
12704 if (quantity_max <= 0)
12706
12707 return quantity_max;
12708 }
12709
12711 {
12713 }
12714
12716 {
12718 }
12719
12720
12722 {
12724 }
12725
12727 {
12729 }
12730
12732 {
12734 }
12735
12736
12738 {
12739
12740 float weightEx = GetWeightEx();
12741 float special = GetInventoryAndCargoWeight();
12742 return weightEx - special;
12743 }
12744
12745
12747 {
12749 }
12750
12752 {
12754 {
12755 #ifdef DEVELOPER
12756 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12757 {
12758 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12760 }
12761 #endif
12762
12763 return GetQuantity() * GetConfigWeightModified();
12764 }
12765 else if (HasEnergyManager())
12766 {
12767 #ifdef DEVELOPER
12768 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12769 {
12770 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12771 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12772 }
12773 #endif
12774 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12775 }
12776 else
12777 {
12778 #ifdef DEVELOPER
12779 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12780 {
12781 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12782 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12783 }
12784 #endif
12785 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12786 }
12787 }
12788
12791 {
12792 int item_count = 0;
12794
12795 GameInventory inventory = GetInventory();
12796 CargoBase cargo = inventory.
GetCargo();
12797 if (cargo != NULL)
12798 {
12800 }
12801
12803 for (int i = 0; i < nAttachments; ++i)
12804 {
12806 if (item)
12807 item_count += item.GetNumberOfItems();
12808 }
12809 return item_count;
12810 }
12811
12814 {
12815 float weight = 0;
12816 float wetness = 1;
12817 if (include_wetness)
12820 {
12821 weight = wetness * m_ConfigWeight;
12822 }
12824 {
12825 weight = 1;
12826 }
12827 return weight;
12828 }
12829
12830
12831
12833 {
12834 GameInventory inventory = GetInventory();
12835 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12836 {
12837 array<EntityAI> items = new array<EntityAI>;
12839 for (int i = 0; i < items.Count(); ++i)
12840 {
12842 if (item)
12843 {
12844 g_Game.ObjectDelete(item);
12845 }
12846 }
12847 }
12848 }
12849
12850
12851
12852
12854 {
12855 float energy = 0;
12856 if (HasEnergyManager())
12857 {
12858 energy = GetCompEM().GetEnergy();
12859 }
12860 return energy;
12861 }
12862
12863
12865 {
12866 super.OnEnergyConsumed();
12867
12869 }
12870
12872 {
12873 super.OnEnergyAdded();
12874
12876 }
12877
12878
12880 {
12881 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12882 {
12884 {
12885 float energy_0to1 = GetCompEM().GetEnergy0To1();
12887 }
12888 }
12889 }
12890
12891
12893 {
12894 return ConfigGetFloat("heatIsolation");
12895 }
12896
12898 {
12900 }
12901
12903 {
12904 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12905 if (
g_Game.ConfigIsExisting(paramPath))
12906 return g_Game.ConfigGetFloat(paramPath);
12907
12908 return 0.0;
12909 }
12910
12912 {
12913 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12914 if (
g_Game.ConfigIsExisting(paramPath))
12915 return g_Game.ConfigGetFloat(paramPath);
12916
12917 return 0.0;
12918 }
12919
12920 override void SetWet(
float value,
bool allow_client =
false)
12921 {
12922 if (!IsServerCheck(allow_client))
12923 return;
12924
12927
12929
12930 m_VarWet = Math.Clamp(value, min, max);
12931
12933 {
12936 }
12937 }
12938
12939 override void AddWet(
float value)
12940 {
12942 }
12943
12945 {
12947 }
12948
12950 {
12952 }
12953
12955 {
12957 }
12958
12960 {
12962 }
12963
12965 {
12967 }
12968
12969 override void OnWetChanged(
float newVal,
float oldVal)
12970 {
12973 if (newLevel != oldLevel)
12974 {
12976 }
12977 }
12978
12980 {
12981 SetWeightDirty();
12982 }
12983
12985 {
12986 return GetWetLevelInternal(
m_VarWet);
12987 }
12988
12989
12990
12992 {
12994 }
12995
12997 {
12999 }
13000
13002 {
13004 }
13005
13007 {
13009 }
13010
13011
13012
13014 {
13015 if (ConfigIsExisting("itemModelLength"))
13016 {
13017 return ConfigGetFloat("itemModelLength");
13018 }
13019 return 0;
13020 }
13021
13023 {
13024 if (ConfigIsExisting("itemAttachOffset"))
13025 {
13026 return ConfigGetFloat("itemAttachOffset");
13027 }
13028 return 0;
13029 }
13030
13031 override void SetCleanness(
int value,
bool allow_client =
false)
13032 {
13033 if (!IsServerCheck(allow_client))
13034 return;
13035
13037
13039
13042 }
13043
13045 {
13047 }
13048
13050 {
13051 return true;
13052 }
13053
13054
13055
13056
13058 {
13060 }
13061
13063 {
13065 }
13066
13067
13068
13069
13070 override void SetColor(
int r,
int g,
int b,
int a)
13071 {
13077 }
13079 override void GetColor(out
int r,out
int g,out
int b,out
int a)
13080 {
13085 }
13086
13088 {
13090 }
13091
13094 {
13095 int r,g,b,a;
13097 r = r/255;
13098 g = g/255;
13099 b = b/255;
13100 a = a/255;
13101 return MiscGameplayFunctions.GetColorString(r, g, b, a);
13102 }
13103
13104
13105
13106 override void SetLiquidType(
int value,
bool allow_client =
false)
13107 {
13108 if (!IsServerCheck(allow_client))
13109 return;
13110
13115 }
13116
13118 {
13119 return ConfigGetInt("varLiquidTypeInit");
13120 }
13121
13123 {
13125 }
13126
13128 {
13130 SetFrozen(false);
13131 }
13132
13135 {
13136 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13137 }
13138
13139
13142 {
13143 PlayerBase nplayer;
13144 if (PlayerBase.CastTo(nplayer, player))
13145 {
13147 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
13148 }
13149 }
13150
13151
13154 {
13155 PlayerBase nplayer;
13156 if (PlayerBase.CastTo(nplayer,player))
13157 {
13158 nplayer.SetEnableQuickBarEntityShortcut(this, false);
13159 }
13160
13161 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
13162
13163 if (HasEnergyManager())
13164 {
13165 GetCompEM().UpdatePlugState();
13166 }
13167 }
13168
13169
13171 {
13172 super.OnPlacementStarted(player);
13173
13175 }
13176
13177 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
13178 {
13180 {
13181 m_AdminLog.OnPlacementComplete(player,
this);
13182 }
13183
13184 super.OnPlacementComplete(player, position, orientation);
13185 }
13186
13187
13188
13189
13190
13192 {
13194 {
13195 return true;
13196 }
13197 else
13198 {
13199 return false;
13200 }
13201 }
13202
13203
13205 {
13207 {
13209 }
13210 }
13211
13212
13214 {
13216 }
13217
13219 {
13221 }
13222
13223 override void InsertAgent(
int agent,
float count = 1)
13224 {
13225 if (count < 1)
13226 return;
13227
13229 }
13230
13233 {
13235 }
13236
13237
13239 {
13241 }
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
13257
13258
13259
13260
13261
13262
13263
13264
13265
13266
13267
13268
13269
13270
13271
13272
13273
13274
13275
13276
13277
13278
13279
13280
13281
13282
13283
13285 {
13287 return false;
13288 return true;
13289 }
13290
13292 {
13293
13295 }
13296
13297
13300 {
13301 super.CheckForRoofLimited(timeTresholdMS);
13302
13303 float time =
g_Game.GetTime();
13304 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13305 {
13306 m_PreviousRoofTestTime = time;
13307 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13308 }
13309 }
13310
13311
13313 {
13315 {
13316 return 0;
13317 }
13318
13319 if (GetInventory().GetAttachmentSlotsCount() != 0)
13320 {
13321 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13322 if (filter)
13323 return filter.GetProtectionLevel(type, false, system);
13324 else
13325 return 0;
13326 }
13327
13328 string subclassPath, entryName;
13329
13330 switch (type)
13331 {
13333 entryName = "biological";
13334 break;
13336 entryName = "chemical";
13337 break;
13338 default:
13339 entryName = "biological";
13340 break;
13341 }
13342
13343 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13344
13345 return g_Game.ConfigGetFloat(subclassPath + entryName);
13346 }
13347
13348
13349
13352 {
13353 if (!IsMagazine())
13355
13357 }
13358
13359
13360
13361
13362
13367 {
13368 return true;
13369 }
13370
13372 {
13374 }
13375
13376
13377
13378
13379
13381 {
13382 if (parent)
13383 {
13384 if (parent.IsInherited(DayZInfected))
13385 return true;
13386
13387 if (!parent.IsRuined())
13388 return true;
13389 }
13390
13391 return true;
13392 }
13393
13395 {
13396 if (!super.CanPutAsAttachment(parent))
13397 {
13398 return false;
13399 }
13400
13401 if (!IsRuined() && !parent.IsRuined())
13402 {
13403 return true;
13404 }
13405
13406 return false;
13407 }
13408
13410 {
13411
13412
13413
13414
13415 return super.CanReceiveItemIntoCargo(item);
13416 }
13417
13419 {
13420
13421
13422
13423
13424 GameInventory attachmentInv = attachment.GetInventory();
13426 {
13427 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13428 return false;
13429 }
13430
13431 InventoryLocation loc = new InventoryLocation();
13432 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13433 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13434 return false;
13435
13436 return super.CanReceiveAttachment(attachment, slotId);
13437 }
13438
13440 {
13441 if (!super.CanReleaseAttachment(attachment))
13442 return false;
13443
13444 return GetInventory().AreChildrenAccessible();
13445 }
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
13458
13459
13460
13461
13462
13463
13464
13465
13466
13468 {
13469 int id = muzzle_owner.GetMuzzleID();
13470 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13471
13472 if (WPOF_array)
13473 {
13474 for (int i = 0; i < WPOF_array.Count(); i++)
13475 {
13476 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13477
13478 if (WPOF)
13479 {
13480 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13481 }
13482 }
13483 }
13484 }
13485
13486
13488 {
13489 int id = muzzle_owner.GetMuzzleID();
13491
13492 if (WPOBE_array)
13493 {
13494 for (int i = 0; i < WPOBE_array.Count(); i++)
13495 {
13496 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13497
13498 if (WPOBE)
13499 {
13500 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13501 }
13502 }
13503 }
13504 }
13505
13506
13508 {
13509 int id = muzzle_owner.GetMuzzleID();
13510 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13511
13512 if (WPOOH_array)
13513 {
13514 for (int i = 0; i < WPOOH_array.Count(); i++)
13515 {
13516 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13517
13518 if (WPOOH)
13519 {
13520 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13521 }
13522 }
13523 }
13524 }
13525
13526
13528 {
13529 int id = muzzle_owner.GetMuzzleID();
13530 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13531
13532 if (WPOOH_array)
13533 {
13534 for (int i = 0; i < WPOOH_array.Count(); i++)
13535 {
13536 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13537
13538 if (WPOOH)
13539 {
13540 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13541 }
13542 }
13543 }
13544 }
13545
13546
13548 {
13549 int id = muzzle_owner.GetMuzzleID();
13550 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13551
13552 if (WPOOH_array)
13553 {
13554 for (int i = 0; i < WPOOH_array.Count(); i++)
13555 {
13556 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13557
13558 if (WPOOH)
13559 {
13560 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13561 }
13562 }
13563 }
13564 }
13565
13566
13567
13569 {
13571 {
13572 return true;
13573 }
13574
13575 return false;
13576 }
13577
13579 {
13581 {
13582 return true;
13583 }
13584
13585 return false;
13586 }
13587
13589 {
13591 {
13592 return true;
13593 }
13594
13595 return false;
13596 }
13597
13599 {
13600 return false;
13601 }
13602
13605 {
13606 return UATimeSpent.DEFAULT_DEPLOY;
13607 }
13608
13609
13610
13611
13613 {
13615 SetSynchDirty();
13616 }
13617
13619 {
13621 }
13622
13623
13625 {
13626 return false;
13627 }
13628
13631 {
13632 string att_type = "None";
13633
13634 if (ConfigIsExisting("soundAttType"))
13635 {
13636 att_type = ConfigGetString("soundAttType");
13637 }
13638
13640 }
13641
13643 {
13645 }
13646
13647
13648
13649
13650
13656
13658 {
13661
13663 }
13664
13665
13667 {
13669 return;
13670
13672
13675
13678
13679 SoundParameters params = new SoundParameters();
13683 }
13684
13685
13687 {
13689 {
13692
13693 SetSynchDirty();
13694
13697 }
13698 }
13699
13701 {
13703 }
13704
13705
13707 {
13709 return;
13710
13712 SetSynchDirty();
13713
13716 }
13717
13719 {
13722 }
13723
13725 {
13727 }
13728
13729 void OnApply(PlayerBase player);
13730
13732 {
13733 return 1.0;
13734 };
13735
13737 {
13739 }
13740
13742 {
13744 }
13745
13747
13749 {
13750 SetDynamicPhysicsLifeTime(0.01);
13752 }
13753
13755 {
13756 array<string> zone_names = new array<string>;
13757 GetDamageZones(zone_names);
13758 for (int i = 0; i < zone_names.Count(); i++)
13759 {
13760 SetHealthMax(zone_names.Get(i),"Health");
13761 }
13762 SetHealthMax("","Health");
13763 }
13764
13767 {
13768 float global_health = GetHealth01("","Health");
13769 array<string> zones = new array<string>;
13770 GetDamageZones(zones);
13771
13772 for (int i = 0; i < zones.Count(); i++)
13773 {
13774 SetHealth01(zones.Get(i),"Health",global_health);
13775 }
13776 }
13777
13780 {
13781 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13782 }
13783
13785 {
13786 if (!hasRootAsPlayer)
13787 {
13788 if (refParentIB)
13789 {
13790
13791 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13792 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13793
13794 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13795 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13796
13799 }
13800 else
13801 {
13802
13805 }
13806 }
13807 }
13808
13810 {
13812 {
13813 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13814 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13815 {
13816 float heatPermCoef = 1.0;
13818 while (ent)
13819 {
13820 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13821 ent = ent.GetHierarchyParent();
13822 }
13823
13824 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13825 }
13826 }
13827 }
13828
13830 {
13831
13832 EntityAI parent = GetHierarchyParent();
13833 if (!parent)
13834 {
13835 hasParent = false;
13836 hasRootAsPlayer = false;
13837 }
13838 else
13839 {
13840 hasParent = true;
13841 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13842 refParentIB =
ItemBase.Cast(parent);
13843 }
13844 }
13845
13846 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13847 {
13848
13849 }
13850
13852 {
13853
13854 return false;
13855 }
13856
13858 {
13859
13860
13861 return false;
13862 }
13863
13865 {
13866
13867 return false;
13868 }
13869
13872 {
13873 return !GetIsFrozen() &&
IsOpen();
13874 }
13875
13877 {
13878 bool hasParent = false, hasRootAsPlayer = false;
13880
13881 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13882 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13883
13884 if (wwtu || foodDecay)
13885 {
13889
13890 if (processWetness || processTemperature || processDecay)
13891 {
13893
13894 if (processWetness)
13895 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13896
13897 if (processTemperature)
13899
13900 if (processDecay)
13901 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13902 }
13903 }
13904 }
13905
13908 {
13910 }
13911
13913 {
13916
13917 return super.GetTemperatureFreezeThreshold();
13918 }
13919
13921 {
13924
13925 return super.GetTemperatureThawThreshold();
13926 }
13927
13929 {
13932
13933 return super.GetItemOverheatThreshold();
13934 }
13935
13937 {
13939 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13940
13941 return super.GetTemperatureFreezeTime();
13942 }
13943
13945 {
13947 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13948
13949 return super.GetTemperatureThawTime();
13950 }
13951
13956
13958 {
13959 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13960 }
13961
13963 {
13964 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13965 }
13966
13969 {
13971 }
13972
13974 {
13976 }
13977
13979 {
13981 }
13982
13985 {
13986 return null;
13987 }
13988
13991 {
13992 return false;
13993 }
13994
13996 {
13998 {
14001 if (!trg)
14002 {
14004 explosive = this;
14005 }
14006
14007 explosive.PairRemote(trg);
14009
14010 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
14011 trg.SetPersistentPairID(persistentID);
14012 explosive.SetPersistentPairID(persistentID);
14013
14014 return true;
14015 }
14016 return false;
14017 }
14018
14021 {
14022 float ret = 1.0;
14025 ret *= GetHealth01();
14026
14027 return ret;
14028 }
14029
14030 #ifdef DEVELOPER
14031 override void SetDebugItem()
14032 {
14033 super.SetDebugItem();
14034 _itemBase = this;
14035 }
14036
14038 {
14039 string text = super.GetDebugText();
14040
14042 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
14043
14044 return text;
14045 }
14046 #endif
14047
14049 {
14050 return true;
14051 }
14052
14054
14056
14058 {
14061 }
14062
14063
14071
14087
14088 [
Obsolete(
"Use ItemSoundHandler instead")]
14091 {
14092 if (!
g_Game.IsDedicatedServer())
14093 {
14094 if (ConfigIsExisting("attachSoundSet"))
14095 {
14096 string cfg_path = "";
14097 string soundset = "";
14098 string type_name =
GetType();
14099
14102 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
14103 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
14104
14105 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
14106 {
14107 for (int i = 0; i < cfg_soundset_array.Count(); i++)
14108 {
14109 if (cfg_slot_array[i] == slot_type)
14110 {
14111 soundset = cfg_soundset_array[i];
14112 break;
14113 }
14114 }
14115 }
14116
14117 if (soundset != "")
14118 {
14119 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
14121 }
14122 }
14123 }
14124 }
14125
14127}
14128
14130{
14132 if (entity)
14133 {
14134 bool is_item = entity.IsInherited(
ItemBase);
14135 if (is_item && full_quantity)
14136 {
14139 }
14140 }
14141 else
14142 {
14144 return NULL;
14145 }
14146 return entity;
14147}
14148
14150{
14151 if (item)
14152 {
14153 if (health > 0)
14154 item.SetHealth("", "", health);
14155
14156 if (item.CanHaveTemperature())
14157 {
14159 if (item.CanFreeze())
14160 item.SetFrozen(false);
14161 }
14162
14163 if (item.HasEnergyManager())
14164 {
14165 if (quantity >= 0)
14166 {
14167 item.GetCompEM().SetEnergy0To1(quantity);
14168 }
14169 else
14170 {
14172 }
14173 }
14174 else if (item.IsMagazine())
14175 {
14176 Magazine mag = Magazine.Cast(item);
14177 if (quantity >= 0)
14178 {
14179 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
14180 }
14181 else
14182 {
14184 }
14185
14186 }
14187 else
14188 {
14189 if (quantity >= 0)
14190 {
14191 item.SetQuantityNormalized(quantity, false);
14192 }
14193 else
14194 {
14196 }
14197
14198 }
14199 }
14200}
14201
14202#ifdef DEVELOPER
14204#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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 IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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)
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()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.