9015{
9017 {
9018 return true;
9019 }
9020};
9021
9022
9023
9025{
9029
9031
9034
9035
9036
9037
9038
9047
9053
9058
9063
9084 protected bool m_IsResultOfSplit
9085
9087
9092
9093
9094
9096
9100
9101
9102
9104
9107
9108
9109
9115
9116
9124
9127
9128
9130
9131
9133
9134
9139
9140
9145
9146
9148
9149
9151 {
9156
9157 if (!
GetGame().IsDedicatedServer())
9158 {
9160 {
9162
9164 {
9166 }
9167 }
9168
9171 }
9172
9173 m_OldLocation = null;
9174
9176 {
9178 }
9179
9180 if (ConfigIsExisting("headSelectionsToHide"))
9181 {
9184 }
9185
9187 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9188 {
9190 }
9191
9193
9194 m_IsResultOfSplit = false;
9195
9197 }
9198
9200 {
9201 super.InitItemVariables();
9202
9208 m_Count = ConfigGetInt(
"count");
9209
9212
9217
9220
9225
9237
9241
9242
9245 if (ConfigIsExisting("canBeSplit"))
9246 {
9249 }
9250
9252 if (ConfigIsExisting("itemBehaviour"))
9254
9255
9258 RegisterNetSyncVariableInt("m_VarLiquidType");
9259 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9260
9261 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9262 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9263 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9264
9265 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9266 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9267 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9268 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9269
9270 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9271 RegisterNetSyncVariableBool("m_IsTakeable");
9272 RegisterNetSyncVariableBool("m_IsHologram");
9273
9276 {
9279 }
9280
9282
9284 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9286
9287 }
9288
9290 {
9292 }
9293
9295 {
9298 {
9303 }
9304 }
9305
9306 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9307 {
9309 {
9312 }
9313
9315 }
9316
9318 {
9324 }
9325
9327
9329 {
9331
9332 if (!action)
9333 {
9334 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9335 return;
9336 }
9337
9339 if (!ai)
9340 {
9342 return;
9343 }
9344
9346 if (!action_array)
9347 {
9348 action_array = new array<ActionBase_Basic>;
9350 }
9351 if (LogManager.IsActionLogEnable())
9352 {
9353 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9354 }
9355
9356 if (action_array.Find(action) != -1)
9357 {
9358 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9359 }
9360 else
9361 {
9362 action_array.Insert(action);
9363 }
9364 }
9365
9367 {
9369 ActionBase action = player.GetActionManager().GetAction(actionName);
9372
9373 if (action_array)
9374 {
9375 action_array.RemoveItem(action);
9376 }
9377 }
9378
9379
9380
9382 {
9383 ActionOverrideData overrideData = new ActionOverrideData();
9387
9389 if (!actionMap)
9390 {
9393 }
9394
9395 actionMap.Insert(this.
Type(), overrideData);
9396
9397 }
9398
9400
9402
9403
9405 {
9408
9411
9412 string config_to_search = "CfgVehicles";
9413 string muzzle_owner_config;
9414
9416 {
9417 if (IsInherited(Weapon))
9418 config_to_search = "CfgWeapons";
9419
9420 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9421
9422 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9423
9425
9426 if (config_OnFire_subclass_count > 0)
9427 {
9428 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9429
9430 for (int i = 0; i < config_OnFire_subclass_count; i++)
9431 {
9432 string particle_class = "";
9434 string config_OnFire_entry = config_OnFire_class + particle_class;
9435 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9436 WPOF_array.Insert(WPOF);
9437 }
9438
9439
9441 }
9442 }
9443
9445 {
9446 config_to_search = "CfgWeapons";
9447 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9448
9449 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9450
9452
9453 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9454 {
9455 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9456
9457 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9458 {
9459 string particle_class2 = "";
9461 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9462 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9463 WPOBE_array.Insert(WPOBE);
9464 }
9465
9466
9468 }
9469 }
9470 }
9471
9472
9474 {
9477
9479 {
9480 string config_to_search = "CfgVehicles";
9481
9482 if (IsInherited(Weapon))
9483 config_to_search = "CfgWeapons";
9484
9485 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9486 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9487
9488 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
9489 {
9490
9492
9494 {
9496 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9498 return;
9499 }
9500
9503
9504
9505
9507 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9508
9509 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9510 {
9511 string particle_class = "";
9513 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9515
9516 if (entry_type == CT_CLASS)
9517 {
9518 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9519 WPOOH_array.Insert(WPOF);
9520 }
9521 }
9522
9523
9525 }
9526 }
9527 }
9528
9530 {
9532 }
9533
9535 {
9537 {
9539
9542
9545
9546 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9547 }
9548 }
9549
9551 {
9553 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9554
9556 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9557
9559 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9560
9562 {
9564 }
9565 }
9566
9568 {
9570 }
9571
9573 {
9576 else
9578
9580 {
9583 }
9584 else
9585 {
9588
9591 }
9592
9594 }
9595
9597 {
9599 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9600 }
9601
9603 {
9605 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9607 }
9608
9610 {
9612 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9613 }
9614
9616 {
9619
9620 OverheatingParticle OP = new OverheatingParticle();
9625
9627 }
9628
9630 {
9633
9634 return -1;
9635 }
9636
9638 {
9640 {
9643
9644 for (int i = count; i > 0; --i)
9645 {
9646 int id = i - 1;
9649
9652
9653 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9654 {
9655 if (p)
9656 {
9659 }
9660 }
9661 }
9662 }
9663 }
9664
9666 {
9668 {
9670 {
9671 int id = i - 1;
9673
9674 if (OP)
9675 {
9677
9678 if (p)
9679 {
9681 }
9682
9683 delete OP;
9684 }
9685 }
9686
9689 }
9690 }
9691
9694 {
9695 return 0.0;
9696 }
9697
9698
9700 {
9701 return 250;
9702 }
9703
9705 {
9706 return 0;
9707 }
9708
9711 {
9713 return true;
9714
9715 return false;
9716 }
9717
9720 {
9723
9725 {
9727 }
9728 else
9729 {
9730
9732 }
9733
9735 }
9736
9743 {
9744 return -1;
9745 }
9746
9747
9748
9749
9751 {
9753 {
9755 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9756
9757 if (r_index >= 0)
9758 {
9759 InventoryLocation r_il = new InventoryLocation;
9760 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9761
9762 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9765 {
9766 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9767 }
9769 {
9770 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9771 }
9772
9773 }
9774
9775 player.GetHumanInventory().ClearUserReservedLocation(this);
9776 }
9777
9780 }
9781
9782
9783
9784
9786 {
9787 return ItemBase.m_DebugActionsMask;
9788 }
9789
9791 {
9792 return ItemBase.m_DebugActionsMask & mask;
9793 }
9794
9796 {
9797 ItemBase.m_DebugActionsMask = mask;
9798 }
9799
9801 {
9802 ItemBase.m_DebugActionsMask |= mask;
9803 }
9804
9806 {
9807 ItemBase.m_DebugActionsMask &= ~mask;
9808 }
9809
9811 {
9813 {
9815 }
9816 else
9817 {
9819 }
9820 }
9821
9822
9824 {
9825 if (GetEconomyProfile())
9826 {
9827 float q_max = GetEconomyProfile().GetQuantityMax();
9828 if (q_max > 0)
9829 {
9830 float q_min = GetEconomyProfile().GetQuantityMin();
9831 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9832
9834 {
9835 ComponentEnergyManager comp = GetCompEM();
9837 {
9839 }
9840 }
9842 {
9844
9845 }
9846
9847 }
9848 }
9849 }
9850
9853 {
9854 EntityAI parent = GetHierarchyParent();
9855
9856 if (parent)
9857 {
9858 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9859 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9860 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9861 }
9862 }
9863
9866 {
9867 EntityAI parent = GetHierarchyParent();
9868
9869 if (parent)
9870 {
9871 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9872 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9873 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9874 }
9875 }
9876
9878 {
9879
9880
9881
9882
9884
9886 {
9887 if (ScriptInputUserData.CanStoreInputUserData())
9888 {
9889 ScriptInputUserData ctx = new ScriptInputUserData;
9895 ctx.
Write(use_stack_max);
9898
9900 {
9901 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9902 }
9903 }
9904 }
9905 else if (!
GetGame().IsMultiplayer())
9906 {
9908 }
9909 }
9910
9912 {
9914 }
9915
9917 {
9919 }
9920
9922 {
9924 }
9925
9927 {
9928
9929 return false;
9930 }
9931
9933 {
9934 return false;
9935 }
9936
9940 {
9941 return false;
9942 }
9943
9945 {
9946 return "";
9947 }
9948
9950
9952 {
9953 return false;
9954 }
9955
9957 {
9958 return true;
9959 }
9960
9961
9962
9964 {
9965 return true;
9966 }
9967
9969 {
9970 return true;
9971 }
9972
9974 {
9975 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9977 }
9978
9980 {
9982 }
9983
9985 {
9987 if (!is_being_placed)
9989 SetSynchDirty();
9990 }
9991
9992
9994
9996 {
9998 }
9999
10001 {
10003 }
10004
10006 {
10007 return 1;
10008 }
10009
10011 {
10012 return false;
10013 }
10014
10016 {
10018 SetSynchDirty();
10019 }
10020
10021
10022
10023
10024
10025
10026
10027
10028
10029
10030
10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10056 {
10057 super.OnMovedInsideCargo(container);
10058
10059 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10060 }
10061
10062 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10063 {
10064 super.EEItemLocationChanged(oldLoc,newLoc);
10065
10066 PlayerBase new_player = null;
10067 PlayerBase old_player = null;
10068
10069 if (newLoc.GetParent())
10070 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10071
10072 if (oldLoc.GetParent())
10073 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10074
10076 {
10077 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
10078
10079 if (r_index >= 0)
10080 {
10081 InventoryLocation r_il = new InventoryLocation;
10082 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10083
10084 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10087 {
10088 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10089 }
10091 {
10092 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10093 }
10094
10095 }
10096 }
10097
10099 {
10100 if (new_player)
10101 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
10102
10103 if (new_player == old_player)
10104 {
10105
10106 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10107 {
10109 {
10110 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10111 {
10112 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10113 }
10114 }
10115 else
10116 {
10117 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10118 }
10119 }
10120
10121 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10122 {
10123 int type = oldLoc.GetType();
10125 {
10126 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10127 }
10129 {
10130 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10131 }
10132 }
10133 if (!m_OldLocation)
10134 {
10135 m_OldLocation = new InventoryLocation;
10136 }
10137 m_OldLocation.Copy(oldLoc);
10138 }
10139 else
10140 {
10141 if (m_OldLocation)
10142 {
10143 m_OldLocation.Reset();
10144 }
10145 }
10146
10148 }
10149 else
10150 {
10151 if (new_player)
10152 {
10153 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10154 if (res_index >= 0)
10155 {
10156 InventoryLocation il = new InventoryLocation;
10157 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
10159 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
10162 {
10163 il.
GetParent().GetOnReleaseLock().Invoke(it);
10164 }
10166 {
10168 }
10169
10170 }
10171 }
10173 {
10174
10176 }
10177
10178 if (m_OldLocation)
10179 {
10180 m_OldLocation.Reset();
10181 }
10182 }
10183 }
10184
10185 override void EOnContact(IEntity other, Contact extra)
10186 {
10188 {
10189 int liquidType = -1;
10191 if (impactSpeed > 0.0)
10192 {
10194 #ifndef SERVER
10196 #else
10198 SetSynchDirty();
10199 #endif
10201 }
10202 }
10203
10204 #ifdef SERVER
10205 if (GetCompEM() && GetCompEM().IsPlugged())
10206 {
10207 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10208 GetCompEM().UnplugThis();
10209 }
10210 #endif
10211 }
10212
10214
10216 {
10218 }
10219
10221 {
10222
10223 }
10224
10226 {
10227 super.OnItemLocationChanged(old_owner, new_owner);
10228
10229 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10230 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10231
10232 if (!relatedPlayer && playerNew)
10233 relatedPlayer = playerNew;
10234
10235 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10236 {
10238 if (actionMgr)
10239 {
10240 ActionBase currentAction = actionMgr.GetRunningAction();
10241 if (currentAction)
10243 }
10244 }
10245
10246 Man ownerPlayerOld = null;
10247 Man ownerPlayerNew = null;
10248
10249 if (old_owner)
10250 {
10251 if (old_owner.
IsMan())
10252 {
10253 ownerPlayerOld = Man.Cast(old_owner);
10254 }
10255 else
10256 {
10257 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10258 }
10259 }
10260 else
10261 {
10263 {
10265
10266 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10267 {
10268 GetCompEM().UnplugThis();
10269 }
10270 }
10271 }
10272
10273 if (new_owner)
10274 {
10275 if (new_owner.
IsMan())
10276 {
10277 ownerPlayerNew = Man.Cast(new_owner);
10278 }
10279 else
10280 {
10281 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10282 }
10283 }
10284
10285 if (ownerPlayerOld != ownerPlayerNew)
10286 {
10287 if (ownerPlayerOld)
10288 {
10289 array<EntityAI> subItemsExit = new array<EntityAI>;
10291 for (int i = 0; i < subItemsExit.Count(); i++)
10292 {
10295 }
10296 }
10297
10298 if (ownerPlayerNew)
10299 {
10300 array<EntityAI> subItemsEnter = new array<EntityAI>;
10302 for (int j = 0; j < subItemsEnter.Count(); j++)
10303 {
10306 }
10307 }
10308 }
10309 else if (ownerPlayerNew != null)
10310 {
10311 PlayerBase nplayer;
10312 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10313 {
10314 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10316 for (int k = 0; k < subItemsUpdate.Count(); k++)
10317 {
10319 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10320 }
10321 }
10322 }
10323
10324 if (old_owner)
10325 old_owner.OnChildItemRemoved(this);
10326 if (new_owner)
10327 new_owner.OnChildItemReceived(this);
10328 }
10329
10330
10332 {
10333 super.EEDelete(parent);
10334 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10335 if (player)
10336 {
10338
10339 if (player.IsAlive())
10340 {
10341 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10342 if (r_index >= 0)
10343 {
10344 InventoryLocation r_il = new InventoryLocation;
10345 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10346
10347 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10350 {
10351 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10352 }
10354 {
10355 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10356 }
10357
10358 }
10359
10360 player.RemoveQuickBarEntityShortcut(this);
10361 }
10362 }
10363 }
10364
10366 {
10367 super.EEKilled(killer);
10368
10371 {
10372 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10373 {
10374 if (IsMagazine())
10375 {
10376 if (Magazine.Cast(this).GetAmmoCount() > 0)
10377 {
10379 }
10380 }
10381 else
10382 {
10384 }
10385 }
10386 }
10387 }
10388
10390 {
10391 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10392
10393 super.OnWasAttached(parent, slot_id);
10394
10397
10399 }
10400
10402 {
10403 super.OnWasDetached(parent, slot_id);
10404
10407 }
10408
10410 {
10411 int idx;
10414
10415 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10416 if (inventory_slots.Count() < 1)
10417 {
10418 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10419 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10420 }
10421 else
10422 {
10423 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10424 }
10425
10426 idx = inventory_slots.Find(slot);
10427 if (idx < 0)
10428 return "";
10429
10430 return attach_types.Get(idx);
10431 }
10432
10434 {
10435 int idx = -1;
10436 string slot;
10437
10440
10441 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10442 if (inventory_slots.Count() < 1)
10443 {
10444 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10445 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10446 }
10447 else
10448 {
10449 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10450 if (detach_types.Count() < 1)
10451 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10452 }
10453
10454 for (int i = 0; i < inventory_slots.Count(); i++)
10455 {
10456 slot = inventory_slots.Get(i);
10457 }
10458
10459 if (slot != "")
10460 {
10461 if (detach_types.Count() == 1)
10462 idx = 0;
10463 else
10464 idx = inventory_slots.Find(slot);
10465 }
10466 if (idx < 0)
10467 return "";
10468
10469 return detach_types.Get(idx);
10470 }
10471
10473 {
10474
10476
10477
10478 float min_time = 1;
10479 float max_time = 3;
10480 float delay = Math.RandomFloat(min_time, max_time);
10481
10482 explode_timer.Run(delay, this, "DoAmmoExplosion");
10483 }
10484
10486 {
10487 Magazine magazine = Magazine.Cast(this);
10488 int pop_sounds_count = 6;
10489 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10490
10491
10492 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10493 string sound_name = pop_sounds[ sound_idx ];
10495
10496
10497 magazine.ServerAddAmmoCount(-1);
10498
10499
10500 float min_temp_to_explode = 100;
10501
10502 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10503 {
10505 }
10506 }
10507
10508
10509 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10510 {
10511 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10512
10513 const int CHANCE_DAMAGE_CARGO = 4;
10514 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10515 const int CHANCE_DAMAGE_NOTHING = 2;
10516
10518 {
10519 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10520 int chances;
10521 int rnd;
10522
10523 if (GetInventory().GetCargo())
10524 {
10525 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10526 rnd = Math.RandomInt(0,chances);
10527
10528 if (rnd < CHANCE_DAMAGE_CARGO)
10529 {
10531 }
10532 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10533 {
10535 }
10536 }
10537 else
10538 {
10539 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10540 rnd = Math.RandomInt(0,chances);
10541
10542 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10543 {
10545 }
10546 }
10547 }
10548 }
10549
10551 {
10552 if (GetInventory().GetCargo())
10553 {
10554 int item_count = GetInventory().GetCargo().GetItemCount();
10555 if (item_count > 0)
10556 {
10557 int random_pick = Math.RandomInt(0, item_count);
10559 if (!item.IsExplosive())
10560 {
10561 item.AddHealth("","",damage);
10562 return true;
10563 }
10564 }
10565 }
10566 return false;
10567 }
10568
10570 {
10571 int attachment_count = GetInventory().AttachmentCount();
10572 if (attachment_count > 0)
10573 {
10574 int random_pick = Math.RandomInt(0, attachment_count);
10575 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
10576 if (!attachment.IsExplosive())
10577 {
10578 attachment.AddHealth("","",damage);
10579 return true;
10580 }
10581 }
10582 return false;
10583 }
10584
10586 {
10588 }
10589
10591 {
10593 return GetInventory().CanRemoveEntity();
10594
10595 return false;
10596 }
10597
10599 {
10600
10602 return false;
10603
10604
10606 return false;
10607
10608
10609
10611 if (delta == 0)
10612 return false;
10613
10614
10615 return true;
10616 }
10617
10619 {
10621 {
10622 if (ScriptInputUserData.CanStoreInputUserData())
10623 {
10624 ScriptInputUserData ctx = new ScriptInputUserData;
10629 ctx.
Write(destination_entity);
10631 ctx.
Write(slot_id);
10633 }
10634 }
10635 else if (!
GetGame().IsMultiplayer())
10636 {
10638 }
10639 }
10640
10642 {
10643 float split_quantity_new;
10647 InventoryLocation loc = new InventoryLocation;
10648
10649 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10650 {
10652 split_quantity_new = stack_max;
10653 else
10655
10657 {
10658 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10659 if (new_item)
10660 {
10661 new_item.SetResultOfSplit(true);
10662 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10664 new_item.
SetQuantity(split_quantity_new,
false,
true);
10665 }
10666 }
10667 }
10668 else if (destination_entity && slot_id == -1)
10669 {
10670 if (quantity > stack_max)
10671 split_quantity_new = stack_max;
10672 else
10673 split_quantity_new = quantity;
10674
10676 {
10678 {
10681 }
10682
10683 if (new_item)
10684 {
10685 new_item.SetResultOfSplit(true);
10686 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10688 new_item.
SetQuantity(split_quantity_new,
false,
true);
10689 }
10690 }
10691 }
10692 else
10693 {
10694 if (stack_max != 0)
10695 {
10697 {
10699 }
10700
10701 if (split_quantity_new == 0)
10702 {
10703 if (!
GetGame().IsMultiplayer())
10704 player.PhysicalPredictiveDropItem(this);
10705 else
10706 player.ServerDropEntity(this);
10707 return;
10708 }
10709
10711 {
10713
10714 if (new_item)
10715 {
10716 new_item.SetResultOfSplit(true);
10717 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10720 new_item.PlaceOnSurface();
10721 }
10722 }
10723 }
10724 }
10725 }
10726
10728 {
10729 float split_quantity_new;
10733 InventoryLocation loc = new InventoryLocation;
10734
10735 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10736 {
10738 split_quantity_new = stack_max;
10739 else
10741
10743 {
10744 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10745 if (new_item)
10746 {
10747 new_item.SetResultOfSplit(true);
10748 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10750 new_item.
SetQuantity(split_quantity_new,
false,
true);
10751 }
10752 }
10753 }
10754 else if (destination_entity && slot_id == -1)
10755 {
10756 if (quantity > stack_max)
10757 split_quantity_new = stack_max;
10758 else
10759 split_quantity_new = quantity;
10760
10762 {
10764 {
10767 }
10768
10769 if (new_item)
10770 {
10771 new_item.SetResultOfSplit(true);
10772 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10774 new_item.
SetQuantity(split_quantity_new,
false,
true);
10775 }
10776 }
10777 }
10778 else
10779 {
10780 if (stack_max != 0)
10781 {
10783 {
10785 }
10786
10788 {
10790
10791 if (new_item)
10792 {
10793 new_item.SetResultOfSplit(true);
10794 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10797 new_item.PlaceOnSurface();
10798 }
10799 }
10800 }
10801 }
10802 }
10803
10805 {
10807 {
10808 if (ScriptInputUserData.CanStoreInputUserData())
10809 {
10810 ScriptInputUserData ctx = new ScriptInputUserData;
10815 dst.WriteToContext(ctx);
10817 }
10818 }
10819 else if (!
GetGame().IsMultiplayer())
10820 {
10822 }
10823 }
10824
10826 {
10828 {
10829 if (ScriptInputUserData.CanStoreInputUserData())
10830 {
10831 ScriptInputUserData ctx = new ScriptInputUserData;
10836 ctx.
Write(destination_entity);
10842 }
10843 }
10844 else if (!
GetGame().IsMultiplayer())
10845 {
10847 }
10848 }
10849
10851 {
10853 }
10854
10856 {
10858 float split_quantity_new;
10860 if (dst.IsValid())
10861 {
10862 int slot_id = dst.GetSlot();
10864
10865 if (quantity > stack_max)
10866 split_quantity_new = stack_max;
10867 else
10868 split_quantity_new = quantity;
10869
10871 {
10873
10874 if (new_item)
10875 {
10876 new_item.SetResultOfSplit(true);
10877 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10879 new_item.
SetQuantity(split_quantity_new,
false,
true);
10880 }
10881
10882 return new_item;
10883 }
10884 }
10885
10886 return null;
10887 }
10888
10890 {
10892 float split_quantity_new;
10894 if (destination_entity)
10895 {
10897 if (quantity > stackable)
10898 split_quantity_new = stackable;
10899 else
10900 split_quantity_new = quantity;
10901
10903 {
10904 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10905 if (new_item)
10906 {
10907 new_item.SetResultOfSplit(true);
10908 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10910 new_item.
SetQuantity(split_quantity_new,
false,
true);
10911 }
10912 }
10913 }
10914 }
10915
10917 {
10919 {
10920 if (ScriptInputUserData.CanStoreInputUserData())
10921 {
10922 ScriptInputUserData ctx = new ScriptInputUserData;
10927 ItemBase destination_entity =
this;
10928 ctx.
Write(destination_entity);
10932 }
10933 }
10934 else if (!
GetGame().IsMultiplayer())
10935 {
10937 }
10938 }
10939
10941 {
10943 float split_quantity_new;
10945 if (player)
10946 {
10948 if (quantity > stackable)
10949 split_quantity_new = stackable;
10950 else
10951 split_quantity_new = quantity;
10952
10954 {
10955 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10956 new_item =
ItemBase.Cast(in_hands);
10957 if (new_item)
10958 {
10959 new_item.SetResultOfSplit(true);
10960 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10962 new_item.SetQuantity(split_quantity_new, false, true);
10963 }
10964 }
10965 }
10966 }
10967
10969 {
10971 float split_quantity_new = Math.Floor(quantity * 0.5);
10972
10974 return;
10975
10977
10978 if (new_item)
10979 {
10980 if (new_item.GetQuantityMax() < split_quantity_new)
10981 {
10982 split_quantity_new = new_item.GetQuantityMax();
10983 }
10984
10985 new_item.SetResultOfSplit(true);
10986 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10987
10989 {
10992 }
10993 else
10994 {
10996 new_item.
SetQuantity(split_quantity_new,
false,
true);
10997 }
10998 }
10999 }
11000
11002 {
11004 float split_quantity_new = Math.Floor(quantity / 2);
11005
11007 return;
11008
11009 InventoryLocation invloc = new InventoryLocation;
11011
11013 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11014
11015 if (new_item)
11016 {
11017 if (new_item.GetQuantityMax() < split_quantity_new)
11018 {
11019 split_quantity_new = new_item.GetQuantityMax();
11020 }
11022 {
11025 }
11026 else if (split_quantity_new > 1)
11027 {
11029 new_item.
SetQuantity(split_quantity_new,
false,
true);
11030 }
11031 }
11032 }
11033
11036 {
11037 SetWeightDirty();
11039
11040 if (parent)
11041 parent.OnAttachmentQuantityChangedEx(this, delta);
11042
11044 {
11046 {
11048 }
11050 {
11051 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11053 }
11054 }
11055
11056 }
11057
11060 {
11061
11062 }
11063
11066 {
11068 }
11069
11071 {
11072 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11073
11075 {
11076 if (newLevel == GameConstants.STATE_RUINED)
11077 {
11079 EntityAI parent = GetHierarchyParent();
11080 if (parent && parent.IsFireplace())
11081 {
11082 CargoBase cargo = GetInventory().GetCargo();
11083 if (cargo)
11084 {
11086 {
11088 }
11089 }
11090 }
11091 }
11092
11094 {
11095
11097 return;
11098 }
11099
11100 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11101 {
11103 }
11104 }
11105 }
11106
11107
11109 {
11110 super.OnRightClick();
11111
11113 {
11115 {
11116 if (ScriptInputUserData.CanStoreInputUserData())
11117 {
11118 EntityAI root = GetHierarchyRoot();
11119 Man playerOwner = GetHierarchyRootPlayer();
11120 InventoryLocation dst = new InventoryLocation;
11121
11122
11123 if (!playerOwner && root && root == this)
11124 {
11126 }
11127 else
11128 {
11129
11130 GetInventory().GetCurrentInventoryLocation(dst);
11132 {
11135 {
11137 }
11138 else
11139 {
11141
11142
11143 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11144 {
11146 }
11147 else
11148 {
11149 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11150 }
11151 }
11152 }
11153 }
11154
11155 ScriptInputUserData ctx = new ScriptInputUserData;
11163 }
11164 }
11165 else if (!
GetGame().IsMultiplayer())
11166 {
11168 }
11169 }
11170 }
11171
11173 {
11174 if (root)
11175 {
11176 vector m4[4];
11177 root.GetTransform(m4);
11178 dst.SetGround(this, m4);
11179 }
11180 else
11181 {
11182 GetInventory().GetCurrentInventoryLocation(dst);
11183 }
11184 }
11185
11186 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11187 {
11188
11189 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11190 return false;
11191
11192 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11193 return false;
11194
11195
11197 return false;
11198
11199
11200 Magazine mag = Magazine.Cast(this);
11201 if (mag)
11202 {
11203 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11204 return false;
11205
11206 if (stack_max_limit)
11207 {
11208 Magazine other_mag = Magazine.Cast(other_item);
11209 if (other_item)
11210 {
11211 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11212 return false;
11213 }
11214
11215 }
11216 }
11217 else
11218 {
11219
11221 return false;
11222
11224 return false;
11225 }
11226
11227 PlayerBase player = null;
11228 if (CastTo(player, GetHierarchyRootPlayer()))
11229 {
11230 if (player.GetInventory().HasAttachment(this))
11231 return false;
11232
11233 if (player.IsItemsToDelete())
11234 return false;
11235 }
11236
11237 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11238 return false;
11239
11240 int slotID;
11242 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11243 return false;
11244
11245 return true;
11246 }
11247
11249 {
11251 }
11252
11254 {
11255 return m_IsResultOfSplit;
11256 }
11257
11259 {
11260 m_IsResultOfSplit = value;
11261 }
11262
11264 {
11266 }
11267
11269 {
11270 float other_item_quantity = other_item.GetQuantity();
11271 float this_free_space;
11272
11274
11276
11277 if (other_item_quantity > this_free_space)
11278 {
11279 return this_free_space;
11280 }
11281 else
11282 {
11283 return other_item_quantity;
11284 }
11285 }
11286
11288 {
11290 }
11291
11293 {
11295 return;
11296
11297 if (!IsMagazine() && other_item)
11298 {
11300 if (quantity_used != 0)
11301 {
11302 float hp1 = GetHealth01("","");
11303 float hp2 = other_item.GetHealth01("","");
11304 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11305 hpResult = hpResult / (
GetQuantity() + quantity_used);
11306
11307 hpResult *= GetMaxHealth();
11308 Math.Round(hpResult);
11309 SetHealth("", "Health", hpResult);
11310
11312 other_item.AddQuantity(-quantity_used);
11313 }
11314 }
11316 }
11317
11319 {
11320 #ifdef SERVER
11321 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11322 GetHierarchyParent().IncreaseLifetimeUp();
11323 #endif
11324 };
11325
11327 {
11328 PlayerBase p = PlayerBase.Cast(player);
11329
11330 array<int> recipesIds = p.m_Recipes;
11331 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11332 if (moduleRecipesManager)
11333 {
11334 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
11335 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11336 }
11337
11338 for (int i = 0;i < recipesIds.Count(); i++)
11339 {
11340 int key = recipesIds.Get(i);
11341 string recipeName = moduleRecipesManager.GetRecipeName(key);
11343 }
11344 }
11345
11346
11347 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11348 {
11349 super.GetDebugActions(outputList);
11350
11351
11357
11358
11363
11368
11369
11373
11374
11376 {
11380 }
11381
11384
11385
11389
11391
11392 InventoryLocation loc = new InventoryLocation();
11393 GetInventory().GetCurrentInventoryLocation(loc);
11395 {
11396 if (Gizmo_IsSupported())
11399 }
11400
11402 }
11403
11404
11405
11406
11408 {
11409 super.OnAction(action_id, player, ctx);
11410
11412 {
11413 switch (action_id)
11414 {
11417 return true;
11420 return true;
11421 }
11422 }
11423
11425 {
11426 switch (action_id)
11427 {
11429 Delete();
11430 return true;
11431 }
11432 }
11433
11434 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11435 {
11436 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11437 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11438 PlayerBase p = PlayerBase.Cast(player);
11439 if (
EActions.RECIPES_RANGE_START < 1000)
11440 {
11441 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11442 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11443 }
11444 }
11445 #ifndef SERVER
11446 else if (action_id ==
EActions.WATCH_PLAYER)
11447 {
11448 PluginDeveloper.SetDeveloperItemClientEx(player);
11449 }
11450 #endif
11452 {
11453 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11454 {
11455 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11456 OnDebugButtonPressServer(id + 1);
11457 }
11458
11459 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11460 {
11461 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11463 }
11464
11465 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11466 {
11467 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11469 }
11470
11471 else if (action_id ==
EActions.ADD_QUANTITY)
11472 {
11473 if (IsMagazine())
11474 {
11475 Magazine mag = Magazine.Cast(this);
11476 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11477 }
11478 else
11479 {
11481 }
11482
11483 if (m_EM)
11484 {
11485 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11486 }
11487
11488 }
11489
11490 else if (action_id ==
EActions.REMOVE_QUANTITY)
11491 {
11492 if (IsMagazine())
11493 {
11494 Magazine mag2 = Magazine.Cast(this);
11495 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11496 }
11497 else
11498 {
11500 }
11501 if (m_EM)
11502 {
11503 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11504 }
11505
11506 }
11507
11508 else if (action_id ==
EActions.SET_QUANTITY_0)
11509 {
11511
11512 if (m_EM)
11513 {
11514 m_EM.SetEnergy(0);
11515 }
11516 }
11517
11518 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11519 {
11521
11522 if (m_EM)
11523 {
11524 m_EM.SetEnergy(m_EM.GetEnergyMax());
11525 }
11526 }
11527
11528 else if (action_id ==
EActions.ADD_HEALTH)
11529 {
11530 AddHealth("","",GetMaxHealth("","Health")/5);
11531 }
11532 else if (action_id ==
EActions.REMOVE_HEALTH)
11533 {
11534 AddHealth("","",-GetMaxHealth("","Health")/5);
11535 }
11536 else if (action_id ==
EActions.DESTROY_HEALTH)
11537 {
11538 SetHealth01("","",0);
11539 }
11540 else if (action_id ==
EActions.WATCH_ITEM)
11541 {
11543 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11544 #ifdef DEVELOPER
11545 SetDebugDeveloper_item(this);
11546 #endif
11547 }
11548
11549 else if (action_id ==
EActions.ADD_TEMPERATURE)
11550 {
11551 AddTemperature(20);
11552
11553 }
11554
11555 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11556 {
11557 AddTemperature(-20);
11558
11559 }
11560
11561 else if (action_id ==
EActions.FLIP_FROZEN)
11562 {
11563 SetFrozen(!GetIsFrozen());
11564
11565 }
11566
11567 else if (action_id ==
EActions.ADD_WETNESS)
11568 {
11570
11571 }
11572
11573 else if (action_id ==
EActions.REMOVE_WETNESS)
11574 {
11576
11577 }
11578
11579 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11580 {
11583
11584
11585 }
11586
11587 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11588 {
11591 }
11592
11593 else if (action_id ==
EActions.MAKE_SPECIAL)
11594 {
11595 auto debugParams = DebugSpawnParams.WithPlayer(player);
11596 OnDebugSpawnEx(debugParams);
11597 }
11598
11599 }
11600
11601
11602 return false;
11603 }
11604
11605
11606
11607
11611
11614
11615
11616
11618 {
11619 return false;
11620 }
11621
11622
11624 {
11625 return true;
11626 }
11627
11628
11630 {
11631 return true;
11632 }
11633
11634
11635
11637 {
11638 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11640 }
11641
11644 {
11645 return null;
11646 }
11647
11649 {
11650 return false;
11651 }
11652
11654 {
11655 return false;
11656 }
11657
11661
11662
11664 {
11665 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11666 return module_repairing.CanRepair(this, item_repair_kit);
11667 }
11668
11669
11670 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11671 {
11672 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11673 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11674 }
11675
11676
11678 {
11679
11680
11681
11682
11683
11684
11685
11686
11687 return 1;
11688 }
11689
11690
11691
11693 {
11695 }
11696
11697
11698
11700 {
11702 }
11703
11704
11713 {
11714 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11715
11716 if (player)
11717 {
11718 player.MessageStatus(text);
11719 }
11720 }
11721
11722
11731 {
11732 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11733
11734 if (player)
11735 {
11736 player.MessageAction(text);
11737 }
11738 }
11739
11740
11749 {
11750 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11751
11752 if (player)
11753 {
11754 player.MessageFriendly(text);
11755 }
11756 }
11757
11758
11767 {
11768 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11769
11770 if (player)
11771 {
11772 player.MessageImportant(text);
11773 }
11774 }
11775
11777 {
11778 return true;
11779 }
11780
11781
11782 override bool KindOf(
string tag)
11783 {
11784 bool found = false;
11785 string item_name = this.
GetType();
11788
11789 int array_size = item_tag_array.Count();
11790 for (int i = 0; i < array_size; i++)
11791 {
11792 if (item_tag_array.Get(i) == tag)
11793 {
11794 found = true;
11795 break;
11796 }
11797 }
11798 return found;
11799 }
11800
11801
11803 {
11804
11805 super.OnRPC(sender, rpc_type,ctx);
11806
11807
11808 switch (rpc_type)
11809 {
11810 #ifndef SERVER
11811 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11812 Param2<bool, string> p = new Param2<bool, string>(false, "");
11813
11815 return;
11816
11817 bool play = p.param1;
11818 string soundSet = p.param2;
11819
11820 if (play)
11821 {
11823 {
11825 {
11827 }
11828 }
11829 else
11830 {
11832 }
11833 }
11834 else
11835 {
11837 }
11838
11839 break;
11840 #endif
11841
11842 }
11843
11845 {
11847 }
11848 }
11849
11850
11851
11852
11854 {
11855 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11856 return plugin.GetID(
name);
11857 }
11858
11860 {
11861 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11862 return plugin.GetName(id);
11863 }
11864
11867 {
11868
11869
11870 int varFlags;
11871 if (!ctx.
Read(varFlags))
11872 return;
11873
11874 if (varFlags & ItemVariableFlags.FLOAT)
11875 {
11877 }
11878 }
11879
11881 {
11882
11883 super.SerializeNumericalVars(floats_out);
11884
11885
11886
11888 {
11890 }
11891
11893 {
11895 }
11896
11898 {
11900 }
11901
11903 {
11908 }
11909
11911 {
11913 }
11914 }
11915
11917 {
11918
11919 super.DeSerializeNumericalVars(floats);
11920
11921
11922 int index = 0;
11923 int mask = Math.Round(floats.Get(index));
11924
11925 index++;
11926
11928 {
11930 {
11932 }
11933 else
11934 {
11935 float quantity = floats.Get(index);
11936 SetQuantity(quantity,
true,
false,
false,
false);
11937 }
11938 index++;
11939 }
11940
11942 {
11943 float wet = floats.Get(index);
11945 index++;
11946 }
11947
11949 {
11950 int liquidtype = Math.Round(floats.Get(index));
11952 index++;
11953 }
11954
11956 {
11958 index++;
11960 index++;
11962 index++;
11964 index++;
11965 }
11966
11968 {
11969 int cleanness = Math.Round(floats.Get(index));
11971 index++;
11972 }
11973 }
11974
11976 {
11977 super.WriteVarsToCTX(ctx);
11978
11979
11981 {
11983 }
11984
11986 {
11988 }
11989
11991 {
11993 }
11994
11996 {
11997 int r,g,b,a;
12003 }
12004
12006 {
12008 }
12009 }
12010
12012 {
12013 if (!super.ReadVarsFromCTX(ctx,version))
12014 return false;
12015
12016 int intValue;
12017 float value;
12018
12019 if (version < 140)
12020 {
12021 if (!ctx.
Read(intValue))
12022 return false;
12023
12024 m_VariablesMask = intValue;
12025 }
12026
12028 {
12029 if (!ctx.
Read(value))
12030 return false;
12031
12033 {
12035 }
12036 else
12037 {
12039 }
12040 }
12041
12042 if (version < 140)
12043 {
12045 {
12046 if (!ctx.
Read(value))
12047 return false;
12048 SetTemperatureDirect(value);
12049 }
12050 }
12051
12053 {
12054 if (!ctx.
Read(value))
12055 return false;
12057 }
12058
12060 {
12061 if (!ctx.
Read(intValue))
12062 return false;
12064 }
12065
12067 {
12068 int r,g,b,a;
12070 return false;
12072 return false;
12074 return false;
12076 return false;
12077
12079 }
12080
12082 {
12083 if (!ctx.
Read(intValue))
12084 return false;
12086 }
12087
12088 if (version >= 138 && version < 140)
12089 {
12091 {
12092 if (!ctx.
Read(intValue))
12093 return false;
12094 SetFrozen(intValue);
12095 }
12096 }
12097
12098 return true;
12099 }
12100
12101
12103 {
12106 {
12108 }
12109
12110 if (!super.OnStoreLoad(ctx, version))
12111 {
12113 return false;
12114 }
12115
12116 if (version >= 114)
12117 {
12118 bool hasQuickBarIndexSaved;
12119
12120 if (!ctx.
Read(hasQuickBarIndexSaved))
12121 {
12123 return false;
12124 }
12125
12126 if (hasQuickBarIndexSaved)
12127 {
12128 int itmQBIndex;
12129
12130
12131 if (!ctx.
Read(itmQBIndex))
12132 {
12134 return false;
12135 }
12136
12137 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12138 if (itmQBIndex != -1 && parentPlayer)
12139 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12140 }
12141 }
12142 else
12143 {
12144
12145 PlayerBase player;
12146 int itemQBIndex;
12147 if (version ==
int.
MAX)
12148 {
12149 if (!ctx.
Read(itemQBIndex))
12150 {
12152 return false;
12153 }
12154 }
12155 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12156 {
12157
12158 if (!ctx.
Read(itemQBIndex))
12159 {
12161 return false;
12162 }
12163 if (itemQBIndex != -1 && player)
12164 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12165 }
12166 }
12167
12168 if (version < 140)
12169 {
12170
12171 if (!LoadVariables(ctx, version))
12172 {
12174 return false;
12175 }
12176 }
12177
12178
12180 {
12182 return false;
12183 }
12184 if (version >= 132)
12185 {
12187 if (raib)
12188 {
12190 {
12192 return false;
12193 }
12194 }
12195 }
12196
12198 return true;
12199 }
12200
12201
12202
12204 {
12205 super.OnStoreSave(ctx);
12206
12207 PlayerBase player;
12208 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12209 {
12211
12212 int itemQBIndex = -1;
12213 itemQBIndex = player.FindQuickBarEntityIndex(this);
12214 ctx.
Write(itemQBIndex);
12215 }
12216 else
12217 {
12219 }
12220
12222
12224 if (raib)
12225 {
12227 }
12228 }
12229
12230
12232 {
12233 super.AfterStoreLoad();
12234
12236 {
12238 }
12239
12241 {
12244 }
12245 }
12246
12248 {
12249 super.EEOnAfterLoad();
12250
12252 {
12254 }
12255
12258 }
12259
12261 {
12262 return false;
12263 }
12264
12265
12266
12268 {
12270 {
12271 #ifdef PLATFORM_CONSOLE
12272
12274 {
12276 if (menu)
12277 {
12279 }
12280 }
12281 #endif
12282 }
12283
12285 {
12288 }
12289
12291 {
12292 SetWeightDirty();
12294 }
12296 {
12299 }
12300
12302 {
12305 }
12307 {
12310 }
12311
12312 super.OnVariablesSynchronized();
12313 }
12314
12315
12316
12318 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12319 {
12320 if (!IsServerCheck(allow_client))
12321 return false;
12322
12324 return false;
12325
12328
12329 if (value <= (min + 0.001))
12330 value = min;
12331
12332 if (value == min)
12333 {
12334 if (destroy_config)
12335 {
12336 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12337 if (dstr)
12338 {
12340 this.Delete();
12341 return true;
12342 }
12343 }
12344 else if (destroy_forced)
12345 {
12347 this.Delete();
12348 return true;
12349 }
12350
12352 }
12353
12356
12358 {
12360
12361 if (delta)
12363 }
12364
12366
12367 return false;
12368 }
12369
12370
12372 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12373 {
12375 }
12376
12378 {
12381 }
12382
12384 {
12387 }
12388
12390 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12391 {
12392 float value_clamped = Math.Clamp(value, 0, 1);
12394 SetQuantity(result, destroy_config, destroy_forced);
12395 }
12396
12397
12400 {
12402 }
12403
12405 {
12407 }
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12419 {
12420 int slot = -1;
12421 if (GetInventory())
12422 {
12423 InventoryLocation il = new InventoryLocation;
12424 GetInventory().GetCurrentInventoryLocation(il);
12426 }
12427
12429 }
12430
12432 {
12433 float quantity_max = 0;
12434
12436 {
12437 if (attSlotID != -1)
12438 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12439
12440 if (quantity_max <= 0)
12442 }
12443
12444 if (quantity_max <= 0)
12446
12447 return quantity_max;
12448 }
12449
12451 {
12453 }
12454
12456 {
12458 }
12459
12460
12462 {
12464 }
12465
12467 {
12469 }
12470
12472 {
12474 }
12475
12476
12478 {
12479
12480 float weightEx = GetWeightEx();
12481 float special = GetInventoryAndCargoWeight();
12482 return weightEx - special;
12483 }
12484
12485
12487 {
12489 }
12490
12492 {
12494 {
12495 #ifdef DEVELOPER
12496 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12497 {
12498 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12500 }
12501 #endif
12502
12503 return GetQuantity() * GetConfigWeightModified();
12504 }
12505 else if (HasEnergyManager())
12506 {
12507 #ifdef DEVELOPER
12508 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12509 {
12510 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12511 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12512 }
12513 #endif
12514 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12515 }
12516 else
12517 {
12518 #ifdef DEVELOPER
12519 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12520 {
12521 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12522 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12523 }
12524 #endif
12525 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12526 }
12527 }
12528
12531 {
12532 int item_count = 0;
12534
12535 if (GetInventory().GetCargo() != NULL)
12536 {
12537 item_count = GetInventory().GetCargo().GetItemCount();
12538 }
12539
12540 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
12541 {
12542 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
12543 if (item)
12544 item_count += item.GetNumberOfItems();
12545 }
12546 return item_count;
12547 }
12548
12551 {
12552 float weight = 0;
12553 float wetness = 1;
12554 if (include_wetness)
12557 {
12558 weight = wetness * m_ConfigWeight;
12559 }
12561 {
12562 weight = 1;
12563 }
12564 return weight;
12565 }
12566
12567
12568
12570 {
12571 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
12572 {
12573 GameInventory inv = GetInventory();
12574 array<EntityAI> items = new array<EntityAI>;
12576 for (int i = 0; i < items.Count(); i++)
12577 {
12579 if (item)
12580 {
12582 }
12583 }
12584 }
12585 }
12586
12587
12588
12589
12591 {
12592 float energy = 0;
12593 if (HasEnergyManager())
12594 {
12595 energy = GetCompEM().GetEnergy();
12596 }
12597 return energy;
12598 }
12599
12600
12602 {
12603 super.OnEnergyConsumed();
12604
12606 }
12607
12609 {
12610 super.OnEnergyAdded();
12611
12613 }
12614
12615
12617 {
12618 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12619 {
12621 {
12622 float energy_0to1 = GetCompEM().GetEnergy0To1();
12624 }
12625 }
12626 }
12627
12628
12630 {
12631 return ConfigGetFloat("heatIsolation");
12632 }
12633
12635 {
12637 }
12638
12640 {
12641 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12642 if (
GetGame().ConfigIsExisting(paramPath))
12644
12645 return 0.0;
12646 }
12647
12649 {
12650 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12651 if (
GetGame().ConfigIsExisting(paramPath))
12653
12654 return 0.0;
12655 }
12656
12657 override void SetWet(
float value,
bool allow_client =
false)
12658 {
12659 if (!IsServerCheck(allow_client))
12660 return;
12661
12664
12666
12667 m_VarWet = Math.Clamp(value, min, max);
12668
12670 {
12673 }
12674 }
12675
12676 override void AddWet(
float value)
12677 {
12679 }
12680
12682 {
12684 }
12685
12687 {
12689 }
12690
12692 {
12694 }
12695
12697 {
12699 }
12700
12702 {
12704 }
12705
12706 override void OnWetChanged(
float newVal,
float oldVal)
12707 {
12710 if (newLevel != oldLevel)
12711 {
12713 }
12714 }
12715
12717 {
12718 SetWeightDirty();
12719 }
12720
12722 {
12723 return GetWetLevelInternal(
m_VarWet);
12724 }
12725
12726
12727
12729 {
12731 }
12732
12734 {
12736 }
12737
12739 {
12741 }
12742
12744 {
12746 }
12747
12748
12749
12751 {
12752 if (ConfigIsExisting("itemModelLength"))
12753 {
12754 return ConfigGetFloat("itemModelLength");
12755 }
12756 return 0;
12757 }
12758
12760 {
12761 if (ConfigIsExisting("itemAttachOffset"))
12762 {
12763 return ConfigGetFloat("itemAttachOffset");
12764 }
12765 return 0;
12766 }
12767
12768 override void SetCleanness(
int value,
bool allow_client =
false)
12769 {
12770 if (!IsServerCheck(allow_client))
12771 return;
12772
12774
12776
12779 }
12780
12782 {
12784 }
12785
12787 {
12788 return true;
12789 }
12790
12791
12792
12793
12795 {
12797 }
12798
12800 {
12802 }
12803
12804
12805
12806
12807 override void SetColor(
int r,
int g,
int b,
int a)
12808 {
12814 }
12816 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12817 {
12822 }
12823
12825 {
12827 }
12828
12831 {
12832 int r,g,b,a;
12834 r = r/255;
12835 g = g/255;
12836 b = b/255;
12837 a = a/255;
12838 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12839 }
12840
12841
12842
12843 override void SetLiquidType(
int value,
bool allow_client =
false)
12844 {
12845 if (!IsServerCheck(allow_client))
12846 return;
12847
12852 }
12853
12855 {
12856 return ConfigGetInt("varLiquidTypeInit");
12857 }
12858
12860 {
12862 }
12863
12865 {
12867 SetFrozen(false);
12868 }
12869
12872 {
12873 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12874 }
12875
12876
12879 {
12880 PlayerBase nplayer;
12881 if (PlayerBase.CastTo(nplayer, player))
12882 {
12884
12885 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12886 }
12887 }
12888
12889
12892 {
12893 PlayerBase nplayer;
12894 if (PlayerBase.CastTo(nplayer,player))
12895 {
12896
12897 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12898
12899 }
12900
12901
12902 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12903
12904
12905 if (HasEnergyManager())
12906 {
12907 GetCompEM().UpdatePlugState();
12908 }
12909 }
12910
12911
12913 {
12914 super.OnPlacementStarted(player);
12915
12917 }
12918
12919 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12920 {
12922 {
12923 m_AdminLog.OnPlacementComplete(player,
this);
12924 }
12925
12926 super.OnPlacementComplete(player, position, orientation);
12927 }
12928
12929
12930
12931
12932
12934 {
12936 {
12937 return true;
12938 }
12939 else
12940 {
12941 return false;
12942 }
12943 }
12944
12945
12947 {
12949 {
12951 }
12952 }
12953
12954
12956 {
12958 }
12959
12961 {
12963 }
12964
12965 override void InsertAgent(
int agent,
float count = 1)
12966 {
12967 if (count < 1)
12968 return;
12969
12971 }
12972
12975 {
12977 }
12978
12979
12981 {
12983 }
12984
12985
12986
12987
12988
12989
12990
12991
12992
12993
12994
12995
12996
12997
12998
12999
13000
13001
13002
13003
13004
13005
13006
13007
13008
13009
13010
13011
13012
13013
13014
13015
13016
13017
13018
13019
13020
13021
13022
13023
13024
13025
13027 {
13029 return false;
13030 return true;
13031 }
13032
13034 {
13035
13037 }
13038
13039
13042 {
13043 super.CheckForRoofLimited(timeTresholdMS);
13044
13046 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13047 {
13048 m_PreviousRoofTestTime = time;
13049 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13050 }
13051 }
13052
13053
13055 {
13057 {
13058 return 0;
13059 }
13060
13061 if (GetInventory().GetAttachmentSlotsCount() != 0)
13062 {
13063 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13064 if (filter)
13065 return filter.GetProtectionLevel(type, false, system);
13066 else
13067 return 0;
13068 }
13069
13070 string subclassPath, entryName;
13071
13072 switch (type)
13073 {
13075 entryName = "biological";
13076 break;
13078 entryName = "chemical";
13079 break;
13080 default:
13081 entryName = "biological";
13082 break;
13083 }
13084
13085 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13086
13088 }
13089
13090
13091
13094 {
13095 if (!IsMagazine())
13097
13099 }
13100
13101
13102
13103
13104
13109 {
13110 return true;
13111 }
13112
13114 {
13116 }
13117
13118
13119
13120
13121
13123 {
13124 if (parent)
13125 {
13126 if (parent.IsInherited(DayZInfected))
13127 return true;
13128
13129 if (!parent.IsRuined())
13130 return true;
13131 }
13132
13133 return true;
13134 }
13135
13137 {
13138 if (!super.CanPutAsAttachment(parent))
13139 {
13140 return false;
13141 }
13142
13143 if (!IsRuined() && !parent.IsRuined())
13144 {
13145 return true;
13146 }
13147
13148 return false;
13149 }
13150
13152 {
13153
13154
13155
13156
13157 return super.CanReceiveItemIntoCargo(item);
13158 }
13159
13161 {
13162
13163
13164
13165
13166 GameInventory attachmentInv = attachment.GetInventory();
13168 {
13169 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13170 return false;
13171 }
13172
13173 InventoryLocation loc = new InventoryLocation();
13174 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13175 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13176 return false;
13177
13178 return super.CanReceiveAttachment(attachment, slotId);
13179 }
13180
13182 {
13183 if (!super.CanReleaseAttachment(attachment))
13184 return false;
13185
13186 return GetInventory().AreChildrenAccessible();
13187 }
13188
13189
13190
13191
13192
13193
13194
13195
13196
13197
13198
13199
13200
13201
13202
13203
13204
13205
13206
13207
13208
13210 {
13211 int id = muzzle_owner.GetMuzzleID();
13212 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13213
13214 if (WPOF_array)
13215 {
13216 for (int i = 0; i < WPOF_array.Count(); i++)
13217 {
13218 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13219
13220 if (WPOF)
13221 {
13222 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13223 }
13224 }
13225 }
13226 }
13227
13228
13230 {
13231 int id = muzzle_owner.GetMuzzleID();
13233
13234 if (WPOBE_array)
13235 {
13236 for (int i = 0; i < WPOBE_array.Count(); i++)
13237 {
13238 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13239
13240 if (WPOBE)
13241 {
13242 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13243 }
13244 }
13245 }
13246 }
13247
13248
13250 {
13251 int id = muzzle_owner.GetMuzzleID();
13252 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13253
13254 if (WPOOH_array)
13255 {
13256 for (int i = 0; i < WPOOH_array.Count(); i++)
13257 {
13258 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13259
13260 if (WPOOH)
13261 {
13262 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13263 }
13264 }
13265 }
13266 }
13267
13268
13270 {
13271 int id = muzzle_owner.GetMuzzleID();
13272 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13273
13274 if (WPOOH_array)
13275 {
13276 for (int i = 0; i < WPOOH_array.Count(); i++)
13277 {
13278 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13279
13280 if (WPOOH)
13281 {
13282 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13283 }
13284 }
13285 }
13286 }
13287
13288
13290 {
13291 int id = muzzle_owner.GetMuzzleID();
13292 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13293
13294 if (WPOOH_array)
13295 {
13296 for (int i = 0; i < WPOOH_array.Count(); i++)
13297 {
13298 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13299
13300 if (WPOOH)
13301 {
13302 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13303 }
13304 }
13305 }
13306 }
13307
13308
13309
13311 {
13313 {
13314 return true;
13315 }
13316
13317 return false;
13318 }
13319
13321 {
13323 {
13324 return true;
13325 }
13326
13327 return false;
13328 }
13329
13331 {
13333 {
13334 return true;
13335 }
13336
13337 return false;
13338 }
13339
13341 {
13342 return false;
13343 }
13344
13347 {
13348 return UATimeSpent.DEFAULT_DEPLOY;
13349 }
13350
13351
13352
13353
13355 {
13357 SetSynchDirty();
13358 }
13359
13361 {
13363 }
13364
13365
13367 {
13368 return false;
13369 }
13370
13373 {
13374 string att_type = "None";
13375
13376 if (ConfigIsExisting("soundAttType"))
13377 {
13378 att_type = ConfigGetString("soundAttType");
13379 }
13380
13382 }
13383
13385 {
13387 }
13388
13389
13390
13391
13392
13398
13400 {
13403
13405 }
13406
13407
13409 {
13411 return;
13412
13414
13417
13420
13421 SoundParameters params = new SoundParameters();
13425 }
13426
13427
13429 {
13431 return;
13432
13434 SetSynchDirty();
13435
13438 }
13439
13440
13442 {
13444 return;
13445
13447 SetSynchDirty();
13448
13451 }
13452
13454 {
13456 }
13457
13459 {
13461 }
13462
13465 {
13466 if (!
GetGame().IsDedicatedServer())
13467 {
13468 if (ConfigIsExisting("attachSoundSet"))
13469 {
13470 string cfg_path = "";
13471 string soundset = "";
13472 string type_name =
GetType();
13473
13476 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13477 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13478
13479 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13480 {
13481 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13482 {
13483 if (cfg_slot_array[i] == slot_type)
13484 {
13485 soundset = cfg_soundset_array[i];
13486 break;
13487 }
13488 }
13489 }
13490
13491 if (soundset != "")
13492 {
13493 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13495 }
13496 }
13497 }
13498 }
13499
13501 {
13502
13503 }
13504
13505 void OnApply(PlayerBase player);
13506
13508 {
13509 return 1.0;
13510 };
13511
13513 {
13515 }
13516
13518 {
13520 }
13521
13523
13525 {
13526 SetDynamicPhysicsLifeTime(0.01);
13528 }
13529
13531 {
13532 array<string> zone_names = new array<string>;
13533 GetDamageZones(zone_names);
13534 for (int i = 0; i < zone_names.Count(); i++)
13535 {
13536 SetHealthMax(zone_names.Get(i),"Health");
13537 }
13538 SetHealthMax("","Health");
13539 }
13540
13543 {
13544 float global_health = GetHealth01("","Health");
13545 array<string> zones = new array<string>;
13546 GetDamageZones(zones);
13547
13548 for (int i = 0; i < zones.Count(); i++)
13549 {
13550 SetHealth01(zones.Get(i),"Health",global_health);
13551 }
13552 }
13553
13556 {
13557 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13558 }
13559
13561 {
13562 if (!hasRootAsPlayer)
13563 {
13564 if (refParentIB)
13565 {
13566
13567 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13568 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13569
13570 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13571 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13572
13575 }
13576 else
13577 {
13578
13581 }
13582 }
13583 }
13584
13586 {
13588 {
13589 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13590 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13591 {
13592 float heatPermCoef = 1.0;
13594 while (ent)
13595 {
13596 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13597 ent = ent.GetHierarchyParent();
13598 }
13599
13600 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13601 }
13602 }
13603 }
13604
13606 {
13607
13608 EntityAI parent = GetHierarchyParent();
13609 if (!parent)
13610 {
13611 hasParent = false;
13612 hasRootAsPlayer = false;
13613 }
13614 else
13615 {
13616 hasParent = true;
13617 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13618 refParentIB =
ItemBase.Cast(parent);
13619 }
13620 }
13621
13622 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13623 {
13624
13625 }
13626
13628 {
13629
13630 return false;
13631 }
13632
13634 {
13635
13636
13637 return false;
13638 }
13639
13641 {
13642
13643 return false;
13644 }
13645
13648 {
13649 return !GetIsFrozen() &&
IsOpen();
13650 }
13651
13653 {
13654 bool hasParent = false, hasRootAsPlayer = false;
13656
13657 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13658 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13659
13660 if (wwtu || foodDecay)
13661 {
13665
13666 if (processWetness || processTemperature || processDecay)
13667 {
13669
13670 if (processWetness)
13671 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13672
13673 if (processTemperature)
13675
13676 if (processDecay)
13677 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13678 }
13679 }
13680 }
13681
13684 {
13686 }
13687
13689 {
13692
13693 return super.GetTemperatureFreezeThreshold();
13694 }
13695
13697 {
13700
13701 return super.GetTemperatureThawThreshold();
13702 }
13703
13705 {
13708
13709 return super.GetItemOverheatThreshold();
13710 }
13711
13713 {
13715 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13716
13717 return super.GetTemperatureFreezeTime();
13718 }
13719
13721 {
13723 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13724
13725 return super.GetTemperatureThawTime();
13726 }
13727
13732
13734 {
13735 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13736 }
13737
13739 {
13740 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13741 }
13742
13745 {
13747 }
13748
13750 {
13752 }
13753
13755 {
13757 }
13758
13761 {
13762 return null;
13763 }
13764
13767 {
13768 return false;
13769 }
13770
13772 {
13774 {
13777 if (!trg)
13778 {
13780 explosive = this;
13781 }
13782
13783 explosive.PairRemote(trg);
13785
13786 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13787 trg.SetPersistentPairID(persistentID);
13788 explosive.SetPersistentPairID(persistentID);
13789
13790 return true;
13791 }
13792 return false;
13793 }
13794
13797 {
13798 float ret = 1.0;
13801 ret *= GetHealth01();
13802
13803 return ret;
13804 }
13805
13806 #ifdef DEVELOPER
13807 override void SetDebugItem()
13808 {
13809 super.SetDebugItem();
13810 _itemBase = this;
13811 }
13812
13814 {
13815 string text = super.GetDebugText();
13816
13818 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13819
13820 return text;
13821 }
13822 #endif
13823
13825 {
13826 return true;
13827 }
13828
13830
13832
13834 {
13837 }
13838
13839
13847
13863}
13864
13866{
13868 if (entity)
13869 {
13870 bool is_item = entity.IsInherited(
ItemBase);
13871 if (is_item && full_quantity)
13872 {
13875 }
13876 }
13877 else
13878 {
13880 return NULL;
13881 }
13882 return entity;
13883}
13884
13886{
13887 if (item)
13888 {
13889 if (health > 0)
13890 item.SetHealth("", "", health);
13891
13892 if (item.CanHaveTemperature())
13893 {
13895 if (item.CanFreeze())
13896 item.SetFrozen(false);
13897 }
13898
13899 if (item.HasEnergyManager())
13900 {
13901 if (quantity >= 0)
13902 {
13903 item.GetCompEM().SetEnergy0To1(quantity);
13904 }
13905 else
13906 {
13908 }
13909 }
13910 else if (item.IsMagazine())
13911 {
13912 Magazine mag = Magazine.Cast(item);
13913 if (quantity >= 0)
13914 {
13915 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13916 }
13917 else
13918 {
13920 }
13921
13922 }
13923 else
13924 {
13925 if (quantity >= 0)
13926 {
13927 item.SetQuantityNormalized(quantity, false);
13928 }
13929 else
13930 {
13932 }
13933
13934 }
13935 }
13936}
13937
13938#ifdef DEVELOPER
13940#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.