8961{
8963 {
8964 return true;
8965 }
8966};
8967
8969{
8970
8971};
8972
8973
8974
8976{
8980
8982
8985
8986
8987
8988
8989
8998
9004
9009
9014
9035 protected bool m_IsResultOfSplit
9036
9038
9043
9044
9045
9047
9051
9052
9053
9055
9058
9059
9060
9066
9067
9075
9078
9079
9081
9082
9084
9085
9090
9091
9096
9098
9099
9101
9102
9104 {
9109
9110 if (!
g_Game.IsDedicatedServer())
9111 {
9113 {
9115
9117 {
9119 }
9120 }
9121
9124 }
9125
9126 m_OldLocation = null;
9127
9129 {
9131 }
9132
9133 if (ConfigIsExisting("headSelectionsToHide"))
9134 {
9137 }
9138
9140 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9141 {
9143 }
9144
9146
9147 m_IsResultOfSplit = false;
9148
9150 }
9151
9153 {
9154 super.InitItemVariables();
9155
9161 m_Count = ConfigGetInt(
"count");
9162
9165
9170
9173
9178
9190
9194
9195
9198 if (ConfigIsExisting("canBeSplit"))
9199 {
9202 }
9203
9205 if (ConfigIsExisting("itemBehaviour"))
9207
9208
9211 RegisterNetSyncVariableInt("m_VarLiquidType");
9212 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9213
9214 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9215 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9216 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9217
9218 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9219 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9220 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9221 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9222
9223 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9224 RegisterNetSyncVariableBool("m_IsTakeable");
9225 RegisterNetSyncVariableBool("m_IsHologram");
9226
9229 {
9232 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9233 }
9234
9236
9238 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9240
9242 }
9243
9245 {
9247 }
9248
9250 {
9253 {
9258 }
9259 }
9260
9261 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9262 {
9264 {
9267 }
9268
9270 }
9271
9273 {
9279 }
9280
9282
9284 {
9286
9287 if (!action)
9288 {
9289 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9290 return;
9291 }
9292
9294 if (!ai)
9295 {
9297 return;
9298 }
9299
9301 if (!action_array)
9302 {
9303 action_array = new array<ActionBase_Basic>;
9305 }
9306 if (LogManager.IsActionLogEnable())
9307 {
9308 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9309 }
9310
9311 if (action_array.Find(action) != -1)
9312 {
9313 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9314 }
9315 else
9316 {
9317 action_array.Insert(action);
9318 }
9319 }
9320
9322 {
9323 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9324 ActionBase action = player.GetActionManager().GetAction(actionName);
9327
9328 if (action_array)
9329 {
9330 action_array.RemoveItem(action);
9331 }
9332 }
9333
9334
9335
9337 {
9338 ActionOverrideData overrideData = new ActionOverrideData();
9342
9344 if (!actionMap)
9345 {
9348 }
9349
9350 actionMap.Insert(this.
Type(), overrideData);
9351
9352 }
9353
9355
9357
9358
9360 {
9363
9366
9367 string config_to_search = "CfgVehicles";
9368 string muzzle_owner_config;
9369
9371 {
9372 if (IsInherited(Weapon))
9373 config_to_search = "CfgWeapons";
9374
9375 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9376
9377 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9378
9379 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9380
9381 if (config_OnFire_subclass_count > 0)
9382 {
9383 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9384
9385 for (int i = 0; i < config_OnFire_subclass_count; i++)
9386 {
9387 string particle_class = "";
9388 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9389 string config_OnFire_entry = config_OnFire_class + particle_class;
9390 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9391 WPOF_array.Insert(WPOF);
9392 }
9393
9394
9396 }
9397 }
9398
9400 {
9401 config_to_search = "CfgWeapons";
9402 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9403
9404 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9405
9406 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9407
9408 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9409 {
9410 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9411
9412 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9413 {
9414 string particle_class2 = "";
9415 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9416 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9417 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9418 WPOBE_array.Insert(WPOBE);
9419 }
9420
9421
9423 }
9424 }
9425 }
9426
9427
9429 {
9432
9434 {
9435 string config_to_search = "CfgVehicles";
9436
9437 if (IsInherited(Weapon))
9438 config_to_search = "CfgWeapons";
9439
9440 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9441 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9442
9443 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9444 {
9445
9447
9449 {
9451 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9453 return;
9454 }
9455
9458
9459
9460
9461 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9462 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9463
9464 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9465 {
9466 string particle_class = "";
9467 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9468 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9469 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9470
9471 if (entry_type == CT_CLASS)
9472 {
9473 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9474 WPOOH_array.Insert(WPOF);
9475 }
9476 }
9477
9478
9480 }
9481 }
9482 }
9483
9485 {
9487 }
9488
9490 {
9492 {
9494
9497
9500
9501 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9502 }
9503 }
9504
9506 {
9508 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9509
9511 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9512
9514 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9515
9517 {
9519 }
9520 }
9521
9523 {
9525 }
9526
9528 {
9531 else
9533
9535 {
9538 }
9539 else
9540 {
9543
9546 }
9547
9549 }
9550
9552 {
9554 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9555 }
9556
9558 {
9560 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9562 }
9563
9565 {
9567 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9568 }
9569
9571 {
9574
9575 OverheatingParticle OP = new OverheatingParticle();
9580
9582 }
9583
9585 {
9588
9589 return -1;
9590 }
9591
9593 {
9595 {
9598
9599 for (int i = count; i > 0; --i)
9600 {
9601 int id = i - 1;
9604
9607
9608 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9609 {
9610 if (p)
9611 {
9614 }
9615 }
9616 }
9617 }
9618 }
9619
9621 {
9623 {
9625 {
9626 int id = i - 1;
9628
9629 if (OP)
9630 {
9632
9633 if (p)
9634 {
9636 }
9637
9638 delete OP;
9639 }
9640 }
9641
9644 }
9645 }
9646
9649 {
9650 return 0.0;
9651 }
9652
9653
9655 {
9656 return 250;
9657 }
9658
9660 {
9661 return 0;
9662 }
9663
9666 {
9668 return true;
9669
9670 return false;
9671 }
9672
9675 {
9678
9680 {
9682 }
9683 else
9684 {
9685
9687 }
9688
9690 }
9691
9698 {
9699 return -1;
9700 }
9701
9702
9703
9704
9706 {
9708 {
9709 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9710 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9711
9712 if (r_index >= 0)
9713 {
9714 InventoryLocation r_il = new InventoryLocation;
9715 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9716
9717 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9720 {
9721 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9722 }
9724 {
9725 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9726 }
9727
9728 }
9729
9730 player.GetHumanInventory().ClearUserReservedLocation(this);
9731 }
9732
9735 }
9736
9737
9738
9739
9741 {
9742 return ItemBase.m_DebugActionsMask;
9743 }
9744
9746 {
9747 return ItemBase.m_DebugActionsMask & mask;
9748 }
9749
9751 {
9752 ItemBase.m_DebugActionsMask = mask;
9753 }
9754
9756 {
9757 ItemBase.m_DebugActionsMask |= mask;
9758 }
9759
9761 {
9762 ItemBase.m_DebugActionsMask &= ~mask;
9763 }
9764
9766 {
9768 {
9770 }
9771 else
9772 {
9774 }
9775 }
9776
9777
9779 {
9780 if (GetEconomyProfile())
9781 {
9782 float q_max = GetEconomyProfile().GetQuantityMax();
9783 if (q_max > 0)
9784 {
9785 float q_min = GetEconomyProfile().GetQuantityMin();
9786 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9787
9789 {
9790 ComponentEnergyManager comp = GetCompEM();
9792 {
9794 }
9795 }
9797 {
9799
9800 }
9801
9802 }
9803 }
9804 }
9805
9808 {
9809 EntityAI parent = GetHierarchyParent();
9810
9811 if (parent)
9812 {
9813 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9814 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9815 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9816 }
9817 }
9818
9821 {
9822 EntityAI parent = GetHierarchyParent();
9823
9824 if (parent)
9825 {
9826 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9827 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9828 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9829 }
9830 }
9831
9833 {
9834
9835
9836
9837
9839
9841 {
9842 if (ScriptInputUserData.CanStoreInputUserData())
9843 {
9844 ScriptInputUserData ctx = new ScriptInputUserData;
9850 ctx.
Write(use_stack_max);
9853
9855 {
9856 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9857 }
9858 }
9859 }
9860 else if (!
g_Game.IsMultiplayer())
9861 {
9863 }
9864 }
9865
9867 {
9869 }
9870
9872 {
9874 }
9875
9877 {
9879 }
9880
9882 {
9883
9884 return false;
9885 }
9886
9888 {
9889 return false;
9890 }
9891
9895 {
9896 return false;
9897 }
9898
9900 {
9901 return "";
9902 }
9903
9905
9907 {
9908 return false;
9909 }
9910
9912 {
9913 return true;
9914 }
9915
9916
9917
9919 {
9920 return true;
9921 }
9922
9924 {
9925 return true;
9926 }
9927
9929 {
9930 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9932 }
9933
9935 {
9937 }
9938
9940 {
9942 if (!is_being_placed)
9944 SetSynchDirty();
9945 }
9946
9947
9949
9951 {
9953 }
9954
9956 {
9958 }
9959
9961 {
9962 return 1;
9963 }
9964
9966 {
9967 return false;
9968 }
9969
9971 {
9973 SetSynchDirty();
9974 }
9975
9976
9977
9978
9979
9980
9981
9982
9983
9984
9985
9986
9987
9988
9989
9990
9991
9992
9993
9994
9995
9996
9997
9998
9999
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10011 {
10012 super.OnMovedInsideCargo(container);
10013
10014 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10015 }
10016
10017 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10018 {
10019 super.EEItemLocationChanged(oldLoc, newLoc);
10020
10021 PlayerBase newPlayer = null;
10022 PlayerBase oldPlayer = null;
10023
10024 if (newLoc.GetParent())
10025 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10026
10027 if (oldLoc.GetParent())
10028 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10029
10031 {
10032 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10033
10034 if (rIndex >= 0)
10035 {
10036 InventoryLocation rIl = new InventoryLocation;
10037 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10038
10039 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10042 {
10043 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
10044 }
10046 {
10048 }
10049
10050 }
10051 }
10052
10054 {
10055 if (newPlayer)
10056 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10057
10058 if (newPlayer == oldPlayer)
10059 {
10060 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10061 {
10063 {
10064 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10065 {
10066 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10067 }
10068 }
10069 else
10070 {
10071 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10072 }
10073 }
10074
10075 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10076 {
10077 int type = oldLoc.GetType();
10079 {
10080 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10081 }
10083 {
10084 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10085 }
10086 }
10087 if (!m_OldLocation)
10088 {
10089 m_OldLocation = new InventoryLocation;
10090 }
10091 m_OldLocation.Copy(oldLoc);
10092 }
10093 else
10094 {
10095 if (m_OldLocation)
10096 {
10097 m_OldLocation.Reset();
10098 }
10099 }
10100
10101 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10102 }
10103 else
10104 {
10105 if (newPlayer)
10106 {
10107 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10108 if (resIndex >= 0)
10109 {
10110 InventoryLocation il = new InventoryLocation;
10111 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10113 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10116 {
10117 il.
GetParent().GetOnReleaseLock().Invoke(it);
10118 }
10120 {
10122 }
10123
10124 }
10125 }
10127 {
10128
10130 }
10131
10132 if (m_OldLocation)
10133 {
10134 m_OldLocation.Reset();
10135 }
10136 }
10137
10139 {
10140 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10141 }
10142
10144 {
10145 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10146 }
10147 }
10148
10149 override void EOnContact(IEntity other, Contact extra)
10150 {
10152 {
10153 int liquidType = -1;
10155 if (impactSpeed > 0.0)
10156 {
10158 #ifndef SERVER
10160 #else
10162 SetSynchDirty();
10163 #endif
10165 }
10166 }
10167
10168 #ifdef SERVER
10169 if (GetCompEM() && GetCompEM().IsPlugged())
10170 {
10171 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10172 GetCompEM().UnplugThis();
10173 }
10174 #endif
10175 }
10176
10178
10180 {
10182 }
10183
10185 {
10186
10187 }
10188
10190 {
10191 super.OnItemLocationChanged(old_owner, new_owner);
10192
10193 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10194 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10195
10196 if (!relatedPlayer && playerNew)
10197 relatedPlayer = playerNew;
10198
10199 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10200 {
10202 if (actionMgr)
10203 {
10204 ActionBase currentAction = actionMgr.GetRunningAction();
10205 if (currentAction)
10207 }
10208 }
10209
10210 Man ownerPlayerOld = null;
10211 Man ownerPlayerNew = null;
10212
10213 if (old_owner)
10214 {
10215 if (old_owner.
IsMan())
10216 {
10217 ownerPlayerOld = Man.Cast(old_owner);
10218 }
10219 else
10220 {
10221 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10222 }
10223 }
10224 else
10225 {
10227 {
10229
10230 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10231 {
10232 GetCompEM().UnplugThis();
10233 }
10234 }
10235 }
10236
10237 if (new_owner)
10238 {
10239 if (new_owner.
IsMan())
10240 {
10241 ownerPlayerNew = Man.Cast(new_owner);
10242 }
10243 else
10244 {
10245 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10246 }
10247 }
10248
10249 if (ownerPlayerOld != ownerPlayerNew)
10250 {
10251 if (ownerPlayerOld)
10252 {
10253 array<EntityAI> subItemsExit = new array<EntityAI>;
10255 for (int i = 0; i < subItemsExit.Count(); i++)
10256 {
10259 }
10260 }
10261
10262 if (ownerPlayerNew)
10263 {
10264 array<EntityAI> subItemsEnter = new array<EntityAI>;
10266 for (int j = 0; j < subItemsEnter.Count(); j++)
10267 {
10270 }
10271 }
10272 }
10273 else if (ownerPlayerNew != null)
10274 {
10275 PlayerBase nplayer;
10276 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10277 {
10278 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10280 for (int k = 0; k < subItemsUpdate.Count(); k++)
10281 {
10283 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10284 }
10285 }
10286 }
10287
10288 if (old_owner)
10289 old_owner.OnChildItemRemoved(this);
10290 if (new_owner)
10291 new_owner.OnChildItemReceived(this);
10292 }
10293
10294
10296 {
10297 super.EEDelete(parent);
10298 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10299 if (player)
10300 {
10302
10303 if (player.IsAlive())
10304 {
10305 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10306 if (r_index >= 0)
10307 {
10308 InventoryLocation r_il = new InventoryLocation;
10309 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10310
10311 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10314 {
10315 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10316 }
10318 {
10319 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10320 }
10321
10322 }
10323
10324 player.RemoveQuickBarEntityShortcut(this);
10325 }
10326 }
10327 }
10328
10330 {
10331 super.EEKilled(killer);
10332
10335 {
10336 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10337 {
10338 if (IsMagazine())
10339 {
10340 if (Magazine.Cast(this).GetAmmoCount() > 0)
10341 {
10343 }
10344 }
10345 else
10346 {
10348 }
10349 }
10350 }
10351 }
10352
10354 {
10355 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10356
10357 super.OnWasAttached(parent, slot_id);
10358
10361
10364 }
10365
10367 {
10368 super.OnWasDetached(parent, slot_id);
10369
10372
10375 }
10376
10378 {
10379 int idx;
10382
10383 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10384 if (inventory_slots.Count() < 1)
10385 {
10386 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10387 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10388 }
10389 else
10390 {
10391 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10392 }
10393
10394 idx = inventory_slots.Find(slot);
10395 if (idx < 0)
10396 return "";
10397
10398 return attach_types.Get(idx);
10399 }
10400
10402 {
10403 int idx = -1;
10404 string slot;
10405
10408
10409 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10410 if (inventory_slots.Count() < 1)
10411 {
10412 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10413 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10414 }
10415 else
10416 {
10417 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10418 if (detach_types.Count() < 1)
10419 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10420 }
10421
10422 for (int i = 0; i < inventory_slots.Count(); i++)
10423 {
10424 slot = inventory_slots.Get(i);
10425 }
10426
10427 if (slot != "")
10428 {
10429 if (detach_types.Count() == 1)
10430 idx = 0;
10431 else
10432 idx = inventory_slots.Find(slot);
10433 }
10434 if (idx < 0)
10435 return "";
10436
10437 return detach_types.Get(idx);
10438 }
10439
10441 {
10442
10444
10445
10446 float min_time = 1;
10447 float max_time = 3;
10448 float delay = Math.RandomFloat(min_time, max_time);
10449
10450 explode_timer.Run(delay, this, "DoAmmoExplosion");
10451 }
10452
10454 {
10455 Magazine magazine = Magazine.Cast(this);
10456 int pop_sounds_count = 6;
10457 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10458
10459
10460 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10461 string sound_name = pop_sounds[ sound_idx ];
10462 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10463
10464
10465 magazine.ServerAddAmmoCount(-1);
10466
10467
10468 float min_temp_to_explode = 100;
10469
10470 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10471 {
10473 }
10474 }
10475
10476
10477 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10478 {
10479 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10480
10481 const int CHANCE_DAMAGE_CARGO = 4;
10482 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10483 const int CHANCE_DAMAGE_NOTHING = 2;
10484
10486 {
10487 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10488 int chances;
10489 int rnd;
10490
10491 if (GetInventory().GetCargo())
10492 {
10493 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10494 rnd = Math.RandomInt(0,chances);
10495
10496 if (rnd < CHANCE_DAMAGE_CARGO)
10497 {
10499 }
10500 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10501 {
10503 }
10504 }
10505 else
10506 {
10507 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10508 rnd = Math.RandomInt(0,chances);
10509
10510 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10511 {
10513 }
10514 }
10515 }
10516 }
10517
10519 {
10520 CargoBase cargo = GetInventory().GetCargo();
10521 if (cargo)
10522 {
10524 if (item_count > 0)
10525 {
10526 int random_pick = Math.RandomInt(0, item_count);
10528 if (!item.IsExplosive())
10529 {
10530 item.AddHealth("","",damage);
10531 return true;
10532 }
10533 }
10534 }
10535 return false;
10536 }
10537
10539 {
10540 GameInventory inventory = GetInventory();
10542 if (attachment_count > 0)
10543 {
10544 int random_pick = Math.RandomInt(0, attachment_count);
10546 if (!attachment.IsExplosive())
10547 {
10548 attachment.AddHealth("","",damage);
10549 return true;
10550 }
10551 }
10552 return false;
10553 }
10554
10556 {
10558 }
10559
10561 {
10563 return GetInventory().CanRemoveEntity();
10564
10565 return false;
10566 }
10567
10569 {
10570
10572 return false;
10573
10574
10576 return false;
10577
10578
10579
10581 if (delta == 0)
10582 return false;
10583
10584
10585 return true;
10586 }
10587
10589 {
10591 {
10592 if (ScriptInputUserData.CanStoreInputUserData())
10593 {
10594 ScriptInputUserData ctx = new ScriptInputUserData;
10599 ctx.
Write(destination_entity);
10601 ctx.
Write(slot_id);
10603 }
10604 }
10605 else if (!
g_Game.IsMultiplayer())
10606 {
10608 }
10609 }
10610
10612 {
10613 float split_quantity_new;
10617 InventoryLocation loc = new InventoryLocation;
10618
10619 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10620 {
10622 split_quantity_new = stack_max;
10623 else
10625
10627 {
10628 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10629 if (new_item)
10630 {
10631 new_item.SetResultOfSplit(true);
10632 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10634 new_item.
SetQuantity(split_quantity_new,
false,
true);
10635 }
10636 }
10637 }
10638 else if (destination_entity && slot_id == -1)
10639 {
10640 if (quantity > stack_max)
10641 split_quantity_new = stack_max;
10642 else
10643 split_quantity_new = quantity;
10644
10646 {
10647 GameInventory destinationInventory = destination_entity.GetInventory();
10649 {
10652 }
10653
10654 if (new_item)
10655 {
10656 new_item.SetResultOfSplit(true);
10657 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10659 new_item.
SetQuantity(split_quantity_new,
false,
true);
10660 }
10661 }
10662 }
10663 else
10664 {
10665 if (stack_max != 0)
10666 {
10668 {
10670 }
10671
10672 if (split_quantity_new == 0)
10673 {
10674 if (!
g_Game.IsMultiplayer())
10675 player.PhysicalPredictiveDropItem(this);
10676 else
10677 player.ServerDropEntity(this);
10678 return;
10679 }
10680
10682 {
10684
10685 if (new_item)
10686 {
10687 new_item.SetResultOfSplit(true);
10688 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10691 new_item.PlaceOnSurface();
10692 }
10693 }
10694 }
10695 }
10696 }
10697
10699 {
10700 float split_quantity_new;
10704 InventoryLocation loc = new InventoryLocation;
10705
10706 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10707 {
10709 split_quantity_new = stack_max;
10710 else
10712
10714 {
10715 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10716 if (new_item)
10717 {
10718 new_item.SetResultOfSplit(true);
10719 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10721 new_item.
SetQuantity(split_quantity_new,
false,
true);
10722 }
10723 }
10724 }
10725 else if (destination_entity && slot_id == -1)
10726 {
10727 if (quantity > stack_max)
10728 split_quantity_new = stack_max;
10729 else
10730 split_quantity_new = quantity;
10731
10733 {
10734 GameInventory destinationInventory = destination_entity.GetInventory();
10736 {
10739 }
10740
10741 if (new_item)
10742 {
10743 new_item.SetResultOfSplit(true);
10744 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10746 new_item.
SetQuantity(split_quantity_new,
false,
true);
10747 }
10748 }
10749 }
10750 else
10751 {
10752 if (stack_max != 0)
10753 {
10755 {
10757 }
10758
10760 {
10762
10763 if (new_item)
10764 {
10765 new_item.SetResultOfSplit(true);
10766 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10769 new_item.PlaceOnSurface();
10770 }
10771 }
10772 }
10773 }
10774 }
10775
10777 {
10779 {
10780 if (ScriptInputUserData.CanStoreInputUserData())
10781 {
10782 ScriptInputUserData ctx = new ScriptInputUserData;
10787 dst.WriteToContext(ctx);
10789 }
10790 }
10791 else if (!
g_Game.IsMultiplayer())
10792 {
10794 }
10795 }
10796
10798 {
10800 {
10801 if (ScriptInputUserData.CanStoreInputUserData())
10802 {
10803 ScriptInputUserData ctx = new ScriptInputUserData;
10808 ctx.
Write(destination_entity);
10814 }
10815 }
10816 else if (!
g_Game.IsMultiplayer())
10817 {
10819 }
10820 }
10821
10823 {
10825 }
10826
10828 {
10830 float split_quantity_new;
10832 if (dst.IsValid())
10833 {
10834 int slot_id = dst.GetSlot();
10836
10837 if (quantity > stack_max)
10838 split_quantity_new = stack_max;
10839 else
10840 split_quantity_new = quantity;
10841
10843 {
10845
10846 if (new_item)
10847 {
10848 new_item.SetResultOfSplit(true);
10849 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10851 new_item.
SetQuantity(split_quantity_new,
false,
true);
10852 }
10853
10854 return new_item;
10855 }
10856 }
10857
10858 return null;
10859 }
10860
10862 {
10864 float split_quantity_new;
10866 if (destination_entity)
10867 {
10869 if (quantity > stackable)
10870 split_quantity_new = stackable;
10871 else
10872 split_quantity_new = quantity;
10873
10875 {
10876 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10877 if (new_item)
10878 {
10879 new_item.SetResultOfSplit(true);
10880 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10882 new_item.
SetQuantity(split_quantity_new,
false,
true);
10883 }
10884 }
10885 }
10886 }
10887
10889 {
10891 {
10892 if (ScriptInputUserData.CanStoreInputUserData())
10893 {
10894 ScriptInputUserData ctx = new ScriptInputUserData;
10899 ItemBase destination_entity =
this;
10900 ctx.
Write(destination_entity);
10904 }
10905 }
10906 else if (!
g_Game.IsMultiplayer())
10907 {
10909 }
10910 }
10911
10913 {
10915 float split_quantity_new;
10917 if (player)
10918 {
10920 if (quantity > stackable)
10921 split_quantity_new = stackable;
10922 else
10923 split_quantity_new = quantity;
10924
10926 {
10927 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10928 new_item =
ItemBase.Cast(in_hands);
10929 if (new_item)
10930 {
10931 new_item.SetResultOfSplit(true);
10932 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10934 new_item.SetQuantity(split_quantity_new, false, true);
10935 }
10936 }
10937 }
10938 }
10939
10941 {
10943 float split_quantity_new = Math.Floor(quantity * 0.5);
10944
10946 return;
10947
10949
10950 if (new_item)
10951 {
10952 if (new_item.GetQuantityMax() < split_quantity_new)
10953 {
10954 split_quantity_new = new_item.GetQuantityMax();
10955 }
10956
10957 new_item.SetResultOfSplit(true);
10958 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10959
10961 {
10964 }
10965 else
10966 {
10968 new_item.
SetQuantity(split_quantity_new,
false,
true);
10969 }
10970 }
10971 }
10972
10974 {
10976 float split_quantity_new = Math.Floor(quantity / 2);
10977
10979 return;
10980
10981 InventoryLocation invloc = new InventoryLocation;
10983
10985 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10986
10987 if (new_item)
10988 {
10989 if (new_item.GetQuantityMax() < split_quantity_new)
10990 {
10991 split_quantity_new = new_item.GetQuantityMax();
10992 }
10994 {
10997 }
10998 else if (split_quantity_new > 1)
10999 {
11001 new_item.
SetQuantity(split_quantity_new,
false,
true);
11002 }
11003 }
11004 }
11005
11008 {
11009 SetWeightDirty();
11011
11012 if (parent)
11013 parent.OnAttachmentQuantityChangedEx(this, delta);
11014
11016 {
11018 {
11020 }
11022 {
11023 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
11025 }
11026 }
11027 }
11028
11031 {
11032
11033 }
11034
11037 {
11039 }
11040
11042 {
11043 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11044
11046 {
11047 if (newLevel == GameConstants.STATE_RUINED)
11048 {
11050 EntityAI parent = GetHierarchyParent();
11051 if (parent && parent.IsFireplace())
11052 {
11053 CargoBase cargo = GetInventory().GetCargo();
11054 if (cargo)
11055 {
11057 {
11059 }
11060 }
11061 }
11062 }
11063
11065 {
11066
11068 return;
11069 }
11070
11071 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11072 {
11074 }
11075 }
11076 }
11077
11078
11080 {
11081 super.OnRightClick();
11082
11084 {
11086 {
11087 if (ScriptInputUserData.CanStoreInputUserData())
11088 {
11089 EntityAI root = GetHierarchyRoot();
11090 Man playerOwner = GetHierarchyRootPlayer();
11091 InventoryLocation dst = new InventoryLocation;
11092
11093
11094 if (!playerOwner && root && root == this)
11095 {
11097 }
11098 else
11099 {
11100
11101 GetInventory().GetCurrentInventoryLocation(dst);
11103 {
11104 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11106 {
11108 }
11109 else
11110 {
11112
11113
11114 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11115 {
11117 }
11118 else
11119 {
11120 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11121 }
11122 }
11123 }
11124 }
11125
11126 ScriptInputUserData ctx = new ScriptInputUserData;
11134 }
11135 }
11136 else if (!
g_Game.IsMultiplayer())
11137 {
11139 }
11140 }
11141 }
11142
11144 {
11145 if (root)
11146 {
11147 vector m4[4];
11148 root.GetTransform(m4);
11149 dst.SetGround(this, m4);
11150 }
11151 else
11152 {
11153 GetInventory().GetCurrentInventoryLocation(dst);
11154 }
11155 }
11156
11157 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11158 {
11159
11160 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11161 return false;
11162
11163 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11164 return false;
11165
11166
11168 return false;
11169
11170
11171 Magazine mag = Magazine.Cast(this);
11172 if (mag)
11173 {
11174 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11175 return false;
11176
11177 if (stack_max_limit)
11178 {
11179 Magazine other_mag = Magazine.Cast(other_item);
11180 if (other_item)
11181 {
11182 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11183 return false;
11184 }
11185
11186 }
11187 }
11188 else
11189 {
11190
11192 return false;
11193
11195 return false;
11196 }
11197
11198 PlayerBase player = null;
11199 if (CastTo(player, GetHierarchyRootPlayer()))
11200 {
11201 if (player.GetInventory().HasAttachment(this))
11202 return false;
11203
11204 if (player.IsItemsToDelete())
11205 return false;
11206 }
11207
11208 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11209 return false;
11210
11211 int slotID;
11213 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11214 return false;
11215
11216 return true;
11217 }
11218
11220 {
11222 }
11223
11225 {
11226 return m_IsResultOfSplit;
11227 }
11228
11230 {
11231 m_IsResultOfSplit = value;
11232 }
11233
11235 {
11237 }
11238
11240 {
11241 float other_item_quantity = other_item.GetQuantity();
11242 float this_free_space;
11243
11245
11247
11248 if (other_item_quantity > this_free_space)
11249 {
11250 return this_free_space;
11251 }
11252 else
11253 {
11254 return other_item_quantity;
11255 }
11256 }
11257
11259 {
11261 }
11262
11264 {
11266 return;
11267
11268 if (!IsMagazine() && other_item)
11269 {
11271 if (quantity_used != 0)
11272 {
11273 float hp1 = GetHealth01("","");
11274 float hp2 = other_item.GetHealth01("","");
11275 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11276 hpResult = hpResult / (
GetQuantity() + quantity_used);
11277
11278 hpResult *= GetMaxHealth();
11279 Math.Round(hpResult);
11280 SetHealth("", "Health", hpResult);
11281
11283 other_item.AddQuantity(-quantity_used);
11284 }
11285 }
11287 }
11288
11290 {
11291 #ifdef SERVER
11292 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11293 GetHierarchyParent().IncreaseLifetimeUp();
11294 #endif
11295 };
11296
11298 {
11299 PlayerBase p = PlayerBase.Cast(player);
11300
11301 array<int> recipesIds = p.m_Recipes;
11302 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11303 if (moduleRecipesManager)
11304 {
11305 EntityAI itemInHands = player.GetEntityInHands();
11306 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11307 }
11308
11309 for (int i = 0;i < recipesIds.Count(); i++)
11310 {
11311 int key = recipesIds.Get(i);
11312 string recipeName = moduleRecipesManager.GetRecipeName(key);
11314 }
11315 }
11316
11317
11318 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11319 {
11320 super.GetDebugActions(outputList);
11321
11322
11328
11329
11334
11339
11340
11344
11345
11347 {
11351 }
11352
11355
11356
11360
11362
11363 InventoryLocation loc = new InventoryLocation();
11364 GetInventory().GetCurrentInventoryLocation(loc);
11366 {
11367 if (Gizmo_IsSupported())
11370 }
11371
11373 }
11374
11375
11376
11377
11379 {
11380 super.OnAction(action_id, player, ctx);
11381
11383 {
11384 switch (action_id)
11385 {
11389 return true;
11393 return true;
11394 }
11395 }
11396
11398 {
11399 switch (action_id)
11400 {
11402 Delete();
11403 return true;
11404 }
11405 }
11406
11407 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11408 {
11409 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11410 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11411 PlayerBase p = PlayerBase.Cast(player);
11412 if (
EActions.RECIPES_RANGE_START < 1000)
11413 {
11414 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11415 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11416 }
11417 }
11418 #ifndef SERVER
11419 else if (action_id ==
EActions.WATCH_PLAYER)
11420 {
11421 PluginDeveloper.SetDeveloperItemClientEx(player);
11422 }
11423 #endif
11425 {
11426 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11427 {
11428 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11429 OnDebugButtonPressServer(id + 1);
11430 }
11431
11432 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11433 {
11434 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11436 }
11437
11438 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11439 {
11440 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11442 }
11443
11444 else if (action_id ==
EActions.ADD_QUANTITY)
11445 {
11446 if (IsMagazine())
11447 {
11448 Magazine mag = Magazine.Cast(this);
11449 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11450 }
11451 else
11452 {
11454 }
11455
11456 if (m_EM)
11457 {
11458 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11459 }
11460
11461 }
11462
11463 else if (action_id ==
EActions.REMOVE_QUANTITY)
11464 {
11465 if (IsMagazine())
11466 {
11467 Magazine mag2 = Magazine.Cast(this);
11468 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11469 }
11470 else
11471 {
11473 }
11474 if (m_EM)
11475 {
11476 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11477 }
11478
11479 }
11480
11481 else if (action_id ==
EActions.SET_QUANTITY_0)
11482 {
11484
11485 if (m_EM)
11486 {
11487 m_EM.SetEnergy(0);
11488 }
11489 }
11490
11491 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11492 {
11494
11495 if (m_EM)
11496 {
11497 m_EM.SetEnergy(m_EM.GetEnergyMax());
11498 }
11499 }
11500
11501 else if (action_id ==
EActions.ADD_HEALTH)
11502 {
11503 AddHealth("","",GetMaxHealth("","Health")/5);
11504 }
11505 else if (action_id ==
EActions.REMOVE_HEALTH)
11506 {
11507 AddHealth("","",-GetMaxHealth("","Health")/5);
11508 }
11509 else if (action_id ==
EActions.DESTROY_HEALTH)
11510 {
11511 SetHealth01("","",0);
11512 }
11513 else if (action_id ==
EActions.WATCH_ITEM)
11514 {
11516 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11517 #ifdef DEVELOPER
11518 SetDebugDeveloper_item(this);
11519 #endif
11520 }
11521
11522 else if (action_id ==
EActions.ADD_TEMPERATURE)
11523 {
11524 AddTemperature(20);
11525
11526 }
11527
11528 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11529 {
11530 AddTemperature(-20);
11531
11532 }
11533
11534 else if (action_id ==
EActions.FLIP_FROZEN)
11535 {
11536 SetFrozen(!GetIsFrozen());
11537
11538 }
11539
11540 else if (action_id ==
EActions.ADD_WETNESS)
11541 {
11543
11544 }
11545
11546 else if (action_id ==
EActions.REMOVE_WETNESS)
11547 {
11549
11550 }
11551
11552 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11553 {
11556
11557
11558 }
11559
11560 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11561 {
11564 }
11565
11566 else if (action_id ==
EActions.MAKE_SPECIAL)
11567 {
11568 auto debugParams = DebugSpawnParams.WithPlayer(player);
11569 OnDebugSpawnEx(debugParams);
11570 }
11571
11572 }
11573
11574
11575 return false;
11576 }
11577
11578
11579
11580
11584
11587
11588
11589
11591 {
11592 return false;
11593 }
11594
11595
11597 {
11598 return true;
11599 }
11600
11601
11603 {
11604 return true;
11605 }
11606
11607
11608
11610 {
11611 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11612 return g_Game.ConfigIsExisting(config_path);
11613 }
11614
11617 {
11618 return null;
11619 }
11620
11622 {
11623 return false;
11624 }
11625
11627 {
11628 return false;
11629 }
11630
11634
11635
11637 {
11638 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11639 return module_repairing.CanRepair(this, item_repair_kit);
11640 }
11641
11642
11643 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11644 {
11645 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11646 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11647 }
11648
11649
11651 {
11652
11653
11654
11655
11656
11657
11658
11659
11660 return 1;
11661 }
11662
11663
11664
11666 {
11668 }
11669
11670
11671
11673 {
11675 }
11676
11677
11686 {
11687 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11688
11689 if (player)
11690 {
11691 player.MessageStatus(text);
11692 }
11693 }
11694
11695
11704 {
11705 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11706
11707 if (player)
11708 {
11709 player.MessageAction(text);
11710 }
11711 }
11712
11713
11722 {
11723 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11724
11725 if (player)
11726 {
11727 player.MessageFriendly(text);
11728 }
11729 }
11730
11731
11740 {
11741 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11742
11743 if (player)
11744 {
11745 player.MessageImportant(text);
11746 }
11747 }
11748
11750 {
11751 return true;
11752 }
11753
11754
11755 override bool KindOf(
string tag)
11756 {
11757 bool found = false;
11758 string item_name = this.
GetType();
11760 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11761
11762 int array_size = item_tag_array.Count();
11763 for (int i = 0; i < array_size; i++)
11764 {
11765 if (item_tag_array.Get(i) == tag)
11766 {
11767 found = true;
11768 break;
11769 }
11770 }
11771 return found;
11772 }
11773
11774
11776 {
11777
11778 super.OnRPC(sender, rpc_type,ctx);
11779
11780
11781 switch (rpc_type)
11782 {
11783 #ifndef SERVER
11784 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11785 Param2<bool, string> p = new Param2<bool, string>(false, "");
11786
11788 return;
11789
11790 bool play = p.param1;
11791 string soundSet = p.param2;
11792
11793 if (play)
11794 {
11796 {
11798 {
11800 }
11801 }
11802 else
11803 {
11805 }
11806 }
11807 else
11808 {
11810 }
11811
11812 break;
11813 #endif
11814
11815 }
11816
11818 {
11820 }
11821 }
11822
11823
11824
11825
11827 {
11828 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11829 return plugin.GetID(
name);
11830 }
11831
11833 {
11834 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11835 return plugin.GetName(id);
11836 }
11837
11840 {
11841
11842
11843 int varFlags;
11844 if (!ctx.
Read(varFlags))
11845 return;
11846
11847 if (varFlags & ItemVariableFlags.FLOAT)
11848 {
11850 }
11851 }
11852
11854 {
11855
11856 super.SerializeNumericalVars(floats_out);
11857
11858
11859
11861 {
11863 }
11864
11866 {
11868 }
11869
11871 {
11873 }
11874
11876 {
11881 }
11882
11884 {
11886 }
11887 }
11888
11890 {
11891
11892 super.DeSerializeNumericalVars(floats);
11893
11894
11895 int index = 0;
11896 int mask = Math.Round(floats.Get(index));
11897
11898 index++;
11899
11901 {
11903 {
11905 }
11906 else
11907 {
11908 float quantity = floats.Get(index);
11909 SetQuantity(quantity,
true,
false,
false,
false);
11910 }
11911 index++;
11912 }
11913
11915 {
11916 float wet = floats.Get(index);
11918 index++;
11919 }
11920
11922 {
11923 int liquidtype = Math.Round(floats.Get(index));
11925 index++;
11926 }
11927
11929 {
11931 index++;
11933 index++;
11935 index++;
11937 index++;
11938 }
11939
11941 {
11942 int cleanness = Math.Round(floats.Get(index));
11944 index++;
11945 }
11946 }
11947
11949 {
11950 super.WriteVarsToCTX(ctx);
11951
11952
11954 {
11956 }
11957
11959 {
11961 }
11962
11964 {
11966 }
11967
11969 {
11970 int r,g,b,a;
11976 }
11977
11979 {
11981 }
11982 }
11983
11985 {
11986 if (!super.ReadVarsFromCTX(ctx,version))
11987 return false;
11988
11989 int intValue;
11990 float value;
11991
11992 if (version < 140)
11993 {
11994 if (!ctx.
Read(intValue))
11995 return false;
11996
11997 m_VariablesMask = intValue;
11998 }
11999
12001 {
12002 if (!ctx.
Read(value))
12003 return false;
12004
12006 {
12008 }
12009 else
12010 {
12012 }
12013 }
12014
12015 if (version < 140)
12016 {
12018 {
12019 if (!ctx.
Read(value))
12020 return false;
12021 SetTemperatureDirect(value);
12022 }
12023 }
12024
12026 {
12027 if (!ctx.
Read(value))
12028 return false;
12030 }
12031
12033 {
12034 if (!ctx.
Read(intValue))
12035 return false;
12037 }
12038
12040 {
12041 int r,g,b,a;
12043 return false;
12045 return false;
12047 return false;
12049 return false;
12050
12052 }
12053
12055 {
12056 if (!ctx.
Read(intValue))
12057 return false;
12059 }
12060
12061 if (version >= 138 && version < 140)
12062 {
12064 {
12065 if (!ctx.
Read(intValue))
12066 return false;
12067 SetFrozen(intValue);
12068 }
12069 }
12070
12071 return true;
12072 }
12073
12074
12076 {
12079 {
12081 }
12082
12083 if (!super.OnStoreLoad(ctx, version))
12084 {
12086 return false;
12087 }
12088
12089 if (version >= 114)
12090 {
12091 bool hasQuickBarIndexSaved;
12092
12093 if (!ctx.
Read(hasQuickBarIndexSaved))
12094 {
12096 return false;
12097 }
12098
12099 if (hasQuickBarIndexSaved)
12100 {
12101 int itmQBIndex;
12102
12103
12104 if (!ctx.
Read(itmQBIndex))
12105 {
12107 return false;
12108 }
12109
12110 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12111 if (itmQBIndex != -1 && parentPlayer)
12112 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12113 }
12114 }
12115 else
12116 {
12117
12118 PlayerBase player;
12119 int itemQBIndex;
12120 if (version ==
int.
MAX)
12121 {
12122 if (!ctx.
Read(itemQBIndex))
12123 {
12125 return false;
12126 }
12127 }
12128 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12129 {
12130
12131 if (!ctx.
Read(itemQBIndex))
12132 {
12134 return false;
12135 }
12136 if (itemQBIndex != -1 && player)
12137 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12138 }
12139 }
12140
12141 if (version < 140)
12142 {
12143
12144 if (!LoadVariables(ctx, version))
12145 {
12147 return false;
12148 }
12149 }
12150
12151
12153 {
12155 return false;
12156 }
12157 if (version >= 132)
12158 {
12160 if (raib)
12161 {
12163 {
12165 return false;
12166 }
12167 }
12168 }
12169
12171 return true;
12172 }
12173
12174
12175
12177 {
12178 super.OnStoreSave(ctx);
12179
12180 PlayerBase player;
12181 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12182 {
12184
12185 int itemQBIndex = -1;
12186 itemQBIndex = player.FindQuickBarEntityIndex(this);
12187 ctx.
Write(itemQBIndex);
12188 }
12189 else
12190 {
12192 }
12193
12195
12197 if (raib)
12198 {
12200 }
12201 }
12202
12203
12205 {
12206 super.AfterStoreLoad();
12207
12209 {
12211 }
12212
12214 {
12217 }
12218 }
12219
12221 {
12222 super.EEOnAfterLoad();
12223
12225 {
12227 }
12228
12231 }
12232
12234 {
12235 return false;
12236 }
12237
12238
12239
12241 {
12243 {
12244 #ifdef PLATFORM_CONSOLE
12245
12247 {
12249 if (menu)
12250 {
12252 }
12253 }
12254 #endif
12255 }
12256
12258 {
12261 }
12262
12264 {
12265 SetWeightDirty();
12267 }
12269 {
12272 }
12273
12275 {
12278
12281 }
12283 {
12287 }
12288
12289 super.OnVariablesSynchronized();
12290 }
12291
12292
12293
12295 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12296 {
12297 if (!IsServerCheck(allow_client))
12298 return false;
12299
12301 return false;
12302
12305
12306 if (value <= (min + 0.001))
12307 value = min;
12308
12309 if (value == min)
12310 {
12311 if (destroy_config)
12312 {
12313 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12314 if (dstr)
12315 {
12317 this.Delete();
12318 return true;
12319 }
12320 }
12321 else if (destroy_forced)
12322 {
12324 this.Delete();
12325 return true;
12326 }
12327
12329 }
12330
12333
12335 {
12336 EntityAI parent = GetHierarchyRoot();
12337 InventoryLocation iLoc = new InventoryLocation();
12338 GetInventory().GetCurrentInventoryLocation(iLoc);
12340 {
12341 int iLocSlot = iLoc.
GetSlot();
12343 {
12345 }
12347 {
12349 }
12350 }
12351 }
12352
12354 {
12356
12357 if (delta)
12359 }
12360
12362
12363 return false;
12364 }
12365
12366
12368 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12369 {
12371 }
12372
12374 {
12377 }
12378
12380 {
12383 }
12384
12386 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12387 {
12388 float value_clamped = Math.Clamp(value, 0, 1);
12390 SetQuantity(result, destroy_config, destroy_forced);
12391 }
12392
12393
12396 {
12398 }
12399
12401 {
12403 }
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12415 {
12416 int slot = -1;
12417 GameInventory inventory = GetInventory();
12418 if (inventory)
12419 {
12420 InventoryLocation il = new InventoryLocation;
12423 }
12424
12426 }
12427
12429 {
12430 float quantity_max = 0;
12431
12433 {
12434 if (attSlotID != -1)
12435 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12436
12437 if (quantity_max <= 0)
12439 }
12440
12441 if (quantity_max <= 0)
12443
12444 return quantity_max;
12445 }
12446
12448 {
12450 }
12451
12453 {
12455 }
12456
12457
12459 {
12461 }
12462
12464 {
12466 }
12467
12469 {
12471 }
12472
12473
12475 {
12476
12477 float weightEx = GetWeightEx();
12478 float special = GetInventoryAndCargoWeight();
12479 return weightEx - special;
12480 }
12481
12482
12484 {
12486 }
12487
12489 {
12491 {
12492 #ifdef DEVELOPER
12493 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12494 {
12495 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12497 }
12498 #endif
12499
12500 return GetQuantity() * GetConfigWeightModified();
12501 }
12502 else if (HasEnergyManager())
12503 {
12504 #ifdef DEVELOPER
12505 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12506 {
12507 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12508 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12509 }
12510 #endif
12511 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12512 }
12513 else
12514 {
12515 #ifdef DEVELOPER
12516 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12517 {
12518 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12519 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12520 }
12521 #endif
12522 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12523 }
12524 }
12525
12528 {
12529 int item_count = 0;
12531
12532 GameInventory inventory = GetInventory();
12533 CargoBase cargo = inventory.
GetCargo();
12534 if (cargo != NULL)
12535 {
12537 }
12538
12540 for (int i = 0; i < nAttachments; ++i)
12541 {
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 GameInventory inventory = GetInventory();
12572 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12573 {
12574 array<EntityAI> items = new array<EntityAI>;
12576 for (int i = 0; i < items.Count(); ++i)
12577 {
12579 if (item)
12580 {
12581 g_Game.ObjectDelete(item);
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 (
g_Game.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 (
g_Game.ConfigIsExisting(paramPath))
12643 return g_Game.ConfigGetFloat(paramPath);
12644
12645 return 0.0;
12646 }
12647
12649 {
12650 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12651 if (
g_Game.ConfigIsExisting(paramPath))
12652 return g_Game.ConfigGetFloat(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 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12885 }
12886 }
12887
12888
12891 {
12892 PlayerBase nplayer;
12893 if (PlayerBase.CastTo(nplayer,player))
12894 {
12895 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12896 }
12897
12898 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12899
12900 if (HasEnergyManager())
12901 {
12902 GetCompEM().UpdatePlugState();
12903 }
12904 }
12905
12906
12908 {
12909 super.OnPlacementStarted(player);
12910
12912 }
12913
12914 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12915 {
12917 {
12918 m_AdminLog.OnPlacementComplete(player,
this);
12919 }
12920
12921 super.OnPlacementComplete(player, position, orientation);
12922 }
12923
12924
12925
12926
12927
12929 {
12931 {
12932 return true;
12933 }
12934 else
12935 {
12936 return false;
12937 }
12938 }
12939
12940
12942 {
12944 {
12946 }
12947 }
12948
12949
12951 {
12953 }
12954
12956 {
12958 }
12959
12960 override void InsertAgent(
int agent,
float count = 1)
12961 {
12962 if (count < 1)
12963 return;
12964
12966 }
12967
12970 {
12972 }
12973
12974
12976 {
12978 }
12979
12980
12981
12982
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
13022 {
13024 return false;
13025 return true;
13026 }
13027
13029 {
13030
13032 }
13033
13034
13037 {
13038 super.CheckForRoofLimited(timeTresholdMS);
13039
13040 float time =
g_Game.GetTime();
13041 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13042 {
13043 m_PreviousRoofTestTime = time;
13044 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13045 }
13046 }
13047
13048
13050 {
13052 {
13053 return 0;
13054 }
13055
13056 if (GetInventory().GetAttachmentSlotsCount() != 0)
13057 {
13058 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13059 if (filter)
13060 return filter.GetProtectionLevel(type, false, system);
13061 else
13062 return 0;
13063 }
13064
13065 string subclassPath, entryName;
13066
13067 switch (type)
13068 {
13070 entryName = "biological";
13071 break;
13073 entryName = "chemical";
13074 break;
13075 default:
13076 entryName = "biological";
13077 break;
13078 }
13079
13080 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13081
13082 return g_Game.ConfigGetFloat(subclassPath + entryName);
13083 }
13084
13085
13086
13089 {
13090 if (!IsMagazine())
13092
13094 }
13095
13096
13097
13098
13099
13104 {
13105 return true;
13106 }
13107
13109 {
13111 }
13112
13113
13114
13115
13116
13118 {
13119 if (parent)
13120 {
13121 if (parent.IsInherited(DayZInfected))
13122 return true;
13123
13124 if (!parent.IsRuined())
13125 return true;
13126 }
13127
13128 return true;
13129 }
13130
13132 {
13133 if (!super.CanPutAsAttachment(parent))
13134 {
13135 return false;
13136 }
13137
13138 if (!IsRuined() && !parent.IsRuined())
13139 {
13140 return true;
13141 }
13142
13143 return false;
13144 }
13145
13147 {
13148
13149
13150
13151
13152 return super.CanReceiveItemIntoCargo(item);
13153 }
13154
13156 {
13157
13158
13159
13160
13161 GameInventory attachmentInv = attachment.GetInventory();
13163 {
13164 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13165 return false;
13166 }
13167
13168 InventoryLocation loc = new InventoryLocation();
13169 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13170 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13171 return false;
13172
13173 return super.CanReceiveAttachment(attachment, slotId);
13174 }
13175
13177 {
13178 if (!super.CanReleaseAttachment(attachment))
13179 return false;
13180
13181 return GetInventory().AreChildrenAccessible();
13182 }
13183
13184
13185
13186
13187
13188
13189
13190
13191
13192
13193
13194
13195
13196
13197
13198
13199
13200
13201
13202
13203
13205 {
13206 int id = muzzle_owner.GetMuzzleID();
13207 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13208
13209 if (WPOF_array)
13210 {
13211 for (int i = 0; i < WPOF_array.Count(); i++)
13212 {
13213 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13214
13215 if (WPOF)
13216 {
13217 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13218 }
13219 }
13220 }
13221 }
13222
13223
13225 {
13226 int id = muzzle_owner.GetMuzzleID();
13228
13229 if (WPOBE_array)
13230 {
13231 for (int i = 0; i < WPOBE_array.Count(); i++)
13232 {
13233 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13234
13235 if (WPOBE)
13236 {
13237 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13238 }
13239 }
13240 }
13241 }
13242
13243
13245 {
13246 int id = muzzle_owner.GetMuzzleID();
13247 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13248
13249 if (WPOOH_array)
13250 {
13251 for (int i = 0; i < WPOOH_array.Count(); i++)
13252 {
13253 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13254
13255 if (WPOOH)
13256 {
13257 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13258 }
13259 }
13260 }
13261 }
13262
13263
13265 {
13266 int id = muzzle_owner.GetMuzzleID();
13267 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13268
13269 if (WPOOH_array)
13270 {
13271 for (int i = 0; i < WPOOH_array.Count(); i++)
13272 {
13273 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13274
13275 if (WPOOH)
13276 {
13277 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13278 }
13279 }
13280 }
13281 }
13282
13283
13285 {
13286 int id = muzzle_owner.GetMuzzleID();
13287 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13288
13289 if (WPOOH_array)
13290 {
13291 for (int i = 0; i < WPOOH_array.Count(); i++)
13292 {
13293 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13294
13295 if (WPOOH)
13296 {
13297 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13298 }
13299 }
13300 }
13301 }
13302
13303
13304
13306 {
13308 {
13309 return true;
13310 }
13311
13312 return false;
13313 }
13314
13316 {
13318 {
13319 return true;
13320 }
13321
13322 return false;
13323 }
13324
13326 {
13328 {
13329 return true;
13330 }
13331
13332 return false;
13333 }
13334
13336 {
13337 return false;
13338 }
13339
13342 {
13343 return UATimeSpent.DEFAULT_DEPLOY;
13344 }
13345
13346
13347
13348
13350 {
13352 SetSynchDirty();
13353 }
13354
13356 {
13358 }
13359
13360
13362 {
13363 return false;
13364 }
13365
13368 {
13369 string att_type = "None";
13370
13371 if (ConfigIsExisting("soundAttType"))
13372 {
13373 att_type = ConfigGetString("soundAttType");
13374 }
13375
13377 }
13378
13380 {
13382 }
13383
13384
13385
13386
13387
13393
13395 {
13398
13400 }
13401
13402
13404 {
13406 return;
13407
13409
13412
13415
13416 SoundParameters params = new SoundParameters();
13420 }
13421
13422
13424 {
13426 {
13429
13430 SetSynchDirty();
13431
13434 }
13435 }
13436
13438 {
13440 }
13441
13442
13444 {
13446 return;
13447
13449 SetSynchDirty();
13450
13453 }
13454
13456 {
13459 }
13460
13462 {
13464 }
13465
13466 void OnApply(PlayerBase player);
13467
13469 {
13470 return 1.0;
13471 };
13472
13474 {
13476 }
13477
13479 {
13481 }
13482
13484
13486 {
13487 SetDynamicPhysicsLifeTime(0.01);
13489 }
13490
13492 {
13493 array<string> zone_names = new array<string>;
13494 GetDamageZones(zone_names);
13495 for (int i = 0; i < zone_names.Count(); i++)
13496 {
13497 SetHealthMax(zone_names.Get(i),"Health");
13498 }
13499 SetHealthMax("","Health");
13500 }
13501
13504 {
13505 float global_health = GetHealth01("","Health");
13506 array<string> zones = new array<string>;
13507 GetDamageZones(zones);
13508
13509 for (int i = 0; i < zones.Count(); i++)
13510 {
13511 SetHealth01(zones.Get(i),"Health",global_health);
13512 }
13513 }
13514
13517 {
13518 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13519 }
13520
13522 {
13523 if (!hasRootAsPlayer)
13524 {
13525 if (refParentIB)
13526 {
13527
13528 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13529 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13530
13531 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13532 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13533
13536 }
13537 else
13538 {
13539
13542 }
13543 }
13544 }
13545
13547 {
13549 {
13550 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13551 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13552 {
13553 float heatPermCoef = 1.0;
13555 while (ent)
13556 {
13557 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13558 ent = ent.GetHierarchyParent();
13559 }
13560
13561 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13562 }
13563 }
13564 }
13565
13567 {
13568
13569 EntityAI parent = GetHierarchyParent();
13570 if (!parent)
13571 {
13572 hasParent = false;
13573 hasRootAsPlayer = false;
13574 }
13575 else
13576 {
13577 hasParent = true;
13578 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13579 refParentIB =
ItemBase.Cast(parent);
13580 }
13581 }
13582
13583 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13584 {
13585
13586 }
13587
13589 {
13590
13591 return false;
13592 }
13593
13595 {
13596
13597
13598 return false;
13599 }
13600
13602 {
13603
13604 return false;
13605 }
13606
13609 {
13610 return !GetIsFrozen() &&
IsOpen();
13611 }
13612
13614 {
13615 bool hasParent = false, hasRootAsPlayer = false;
13617
13618 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13619 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13620
13621 if (wwtu || foodDecay)
13622 {
13626
13627 if (processWetness || processTemperature || processDecay)
13628 {
13630
13631 if (processWetness)
13632 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13633
13634 if (processTemperature)
13636
13637 if (processDecay)
13638 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13639 }
13640 }
13641 }
13642
13645 {
13647 }
13648
13650 {
13653
13654 return super.GetTemperatureFreezeThreshold();
13655 }
13656
13658 {
13661
13662 return super.GetTemperatureThawThreshold();
13663 }
13664
13666 {
13669
13670 return super.GetItemOverheatThreshold();
13671 }
13672
13674 {
13676 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13677
13678 return super.GetTemperatureFreezeTime();
13679 }
13680
13682 {
13684 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13685
13686 return super.GetTemperatureThawTime();
13687 }
13688
13693
13695 {
13696 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13697 }
13698
13700 {
13701 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13702 }
13703
13706 {
13708 }
13709
13711 {
13713 }
13714
13716 {
13718 }
13719
13722 {
13723 return null;
13724 }
13725
13728 {
13729 return false;
13730 }
13731
13733 {
13735 {
13738 if (!trg)
13739 {
13741 explosive = this;
13742 }
13743
13744 explosive.PairRemote(trg);
13746
13747 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13748 trg.SetPersistentPairID(persistentID);
13749 explosive.SetPersistentPairID(persistentID);
13750
13751 return true;
13752 }
13753 return false;
13754 }
13755
13758 {
13759 float ret = 1.0;
13762 ret *= GetHealth01();
13763
13764 return ret;
13765 }
13766
13767 #ifdef DEVELOPER
13768 override void SetDebugItem()
13769 {
13770 super.SetDebugItem();
13771 _itemBase = this;
13772 }
13773
13775 {
13776 string text = super.GetDebugText();
13777
13779 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13780
13781 return text;
13782 }
13783 #endif
13784
13786 {
13787 return true;
13788 }
13789
13791
13793
13795 {
13798 }
13799
13800
13808
13824
13825 [
Obsolete(
"Use ItemSoundHandler instead")]
13828 {
13829 if (!
g_Game.IsDedicatedServer())
13830 {
13831 if (ConfigIsExisting("attachSoundSet"))
13832 {
13833 string cfg_path = "";
13834 string soundset = "";
13835 string type_name =
GetType();
13836
13839 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13840 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13841
13842 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13843 {
13844 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13845 {
13846 if (cfg_slot_array[i] == slot_type)
13847 {
13848 soundset = cfg_soundset_array[i];
13849 break;
13850 }
13851 }
13852 }
13853
13854 if (soundset != "")
13855 {
13856 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13858 }
13859 }
13860 }
13861 }
13862
13864}
13865
13867{
13869 if (entity)
13870 {
13871 bool is_item = entity.IsInherited(
ItemBase);
13872 if (is_item && full_quantity)
13873 {
13876 }
13877 }
13878 else
13879 {
13881 return NULL;
13882 }
13883 return entity;
13884}
13885
13887{
13888 if (item)
13889 {
13890 if (health > 0)
13891 item.SetHealth("", "", health);
13892
13893 if (item.CanHaveTemperature())
13894 {
13896 if (item.CanFreeze())
13897 item.SetFrozen(false);
13898 }
13899
13900 if (item.HasEnergyManager())
13901 {
13902 if (quantity >= 0)
13903 {
13904 item.GetCompEM().SetEnergy0To1(quantity);
13905 }
13906 else
13907 {
13909 }
13910 }
13911 else if (item.IsMagazine())
13912 {
13913 Magazine mag = Magazine.Cast(item);
13914 if (quantity >= 0)
13915 {
13916 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13917 }
13918 else
13919 {
13921 }
13922
13923 }
13924 else
13925 {
13926 if (quantity >= 0)
13927 {
13928 item.SetQuantityNormalized(quantity, false);
13929 }
13930 else
13931 {
13933 }
13934
13935 }
13936 }
13937}
13938
13939#ifdef DEVELOPER
13941#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
void Obsolete(string msg="")
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
vector GetPosition()
Get the world position of the Effect.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.