8909{
8911 {
8912 return true;
8913 }
8914};
8915
8917{
8918
8919};
8920
8921
8922
8924{
8928
8930
8933
8934
8935
8936
8937
8946
8952
8957
8962
8983 protected bool m_IsResultOfSplit
8984
8986
8991
8992
8993
8995
8999
9000
9001
9003
9006
9007
9008
9014
9015
9023
9026
9027
9029
9030
9032
9033
9038
9039
9044
9046
9047
9049
9050
9052 {
9057
9058 if (!
g_Game.IsDedicatedServer())
9059 {
9061 {
9063
9065 {
9067 }
9068 }
9069
9072 }
9073
9074 m_OldLocation = null;
9075
9077 {
9079 }
9080
9081 if (ConfigIsExisting("headSelectionsToHide"))
9082 {
9085 }
9086
9088 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9089 {
9091 }
9092
9094
9095 m_IsResultOfSplit = false;
9096
9098 }
9099
9101 {
9102 super.InitItemVariables();
9103
9109 m_Count = ConfigGetInt(
"count");
9110
9113
9118
9121
9126
9138
9142
9143
9146 if (ConfigIsExisting("canBeSplit"))
9147 {
9150 }
9151
9153 if (ConfigIsExisting("itemBehaviour"))
9155
9156
9159 RegisterNetSyncVariableInt("m_VarLiquidType");
9160 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9161
9162 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9163 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9164 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9165
9166 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9167 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9168 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9169 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9170
9171 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9172 RegisterNetSyncVariableBool("m_IsTakeable");
9173 RegisterNetSyncVariableBool("m_IsHologram");
9174
9177 {
9180 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
9181 }
9182
9184
9186 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9188
9190 }
9191
9193 {
9195 }
9196
9198 {
9201 {
9206 }
9207 }
9208
9209 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
9210 {
9212 {
9215 }
9216
9218 }
9219
9221 {
9227 }
9228
9230
9232 {
9234
9235 if (!action)
9236 {
9237 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
9238 return;
9239 }
9240
9242 if (!ai)
9243 {
9245 return;
9246 }
9247
9249 if (!action_array)
9250 {
9251 action_array = new array<ActionBase_Basic>;
9253 }
9254 if (LogManager.IsActionLogEnable())
9255 {
9256 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
9257 }
9258
9259 if (action_array.Find(action) != -1)
9260 {
9261 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
9262 }
9263 else
9264 {
9265 action_array.Insert(action);
9266 }
9267 }
9268
9270 {
9271 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9272 ActionBase action = player.GetActionManager().GetAction(actionName);
9275
9276 if (action_array)
9277 {
9278 action_array.RemoveItem(action);
9279 }
9280 }
9281
9282
9283
9285 {
9286 ActionOverrideData overrideData = new ActionOverrideData();
9290
9292 if (!actionMap)
9293 {
9296 }
9297
9298 actionMap.Insert(this.
Type(), overrideData);
9299
9300 }
9301
9303
9305
9306
9308 {
9311
9314
9315 string config_to_search = "CfgVehicles";
9316 string muzzle_owner_config;
9317
9319 {
9320 if (IsInherited(Weapon))
9321 config_to_search = "CfgWeapons";
9322
9323 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9324
9325 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9326
9327 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
9328
9329 if (config_OnFire_subclass_count > 0)
9330 {
9331 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9332
9333 for (int i = 0; i < config_OnFire_subclass_count; i++)
9334 {
9335 string particle_class = "";
9336 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9337 string config_OnFire_entry = config_OnFire_class + particle_class;
9338 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9339 WPOF_array.Insert(WPOF);
9340 }
9341
9342
9344 }
9345 }
9346
9348 {
9349 config_to_search = "CfgWeapons";
9350 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9351
9352 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9353
9354 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9355
9356 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9357 {
9358 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9359
9360 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9361 {
9362 string particle_class2 = "";
9363 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9364 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9365 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9366 WPOBE_array.Insert(WPOBE);
9367 }
9368
9369
9371 }
9372 }
9373 }
9374
9375
9377 {
9380
9382 {
9383 string config_to_search = "CfgVehicles";
9384
9385 if (IsInherited(Weapon))
9386 config_to_search = "CfgWeapons";
9387
9388 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
9389 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9390
9391 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
9392 {
9393
9395
9397 {
9399 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9401 return;
9402 }
9403
9406
9407
9408
9409 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9410 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9411
9412 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9413 {
9414 string particle_class = "";
9415 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9416 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9417 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
9418
9419 if (entry_type == CT_CLASS)
9420 {
9421 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9422 WPOOH_array.Insert(WPOF);
9423 }
9424 }
9425
9426
9428 }
9429 }
9430 }
9431
9433 {
9435 }
9436
9438 {
9440 {
9442
9445
9448
9449 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9450 }
9451 }
9452
9454 {
9456 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9457
9459 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9460
9462 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9463
9465 {
9467 }
9468 }
9469
9471 {
9473 }
9474
9476 {
9479 else
9481
9483 {
9486 }
9487 else
9488 {
9491
9494 }
9495
9497 }
9498
9500 {
9502 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9503 }
9504
9506 {
9508 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9510 }
9511
9513 {
9515 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9516 }
9517
9519 {
9522
9523 OverheatingParticle OP = new OverheatingParticle();
9528
9530 }
9531
9533 {
9536
9537 return -1;
9538 }
9539
9541 {
9543 {
9546
9547 for (int i = count; i > 0; --i)
9548 {
9549 int id = i - 1;
9552
9555
9556 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9557 {
9558 if (p)
9559 {
9562 }
9563 }
9564 }
9565 }
9566 }
9567
9569 {
9571 {
9573 {
9574 int id = i - 1;
9576
9577 if (OP)
9578 {
9580
9581 if (p)
9582 {
9584 }
9585
9586 delete OP;
9587 }
9588 }
9589
9592 }
9593 }
9594
9597 {
9598 return 0.0;
9599 }
9600
9601
9603 {
9604 return 250;
9605 }
9606
9608 {
9609 return 0;
9610 }
9611
9614 {
9616 return true;
9617
9618 return false;
9619 }
9620
9623 {
9626
9628 {
9630 }
9631 else
9632 {
9633
9635 }
9636
9638 }
9639
9646 {
9647 return -1;
9648 }
9649
9650
9651
9652
9654 {
9656 {
9657 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9658 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9659
9660 if (r_index >= 0)
9661 {
9662 InventoryLocation r_il = new InventoryLocation;
9663 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9664
9665 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9668 {
9669 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9670 }
9672 {
9673 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9674 }
9675
9676 }
9677
9678 player.GetHumanInventory().ClearUserReservedLocation(this);
9679 }
9680
9683 }
9684
9685
9686
9687
9689 {
9690 return ItemBase.m_DebugActionsMask;
9691 }
9692
9694 {
9695 return ItemBase.m_DebugActionsMask & mask;
9696 }
9697
9699 {
9700 ItemBase.m_DebugActionsMask = mask;
9701 }
9702
9704 {
9705 ItemBase.m_DebugActionsMask |= mask;
9706 }
9707
9709 {
9710 ItemBase.m_DebugActionsMask &= ~mask;
9711 }
9712
9714 {
9716 {
9718 }
9719 else
9720 {
9722 }
9723 }
9724
9725
9727 {
9728 if (GetEconomyProfile())
9729 {
9730 float q_max = GetEconomyProfile().GetQuantityMax();
9731 if (q_max > 0)
9732 {
9733 float q_min = GetEconomyProfile().GetQuantityMin();
9734 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9735
9737 {
9738 ComponentEnergyManager comp = GetCompEM();
9740 {
9742 }
9743 }
9745 {
9747
9748 }
9749
9750 }
9751 }
9752 }
9753
9756 {
9757 EntityAI parent = GetHierarchyParent();
9758
9759 if (parent)
9760 {
9761 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9762 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9763 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9764 }
9765 }
9766
9769 {
9770 EntityAI parent = GetHierarchyParent();
9771
9772 if (parent)
9773 {
9774 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9775 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9776 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9777 }
9778 }
9779
9781 {
9782
9783
9784
9785
9787
9789 {
9790 if (ScriptInputUserData.CanStoreInputUserData())
9791 {
9792 ScriptInputUserData ctx = new ScriptInputUserData;
9798 ctx.
Write(use_stack_max);
9801
9803 {
9804 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9805 }
9806 }
9807 }
9808 else if (!
g_Game.IsMultiplayer())
9809 {
9811 }
9812 }
9813
9815 {
9817 }
9818
9820 {
9822 }
9823
9825 {
9827 }
9828
9830 {
9831
9832 return false;
9833 }
9834
9836 {
9837 return false;
9838 }
9839
9843 {
9844 return false;
9845 }
9846
9848 {
9849 return "";
9850 }
9851
9853
9855 {
9856 return false;
9857 }
9858
9860 {
9861 return true;
9862 }
9863
9864
9865
9867 {
9868 return true;
9869 }
9870
9872 {
9873 return true;
9874 }
9875
9877 {
9878 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9880 }
9881
9883 {
9885 }
9886
9888 {
9890 if (!is_being_placed)
9892 SetSynchDirty();
9893 }
9894
9895
9897
9899 {
9901 }
9902
9904 {
9906 }
9907
9909 {
9910 return 1;
9911 }
9912
9914 {
9915 return false;
9916 }
9917
9919 {
9921 SetSynchDirty();
9922 }
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957
9959 {
9960 super.OnMovedInsideCargo(container);
9961
9962 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9963 }
9964
9965 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9966 {
9967 super.EEItemLocationChanged(oldLoc, newLoc);
9968
9969 PlayerBase newPlayer = null;
9970 PlayerBase oldPlayer = null;
9971
9972 if (newLoc.GetParent())
9973 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9974
9975 if (oldLoc.GetParent())
9976 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9977
9979 {
9980 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9981
9982 if (rIndex >= 0)
9983 {
9984 InventoryLocation rIl = new InventoryLocation;
9985 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9986
9987 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9990 {
9991 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9992 }
9994 {
9996 }
9997
9998 }
9999 }
10000
10002 {
10003 if (newPlayer)
10004 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10005
10006 if (newPlayer == oldPlayer)
10007 {
10008 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10009 {
10011 {
10012 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10013 {
10014 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10015 }
10016 }
10017 else
10018 {
10019 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10020 }
10021 }
10022
10023 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10024 {
10025 int type = oldLoc.GetType();
10027 {
10028 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10029 }
10031 {
10032 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10033 }
10034 }
10035 if (!m_OldLocation)
10036 {
10037 m_OldLocation = new InventoryLocation;
10038 }
10039 m_OldLocation.Copy(oldLoc);
10040 }
10041 else
10042 {
10043 if (m_OldLocation)
10044 {
10045 m_OldLocation.Reset();
10046 }
10047 }
10048
10049 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
10050 }
10051 else
10052 {
10053 if (newPlayer)
10054 {
10055 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10056 if (resIndex >= 0)
10057 {
10058 InventoryLocation il = new InventoryLocation;
10059 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10061 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10064 {
10065 il.
GetParent().GetOnReleaseLock().Invoke(it);
10066 }
10068 {
10070 }
10071
10072 }
10073 }
10075 {
10076
10078 }
10079
10080 if (m_OldLocation)
10081 {
10082 m_OldLocation.Reset();
10083 }
10084 }
10085
10087 {
10088 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10089 }
10090
10092 {
10093 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10094 }
10095 }
10096
10097 override void EOnContact(IEntity other, Contact extra)
10098 {
10100 {
10101 int liquidType = -1;
10103 if (impactSpeed > 0.0)
10104 {
10106 #ifndef SERVER
10108 #else
10110 SetSynchDirty();
10111 #endif
10113 }
10114 }
10115
10116 #ifdef SERVER
10117 if (GetCompEM() && GetCompEM().IsPlugged())
10118 {
10119 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
10120 GetCompEM().UnplugThis();
10121 }
10122 #endif
10123 }
10124
10126
10128 {
10130 }
10131
10133 {
10134
10135 }
10136
10138 {
10139 super.OnItemLocationChanged(old_owner, new_owner);
10140
10141 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10142 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10143
10144 if (!relatedPlayer && playerNew)
10145 relatedPlayer = playerNew;
10146
10147 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10148 {
10150 if (actionMgr)
10151 {
10152 ActionBase currentAction = actionMgr.GetRunningAction();
10153 if (currentAction)
10155 }
10156 }
10157
10158 Man ownerPlayerOld = null;
10159 Man ownerPlayerNew = null;
10160
10161 if (old_owner)
10162 {
10163 if (old_owner.
IsMan())
10164 {
10165 ownerPlayerOld = Man.Cast(old_owner);
10166 }
10167 else
10168 {
10169 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10170 }
10171 }
10172 else
10173 {
10175 {
10177
10178 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
10179 {
10180 GetCompEM().UnplugThis();
10181 }
10182 }
10183 }
10184
10185 if (new_owner)
10186 {
10187 if (new_owner.
IsMan())
10188 {
10189 ownerPlayerNew = Man.Cast(new_owner);
10190 }
10191 else
10192 {
10193 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10194 }
10195 }
10196
10197 if (ownerPlayerOld != ownerPlayerNew)
10198 {
10199 if (ownerPlayerOld)
10200 {
10201 array<EntityAI> subItemsExit = new array<EntityAI>;
10203 for (int i = 0; i < subItemsExit.Count(); i++)
10204 {
10207 }
10208 }
10209
10210 if (ownerPlayerNew)
10211 {
10212 array<EntityAI> subItemsEnter = new array<EntityAI>;
10214 for (int j = 0; j < subItemsEnter.Count(); j++)
10215 {
10218 }
10219 }
10220 }
10221 else if (ownerPlayerNew != null)
10222 {
10223 PlayerBase nplayer;
10224 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10225 {
10226 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10228 for (int k = 0; k < subItemsUpdate.Count(); k++)
10229 {
10231 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10232 }
10233 }
10234 }
10235
10236 if (old_owner)
10237 old_owner.OnChildItemRemoved(this);
10238 if (new_owner)
10239 new_owner.OnChildItemReceived(this);
10240 }
10241
10242
10244 {
10245 super.EEDelete(parent);
10246 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10247 if (player)
10248 {
10250
10251 if (player.IsAlive())
10252 {
10253 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10254 if (r_index >= 0)
10255 {
10256 InventoryLocation r_il = new InventoryLocation;
10257 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10258
10259 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10262 {
10263 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
10264 }
10266 {
10267 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
10268 }
10269
10270 }
10271
10272 player.RemoveQuickBarEntityShortcut(this);
10273 }
10274 }
10275 }
10276
10278 {
10279 super.EEKilled(killer);
10280
10283 {
10284 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10285 {
10286 if (IsMagazine())
10287 {
10288 if (Magazine.Cast(this).GetAmmoCount() > 0)
10289 {
10291 }
10292 }
10293 else
10294 {
10296 }
10297 }
10298 }
10299 }
10300
10302 {
10303 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10304
10305 super.OnWasAttached(parent, slot_id);
10306
10309
10312 }
10313
10315 {
10316 super.OnWasDetached(parent, slot_id);
10317
10320
10323 }
10324
10326 {
10327 int idx;
10330
10331 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10332 if (inventory_slots.Count() < 1)
10333 {
10334 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10335 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10336 }
10337 else
10338 {
10339 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10340 }
10341
10342 idx = inventory_slots.Find(slot);
10343 if (idx < 0)
10344 return "";
10345
10346 return attach_types.Get(idx);
10347 }
10348
10350 {
10351 int idx = -1;
10352 string slot;
10353
10356
10357 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10358 if (inventory_slots.Count() < 1)
10359 {
10360 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10361 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10362 }
10363 else
10364 {
10365 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10366 if (detach_types.Count() < 1)
10367 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10368 }
10369
10370 for (int i = 0; i < inventory_slots.Count(); i++)
10371 {
10372 slot = inventory_slots.Get(i);
10373 }
10374
10375 if (slot != "")
10376 {
10377 if (detach_types.Count() == 1)
10378 idx = 0;
10379 else
10380 idx = inventory_slots.Find(slot);
10381 }
10382 if (idx < 0)
10383 return "";
10384
10385 return detach_types.Get(idx);
10386 }
10387
10389 {
10390
10392
10393
10394 float min_time = 1;
10395 float max_time = 3;
10396 float delay = Math.RandomFloat(min_time, max_time);
10397
10398 explode_timer.Run(delay, this, "DoAmmoExplosion");
10399 }
10400
10402 {
10403 Magazine magazine = Magazine.Cast(this);
10404 int pop_sounds_count = 6;
10405 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10406
10407
10408 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10409 string sound_name = pop_sounds[ sound_idx ];
10410 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
10411
10412
10413 magazine.ServerAddAmmoCount(-1);
10414
10415
10416 float min_temp_to_explode = 100;
10417
10418 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
10419 {
10421 }
10422 }
10423
10424
10425 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
10426 {
10427 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
10428
10429 const int CHANCE_DAMAGE_CARGO = 4;
10430 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10431 const int CHANCE_DAMAGE_NOTHING = 2;
10432
10434 {
10435 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
10436 int chances;
10437 int rnd;
10438
10439 if (GetInventory().GetCargo())
10440 {
10441 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10442 rnd = Math.RandomInt(0,chances);
10443
10444 if (rnd < CHANCE_DAMAGE_CARGO)
10445 {
10447 }
10448 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10449 {
10451 }
10452 }
10453 else
10454 {
10455 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10456 rnd = Math.RandomInt(0,chances);
10457
10458 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10459 {
10461 }
10462 }
10463 }
10464 }
10465
10467 {
10468 CargoBase cargo = GetInventory().GetCargo();
10469 if (cargo)
10470 {
10472 if (item_count > 0)
10473 {
10474 int random_pick = Math.RandomInt(0, item_count);
10476 if (!item.IsExplosive())
10477 {
10478 item.AddHealth("","",damage);
10479 return true;
10480 }
10481 }
10482 }
10483 return false;
10484 }
10485
10487 {
10488 GameInventory inventory = GetInventory();
10490 if (attachment_count > 0)
10491 {
10492 int random_pick = Math.RandomInt(0, attachment_count);
10494 if (!attachment.IsExplosive())
10495 {
10496 attachment.AddHealth("","",damage);
10497 return true;
10498 }
10499 }
10500 return false;
10501 }
10502
10504 {
10506 }
10507
10509 {
10511 return GetInventory().CanRemoveEntity();
10512
10513 return false;
10514 }
10515
10517 {
10518
10520 return false;
10521
10522
10524 return false;
10525
10526
10527
10529 if (delta == 0)
10530 return false;
10531
10532
10533 return true;
10534 }
10535
10537 {
10539 {
10540 if (ScriptInputUserData.CanStoreInputUserData())
10541 {
10542 ScriptInputUserData ctx = new ScriptInputUserData;
10547 ctx.
Write(destination_entity);
10549 ctx.
Write(slot_id);
10551 }
10552 }
10553 else if (!
g_Game.IsMultiplayer())
10554 {
10556 }
10557 }
10558
10560 {
10561 float split_quantity_new;
10565 InventoryLocation loc = new InventoryLocation;
10566
10567 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10568 {
10570 split_quantity_new = stack_max;
10571 else
10573
10575 {
10576 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10577 if (new_item)
10578 {
10579 new_item.SetResultOfSplit(true);
10580 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10582 new_item.
SetQuantity(split_quantity_new,
false,
true);
10583 }
10584 }
10585 }
10586 else if (destination_entity && slot_id == -1)
10587 {
10588 if (quantity > stack_max)
10589 split_quantity_new = stack_max;
10590 else
10591 split_quantity_new = quantity;
10592
10594 {
10595 GameInventory destinationInventory = destination_entity.GetInventory();
10597 {
10600 }
10601
10602 if (new_item)
10603 {
10604 new_item.SetResultOfSplit(true);
10605 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10607 new_item.
SetQuantity(split_quantity_new,
false,
true);
10608 }
10609 }
10610 }
10611 else
10612 {
10613 if (stack_max != 0)
10614 {
10616 {
10618 }
10619
10620 if (split_quantity_new == 0)
10621 {
10622 if (!
g_Game.IsMultiplayer())
10623 player.PhysicalPredictiveDropItem(this);
10624 else
10625 player.ServerDropEntity(this);
10626 return;
10627 }
10628
10630 {
10632
10633 if (new_item)
10634 {
10635 new_item.SetResultOfSplit(true);
10636 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10639 new_item.PlaceOnSurface();
10640 }
10641 }
10642 }
10643 }
10644 }
10645
10647 {
10648 float split_quantity_new;
10652 InventoryLocation loc = new InventoryLocation;
10653
10654 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10655 {
10657 split_quantity_new = stack_max;
10658 else
10660
10662 {
10663 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10664 if (new_item)
10665 {
10666 new_item.SetResultOfSplit(true);
10667 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10669 new_item.
SetQuantity(split_quantity_new,
false,
true);
10670 }
10671 }
10672 }
10673 else if (destination_entity && slot_id == -1)
10674 {
10675 if (quantity > stack_max)
10676 split_quantity_new = stack_max;
10677 else
10678 split_quantity_new = quantity;
10679
10681 {
10682 GameInventory destinationInventory = destination_entity.GetInventory();
10684 {
10687 }
10688
10689 if (new_item)
10690 {
10691 new_item.SetResultOfSplit(true);
10692 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10694 new_item.
SetQuantity(split_quantity_new,
false,
true);
10695 }
10696 }
10697 }
10698 else
10699 {
10700 if (stack_max != 0)
10701 {
10703 {
10705 }
10706
10708 {
10710
10711 if (new_item)
10712 {
10713 new_item.SetResultOfSplit(true);
10714 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10717 new_item.PlaceOnSurface();
10718 }
10719 }
10720 }
10721 }
10722 }
10723
10725 {
10727 {
10728 if (ScriptInputUserData.CanStoreInputUserData())
10729 {
10730 ScriptInputUserData ctx = new ScriptInputUserData;
10735 dst.WriteToContext(ctx);
10737 }
10738 }
10739 else if (!
g_Game.IsMultiplayer())
10740 {
10742 }
10743 }
10744
10746 {
10748 {
10749 if (ScriptInputUserData.CanStoreInputUserData())
10750 {
10751 ScriptInputUserData ctx = new ScriptInputUserData;
10756 ctx.
Write(destination_entity);
10762 }
10763 }
10764 else if (!
g_Game.IsMultiplayer())
10765 {
10767 }
10768 }
10769
10771 {
10773 }
10774
10776 {
10778 float split_quantity_new;
10780 if (dst.IsValid())
10781 {
10782 int slot_id = dst.GetSlot();
10784
10785 if (quantity > stack_max)
10786 split_quantity_new = stack_max;
10787 else
10788 split_quantity_new = quantity;
10789
10791 {
10793
10794 if (new_item)
10795 {
10796 new_item.SetResultOfSplit(true);
10797 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10799 new_item.
SetQuantity(split_quantity_new,
false,
true);
10800 }
10801
10802 return new_item;
10803 }
10804 }
10805
10806 return null;
10807 }
10808
10810 {
10812 float split_quantity_new;
10814 if (destination_entity)
10815 {
10817 if (quantity > stackable)
10818 split_quantity_new = stackable;
10819 else
10820 split_quantity_new = quantity;
10821
10823 {
10824 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10825 if (new_item)
10826 {
10827 new_item.SetResultOfSplit(true);
10828 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10830 new_item.
SetQuantity(split_quantity_new,
false,
true);
10831 }
10832 }
10833 }
10834 }
10835
10837 {
10839 {
10840 if (ScriptInputUserData.CanStoreInputUserData())
10841 {
10842 ScriptInputUserData ctx = new ScriptInputUserData;
10847 ItemBase destination_entity =
this;
10848 ctx.
Write(destination_entity);
10852 }
10853 }
10854 else if (!
g_Game.IsMultiplayer())
10855 {
10857 }
10858 }
10859
10861 {
10863 float split_quantity_new;
10865 if (player)
10866 {
10868 if (quantity > stackable)
10869 split_quantity_new = stackable;
10870 else
10871 split_quantity_new = quantity;
10872
10874 {
10875 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10876 new_item =
ItemBase.Cast(in_hands);
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 float split_quantity_new = Math.Floor(quantity * 0.5);
10892
10894 return;
10895
10897
10898 if (new_item)
10899 {
10900 if (new_item.GetQuantityMax() < split_quantity_new)
10901 {
10902 split_quantity_new = new_item.GetQuantityMax();
10903 }
10904
10905 new_item.SetResultOfSplit(true);
10906 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10907
10909 {
10912 }
10913 else
10914 {
10916 new_item.
SetQuantity(split_quantity_new,
false,
true);
10917 }
10918 }
10919 }
10920
10922 {
10924 float split_quantity_new = Math.Floor(quantity / 2);
10925
10927 return;
10928
10929 InventoryLocation invloc = new InventoryLocation;
10931
10933 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10934
10935 if (new_item)
10936 {
10937 if (new_item.GetQuantityMax() < split_quantity_new)
10938 {
10939 split_quantity_new = new_item.GetQuantityMax();
10940 }
10942 {
10945 }
10946 else if (split_quantity_new > 1)
10947 {
10949 new_item.
SetQuantity(split_quantity_new,
false,
true);
10950 }
10951 }
10952 }
10953
10956 {
10957 SetWeightDirty();
10959
10960 if (parent)
10961 parent.OnAttachmentQuantityChangedEx(this, delta);
10962
10964 {
10966 {
10968 }
10970 {
10971 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10973 }
10974 }
10975 }
10976
10979 {
10980
10981 }
10982
10985 {
10987 }
10988
10990 {
10991 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10992
10994 {
10995 if (newLevel == GameConstants.STATE_RUINED)
10996 {
10998 EntityAI parent = GetHierarchyParent();
10999 if (parent && parent.IsFireplace())
11000 {
11001 CargoBase cargo = GetInventory().GetCargo();
11002 if (cargo)
11003 {
11005 {
11007 }
11008 }
11009 }
11010 }
11011
11013 {
11014
11016 return;
11017 }
11018
11019 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11020 {
11022 }
11023 }
11024 }
11025
11026
11028 {
11029 super.OnRightClick();
11030
11032 {
11034 {
11035 if (ScriptInputUserData.CanStoreInputUserData())
11036 {
11037 EntityAI root = GetHierarchyRoot();
11038 Man playerOwner = GetHierarchyRootPlayer();
11039 InventoryLocation dst = new InventoryLocation;
11040
11041
11042 if (!playerOwner && root && root == this)
11043 {
11045 }
11046 else
11047 {
11048
11049 GetInventory().GetCurrentInventoryLocation(dst);
11051 {
11052 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
11054 {
11056 }
11057 else
11058 {
11060
11061
11062 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
11063 {
11065 }
11066 else
11067 {
11068 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11069 }
11070 }
11071 }
11072 }
11073
11074 ScriptInputUserData ctx = new ScriptInputUserData;
11082 }
11083 }
11084 else if (!
g_Game.IsMultiplayer())
11085 {
11087 }
11088 }
11089 }
11090
11092 {
11093 if (root)
11094 {
11095 vector m4[4];
11096 root.GetTransform(m4);
11097 dst.SetGround(this, m4);
11098 }
11099 else
11100 {
11101 GetInventory().GetCurrentInventoryLocation(dst);
11102 }
11103 }
11104
11105 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
11106 {
11107
11108 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
11109 return false;
11110
11111 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11112 return false;
11113
11114
11116 return false;
11117
11118
11119 Magazine mag = Magazine.Cast(this);
11120 if (mag)
11121 {
11122 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11123 return false;
11124
11125 if (stack_max_limit)
11126 {
11127 Magazine other_mag = Magazine.Cast(other_item);
11128 if (other_item)
11129 {
11130 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11131 return false;
11132 }
11133
11134 }
11135 }
11136 else
11137 {
11138
11140 return false;
11141
11143 return false;
11144 }
11145
11146 PlayerBase player = null;
11147 if (CastTo(player, GetHierarchyRootPlayer()))
11148 {
11149 if (player.GetInventory().HasAttachment(this))
11150 return false;
11151
11152 if (player.IsItemsToDelete())
11153 return false;
11154 }
11155
11156 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11157 return false;
11158
11159 int slotID;
11161 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11162 return false;
11163
11164 return true;
11165 }
11166
11168 {
11170 }
11171
11173 {
11174 return m_IsResultOfSplit;
11175 }
11176
11178 {
11179 m_IsResultOfSplit = value;
11180 }
11181
11183 {
11185 }
11186
11188 {
11189 float other_item_quantity = other_item.GetQuantity();
11190 float this_free_space;
11191
11193
11195
11196 if (other_item_quantity > this_free_space)
11197 {
11198 return this_free_space;
11199 }
11200 else
11201 {
11202 return other_item_quantity;
11203 }
11204 }
11205
11207 {
11209 }
11210
11212 {
11214 return;
11215
11216 if (!IsMagazine() && other_item)
11217 {
11219 if (quantity_used != 0)
11220 {
11221 float hp1 = GetHealth01("","");
11222 float hp2 = other_item.GetHealth01("","");
11223 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
11224 hpResult = hpResult / (
GetQuantity() + quantity_used);
11225
11226 hpResult *= GetMaxHealth();
11227 Math.Round(hpResult);
11228 SetHealth("", "Health", hpResult);
11229
11231 other_item.AddQuantity(-quantity_used);
11232 }
11233 }
11235 }
11236
11238 {
11239 #ifdef SERVER
11240 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11241 GetHierarchyParent().IncreaseLifetimeUp();
11242 #endif
11243 };
11244
11246 {
11247 PlayerBase p = PlayerBase.Cast(player);
11248
11249 array<int> recipesIds = p.m_Recipes;
11250 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11251 if (moduleRecipesManager)
11252 {
11253 EntityAI itemInHands = player.GetEntityInHands();
11254 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
11255 }
11256
11257 for (int i = 0;i < recipesIds.Count(); i++)
11258 {
11259 int key = recipesIds.Get(i);
11260 string recipeName = moduleRecipesManager.GetRecipeName(key);
11262 }
11263 }
11264
11265
11266 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11267 {
11268 super.GetDebugActions(outputList);
11269
11270
11276
11277
11282
11287
11288
11292
11293
11295 {
11299 }
11300
11303
11304
11308
11310
11311 InventoryLocation loc = new InventoryLocation();
11312 GetInventory().GetCurrentInventoryLocation(loc);
11314 {
11315 if (Gizmo_IsSupported())
11318 }
11319
11321 }
11322
11323
11324
11325
11327 {
11328 super.OnAction(action_id, player, ctx);
11329
11331 {
11332 switch (action_id)
11333 {
11337 return true;
11341 return true;
11342 }
11343 }
11344
11346 {
11347 switch (action_id)
11348 {
11350 Delete();
11351 return true;
11352 }
11353 }
11354
11355 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
11356 {
11357 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
11358 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
11359 PlayerBase p = PlayerBase.Cast(player);
11360 if (
EActions.RECIPES_RANGE_START < 1000)
11361 {
11362 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11363 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11364 }
11365 }
11366 #ifndef SERVER
11367 else if (action_id ==
EActions.WATCH_PLAYER)
11368 {
11369 PluginDeveloper.SetDeveloperItemClientEx(player);
11370 }
11371 #endif
11373 {
11374 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11375 {
11376 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11377 OnDebugButtonPressServer(id + 1);
11378 }
11379
11380 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11381 {
11382 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11384 }
11385
11386 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11387 {
11388 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11390 }
11391
11392 else if (action_id ==
EActions.ADD_QUANTITY)
11393 {
11394 if (IsMagazine())
11395 {
11396 Magazine mag = Magazine.Cast(this);
11397 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11398 }
11399 else
11400 {
11402 }
11403
11404 if (m_EM)
11405 {
11406 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11407 }
11408
11409 }
11410
11411 else if (action_id ==
EActions.REMOVE_QUANTITY)
11412 {
11413 if (IsMagazine())
11414 {
11415 Magazine mag2 = Magazine.Cast(this);
11416 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11417 }
11418 else
11419 {
11421 }
11422 if (m_EM)
11423 {
11424 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11425 }
11426
11427 }
11428
11429 else if (action_id ==
EActions.SET_QUANTITY_0)
11430 {
11432
11433 if (m_EM)
11434 {
11435 m_EM.SetEnergy(0);
11436 }
11437 }
11438
11439 else if (action_id ==
EActions.SET_MAX_QUANTITY)
11440 {
11442
11443 if (m_EM)
11444 {
11445 m_EM.SetEnergy(m_EM.GetEnergyMax());
11446 }
11447 }
11448
11449 else if (action_id ==
EActions.ADD_HEALTH)
11450 {
11451 AddHealth("","",GetMaxHealth("","Health")/5);
11452 }
11453 else if (action_id ==
EActions.REMOVE_HEALTH)
11454 {
11455 AddHealth("","",-GetMaxHealth("","Health")/5);
11456 }
11457 else if (action_id ==
EActions.DESTROY_HEALTH)
11458 {
11459 SetHealth01("","",0);
11460 }
11461 else if (action_id ==
EActions.WATCH_ITEM)
11462 {
11464 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
11465 #ifdef DEVELOPER
11466 SetDebugDeveloper_item(this);
11467 #endif
11468 }
11469
11470 else if (action_id ==
EActions.ADD_TEMPERATURE)
11471 {
11472 AddTemperature(20);
11473
11474 }
11475
11476 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
11477 {
11478 AddTemperature(-20);
11479
11480 }
11481
11482 else if (action_id ==
EActions.FLIP_FROZEN)
11483 {
11484 SetFrozen(!GetIsFrozen());
11485
11486 }
11487
11488 else if (action_id ==
EActions.ADD_WETNESS)
11489 {
11491
11492 }
11493
11494 else if (action_id ==
EActions.REMOVE_WETNESS)
11495 {
11497
11498 }
11499
11500 else if (action_id ==
EActions.LIQUIDTYPE_UP)
11501 {
11504
11505
11506 }
11507
11508 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11509 {
11512 }
11513
11514 else if (action_id ==
EActions.MAKE_SPECIAL)
11515 {
11516 auto debugParams = DebugSpawnParams.WithPlayer(player);
11517 OnDebugSpawnEx(debugParams);
11518 }
11519
11520 }
11521
11522
11523 return false;
11524 }
11525
11526
11527
11528
11532
11535
11536
11537
11539 {
11540 return false;
11541 }
11542
11543
11545 {
11546 return true;
11547 }
11548
11549
11551 {
11552 return true;
11553 }
11554
11555
11556
11558 {
11559 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11560 return g_Game.ConfigIsExisting(config_path);
11561 }
11562
11565 {
11566 return null;
11567 }
11568
11570 {
11571 return false;
11572 }
11573
11575 {
11576 return false;
11577 }
11578
11582
11583
11585 {
11586 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11587 return module_repairing.CanRepair(this, item_repair_kit);
11588 }
11589
11590
11591 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11592 {
11593 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11594 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11595 }
11596
11597
11599 {
11600
11601
11602
11603
11604
11605
11606
11607
11608 return 1;
11609 }
11610
11611
11612
11614 {
11616 }
11617
11618
11619
11621 {
11623 }
11624
11625
11634 {
11635 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11636
11637 if (player)
11638 {
11639 player.MessageStatus(text);
11640 }
11641 }
11642
11643
11652 {
11653 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11654
11655 if (player)
11656 {
11657 player.MessageAction(text);
11658 }
11659 }
11660
11661
11670 {
11671 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11672
11673 if (player)
11674 {
11675 player.MessageFriendly(text);
11676 }
11677 }
11678
11679
11688 {
11689 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11690
11691 if (player)
11692 {
11693 player.MessageImportant(text);
11694 }
11695 }
11696
11698 {
11699 return true;
11700 }
11701
11702
11703 override bool KindOf(
string tag)
11704 {
11705 bool found = false;
11706 string item_name = this.
GetType();
11708 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11709
11710 int array_size = item_tag_array.Count();
11711 for (int i = 0; i < array_size; i++)
11712 {
11713 if (item_tag_array.Get(i) == tag)
11714 {
11715 found = true;
11716 break;
11717 }
11718 }
11719 return found;
11720 }
11721
11722
11724 {
11725
11726 super.OnRPC(sender, rpc_type,ctx);
11727
11728
11729 switch (rpc_type)
11730 {
11731 #ifndef SERVER
11732 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11733 Param2<bool, string> p = new Param2<bool, string>(false, "");
11734
11736 return;
11737
11738 bool play = p.param1;
11739 string soundSet = p.param2;
11740
11741 if (play)
11742 {
11744 {
11746 {
11748 }
11749 }
11750 else
11751 {
11753 }
11754 }
11755 else
11756 {
11758 }
11759
11760 break;
11761 #endif
11762
11763 }
11764
11766 {
11768 }
11769 }
11770
11771
11772
11773
11775 {
11776 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11777 return plugin.GetID(
name);
11778 }
11779
11781 {
11782 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11783 return plugin.GetName(id);
11784 }
11785
11788 {
11789
11790
11791 int varFlags;
11792 if (!ctx.
Read(varFlags))
11793 return;
11794
11795 if (varFlags & ItemVariableFlags.FLOAT)
11796 {
11798 }
11799 }
11800
11802 {
11803
11804 super.SerializeNumericalVars(floats_out);
11805
11806
11807
11809 {
11811 }
11812
11814 {
11816 }
11817
11819 {
11821 }
11822
11824 {
11829 }
11830
11832 {
11834 }
11835 }
11836
11838 {
11839
11840 super.DeSerializeNumericalVars(floats);
11841
11842
11843 int index = 0;
11844 int mask = Math.Round(floats.Get(index));
11845
11846 index++;
11847
11849 {
11851 {
11853 }
11854 else
11855 {
11856 float quantity = floats.Get(index);
11857 SetQuantity(quantity,
true,
false,
false,
false);
11858 }
11859 index++;
11860 }
11861
11863 {
11864 float wet = floats.Get(index);
11866 index++;
11867 }
11868
11870 {
11871 int liquidtype = Math.Round(floats.Get(index));
11873 index++;
11874 }
11875
11877 {
11879 index++;
11881 index++;
11883 index++;
11885 index++;
11886 }
11887
11889 {
11890 int cleanness = Math.Round(floats.Get(index));
11892 index++;
11893 }
11894 }
11895
11897 {
11898 super.WriteVarsToCTX(ctx);
11899
11900
11902 {
11904 }
11905
11907 {
11909 }
11910
11912 {
11914 }
11915
11917 {
11918 int r,g,b,a;
11924 }
11925
11927 {
11929 }
11930 }
11931
11933 {
11934 if (!super.ReadVarsFromCTX(ctx,version))
11935 return false;
11936
11937 int intValue;
11938 float value;
11939
11940 if (version < 140)
11941 {
11942 if (!ctx.
Read(intValue))
11943 return false;
11944
11945 m_VariablesMask = intValue;
11946 }
11947
11949 {
11950 if (!ctx.
Read(value))
11951 return false;
11952
11954 {
11956 }
11957 else
11958 {
11960 }
11961 }
11962
11963 if (version < 140)
11964 {
11966 {
11967 if (!ctx.
Read(value))
11968 return false;
11969 SetTemperatureDirect(value);
11970 }
11971 }
11972
11974 {
11975 if (!ctx.
Read(value))
11976 return false;
11978 }
11979
11981 {
11982 if (!ctx.
Read(intValue))
11983 return false;
11985 }
11986
11988 {
11989 int r,g,b,a;
11991 return false;
11993 return false;
11995 return false;
11997 return false;
11998
12000 }
12001
12003 {
12004 if (!ctx.
Read(intValue))
12005 return false;
12007 }
12008
12009 if (version >= 138 && version < 140)
12010 {
12012 {
12013 if (!ctx.
Read(intValue))
12014 return false;
12015 SetFrozen(intValue);
12016 }
12017 }
12018
12019 return true;
12020 }
12021
12022
12024 {
12027 {
12029 }
12030
12031 if (!super.OnStoreLoad(ctx, version))
12032 {
12034 return false;
12035 }
12036
12037 if (version >= 114)
12038 {
12039 bool hasQuickBarIndexSaved;
12040
12041 if (!ctx.
Read(hasQuickBarIndexSaved))
12042 {
12044 return false;
12045 }
12046
12047 if (hasQuickBarIndexSaved)
12048 {
12049 int itmQBIndex;
12050
12051
12052 if (!ctx.
Read(itmQBIndex))
12053 {
12055 return false;
12056 }
12057
12058 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12059 if (itmQBIndex != -1 && parentPlayer)
12060 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12061 }
12062 }
12063 else
12064 {
12065
12066 PlayerBase player;
12067 int itemQBIndex;
12068 if (version ==
int.
MAX)
12069 {
12070 if (!ctx.
Read(itemQBIndex))
12071 {
12073 return false;
12074 }
12075 }
12076 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12077 {
12078
12079 if (!ctx.
Read(itemQBIndex))
12080 {
12082 return false;
12083 }
12084 if (itemQBIndex != -1 && player)
12085 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12086 }
12087 }
12088
12089 if (version < 140)
12090 {
12091
12092 if (!LoadVariables(ctx, version))
12093 {
12095 return false;
12096 }
12097 }
12098
12099
12101 {
12103 return false;
12104 }
12105 if (version >= 132)
12106 {
12108 if (raib)
12109 {
12111 {
12113 return false;
12114 }
12115 }
12116 }
12117
12119 return true;
12120 }
12121
12122
12123
12125 {
12126 super.OnStoreSave(ctx);
12127
12128 PlayerBase player;
12129 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12130 {
12132
12133 int itemQBIndex = -1;
12134 itemQBIndex = player.FindQuickBarEntityIndex(this);
12135 ctx.
Write(itemQBIndex);
12136 }
12137 else
12138 {
12140 }
12141
12143
12145 if (raib)
12146 {
12148 }
12149 }
12150
12151
12153 {
12154 super.AfterStoreLoad();
12155
12157 {
12159 }
12160
12162 {
12165 }
12166 }
12167
12169 {
12170 super.EEOnAfterLoad();
12171
12173 {
12175 }
12176
12179 }
12180
12182 {
12183 return false;
12184 }
12185
12186
12187
12189 {
12191 {
12192 #ifdef PLATFORM_CONSOLE
12193
12195 {
12197 if (menu)
12198 {
12200 }
12201 }
12202 #endif
12203 }
12204
12206 {
12209 }
12210
12212 {
12213 SetWeightDirty();
12215 }
12217 {
12220 }
12221
12223 {
12226
12229 }
12231 {
12235 }
12236
12237 super.OnVariablesSynchronized();
12238 }
12239
12240
12241
12243 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
12244 {
12245 if (!IsServerCheck(allow_client))
12246 return false;
12247
12249 return false;
12250
12253
12254 if (value <= (min + 0.001))
12255 value = min;
12256
12257 if (value == min)
12258 {
12259 if (destroy_config)
12260 {
12261 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12262 if (dstr)
12263 {
12265 this.Delete();
12266 return true;
12267 }
12268 }
12269 else if (destroy_forced)
12270 {
12272 this.Delete();
12273 return true;
12274 }
12275
12277 }
12278
12281
12283 {
12284 EntityAI parent = GetHierarchyRoot();
12285 InventoryLocation iLoc = new InventoryLocation();
12286 GetInventory().GetCurrentInventoryLocation(iLoc);
12288 {
12289 int iLocSlot = iLoc.
GetSlot();
12291 {
12293 }
12295 {
12297 }
12298 }
12299 }
12300
12302 {
12304
12305 if (delta)
12307 }
12308
12310
12311 return false;
12312 }
12313
12314
12316 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12317 {
12319 }
12320
12322 {
12325 }
12326
12328 {
12331 }
12332
12334 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
12335 {
12336 float value_clamped = Math.Clamp(value, 0, 1);
12338 SetQuantity(result, destroy_config, destroy_forced);
12339 }
12340
12341
12344 {
12346 }
12347
12349 {
12351 }
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12363 {
12364 int slot = -1;
12365 GameInventory inventory = GetInventory();
12366 if (inventory)
12367 {
12368 InventoryLocation il = new InventoryLocation;
12371 }
12372
12374 }
12375
12377 {
12378 float quantity_max = 0;
12379
12381 {
12382 if (attSlotID != -1)
12383 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12384
12385 if (quantity_max <= 0)
12387 }
12388
12389 if (quantity_max <= 0)
12391
12392 return quantity_max;
12393 }
12394
12396 {
12398 }
12399
12401 {
12403 }
12404
12405
12407 {
12409 }
12410
12412 {
12414 }
12415
12417 {
12419 }
12420
12421
12423 {
12424
12425 float weightEx = GetWeightEx();
12426 float special = GetInventoryAndCargoWeight();
12427 return weightEx - special;
12428 }
12429
12430
12432 {
12434 }
12435
12437 {
12439 {
12440 #ifdef DEVELOPER
12441 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12442 {
12443 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12445 }
12446 #endif
12447
12448 return GetQuantity() * GetConfigWeightModified();
12449 }
12450 else if (HasEnergyManager())
12451 {
12452 #ifdef DEVELOPER
12453 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12454 {
12455 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12456 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
12457 }
12458 #endif
12459 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12460 }
12461 else
12462 {
12463 #ifdef DEVELOPER
12464 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12465 {
12466 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12467 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
12468 }
12469 #endif
12470 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
12471 }
12472 }
12473
12476 {
12477 int item_count = 0;
12479
12480 GameInventory inventory = GetInventory();
12481 CargoBase cargo = inventory.
GetCargo();
12482 if (cargo != NULL)
12483 {
12485 }
12486
12488 for (int i = 0; i < nAttachments; ++i)
12489 {
12491 if (item)
12492 item_count += item.GetNumberOfItems();
12493 }
12494 return item_count;
12495 }
12496
12499 {
12500 float weight = 0;
12501 float wetness = 1;
12502 if (include_wetness)
12505 {
12506 weight = wetness * m_ConfigWeight;
12507 }
12509 {
12510 weight = 1;
12511 }
12512 return weight;
12513 }
12514
12515
12516
12518 {
12519 GameInventory inventory = GetInventory();
12520 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12521 {
12522 array<EntityAI> items = new array<EntityAI>;
12524 for (int i = 0; i < items.Count(); ++i)
12525 {
12527 if (item)
12528 {
12529 g_Game.ObjectDelete(item);
12530 }
12531 }
12532 }
12533 }
12534
12535
12536
12537
12539 {
12540 float energy = 0;
12541 if (HasEnergyManager())
12542 {
12543 energy = GetCompEM().GetEnergy();
12544 }
12545 return energy;
12546 }
12547
12548
12550 {
12551 super.OnEnergyConsumed();
12552
12554 }
12555
12557 {
12558 super.OnEnergyAdded();
12559
12561 }
12562
12563
12565 {
12566 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12567 {
12569 {
12570 float energy_0to1 = GetCompEM().GetEnergy0To1();
12572 }
12573 }
12574 }
12575
12576
12578 {
12579 return ConfigGetFloat("heatIsolation");
12580 }
12581
12583 {
12585 }
12586
12588 {
12589 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12590 if (
g_Game.ConfigIsExisting(paramPath))
12591 return g_Game.ConfigGetFloat(paramPath);
12592
12593 return 0.0;
12594 }
12595
12597 {
12598 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12599 if (
g_Game.ConfigIsExisting(paramPath))
12600 return g_Game.ConfigGetFloat(paramPath);
12601
12602 return 0.0;
12603 }
12604
12605 override void SetWet(
float value,
bool allow_client =
false)
12606 {
12607 if (!IsServerCheck(allow_client))
12608 return;
12609
12612
12614
12615 m_VarWet = Math.Clamp(value, min, max);
12616
12618 {
12621 }
12622 }
12623
12624 override void AddWet(
float value)
12625 {
12627 }
12628
12630 {
12632 }
12633
12635 {
12637 }
12638
12640 {
12642 }
12643
12645 {
12647 }
12648
12650 {
12652 }
12653
12654 override void OnWetChanged(
float newVal,
float oldVal)
12655 {
12658 if (newLevel != oldLevel)
12659 {
12661 }
12662 }
12663
12665 {
12666 SetWeightDirty();
12667 }
12668
12670 {
12671 return GetWetLevelInternal(
m_VarWet);
12672 }
12673
12674
12675
12677 {
12679 }
12680
12682 {
12684 }
12685
12687 {
12689 }
12690
12692 {
12694 }
12695
12696
12697
12699 {
12700 if (ConfigIsExisting("itemModelLength"))
12701 {
12702 return ConfigGetFloat("itemModelLength");
12703 }
12704 return 0;
12705 }
12706
12708 {
12709 if (ConfigIsExisting("itemAttachOffset"))
12710 {
12711 return ConfigGetFloat("itemAttachOffset");
12712 }
12713 return 0;
12714 }
12715
12716 override void SetCleanness(
int value,
bool allow_client =
false)
12717 {
12718 if (!IsServerCheck(allow_client))
12719 return;
12720
12722
12724
12727 }
12728
12730 {
12732 }
12733
12735 {
12736 return true;
12737 }
12738
12739
12740
12741
12743 {
12745 }
12746
12748 {
12750 }
12751
12752
12753
12754
12755 override void SetColor(
int r,
int g,
int b,
int a)
12756 {
12762 }
12764 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12765 {
12770 }
12771
12773 {
12775 }
12776
12779 {
12780 int r,g,b,a;
12782 r = r/255;
12783 g = g/255;
12784 b = b/255;
12785 a = a/255;
12786 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12787 }
12788
12789
12790
12791 override void SetLiquidType(
int value,
bool allow_client =
false)
12792 {
12793 if (!IsServerCheck(allow_client))
12794 return;
12795
12800 }
12801
12803 {
12804 return ConfigGetInt("varLiquidTypeInit");
12805 }
12806
12808 {
12810 }
12811
12813 {
12815 SetFrozen(false);
12816 }
12817
12820 {
12821 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12822 }
12823
12824
12827 {
12828 PlayerBase nplayer;
12829 if (PlayerBase.CastTo(nplayer, player))
12830 {
12832 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12833 }
12834 }
12835
12836
12839 {
12840 PlayerBase nplayer;
12841 if (PlayerBase.CastTo(nplayer,player))
12842 {
12843 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12844 }
12845
12846 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12847
12848 if (HasEnergyManager())
12849 {
12850 GetCompEM().UpdatePlugState();
12851 }
12852 }
12853
12854
12856 {
12857 super.OnPlacementStarted(player);
12858
12860 }
12861
12862 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12863 {
12865 {
12866 m_AdminLog.OnPlacementComplete(player,
this);
12867 }
12868
12869 super.OnPlacementComplete(player, position, orientation);
12870 }
12871
12872
12873
12874
12875
12877 {
12879 {
12880 return true;
12881 }
12882 else
12883 {
12884 return false;
12885 }
12886 }
12887
12888
12890 {
12892 {
12894 }
12895 }
12896
12897
12899 {
12901 }
12902
12904 {
12906 }
12907
12908 override void InsertAgent(
int agent,
float count = 1)
12909 {
12910 if (count < 1)
12911 return;
12912
12914 }
12915
12918 {
12920 }
12921
12922
12924 {
12926 }
12927
12928
12929
12930
12931
12932
12933
12934
12935
12936
12937
12938
12939
12940
12941
12942
12943
12944
12945
12946
12947
12948
12949
12950
12951
12952
12953
12954
12955
12956
12957
12958
12959
12960
12961
12962
12963
12964
12965
12966
12967
12968
12970 {
12972 return false;
12973 return true;
12974 }
12975
12977 {
12978
12980 }
12981
12982
12985 {
12986 super.CheckForRoofLimited(timeTresholdMS);
12987
12988 float time =
g_Game.GetTime();
12989 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12990 {
12991 m_PreviousRoofTestTime = time;
12992 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12993 }
12994 }
12995
12996
12998 {
13000 {
13001 return 0;
13002 }
13003
13004 if (GetInventory().GetAttachmentSlotsCount() != 0)
13005 {
13006 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
13007 if (filter)
13008 return filter.GetProtectionLevel(type, false, system);
13009 else
13010 return 0;
13011 }
13012
13013 string subclassPath, entryName;
13014
13015 switch (type)
13016 {
13018 entryName = "biological";
13019 break;
13021 entryName = "chemical";
13022 break;
13023 default:
13024 entryName = "biological";
13025 break;
13026 }
13027
13028 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
13029
13030 return g_Game.ConfigGetFloat(subclassPath + entryName);
13031 }
13032
13033
13034
13037 {
13038 if (!IsMagazine())
13040
13042 }
13043
13044
13045
13046
13047
13052 {
13053 return true;
13054 }
13055
13057 {
13059 }
13060
13061
13062
13063
13064
13066 {
13067 if (parent)
13068 {
13069 if (parent.IsInherited(DayZInfected))
13070 return true;
13071
13072 if (!parent.IsRuined())
13073 return true;
13074 }
13075
13076 return true;
13077 }
13078
13080 {
13081 if (!super.CanPutAsAttachment(parent))
13082 {
13083 return false;
13084 }
13085
13086 if (!IsRuined() && !parent.IsRuined())
13087 {
13088 return true;
13089 }
13090
13091 return false;
13092 }
13093
13095 {
13096
13097
13098
13099
13100 return super.CanReceiveItemIntoCargo(item);
13101 }
13102
13104 {
13105
13106
13107
13108
13109 GameInventory attachmentInv = attachment.GetInventory();
13111 {
13112 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13113 return false;
13114 }
13115
13116 InventoryLocation loc = new InventoryLocation();
13117 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13118 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
13119 return false;
13120
13121 return super.CanReceiveAttachment(attachment, slotId);
13122 }
13123
13125 {
13126 if (!super.CanReleaseAttachment(attachment))
13127 return false;
13128
13129 return GetInventory().AreChildrenAccessible();
13130 }
13131
13132
13133
13134
13135
13136
13137
13138
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13153 {
13154 int id = muzzle_owner.GetMuzzleID();
13155 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
13156
13157 if (WPOF_array)
13158 {
13159 for (int i = 0; i < WPOF_array.Count(); i++)
13160 {
13161 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13162
13163 if (WPOF)
13164 {
13165 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13166 }
13167 }
13168 }
13169 }
13170
13171
13173 {
13174 int id = muzzle_owner.GetMuzzleID();
13176
13177 if (WPOBE_array)
13178 {
13179 for (int i = 0; i < WPOBE_array.Count(); i++)
13180 {
13181 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13182
13183 if (WPOBE)
13184 {
13185 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13186 }
13187 }
13188 }
13189 }
13190
13191
13193 {
13194 int id = muzzle_owner.GetMuzzleID();
13195 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13196
13197 if (WPOOH_array)
13198 {
13199 for (int i = 0; i < WPOOH_array.Count(); i++)
13200 {
13201 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13202
13203 if (WPOOH)
13204 {
13205 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13206 }
13207 }
13208 }
13209 }
13210
13211
13213 {
13214 int id = muzzle_owner.GetMuzzleID();
13215 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13216
13217 if (WPOOH_array)
13218 {
13219 for (int i = 0; i < WPOOH_array.Count(); i++)
13220 {
13221 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13222
13223 if (WPOOH)
13224 {
13225 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13226 }
13227 }
13228 }
13229 }
13230
13231
13233 {
13234 int id = muzzle_owner.GetMuzzleID();
13235 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13236
13237 if (WPOOH_array)
13238 {
13239 for (int i = 0; i < WPOOH_array.Count(); i++)
13240 {
13241 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13242
13243 if (WPOOH)
13244 {
13245 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13246 }
13247 }
13248 }
13249 }
13250
13251
13252
13254 {
13256 {
13257 return true;
13258 }
13259
13260 return false;
13261 }
13262
13264 {
13266 {
13267 return true;
13268 }
13269
13270 return false;
13271 }
13272
13274 {
13276 {
13277 return true;
13278 }
13279
13280 return false;
13281 }
13282
13284 {
13285 return false;
13286 }
13287
13290 {
13291 return UATimeSpent.DEFAULT_DEPLOY;
13292 }
13293
13294
13295
13296
13298 {
13300 SetSynchDirty();
13301 }
13302
13304 {
13306 }
13307
13308
13310 {
13311 return false;
13312 }
13313
13316 {
13317 string att_type = "None";
13318
13319 if (ConfigIsExisting("soundAttType"))
13320 {
13321 att_type = ConfigGetString("soundAttType");
13322 }
13323
13325 }
13326
13328 {
13330 }
13331
13332
13333
13334
13335
13341
13343 {
13346
13348 }
13349
13350
13352 {
13354 return;
13355
13357
13360
13363
13364 SoundParameters params = new SoundParameters();
13368 }
13369
13370
13372 {
13374 {
13377
13378 SetSynchDirty();
13379
13382 }
13383 }
13384
13386 {
13388 }
13389
13390
13392 {
13394 return;
13395
13397 SetSynchDirty();
13398
13401 }
13402
13404 {
13407 }
13408
13410 {
13412 }
13413
13414 void OnApply(PlayerBase player);
13415
13417 {
13418 return 1.0;
13419 };
13420
13422 {
13424 }
13425
13427 {
13429 }
13430
13432
13434 {
13435 SetDynamicPhysicsLifeTime(0.01);
13437 }
13438
13440 {
13441 array<string> zone_names = new array<string>;
13442 GetDamageZones(zone_names);
13443 for (int i = 0; i < zone_names.Count(); i++)
13444 {
13445 SetHealthMax(zone_names.Get(i),"Health");
13446 }
13447 SetHealthMax("","Health");
13448 }
13449
13452 {
13453 float global_health = GetHealth01("","Health");
13454 array<string> zones = new array<string>;
13455 GetDamageZones(zones);
13456
13457 for (int i = 0; i < zones.Count(); i++)
13458 {
13459 SetHealth01(zones.Get(i),"Health",global_health);
13460 }
13461 }
13462
13465 {
13466 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13467 }
13468
13470 {
13471 if (!hasRootAsPlayer)
13472 {
13473 if (refParentIB)
13474 {
13475
13476 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
13477 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13478
13479 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
13480 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13481
13484 }
13485 else
13486 {
13487
13490 }
13491 }
13492 }
13493
13495 {
13497 {
13498 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
13499 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
13500 {
13501 float heatPermCoef = 1.0;
13503 while (ent)
13504 {
13505 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13506 ent = ent.GetHierarchyParent();
13507 }
13508
13509 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13510 }
13511 }
13512 }
13513
13515 {
13516
13517 EntityAI parent = GetHierarchyParent();
13518 if (!parent)
13519 {
13520 hasParent = false;
13521 hasRootAsPlayer = false;
13522 }
13523 else
13524 {
13525 hasParent = true;
13526 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13527 refParentIB =
ItemBase.Cast(parent);
13528 }
13529 }
13530
13531 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13532 {
13533
13534 }
13535
13537 {
13538
13539 return false;
13540 }
13541
13543 {
13544
13545
13546 return false;
13547 }
13548
13550 {
13551
13552 return false;
13553 }
13554
13557 {
13558 return !GetIsFrozen() &&
IsOpen();
13559 }
13560
13562 {
13563 bool hasParent = false, hasRootAsPlayer = false;
13565
13566 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13567 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13568
13569 if (wwtu || foodDecay)
13570 {
13574
13575 if (processWetness || processTemperature || processDecay)
13576 {
13578
13579 if (processWetness)
13580 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13581
13582 if (processTemperature)
13584
13585 if (processDecay)
13586 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13587 }
13588 }
13589 }
13590
13593 {
13595 }
13596
13598 {
13601
13602 return super.GetTemperatureFreezeThreshold();
13603 }
13604
13606 {
13609
13610 return super.GetTemperatureThawThreshold();
13611 }
13612
13614 {
13617
13618 return super.GetItemOverheatThreshold();
13619 }
13620
13622 {
13624 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13625
13626 return super.GetTemperatureFreezeTime();
13627 }
13628
13630 {
13632 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13633
13634 return super.GetTemperatureThawTime();
13635 }
13636
13641
13643 {
13644 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13645 }
13646
13648 {
13649 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13650 }
13651
13654 {
13656 }
13657
13659 {
13661 }
13662
13664 {
13666 }
13667
13670 {
13671 return null;
13672 }
13673
13676 {
13677 return false;
13678 }
13679
13681 {
13683 {
13686 if (!trg)
13687 {
13689 explosive = this;
13690 }
13691
13692 explosive.PairRemote(trg);
13694
13695 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13696 trg.SetPersistentPairID(persistentID);
13697 explosive.SetPersistentPairID(persistentID);
13698
13699 return true;
13700 }
13701 return false;
13702 }
13703
13706 {
13707 float ret = 1.0;
13710 ret *= GetHealth01();
13711
13712 return ret;
13713 }
13714
13715 #ifdef DEVELOPER
13716 override void SetDebugItem()
13717 {
13718 super.SetDebugItem();
13719 _itemBase = this;
13720 }
13721
13723 {
13724 string text = super.GetDebugText();
13725
13727 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13728
13729 return text;
13730 }
13731 #endif
13732
13734 {
13735 return true;
13736 }
13737
13739
13741
13743 {
13746 }
13747
13748
13756
13772
13773 [
Obsolete(
"Use ItemSoundHandler instead")]
13776 {
13777 if (!
g_Game.IsDedicatedServer())
13778 {
13779 if (ConfigIsExisting("attachSoundSet"))
13780 {
13781 string cfg_path = "";
13782 string soundset = "";
13783 string type_name =
GetType();
13784
13787 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13788 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13789
13790 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13791 {
13792 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13793 {
13794 if (cfg_slot_array[i] == slot_type)
13795 {
13796 soundset = cfg_soundset_array[i];
13797 break;
13798 }
13799 }
13800 }
13801
13802 if (soundset != "")
13803 {
13804 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13806 }
13807 }
13808 }
13809 }
13810
13812}
13813
13815{
13817 if (entity)
13818 {
13819 bool is_item = entity.IsInherited(
ItemBase);
13820 if (is_item && full_quantity)
13821 {
13824 }
13825 }
13826 else
13827 {
13829 return NULL;
13830 }
13831 return entity;
13832}
13833
13835{
13836 if (item)
13837 {
13838 if (health > 0)
13839 item.SetHealth("", "", health);
13840
13841 if (item.CanHaveTemperature())
13842 {
13844 if (item.CanFreeze())
13845 item.SetFrozen(false);
13846 }
13847
13848 if (item.HasEnergyManager())
13849 {
13850 if (quantity >= 0)
13851 {
13852 item.GetCompEM().SetEnergy0To1(quantity);
13853 }
13854 else
13855 {
13857 }
13858 }
13859 else if (item.IsMagazine())
13860 {
13861 Magazine mag = Magazine.Cast(item);
13862 if (quantity >= 0)
13863 {
13864 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13865 }
13866 else
13867 {
13869 }
13870
13871 }
13872 else
13873 {
13874 if (quantity >= 0)
13875 {
13876 item.SetQuantityNormalized(quantity, false);
13877 }
13878 else
13879 {
13881 }
13882
13883 }
13884 }
13885}
13886
13887#ifdef DEVELOPER
13889#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.