9002{
9004 {
9005 return true;
9006 }
9007};
9008
9009
9010
9012{
9016
9018
9021
9022
9023
9024
9025
9034
9040
9045
9050
9071 protected bool m_IsResultOfSplit
9072
9074
9079
9080
9081
9083
9087
9088
9089
9091
9094
9095
9096
9102
9103
9111
9114
9115
9117
9118
9120
9121
9126
9127
9132
9133
9135
9136
9138 {
9143
9144 if (!
GetGame().IsDedicatedServer())
9145 {
9147 {
9149
9151 {
9153 }
9154 }
9155
9158 }
9159
9160 m_OldLocation = null;
9161
9163 {
9165 }
9166
9167 if (ConfigIsExisting("headSelectionsToHide"))
9168 {
9171 }
9172
9174 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9175 {
9177 }
9178
9180
9181 m_IsResultOfSplit = false;
9182
9184 }
9185
9187 {
9188 super.InitItemVariables();
9189
9195 m_Count = ConfigGetInt(
"count");
9196
9199
9204
9207
9212
9224
9228
9229
9232 if (ConfigIsExisting("canBeSplit"))
9233 {
9236 }
9237
9239 if (ConfigIsExisting("itemBehaviour"))
9241
9242
9245 RegisterNetSyncVariableInt("m_VarLiquidType");
9246 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9247
9248 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9249 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9250 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9251
9252 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9253 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9254 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9255 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9256
9257 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9258 RegisterNetSyncVariableBool("m_IsTakeable");
9259 RegisterNetSyncVariableBool("m_IsHologram");
9260
9263 {
9266 }
9267
9269
9271 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9273
9274 }
9275
9277 {
9279 }
9280
9282 {
9285 {
9290 }
9291 }
9292
9293 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9294 {
9296 {
9299 }
9300
9302 }
9303
9305 {
9311 }
9312
9314
9316 {
9318
9319 if (!action)
9320 {
9321 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9322 return;
9323 }
9324
9326 if (!ai)
9327 {
9329 return;
9330 }
9331
9333 if (!action_array)
9334 {
9335 action_array = new array<ActionBase_Basic>;
9337 }
9338 if (LogManager.IsActionLogEnable())
9339 {
9340 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9341 }
9342
9343 if (action_array.Find(action) != -1)
9344 {
9345 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9346 }
9347 else
9348 {
9349 action_array.Insert(action);
9350 }
9351 }
9352
9354 {
9356 ActionBase action = player.GetActionManager().GetAction(actionName);
9359
9360 if (action_array)
9361 {
9362 action_array.RemoveItem(action);
9363 }
9364 }
9365
9366
9367
9369 {
9370 ActionOverrideData overrideData = new ActionOverrideData();
9374
9376 if (!actionMap)
9377 {
9380 }
9381
9382 actionMap.Insert(this.
Type(), overrideData);
9383
9384 }
9385
9387
9389
9390
9392 {
9395
9398
9399 string config_to_search = "CfgVehicles";
9400 string muzzle_owner_config;
9401
9403 {
9404 if (IsInherited(Weapon))
9405 config_to_search = "CfgWeapons";
9406
9407 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9408
9409 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9410
9412
9413 if (config_OnFire_subclass_count > 0)
9414 {
9415 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9416
9417 for (int i = 0; i < config_OnFire_subclass_count; i++)
9418 {
9419 string particle_class = "";
9421 string config_OnFire_entry = config_OnFire_class + particle_class;
9422 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9423 WPOF_array.Insert(WPOF);
9424 }
9425
9426
9428 }
9429 }
9430
9432 {
9433 config_to_search = "CfgWeapons";
9434 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9435
9436 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9437
9439
9440 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9441 {
9442 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9443
9444 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9445 {
9446 string particle_class2 = "";
9448 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9449 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9450 WPOBE_array.Insert(WPOBE);
9451 }
9452
9453
9455 }
9456 }
9457 }
9458
9459
9461 {
9464
9466 {
9467 string config_to_search = "CfgVehicles";
9468
9469 if (IsInherited(Weapon))
9470 config_to_search = "CfgWeapons";
9471
9472 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9473 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9474
9475 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9476 {
9477
9479
9481 {
9483 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9485 return;
9486 }
9487
9490
9491
9492
9494 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9495
9496 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9497 {
9498 string particle_class = "";
9500 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9502
9503 if (entry_type == CT_CLASS)
9504 {
9505 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9506 WPOOH_array.Insert(WPOF);
9507 }
9508 }
9509
9510
9512 }
9513 }
9514 }
9515
9517 {
9519 }
9520
9522 {
9524 {
9526
9529
9532
9533 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9534 }
9535 }
9536
9538 {
9540 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9541
9543 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9544
9546 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9547
9549 {
9551 }
9552 }
9553
9555 {
9557 }
9558
9560 {
9563 else
9565
9567 {
9570 }
9571 else
9572 {
9575
9578 }
9579
9581 }
9582
9584 {
9586 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9587 }
9588
9590 {
9592 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9594 }
9595
9597 {
9599 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9600 }
9601
9603 {
9606
9607 OverheatingParticle OP = new OverheatingParticle();
9612
9614 }
9615
9617 {
9620
9621 return -1;
9622 }
9623
9625 {
9627 {
9630
9631 for (int i = count; i > 0; --i)
9632 {
9633 int id = i - 1;
9636
9639
9640 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9641 {
9642 if (p)
9643 {
9646 }
9647 }
9648 }
9649 }
9650 }
9651
9653 {
9655 {
9657 {
9658 int id = i - 1;
9660
9661 if (OP)
9662 {
9664
9665 if (p)
9666 {
9668 }
9669
9670 delete OP;
9671 }
9672 }
9673
9676 }
9677 }
9678
9681 {
9682 return 0.0;
9683 }
9684
9685
9687 {
9688 return 250;
9689 }
9690
9692 {
9693 return 0;
9694 }
9695
9698 {
9700 return true;
9701
9702 return false;
9703 }
9704
9707 {
9710
9712 {
9714 }
9715 else
9716 {
9717
9719 }
9720
9722 }
9723
9730 {
9731 return -1;
9732 }
9733
9734
9735
9736
9738 {
9740 {
9742 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9743
9744 if (r_index >= 0)
9745 {
9746 InventoryLocation r_il = new InventoryLocation;
9747 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9748
9749 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9752 {
9753 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9754 }
9756 {
9757 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9758 }
9759
9760 }
9761
9762 player.GetHumanInventory().ClearUserReservedLocation(this);
9763 }
9764
9767 }
9768
9769
9770
9771
9773 {
9774 return ItemBase.m_DebugActionsMask;
9775 }
9776
9778 {
9779 return ItemBase.m_DebugActionsMask & mask;
9780 }
9781
9783 {
9784 ItemBase.m_DebugActionsMask = mask;
9785 }
9786
9788 {
9789 ItemBase.m_DebugActionsMask |= mask;
9790 }
9791
9793 {
9794 ItemBase.m_DebugActionsMask &= ~mask;
9795 }
9796
9798 {
9800 {
9802 }
9803 else
9804 {
9806 }
9807 }
9808
9809
9811 {
9812 if (GetEconomyProfile())
9813 {
9814 float q_max = GetEconomyProfile().GetQuantityMax();
9815 if (q_max > 0)
9816 {
9817 float q_min = GetEconomyProfile().GetQuantityMin();
9818 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9819
9821 {
9822 ComponentEnergyManager comp = GetCompEM();
9824 {
9826 }
9827 }
9829 {
9831
9832 }
9833
9834 }
9835 }
9836 }
9837
9840 {
9841 EntityAI parent = GetHierarchyParent();
9842
9843 if (parent)
9844 {
9845 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9846 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9847 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9848 }
9849 }
9850
9853 {
9854 EntityAI parent = GetHierarchyParent();
9855
9856 if (parent)
9857 {
9858 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9859 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9860 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9861 }
9862 }
9863
9865 {
9866
9867
9868
9869
9871
9873 {
9874 if (ScriptInputUserData.CanStoreInputUserData())
9875 {
9876 ScriptInputUserData ctx = new ScriptInputUserData;
9882 ctx.
Write(use_stack_max);
9885
9887 {
9888 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9889 }
9890 }
9891 }
9892 else if (!
GetGame().IsMultiplayer())
9893 {
9895 }
9896 }
9897
9899 {
9901 }
9902
9904 {
9906 }
9907
9909 {
9911 }
9912
9914 {
9915
9916 return false;
9917 }
9918
9920 {
9921 return false;
9922 }
9923
9927 {
9928 return false;
9929 }
9930
9932 {
9933 return "";
9934 }
9935
9937
9939 {
9940 return false;
9941 }
9942
9944 {
9945 return true;
9946 }
9947
9948
9949
9951 {
9952 return true;
9953 }
9954
9956 {
9957 return true;
9958 }
9959
9961 {
9962 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9964 }
9965
9967 {
9969 }
9970
9972 {
9974 if (!is_being_placed)
9976 SetSynchDirty();
9977 }
9978
9979
9981
9983 {
9985 }
9986
9988 {
9990 }
9991
9993 {
9994 return 1;
9995 }
9996
9998 {
9999 return false;
10000 }
10001
10003 {
10005 SetSynchDirty();
10006 }
10007
10008
10009
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10043 {
10044 super.OnMovedInsideCargo(container);
10045
10046 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10047 }
10048
10049 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10050 {
10051 super.EEItemLocationChanged(oldLoc,newLoc);
10052
10053 PlayerBase new_player = null;
10054 PlayerBase old_player = null;
10055
10056 if (newLoc.GetParent())
10057 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10058
10059 if (oldLoc.GetParent())
10060 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10061
10063 {
10064 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10065
10066 if (r_index >= 0)
10067 {
10068 InventoryLocation r_il = new InventoryLocation;
10069 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10070
10071 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10074 {
10075 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10076 }
10078 {
10079 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10080 }
10081
10082 }
10083 }
10084
10086 {
10087 if (new_player)
10088 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10089
10090 if (new_player == old_player)
10091 {
10092
10093 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10094 {
10096 {
10097 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10098 {
10099 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10100 }
10101 }
10102 else
10103 {
10104 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10105 }
10106 }
10107
10108 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10109 {
10110 int type = oldLoc.GetType();
10112 {
10113 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10114 }
10116 {
10117 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10118 }
10119 }
10120 if (!m_OldLocation)
10121 {
10122 m_OldLocation = new InventoryLocation;
10123 }
10124 m_OldLocation.Copy(oldLoc);
10125 }
10126 else
10127 {
10128 if (m_OldLocation)
10129 {
10130 m_OldLocation.Reset();
10131 }
10132 }
10133
10135 }
10136 else
10137 {
10138 if (new_player)
10139 {
10140 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10141 if (res_index >= 0)
10142 {
10143 InventoryLocation il = new InventoryLocation;
10144 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10146 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10149 {
10150 il.
GetParent().GetOnReleaseLock().Invoke(it);
10151 }
10153 {
10155 }
10156
10157 }
10158 }
10160 {
10161
10163 }
10164
10165 if (m_OldLocation)
10166 {
10167 m_OldLocation.Reset();
10168 }
10169 }
10170 }
10171
10172 override void EOnContact(IEntity other, Contact extra)
10173 {
10175 {
10176 int liquidType = -1;
10178 if (impactSpeed > 0.0)
10179 {
10181 #ifndef SERVER
10183 #else
10185 SetSynchDirty();
10186 #endif
10188 }
10189 }
10190
10191 #ifdef SERVER
10192 if (GetCompEM() && GetCompEM().IsPlugged())
10193 {
10194 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10195 GetCompEM().UnplugThis();
10196 }
10197 #endif
10198 }
10199
10201
10203 {
10205 }
10206
10208 {
10209
10210 }
10211
10213 {
10214 super.OnItemLocationChanged(old_owner, new_owner);
10215
10216 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10217 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10218
10219 if (!relatedPlayer && playerNew)
10220 relatedPlayer = playerNew;
10221
10222 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10223 {
10225 if (actionMgr)
10226 {
10227 ActionBase currentAction = actionMgr.GetRunningAction();
10228 if (currentAction)
10230 }
10231 }
10232
10233 Man ownerPlayerOld = null;
10234 Man ownerPlayerNew = null;
10235
10236 if (old_owner)
10237 {
10238 if (old_owner.
IsMan())
10239 {
10240 ownerPlayerOld = Man.Cast(old_owner);
10241 }
10242 else
10243 {
10244 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10245 }
10246 }
10247 else
10248 {
10250 {
10252
10253 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10254 {
10255 GetCompEM().UnplugThis();
10256 }
10257 }
10258 }
10259
10260 if (new_owner)
10261 {
10262 if (new_owner.
IsMan())
10263 {
10264 ownerPlayerNew = Man.Cast(new_owner);
10265 }
10266 else
10267 {
10268 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10269 }
10270 }
10271
10272 if (ownerPlayerOld != ownerPlayerNew)
10273 {
10274 if (ownerPlayerOld)
10275 {
10276 array<EntityAI> subItemsExit = new array<EntityAI>;
10278 for (int i = 0; i < subItemsExit.Count(); i++)
10279 {
10282 }
10283 }
10284
10285 if (ownerPlayerNew)
10286 {
10287 array<EntityAI> subItemsEnter = new array<EntityAI>;
10289 for (int j = 0; j < subItemsEnter.Count(); j++)
10290 {
10293 }
10294 }
10295 }
10296 else if (ownerPlayerNew != null)
10297 {
10298 PlayerBase nplayer;
10299 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10300 {
10301 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10303 for (int k = 0; k < subItemsUpdate.Count(); k++)
10304 {
10306 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10307 }
10308 }
10309 }
10310
10311 if (old_owner)
10312 old_owner.OnChildItemRemoved(this);
10313 if (new_owner)
10314 new_owner.OnChildItemReceived(this);
10315 }
10316
10317
10319 {
10320 super.EEDelete(parent);
10321 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10322 if (player)
10323 {
10325
10326 if (player.IsAlive())
10327 {
10328 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10329 if (r_index >= 0)
10330 {
10331 InventoryLocation r_il = new InventoryLocation;
10332 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10333
10334 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10337 {
10338 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10339 }
10341 {
10342 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10343 }
10344
10345 }
10346
10347 player.RemoveQuickBarEntityShortcut(this);
10348 }
10349 }
10350 }
10351
10353 {
10354 super.EEKilled(killer);
10355
10358 {
10359 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10360 {
10361 if (IsMagazine())
10362 {
10363 if (Magazine.Cast(this).GetAmmoCount() > 0)
10364 {
10366 }
10367 }
10368 else
10369 {
10371 }
10372 }
10373 }
10374 }
10375
10377 {
10378 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10379
10380 super.OnWasAttached(parent, slot_id);
10381
10384
10386 }
10387
10389 {
10390 super.OnWasDetached(parent, slot_id);
10391
10394 }
10395
10397 {
10398 int idx;
10401
10402 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10403 if (inventory_slots.Count() < 1)
10404 {
10405 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10406 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10407 }
10408 else
10409 {
10410 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10411 }
10412
10413 idx = inventory_slots.Find(slot);
10414 if (idx < 0)
10415 return "";
10416
10417 return attach_types.Get(idx);
10418 }
10419
10421 {
10422 int idx = -1;
10423 string slot;
10424
10427
10428 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10429 if (inventory_slots.Count() < 1)
10430 {
10431 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10432 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10433 }
10434 else
10435 {
10436 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10437 if (detach_types.Count() < 1)
10438 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10439 }
10440
10441 for (int i = 0; i < inventory_slots.Count(); i++)
10442 {
10443 slot = inventory_slots.Get(i);
10444 }
10445
10446 if (slot != "")
10447 {
10448 if (detach_types.Count() == 1)
10449 idx = 0;
10450 else
10451 idx = inventory_slots.Find(slot);
10452 }
10453 if (idx < 0)
10454 return "";
10455
10456 return detach_types.Get(idx);
10457 }
10458
10460 {
10461
10463
10464
10465 float min_time = 1;
10466 float max_time = 3;
10467 float delay = Math.RandomFloat(min_time, max_time);
10468
10469 explode_timer.Run(delay, this, "DoAmmoExplosion");
10470 }
10471
10473 {
10474 Magazine magazine = Magazine.Cast(this);
10475 int pop_sounds_count = 6;
10476 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10477
10478
10479 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10480 string sound_name = pop_sounds[ sound_idx ];
10482
10483
10484 magazine.ServerAddAmmoCount(-1);
10485
10486
10487 float min_temp_to_explode = 100;
10488
10489 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
10490 {
10492 }
10493 }
10494
10495
10496 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10497 {
10498 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10499
10500 const int CHANCE_DAMAGE_CARGO = 4;
10501 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10502 const int CHANCE_DAMAGE_NOTHING = 2;
10503
10505 {
10506 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10507 int chances;
10508 int rnd;
10509
10510 if (GetInventory().GetCargo())
10511 {
10512 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10513 rnd = Math.RandomInt(0,chances);
10514
10515 if (rnd < CHANCE_DAMAGE_CARGO)
10516 {
10518 }
10519 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10520 {
10522 }
10523 }
10524 else
10525 {
10526 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10527 rnd = Math.RandomInt(0,chances);
10528
10529 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10530 {
10532 }
10533 }
10534 }
10535 }
10536
10538 {
10539 if (GetInventory().GetCargo())
10540 {
10541 int item_count = GetInventory().GetCargo().GetItemCount();
10542 if (item_count > 0)
10543 {
10544 int random_pick = Math.RandomInt(0, item_count);
10546 if (!item.IsExplosive())
10547 {
10548 item.AddHealth("","",damage);
10549 return true;
10550 }
10551 }
10552 }
10553 return false;
10554 }
10555
10557 {
10558 int attachment_count = GetInventory().AttachmentCount();
10559 if (attachment_count > 0)
10560 {
10561 int random_pick = Math.RandomInt(0, attachment_count);
10562 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10563 if (!attachment.IsExplosive())
10564 {
10565 attachment.AddHealth("","",damage);
10566 return true;
10567 }
10568 }
10569 return false;
10570 }
10571
10573 {
10575 }
10576
10578 {
10580 return GetInventory().CanRemoveEntity();
10581
10582 return false;
10583 }
10584
10586 {
10588 return;
10589
10591 {
10592 if (ScriptInputUserData.CanStoreInputUserData())
10593 {
10594 ScriptInputUserData ctx = new ScriptInputUserData;
10599 ctx.
Write(destination_entity);
10601 ctx.
Write(slot_id);
10603 }
10604 }
10605 else if (!
GetGame().IsMultiplayer())
10606 {
10608 }
10609 }
10610
10612 {
10614 return;
10615
10616 float split_quantity_new;
10620 InventoryLocation loc = new InventoryLocation;
10621
10622 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10623 {
10625 split_quantity_new = stack_max;
10626 else
10628
10629 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10630 if (new_item)
10631 {
10632 new_item.SetResultOfSplit(true);
10633 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10635 new_item.SetQuantity(split_quantity_new);
10636 }
10637 }
10638 else if (destination_entity && slot_id == -1)
10639 {
10640 if (quantity > stack_max)
10641 split_quantity_new = stack_max;
10642 else
10643 split_quantity_new = quantity;
10644
10646 {
10649 }
10650
10651 if (new_item)
10652 {
10653 new_item.SetResultOfSplit(true);
10654 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10656 new_item.SetQuantity(split_quantity_new);
10657 }
10658 }
10659 else
10660 {
10661 if (stack_max != 0)
10662 {
10664 {
10666 }
10667
10668 if (split_quantity_new == 0)
10669 {
10670 if (!
GetGame().IsMultiplayer())
10671 player.PhysicalPredictiveDropItem(this);
10672 else
10673 player.ServerDropEntity(this);
10674 return;
10675 }
10676
10678
10679 if (new_item)
10680 {
10681 new_item.SetResultOfSplit(true);
10682 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10684 new_item.SetQuantity(stack_max);
10685 new_item.PlaceOnSurface();
10686 }
10687 }
10688 }
10689 }
10690
10692 {
10694 return;
10695
10696 float split_quantity_new;
10700 InventoryLocation loc = new InventoryLocation;
10701
10702 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10703 {
10705 split_quantity_new = stack_max;
10706 else
10708
10709 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10710 if (new_item)
10711 {
10712 new_item.SetResultOfSplit(true);
10713 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10715 new_item.SetQuantity(split_quantity_new);
10716 }
10717 }
10718 else if (destination_entity && slot_id == -1)
10719 {
10720 if (quantity > stack_max)
10721 split_quantity_new = stack_max;
10722 else
10723 split_quantity_new = quantity;
10724
10726 {
10729 }
10730
10731 if (new_item)
10732 {
10733 new_item.SetResultOfSplit(true);
10734 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10736 new_item.SetQuantity(split_quantity_new);
10737 }
10738 }
10739 else
10740 {
10741 if (stack_max != 0)
10742 {
10744 {
10746 }
10747
10749
10750 if (new_item)
10751 {
10752 new_item.SetResultOfSplit(true);
10753 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10755 new_item.SetQuantity(stack_max);
10756 new_item.PlaceOnSurface();
10757 }
10758 }
10759 }
10760 }
10761
10763 {
10765 return;
10766
10768 {
10769 if (ScriptInputUserData.CanStoreInputUserData())
10770 {
10771 ScriptInputUserData ctx = new ScriptInputUserData;
10776 dst.WriteToContext(ctx);
10778 }
10779 }
10780 else if (!
GetGame().IsMultiplayer())
10781 {
10783 }
10784 }
10785
10787 {
10789 return;
10790
10792 {
10793 if (ScriptInputUserData.CanStoreInputUserData())
10794 {
10795 ScriptInputUserData ctx = new ScriptInputUserData;
10800 ctx.
Write(destination_entity);
10806 }
10807 }
10808 else if (!
GetGame().IsMultiplayer())
10809 {
10811 }
10812 }
10813
10815 {
10817 }
10818
10820 {
10822 return this;
10823
10825 float split_quantity_new;
10827 if (dst.IsValid())
10828 {
10829 int slot_id = dst.GetSlot();
10831
10832 if (quantity > stack_max)
10833 split_quantity_new = stack_max;
10834 else
10835 split_quantity_new = quantity;
10836
10838
10839 if (new_item)
10840 {
10841 new_item.SetResultOfSplit(true);
10842 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10845 }
10846
10847 return new_item;
10848 }
10849
10850 return null;
10851 }
10852
10854 {
10856 return;
10857
10859 float split_quantity_new;
10861 if (destination_entity)
10862 {
10864 if (quantity > stackable)
10865 split_quantity_new = stackable;
10866 else
10867 split_quantity_new = quantity;
10868
10869 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10870 if (new_item)
10871 {
10872 new_item.SetResultOfSplit(true);
10873 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10875 new_item.SetQuantity(split_quantity_new);
10876 }
10877 }
10878 }
10879
10881 {
10883 return;
10884
10886 {
10887 if (ScriptInputUserData.CanStoreInputUserData())
10888 {
10889 ScriptInputUserData ctx = new ScriptInputUserData;
10894 ItemBase destination_entity =
this;
10895 ctx.
Write(destination_entity);
10899 }
10900 }
10901 else if (!
GetGame().IsMultiplayer())
10902 {
10904 }
10905 }
10906
10908 {
10910 return;
10911
10913 float split_quantity_new;
10915 if (player)
10916 {
10918 if (quantity > stackable)
10919 split_quantity_new = stackable;
10920 else
10921 split_quantity_new = quantity;
10922
10923 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10924 new_item =
ItemBase.Cast(in_hands);
10925 if (new_item)
10926 {
10927 new_item.SetResultOfSplit(true);
10928 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10930 new_item.SetQuantity(split_quantity_new);
10931 }
10932 }
10933 }
10934
10936 {
10938 return;
10939
10941 float split_quantity_new = Math.Floor(quantity * 0.5);
10942
10944
10945 if (new_item)
10946 {
10947 if (new_item.GetQuantityMax() < split_quantity_new)
10948 {
10949 split_quantity_new = new_item.GetQuantityMax();
10950 }
10951
10952 new_item.SetResultOfSplit(true);
10953 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10954
10956 {
10959 }
10960 else
10961 {
10964 }
10965 }
10966 }
10967
10969 {
10971 return;
10972
10974 float split_quantity_new = Math.Floor(quantity / 2);
10975
10976 InventoryLocation invloc = new InventoryLocation;
10978
10980 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10981
10982 if (new_item)
10983 {
10984 if (new_item.GetQuantityMax() < split_quantity_new)
10985 {
10986 split_quantity_new = new_item.GetQuantityMax();
10987 }
10989 {
10992 }
10993 else
10994 {
10997 }
10998 }
10999 }
11000
11003 {
11004 SetWeightDirty();
11006
11007 if (parent)
11008 parent.OnAttachmentQuantityChangedEx(this, delta);
11009
11011 {
11013 {
11015 }
11017 {
11018 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11020 }
11021 }
11022
11023 }
11024
11027 {
11028
11029 }
11030
11033 {
11035 }
11036
11038 {
11039 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11040
11042 {
11043 if (newLevel == GameConstants.STATE_RUINED)
11044 {
11046 EntityAI parent = GetHierarchyParent();
11047 if (parent && parent.IsFireplace())
11048 {
11049 CargoBase cargo = GetInventory().GetCargo();
11050 if (cargo)
11051 {
11053 {
11055 }
11056 }
11057 }
11058 }
11059
11061 {
11062
11064 return;
11065 }
11066
11067 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11068 {
11070 }
11071 }
11072 }
11073
11074
11076 {
11077 super.OnRightClick();
11078
11080 {
11082 {
11083 if (ScriptInputUserData.CanStoreInputUserData())
11084 {
11085 vector m4[4];
11087
11088 EntityAI root = GetHierarchyRoot();
11089
11090 InventoryLocation dst = new InventoryLocation;
11092 {
11093 if (root)
11094 {
11095 root.GetTransform(m4);
11097 }
11098 else
11099 GetInventory().GetCurrentInventoryLocation(dst);
11100 }
11101 else
11102 {
11104
11105
11106 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11107 {
11108 if (root)
11109 {
11110 root.GetTransform(m4);
11112 }
11113 else
11114 GetInventory().GetCurrentInventoryLocation(dst);
11115 }
11116 else
11117 {
11118 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11119 }
11120 }
11121
11122 ScriptInputUserData ctx = new ScriptInputUserData;
11130 }
11131 }
11132 else if (!
GetGame().IsMultiplayer())
11133 {
11135 }
11136 }
11137 }
11138
11139 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11140 {
11141
11142 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11143 return false;
11144
11145 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11146 return false;
11147
11148
11150 return false;
11151
11152
11153 Magazine mag = Magazine.Cast(this);
11154 if (mag)
11155 {
11156 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11157 return false;
11158
11159 if (stack_max_limit)
11160 {
11161 Magazine other_mag = Magazine.Cast(other_item);
11162 if (other_item)
11163 {
11164 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11165 return false;
11166 }
11167
11168 }
11169 }
11170 else
11171 {
11172
11174 return false;
11175
11177 return false;
11178 }
11179
11180 PlayerBase player = null;
11181 if (CastTo(player, GetHierarchyRootPlayer()))
11182 {
11183 if (player.GetInventory().HasAttachment(this))
11184 return false;
11185
11186 if (player.IsItemsToDelete())
11187 return false;
11188 }
11189
11190 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11191 return false;
11192
11193 int slotID;
11195 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11196 return false;
11197
11198 return true;
11199 }
11200
11202 {
11204 }
11205
11207 {
11208 return m_IsResultOfSplit;
11209 }
11210
11212 {
11213 m_IsResultOfSplit = value;
11214 }
11215
11217 {
11219 }
11220
11222 {
11223 float other_item_quantity = other_item.GetQuantity();
11224 float this_free_space;
11225
11227
11229
11230 if (other_item_quantity > this_free_space)
11231 {
11232 return this_free_space;
11233 }
11234 else
11235 {
11236 return other_item_quantity;
11237 }
11238 }
11239
11241 {
11243 }
11244
11246 {
11248 return;
11249
11250 if (!IsMagazine() && other_item)
11251 {
11253 if (quantity_used != 0)
11254 {
11255 float hp1 = GetHealth01("","");
11256 float hp2 = other_item.GetHealth01("","");
11257 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11258 hpResult = hpResult / (
GetQuantity() + quantity_used);
11259
11260 hpResult *= GetMaxHealth();
11261 Math.Round(hpResult);
11262 SetHealth("", "Health", hpResult);
11263
11265 other_item.AddQuantity(-quantity_used);
11266 }
11267 }
11269 }
11270
11272 {
11273 #ifdef SERVER
11274 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11275 GetHierarchyParent().IncreaseLifetimeUp();
11276 #endif
11277 };
11278
11280 {
11281 PlayerBase p = PlayerBase.Cast(player);
11282
11283 array<int> recipesIds = p.m_Recipes;
11284 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11285 if (moduleRecipesManager)
11286 {
11287 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11288 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11289 }
11290
11291 for (int i = 0;i < recipesIds.Count(); i++)
11292 {
11293 int key = recipesIds.Get(i);
11294 string recipeName = moduleRecipesManager.GetRecipeName(key);
11296 }
11297 }
11298
11299
11300 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11301 {
11302 super.GetDebugActions(outputList);
11303
11304
11309
11310
11314
11318
11319
11322
11323
11325 {
11328 }
11329
11331
11334
11338 }
11339
11340
11341
11342
11344 {
11345 super.OnAction(action_id, player, ctx);
11346 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11347 {
11348 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11349 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11350 PlayerBase p = PlayerBase.Cast(player);
11351 if (
EActions.RECIPES_RANGE_START < 1000)
11352 {
11353 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11354 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11355 }
11356 }
11357 #ifndef SERVER
11358 else if (action_id ==
EActions.WATCH_PLAYER)
11359 {
11360 PluginDeveloper.SetDeveloperItemClientEx(player);
11361 }
11362 #endif
11364 {
11365 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11366 {
11367 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11368 OnDebugButtonPressServer(id + 1);
11369 }
11370
11371 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11372 {
11373 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11375 }
11376
11377 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11378 {
11379 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11381 }
11382
11383 else if (action_id ==
EActions.ADD_QUANTITY)
11384 {
11385 if (IsMagazine())
11386 {
11387 Magazine mag = Magazine.Cast(this);
11388 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11389 }
11390 else
11391 {
11393 }
11394
11395 if (m_EM)
11396 {
11397 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11398 }
11399
11400 }
11401
11402 else if (action_id ==
EActions.REMOVE_QUANTITY)
11403 {
11404 if (IsMagazine())
11405 {
11406 Magazine mag2 = Magazine.Cast(this);
11407 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11408 }
11409 else
11410 {
11412 }
11413 if (m_EM)
11414 {
11415 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11416 }
11417
11418 }
11419
11420 else if (action_id ==
EActions.SET_QUANTITY_0)
11421 {
11423
11424 if (m_EM)
11425 {
11426 m_EM.SetEnergy(0);
11427 }
11428 }
11429
11430 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11431 {
11433
11434 if (m_EM)
11435 {
11436 m_EM.SetEnergy(m_EM.GetEnergyMax());
11437 }
11438 }
11439
11440 else if (action_id ==
EActions.ADD_HEALTH)
11441 {
11442 AddHealth("","",GetMaxHealth("","Health")/5);
11443 }
11444 else if (action_id ==
EActions.REMOVE_HEALTH)
11445 {
11446 AddHealth("","",-GetMaxHealth("","Health")/5);
11447 }
11448 else if (action_id ==
EActions.DESTROY_HEALTH)
11449 {
11450 SetHealth01("","",0);
11451 }
11452 else if (action_id ==
EActions.WATCH_ITEM)
11453 {
11455 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11456 #ifdef DEVELOPER
11457 SetDebugDeveloper_item(this);
11458 #endif
11459 }
11460
11461 else if (action_id ==
EActions.ADD_TEMPERATURE)
11462 {
11463 AddTemperature(20);
11464
11465 }
11466
11467 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11468 {
11469 AddTemperature(-20);
11470
11471 }
11472
11473 else if (action_id ==
EActions.FLIP_FROZEN)
11474 {
11475 SetFrozen(!GetIsFrozen());
11476
11477 }
11478
11479 else if (action_id ==
EActions.ADD_WETNESS)
11480 {
11482
11483 }
11484
11485 else if (action_id ==
EActions.REMOVE_WETNESS)
11486 {
11488
11489 }
11490
11491 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11492 {
11495
11496
11497 }
11498
11499 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11500 {
11503 }
11504
11505 else if (action_id ==
EActions.MAKE_SPECIAL)
11506 {
11507 auto debugParams = DebugSpawnParams.WithPlayer(player);
11508 OnDebugSpawnEx(debugParams);
11509 }
11510
11511 else if (action_id ==
EActions.DELETE)
11512 {
11513 Delete();
11514 }
11515
11516 }
11517
11518
11519 return false;
11520 }
11521
11522
11523
11524
11528
11531
11532
11533
11535 {
11536 return false;
11537 }
11538
11539
11541 {
11542 return true;
11543 }
11544
11545
11547 {
11548 return true;
11549 }
11550
11551
11552
11554 {
11555 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11557 }
11558
11561 {
11562 return null;
11563 }
11564
11566 {
11567 return false;
11568 }
11569
11571 {
11572 return false;
11573 }
11574
11578
11579
11581 {
11582 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11583 return module_repairing.CanRepair(this, item_repair_kit);
11584 }
11585
11586
11587 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11588 {
11589 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11590 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11591 }
11592
11593
11595 {
11596
11597
11598
11599
11600
11601
11602
11603
11604 return 1;
11605 }
11606
11607
11608
11610 {
11612 }
11613
11614
11615
11617 {
11619 }
11620
11621
11630 {
11631 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11632
11633 if (player)
11634 {
11635 player.MessageStatus(text);
11636 }
11637 }
11638
11639
11648 {
11649 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11650
11651 if (player)
11652 {
11653 player.MessageAction(text);
11654 }
11655 }
11656
11657
11666 {
11667 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11668
11669 if (player)
11670 {
11671 player.MessageFriendly(text);
11672 }
11673 }
11674
11675
11684 {
11685 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11686
11687 if (player)
11688 {
11689 player.MessageImportant(text);
11690 }
11691 }
11692
11694 {
11695 return true;
11696 }
11697
11698
11699 override bool KindOf(
string tag)
11700 {
11701 bool found = false;
11702 string item_name = this.
GetType();
11705
11706 int array_size = item_tag_array.Count();
11707 for (int i = 0; i < array_size; i++)
11708 {
11709 if (item_tag_array.Get(i) == tag)
11710 {
11711 found = true;
11712 break;
11713 }
11714 }
11715 return found;
11716 }
11717
11718
11720 {
11721
11722 super.OnRPC(sender, rpc_type,ctx);
11723
11724
11725 switch (rpc_type)
11726 {
11727 #ifndef SERVER
11728 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11729 Param2<bool, string> p = new Param2<bool, string>(false, "");
11730
11732 return;
11733
11734 bool play = p.param1;
11735 string soundSet = p.param2;
11736
11737 if (play)
11738 {
11740 {
11742 {
11744 }
11745 }
11746 else
11747 {
11749 }
11750 }
11751 else
11752 {
11754 }
11755
11756 break;
11757 #endif
11758
11759 }
11760
11762 {
11764 }
11765 }
11766
11767
11768
11769
11771 {
11772 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11773 return plugin.GetID(
name);
11774 }
11775
11777 {
11778 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11779 return plugin.GetName(id);
11780 }
11781
11784 {
11785
11786
11787 int varFlags;
11788 if (!ctx.
Read(varFlags))
11789 return;
11790
11791 if (varFlags & ItemVariableFlags.FLOAT)
11792 {
11794 }
11795 }
11796
11798 {
11799
11800 super.SerializeNumericalVars(floats_out);
11801
11802
11803
11805 {
11807 }
11808
11810 {
11812 }
11813
11815 {
11817 }
11818
11820 {
11825 }
11826
11828 {
11830 }
11831 }
11832
11834 {
11835
11836 super.DeSerializeNumericalVars(floats);
11837
11838
11839 int index = 0;
11840 int mask = Math.Round(floats.Get(index));
11841
11842 index++;
11843
11845 {
11847 {
11849 }
11850 else
11851 {
11852 float quantity = floats.Get(index);
11853 SetQuantity(quantity,
true,
false,
false,
false);
11854 }
11855 index++;
11856 }
11857
11859 {
11860 float wet = floats.Get(index);
11862 index++;
11863 }
11864
11866 {
11867 int liquidtype = Math.Round(floats.Get(index));
11869 index++;
11870 }
11871
11873 {
11875 index++;
11877 index++;
11879 index++;
11881 index++;
11882 }
11883
11885 {
11886 int cleanness = Math.Round(floats.Get(index));
11888 index++;
11889 }
11890 }
11891
11893 {
11894 super.WriteVarsToCTX(ctx);
11895
11896
11898 {
11900 }
11901
11903 {
11905 }
11906
11908 {
11910 }
11911
11913 {
11914 int r,g,b,a;
11920 }
11921
11923 {
11925 }
11926 }
11927
11929 {
11930 if (!super.ReadVarsFromCTX(ctx,version))
11931 return false;
11932
11933 int intValue;
11934 float value;
11935
11936 if (version < 140)
11937 {
11938 if (!ctx.
Read(intValue))
11939 return false;
11940
11941 m_VariablesMask = intValue;
11942 }
11943
11945 {
11946 if (!ctx.
Read(value))
11947 return false;
11948
11950 {
11952 }
11953 else
11954 {
11956 }
11957 }
11958
11959 if (version < 140)
11960 {
11962 {
11963 if (!ctx.
Read(value))
11964 return false;
11965 SetTemperatureDirect(value);
11966 }
11967 }
11968
11970 {
11971 if (!ctx.
Read(value))
11972 return false;
11974 }
11975
11977 {
11978 if (!ctx.
Read(intValue))
11979 return false;
11981 }
11982
11984 {
11985 int r,g,b,a;
11987 return false;
11989 return false;
11991 return false;
11993 return false;
11994
11996 }
11997
11999 {
12000 if (!ctx.
Read(intValue))
12001 return false;
12003 }
12004
12005 if (version >= 138 && version < 140)
12006 {
12008 {
12009 if (!ctx.
Read(intValue))
12010 return false;
12011 SetFrozen(intValue);
12012 }
12013 }
12014
12015 return true;
12016 }
12017
12018
12020 {
12023 {
12025 }
12026
12027 if (!super.OnStoreLoad(ctx, version))
12028 {
12030 return false;
12031 }
12032
12033 if (version >= 114)
12034 {
12035 bool hasQuickBarIndexSaved;
12036
12037 if (!ctx.
Read(hasQuickBarIndexSaved))
12038 {
12040 return false;
12041 }
12042
12043 if (hasQuickBarIndexSaved)
12044 {
12045 int itmQBIndex;
12046
12047
12048 if (!ctx.
Read(itmQBIndex))
12049 {
12051 return false;
12052 }
12053
12054 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12055 if (itmQBIndex != -1 && parentPlayer)
12056 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12057 }
12058 }
12059 else
12060 {
12061
12062 PlayerBase player;
12063 int itemQBIndex;
12064 if (version ==
int.
MAX)
12065 {
12066 if (!ctx.
Read(itemQBIndex))
12067 {
12069 return false;
12070 }
12071 }
12072 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12073 {
12074
12075 if (!ctx.
Read(itemQBIndex))
12076 {
12078 return false;
12079 }
12080 if (itemQBIndex != -1 && player)
12081 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12082 }
12083 }
12084
12085 if (version < 140)
12086 {
12087
12088 if (!LoadVariables(ctx, version))
12089 {
12091 return false;
12092 }
12093 }
12094
12095
12097 {
12099 return false;
12100 }
12101 if (version >= 132)
12102 {
12104 if (raib)
12105 {
12107 {
12109 return false;
12110 }
12111 }
12112 }
12113
12115 return true;
12116 }
12117
12118
12119
12121 {
12122 super.OnStoreSave(ctx);
12123
12124 PlayerBase player;
12125 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12126 {
12128
12129 int itemQBIndex = -1;
12130 itemQBIndex = player.FindQuickBarEntityIndex(this);
12131 ctx.
Write(itemQBIndex);
12132 }
12133 else
12134 {
12136 }
12137
12139
12141 if (raib)
12142 {
12144 }
12145 }
12146
12147
12149 {
12150 super.AfterStoreLoad();
12151
12153 {
12155 }
12156
12158 {
12161 }
12162 }
12163
12165 {
12166 super.EEOnAfterLoad();
12167
12169 {
12171 }
12172
12175 }
12176
12178 {
12179 return false;
12180 }
12181
12182
12183
12185 {
12187 {
12188 #ifdef PLATFORM_CONSOLE
12189
12191 {
12193 if (menu)
12194 {
12196 }
12197 }
12198 #endif
12199 }
12200
12202 {
12205 }
12206
12208 {
12209 SetWeightDirty();
12211 }
12213 {
12216 }
12217
12219 {
12222 }
12224 {
12227 }
12228
12229 super.OnVariablesSynchronized();
12230 }
12231
12232
12233
12235 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12236 {
12237 if (!IsServerCheck(allow_client))
12238 return false;
12239
12241 return false;
12242
12245
12246 if (value <= (min + 0.001))
12247 value = min;
12248
12249 if (value == min)
12250 {
12251 if (destroy_config)
12252 {
12253 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12254 if (dstr)
12255 {
12257 this.Delete();
12258 return true;
12259 }
12260 }
12261 else if (destroy_forced)
12262 {
12264 this.Delete();
12265 return true;
12266 }
12267
12269 }
12270
12273
12275 {
12277
12278 if (delta)
12280 }
12281
12283
12284 return false;
12285 }
12286
12287
12289 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12290 {
12292 }
12293
12295 {
12298 }
12299
12301 {
12304 }
12305
12308 {
12309 float value_clamped = Math.Clamp(value, 0, 1);
12311 SetQuantity(result, destroy_config, destroy_forced);
12312 }
12313
12314
12317 {
12319 }
12320
12322 {
12324 }
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12336 {
12337 int slot = -1;
12338 if (GetInventory())
12339 {
12340 InventoryLocation il = new InventoryLocation;
12341 GetInventory().GetCurrentInventoryLocation(il);
12343 }
12344
12346 }
12347
12349 {
12350 float quantity_max = 0;
12351
12353 {
12354 if (attSlotID != -1)
12355 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12356
12357 if (quantity_max <= 0)
12359 }
12360
12361 if (quantity_max <= 0)
12363
12364 return quantity_max;
12365 }
12366
12368 {
12370 }
12371
12373 {
12375 }
12376
12377
12379 {
12381 }
12382
12384 {
12386 }
12387
12389 {
12391 }
12392
12393
12395 {
12396
12397 float weightEx = GetWeightEx();
12398 float special = GetInventoryAndCargoWeight();
12399 return weightEx - special;
12400 }
12401
12402
12404 {
12406 }
12407
12409 {
12411 {
12412 #ifdef DEVELOPER
12413 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12414 {
12415 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12417 }
12418 #endif
12419
12420 return GetQuantity() * GetConfigWeightModified();
12421 }
12422 else if (HasEnergyManager())
12423 {
12424 #ifdef DEVELOPER
12425 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12426 {
12427 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12428 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12429 }
12430 #endif
12431 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
12432 }
12433 else
12434 {
12435 #ifdef DEVELOPER
12436 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12437 {
12438 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12439 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12440 }
12441 #endif
12442 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
12443 }
12444 }
12445
12448 {
12449 int item_count = 0;
12451
12452 if (GetInventory().GetCargo() != NULL)
12453 {
12454 item_count = GetInventory().GetCargo().GetItemCount();
12455 }
12456
12457 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12458 {
12459 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12460 if (item)
12461 item_count += item.GetNumberOfItems();
12462 }
12463 return item_count;
12464 }
12465
12468 {
12469 float weight = 0;
12470 float wetness = 1;
12471 if (include_wetness)
12474 {
12475 weight = wetness * m_ConfigWeight;
12476 }
12478 {
12479 weight = 1;
12480 }
12481 return weight;
12482 }
12483
12484
12485
12487 {
12488 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12489 {
12490 GameInventory inv = GetInventory();
12491 array<EntityAI> items = new array<EntityAI>;
12493 for (int i = 0; i < items.Count(); i++)
12494 {
12496 if (item)
12497 {
12499 }
12500 }
12501 }
12502 }
12503
12504
12505
12506
12508 {
12509 float energy = 0;
12510 if (HasEnergyManager())
12511 {
12512 energy = GetCompEM().GetEnergy();
12513 }
12514 return energy;
12515 }
12516
12517
12519 {
12520 super.OnEnergyConsumed();
12521
12523 }
12524
12526 {
12527 super.OnEnergyAdded();
12528
12530 }
12531
12532
12534 {
12535 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12536 {
12538 {
12539 float energy_0to1 = GetCompEM().GetEnergy0To1();
12541 }
12542 }
12543 }
12544
12545
12547 {
12548 return ConfigGetFloat("heatIsolation");
12549 }
12550
12552 {
12554 }
12555
12557 {
12558 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12559 if (
GetGame().ConfigIsExisting(paramPath))
12561
12562 return 0.0;
12563 }
12564
12566 {
12567 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12568 if (
GetGame().ConfigIsExisting(paramPath))
12570
12571 return 0.0;
12572 }
12573
12574 override void SetWet(
float value,
bool allow_client =
false)
12575 {
12576 if (!IsServerCheck(allow_client))
12577 return;
12578
12581
12583
12584 m_VarWet = Math.Clamp(value, min, max);
12585
12587 {
12590 }
12591 }
12592
12593 override void AddWet(
float value)
12594 {
12596 }
12597
12599 {
12601 }
12602
12604 {
12606 }
12607
12609 {
12611 }
12612
12614 {
12616 }
12617
12619 {
12621 }
12622
12623 override void OnWetChanged(
float newVal,
float oldVal)
12624 {
12627 if (newLevel != oldLevel)
12628 {
12630 }
12631 }
12632
12634 {
12635 SetWeightDirty();
12636 }
12637
12639 {
12640 return GetWetLevelInternal(
m_VarWet);
12641 }
12642
12643
12644
12646 {
12648 }
12649
12651 {
12653 }
12654
12656 {
12658 }
12659
12661 {
12663 }
12664
12665
12666
12668 {
12669 if (ConfigIsExisting("itemModelLength"))
12670 {
12671 return ConfigGetFloat("itemModelLength");
12672 }
12673 return 0;
12674 }
12675
12677 {
12678 if (ConfigIsExisting("itemAttachOffset"))
12679 {
12680 return ConfigGetFloat("itemAttachOffset");
12681 }
12682 return 0;
12683 }
12684
12685 override void SetCleanness(
int value,
bool allow_client =
false)
12686 {
12687 if (!IsServerCheck(allow_client))
12688 return;
12689
12691
12693
12696 }
12697
12699 {
12701 }
12702
12704 {
12705 return true;
12706 }
12707
12708
12709
12710
12712 {
12714 }
12715
12717 {
12719 }
12720
12721
12722
12723
12724 override void SetColor(
int r,
int g,
int b,
int a)
12725 {
12731 }
12733 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12734 {
12739 }
12740
12742 {
12744 }
12745
12748 {
12749 int r,g,b,a;
12751 r = r/255;
12752 g = g/255;
12753 b = b/255;
12754 a = a/255;
12755 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12756 }
12757
12758
12759
12760 override void SetLiquidType(
int value,
bool allow_client =
false)
12761 {
12762 if (!IsServerCheck(allow_client))
12763 return;
12764
12769 }
12770
12772 {
12773 return ConfigGetInt("varLiquidTypeInit");
12774 }
12775
12777 {
12779 }
12780
12782 {
12784 SetFrozen(false);
12785 }
12786
12789 {
12790 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12791 }
12792
12793
12796 {
12797 PlayerBase nplayer;
12798 if (PlayerBase.CastTo(nplayer, player))
12799 {
12801
12802 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12803 }
12804 }
12805
12806
12809 {
12810 PlayerBase nplayer;
12811 if (PlayerBase.CastTo(nplayer,player))
12812 {
12813
12814 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12815
12816 }
12817
12818
12819 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12820
12821
12822 if (HasEnergyManager())
12823 {
12824 GetCompEM().UpdatePlugState();
12825 }
12826 }
12827
12828
12830 {
12831 super.OnPlacementStarted(player);
12832
12834 }
12835
12836 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12837 {
12839 {
12840 m_AdminLog.OnPlacementComplete(player,
this);
12841 }
12842
12843 super.OnPlacementComplete(player, position, orientation);
12844 }
12845
12846
12847
12848
12849
12851 {
12853 {
12854 return true;
12855 }
12856 else
12857 {
12858 return false;
12859 }
12860 }
12861
12862
12864 {
12866 {
12868 }
12869 }
12870
12871
12873 {
12875 }
12876
12878 {
12880 }
12881
12882 override void InsertAgent(
int agent,
float count = 1)
12883 {
12884 if (count < 1)
12885 return;
12886
12888 }
12889
12892 {
12894 }
12895
12896
12898 {
12900 }
12901
12902
12903
12904
12905
12906
12907
12908
12909
12910
12911
12912
12913
12914
12915
12916
12917
12918
12919
12920
12921
12922
12923
12924
12925
12926
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12944 {
12946 return false;
12947 return true;
12948 }
12949
12951 {
12952
12954 }
12955
12956
12959 {
12960 super.CheckForRoofLimited(timeTresholdMS);
12961
12963 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12964 {
12965 m_PreviousRoofTestTime = time;
12966 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12967 }
12968 }
12969
12970
12972 {
12974 {
12975 return 0;
12976 }
12977
12978 if (GetInventory().GetAttachmentSlotsCount() != 0)
12979 {
12980 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12981 if (filter)
12982 return filter.GetProtectionLevel(type, false, system);
12983 else
12984 return 0;
12985 }
12986
12987 string subclassPath, entryName;
12988
12989 switch (type)
12990 {
12992 entryName = "biological";
12993 break;
12995 entryName = "chemical";
12996 break;
12997 default:
12998 entryName = "biological";
12999 break;
13000 }
13001
13002 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13003
13005 }
13006
13007
13008
13011 {
13012 if (!IsMagazine())
13014
13016 }
13017
13018
13019
13020
13021
13026 {
13027 return true;
13028 }
13029
13031 {
13033 }
13034
13035
13036
13037
13038
13040 {
13041 if (parent)
13042 {
13043 if (parent.IsInherited(DayZInfected))
13044 return true;
13045
13046 if (!parent.IsRuined())
13047 return true;
13048 }
13049
13050 return true;
13051 }
13052
13054 {
13055 if (!super.CanPutAsAttachment(parent))
13056 {
13057 return false;
13058 }
13059
13060 if (!IsRuined() && !parent.IsRuined())
13061 {
13062 return true;
13063 }
13064
13065 return false;
13066 }
13067
13069 {
13070
13071
13072
13073
13074 return super.CanReceiveItemIntoCargo(item);
13075 }
13076
13078 {
13079
13080
13081
13082
13083 GameInventory attachmentInv = attachment.GetInventory();
13085 {
13086 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13087 return false;
13088 }
13089
13090 InventoryLocation loc = new InventoryLocation();
13091 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13092 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13093 return false;
13094
13095 return super.CanReceiveAttachment(attachment, slotId);
13096 }
13097
13099 {
13100 if (!super.CanReleaseAttachment(attachment))
13101 return false;
13102
13103 return GetInventory().AreChildrenAccessible();
13104 }
13105
13106
13107
13108
13109
13110
13111
13112
13113
13114
13115
13116
13117
13118
13119
13120
13121
13122
13123
13124
13125
13127 {
13128 int id = muzzle_owner.GetMuzzleID();
13129 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13130
13131 if (WPOF_array)
13132 {
13133 for (int i = 0; i < WPOF_array.Count(); i++)
13134 {
13135 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13136
13137 if (WPOF)
13138 {
13139 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13140 }
13141 }
13142 }
13143 }
13144
13145
13147 {
13148 int id = muzzle_owner.GetMuzzleID();
13150
13151 if (WPOBE_array)
13152 {
13153 for (int i = 0; i < WPOBE_array.Count(); i++)
13154 {
13155 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13156
13157 if (WPOBE)
13158 {
13159 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13160 }
13161 }
13162 }
13163 }
13164
13165
13167 {
13168 int id = muzzle_owner.GetMuzzleID();
13169 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13170
13171 if (WPOOH_array)
13172 {
13173 for (int i = 0; i < WPOOH_array.Count(); i++)
13174 {
13175 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13176
13177 if (WPOOH)
13178 {
13179 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13180 }
13181 }
13182 }
13183 }
13184
13185
13187 {
13188 int id = muzzle_owner.GetMuzzleID();
13189 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13190
13191 if (WPOOH_array)
13192 {
13193 for (int i = 0; i < WPOOH_array.Count(); i++)
13194 {
13195 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13196
13197 if (WPOOH)
13198 {
13199 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13200 }
13201 }
13202 }
13203 }
13204
13205
13207 {
13208 int id = muzzle_owner.GetMuzzleID();
13209 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13210
13211 if (WPOOH_array)
13212 {
13213 for (int i = 0; i < WPOOH_array.Count(); i++)
13214 {
13215 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13216
13217 if (WPOOH)
13218 {
13219 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13220 }
13221 }
13222 }
13223 }
13224
13225
13226
13228 {
13230 {
13231 return true;
13232 }
13233
13234 return false;
13235 }
13236
13238 {
13240 {
13241 return true;
13242 }
13243
13244 return false;
13245 }
13246
13248 {
13250 {
13251 return true;
13252 }
13253
13254 return false;
13255 }
13256
13258 {
13259 return false;
13260 }
13261
13264 {
13265 return UATimeSpent.DEFAULT_DEPLOY;
13266 }
13267
13268
13269
13270
13272 {
13274 SetSynchDirty();
13275 }
13276
13278 {
13280 }
13281
13282
13284 {
13285 return false;
13286 }
13287
13290 {
13291 string att_type = "None";
13292
13293 if (ConfigIsExisting("soundAttType"))
13294 {
13295 att_type = ConfigGetString("soundAttType");
13296 }
13297
13299 }
13300
13302 {
13304 }
13305
13306
13307
13308
13309
13313
13315 {
13318
13320 }
13321
13322
13324 {
13326 return;
13327
13329
13332
13335
13336 SoundParameters params = new SoundParameters();
13340 }
13341
13342
13344 {
13346 return;
13347
13349 SetSynchDirty();
13350
13353 }
13354
13355
13357 {
13359 return;
13360
13362 SetSynchDirty();
13363
13366 }
13367
13369 {
13371 }
13372
13374 {
13376 }
13377
13380 {
13381 if (!
GetGame().IsDedicatedServer())
13382 {
13383 if (ConfigIsExisting("attachSoundSet"))
13384 {
13385 string cfg_path = "";
13386 string soundset = "";
13387 string type_name =
GetType();
13388
13391 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13392 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13393
13394 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13395 {
13396 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13397 {
13398 if (cfg_slot_array[i] == slot_type)
13399 {
13400 soundset = cfg_soundset_array[i];
13401 break;
13402 }
13403 }
13404 }
13405
13406 if (soundset != "")
13407 {
13408 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13410 }
13411 }
13412 }
13413 }
13414
13416 {
13417
13418 }
13419
13420 void OnApply(PlayerBase player);
13421
13423 {
13424 return 1.0;
13425 };
13426
13428 {
13430 }
13431
13433 {
13435 }
13436
13438
13440 {
13441 SetDynamicPhysicsLifeTime(0.01);
13443 }
13444
13446 {
13447 array<string> zone_names = new array<string>;
13448 GetDamageZones(zone_names);
13449 for (int i = 0; i < zone_names.Count(); i++)
13450 {
13451 SetHealthMax(zone_names.Get(i),"Health");
13452 }
13453 SetHealthMax("","Health");
13454 }
13455
13458 {
13459 float global_health = GetHealth01("","Health");
13460 array<string> zones = new array<string>;
13461 GetDamageZones(zones);
13462
13463 for (int i = 0; i < zones.Count(); i++)
13464 {
13465 SetHealth01(zones.Get(i),"Health",global_health);
13466 }
13467 }
13468
13471 {
13472 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13473 }
13474
13476 {
13477 if (!hasRootAsPlayer)
13478 {
13479 if (refParentIB)
13480 {
13481
13482 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13483 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13484
13485 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13486 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13487
13490 }
13491 else
13492 {
13493
13496 }
13497 }
13498 }
13499
13501 {
13503 {
13504 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13505 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13506 {
13507 float heatPermCoef = 1.0;
13509 while (ent)
13510 {
13511 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13512 ent = ent.GetHierarchyParent();
13513 }
13514
13515 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13516 }
13517 }
13518 }
13519
13521 {
13522
13523 EntityAI parent = GetHierarchyParent();
13524 if (!parent)
13525 {
13526 hasParent = false;
13527 hasRootAsPlayer = false;
13528 }
13529 else
13530 {
13531 hasParent = true;
13532 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13533 refParentIB =
ItemBase.Cast(parent);
13534 }
13535 }
13536
13537 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13538 {
13539
13540 }
13541
13543 {
13544
13545 return false;
13546 }
13547
13549 {
13550
13551
13552 return false;
13553 }
13554
13556 {
13557
13558 return false;
13559 }
13560
13563 {
13564 return !GetIsFrozen() &&
IsOpen();
13565 }
13566
13568 {
13569 bool hasParent = false, hasRootAsPlayer = false;
13571
13572 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13573 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13574
13575 if (wwtu || foodDecay)
13576 {
13580
13581 if (processWetness || processTemperature || processDecay)
13582 {
13584
13585 if (processWetness)
13586 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13587
13588 if (processTemperature)
13590
13591 if (processDecay)
13592 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13593 }
13594 }
13595 }
13596
13599 {
13601 }
13602
13604 {
13607
13608 return super.GetTemperatureFreezeThreshold();
13609 }
13610
13612 {
13615
13616 return super.GetTemperatureThawThreshold();
13617 }
13618
13620 {
13623
13624 return super.GetItemOverheatThreshold();
13625 }
13626
13628 {
13630 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13631
13632 return super.GetTemperatureFreezeTime();
13633 }
13634
13636 {
13638 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13639
13640 return super.GetTemperatureThawTime();
13641 }
13642
13647
13649 {
13650 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13651 }
13652
13654 {
13655 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13656 }
13657
13660 {
13662 }
13663
13665 {
13667 }
13668
13670 {
13672 }
13673
13676 {
13677 return null;
13678 }
13679
13682 {
13683 return false;
13684 }
13685
13687 {
13689 {
13692 if (!trg)
13693 {
13695 explosive = this;
13696 }
13697
13698 explosive.PairRemote(trg);
13700
13701 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13702 trg.SetPersistentPairID(persistentID);
13703 explosive.SetPersistentPairID(persistentID);
13704
13705 return true;
13706 }
13707 return false;
13708 }
13709
13712 {
13713 float ret = 1.0;
13716 ret *= GetHealth01();
13717
13718 return ret;
13719 }
13720
13721 #ifdef DEVELOPER
13722 override void SetDebugItem()
13723 {
13724 super.SetDebugItem();
13725 _itemBase = this;
13726 }
13727
13729 {
13730 string text = super.GetDebugText();
13731
13733 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13734
13735 return text;
13736 }
13737 #endif
13738
13740 {
13741 return true;
13742 }
13743
13745
13747
13749 {
13752 }
13753
13754
13762
13778}
13779
13781{
13783 if (entity)
13784 {
13785 bool is_item = entity.IsInherited(
ItemBase);
13786 if (is_item && full_quantity)
13787 {
13790 }
13791 }
13792 else
13793 {
13795 return NULL;
13796 }
13797 return entity;
13798}
13799
13801{
13802 if (item)
13803 {
13804 if (health > 0)
13805 item.SetHealth("", "", health);
13806
13807 if (item.CanHaveTemperature())
13808 {
13810 if (item.CanFreeze())
13811 item.SetFrozen(false);
13812 }
13813
13814 if (item.HasEnergyManager())
13815 {
13816 if (quantity >= 0)
13817 {
13818 item.GetCompEM().SetEnergy0To1(quantity);
13819 }
13820 else
13821 {
13823 }
13824 }
13825 else if (item.IsMagazine())
13826 {
13827 Magazine mag = Magazine.Cast(item);
13828 if (quantity >= 0)
13829 {
13830 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13831 }
13832 else
13833 {
13835 }
13836
13837 }
13838 else
13839 {
13840 if (quantity >= 0)
13841 {
13842 item.SetQuantityNormalized(quantity, false);
13843 }
13844 else
13845 {
13847 }
13848
13849 }
13850 }
13851}
13852
13853#ifdef DEVELOPER
13855#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.