DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ RemoveAllAgentsExcept()

override void SpawnItemOnLocation::RemoveAllAgentsExcept ( int agent_to_keep)
protected

См. определение в файле ItemBase.c строка 8890

8895{
8896 override bool CanPutAsAttachment(EntityAI parent)
8897 {
8898 return true;
8899 }
8900};
8901
8903{
8904
8905};
8906
8907//const bool QUANTITY_DEBUG_REMOVE_ME = false;
8908
8909class ItemBase extends InventoryItem
8910{
8914
8916
8917 static int m_DebugActionsMask;
8919 // ============================================
8920 // Variable Manipulation System
8921 // ============================================
8922 // Quantity
8923
8924 float m_VarQuantity;
8925 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
8927 int m_VarQuantityMin;
8928 int m_VarQuantityMax;
8929 int m_Count;
8930 float m_VarStackMax;
8931 float m_StoreLoadedQuantity = float.LOWEST;
8932 // Wet
8933 float m_VarWet;
8934 float m_VarWetPrev;//for client to know wetness changed during synchronization
8935 float m_VarWetInit;
8936 float m_VarWetMin;
8937 float m_VarWetMax;
8938 // Cleanness
8939 int m_Cleanness;
8940 int m_CleannessInit;
8941 int m_CleannessMin;
8942 int m_CleannessMax;
8943 // impact sounds
8945 bool m_CanPlayImpactSound = true;
8946 float m_ImpactSpeed;
8948 //
8949 float m_HeatIsolation;
8950 float m_ItemModelLength;
8951 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
8953 int m_VarLiquidType;
8954 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
8955 int m_QuickBarBonus;
8956 bool m_IsBeingPlaced;
8957 bool m_IsHologram;
8958 bool m_IsTakeable;
8959 bool m_ThrowItemOnDrop;
8962 bool m_FixDamageSystemInit = false; //can be changed on storage version check
8963 bool can_this_be_combined; //Check if item can be combined
8964 bool m_CanThisBeSplit; //Check if item can be split
8965 bool m_IsStoreLoad = false;
8966 bool m_CanShowQuantity;
8967 bool m_HasQuantityBar;
8968 protected bool m_CanBeDigged;
8969 protected bool m_IsResultOfSplit
8970
8971 string m_SoundAttType;
8972 // items color variables
8977 //-------------------------------------------------------
8978
8979 // light source managing
8981
8985
8986 //==============================================
8987 // agent system
8988 private int m_AttachedAgents;
8989
8991 void TransferModifiers(PlayerBase reciever);
8992
8993
8994 // Weapons & suppressors particle effects
8998 ref static map<string, int> m_WeaponTypeToID;
8999 static int m_LastRegisteredWeaponID = 0;
9000
9001 // Overheating effects
9003 float m_OverheatingShots;
9004 ref Timer m_CheckOverheating;
9005 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
9006 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
9007 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
9008 ref array <ref OverheatingParticle> m_OverheatingParticles;
9009
9011 protected bool m_HideSelectionsBySlot;
9012
9013 // Admin Log
9014 PluginAdminLog m_AdminLog;
9015
9016 // misc
9017 ref Timer m_PhysDropTimer;
9018
9019 // Attachment Locking variables
9020 ref array<int> m_CompatibleLocks;
9021 protected int m_LockType;
9022 protected ref EffectSound m_LockingSound;
9023 protected string m_LockSoundSet;
9024
9025 // ItemSoundHandler variables
9026 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
9027 protected int m_SoundSyncPlay; // id for sound to play
9028 protected int m_SoundSyncStop; // id for sound to stop
9029 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
9030
9032
9033 //temperature
9034 private float m_TemperaturePerQuantityWeight;
9035
9036 // -------------------------------------------------------------------------
9037 void ItemBase()
9038 {
9039 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
9043
9044 if (!g_Game.IsDedicatedServer())
9045 {
9046 if (HasMuzzle())
9047 {
9049
9051 {
9053 }
9054 }
9055
9057 m_ActionsInitialize = false;
9058 }
9059
9060 m_OldLocation = null;
9061
9062 if (g_Game.IsServer())
9063 {
9064 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
9065 }
9066
9067 if (ConfigIsExisting("headSelectionsToHide"))
9068 {
9070 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
9071 }
9072
9073 m_HideSelectionsBySlot = false;
9074 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9075 {
9076 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
9077 }
9078
9079 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
9080
9081 m_IsResultOfSplit = false;
9082
9084 }
9085
9086 override void InitItemVariables()
9087 {
9088 super.InitItemVariables();
9089
9090 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
9091 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
9092 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
9093 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
9094 m_VarStackMax = ConfigGetFloat("varStackMax");
9095 m_Count = ConfigGetInt("count");
9096
9097 m_CanShowQuantity = ConfigGetBool("quantityShow");
9098 m_HasQuantityBar = ConfigGetBool("quantityBar");
9099
9100 m_CleannessInit = ConfigGetInt("varCleannessInit");
9102 m_CleannessMin = ConfigGetInt("varCleannessMin");
9103 m_CleannessMax = ConfigGetInt("varCleannessMax");
9104
9105 m_WantPlayImpactSound = false;
9106 m_ImpactSpeed = 0.0;
9107
9108 m_VarWetInit = ConfigGetFloat("varWetInit");
9110 m_VarWetMin = ConfigGetFloat("varWetMin");
9111 m_VarWetMax = ConfigGetFloat("varWetMax");
9112
9113 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
9114 if (IsLiquidContainer() && GetQuantity() != 0)
9116 m_IsBeingPlaced = false;
9117 m_IsHologram = false;
9118 m_IsTakeable = true;
9119 m_CanBeMovedOverride = false;
9123 m_CanBeDigged = ConfigGetBool("canBeDigged");
9124
9125 m_CompatibleLocks = new array<int>();
9126 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
9127 m_LockType = ConfigGetInt("lockType");
9128
9129 //Define if item can be split and set ability to be combined accordingly
9130 m_CanThisBeSplit = false;
9131 can_this_be_combined = false;
9132 if (ConfigIsExisting("canBeSplit"))
9133 {
9134 can_this_be_combined = ConfigGetBool("canBeSplit");
9136 }
9137
9138 m_ItemBehaviour = -1;
9139 if (ConfigIsExisting("itemBehaviour"))
9140 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
9141
9142 //RegisterNetSyncVariableInt("m_VariablesMask");
9143 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9144 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
9145 RegisterNetSyncVariableInt("m_VarLiquidType");
9146 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9147
9148 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9149 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9150 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9151
9152 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9153 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9154 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9155 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9156
9157 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9158 RegisterNetSyncVariableBool("m_IsTakeable");
9159 RegisterNetSyncVariableBool("m_IsHologram");
9160
9163 {
9164 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
9165 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
9166 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
9167 }
9168
9169 m_LockSoundSet = ConfigGetString("lockSoundSet");
9170
9172 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9173 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
9174
9175 m_SoundSyncSlotID = -1;
9176 }
9177
9178 override int GetQuickBarBonus()
9179 {
9180 return m_QuickBarBonus;
9181 }
9182
9183 void InitializeActions()
9184 {
9186 if (!m_InputActionMap)
9187 {
9189 m_InputActionMap = iam;
9190 SetActions();
9192 }
9193 }
9194
9195 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
9196 {
9198 {
9199 m_ActionsInitialize = true;
9201 }
9202
9203 actions = m_InputActionMap.Get(action_input_type);
9204 }
9205
9206 void SetActions()
9207 {
9208 AddAction(ActionTakeItem);
9209 AddAction(ActionTakeItemToHands);
9210 AddAction(ActionWorldCraft);
9212 AddAction(ActionAttachWithSwitch);
9213 }
9214
9215 void SetActionAnimOverrides(); // Override action animation for specific item
9216
9217 void AddAction(typename actionName)
9218 {
9219 ActionBase action = ActionManagerBase.GetAction(actionName);
9220
9221 if (!action)
9222 {
9223 Debug.LogError("Action " + actionName + " dosn't exist!");
9224 return;
9225 }
9226
9227 typename ai = action.GetInputType();
9228 if (!ai)
9229 {
9230 m_ActionsInitialize = false;
9231 return;
9232 }
9233
9234 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9235 if (!action_array)
9236 {
9237 action_array = new array<ActionBase_Basic>;
9238 m_InputActionMap.Insert(ai, action_array);
9239 }
9240 if (LogManager.IsActionLogEnable())
9241 {
9242 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
9243 }
9244
9245 if (action_array.Find(action) != -1)
9246 {
9247 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
9248 }
9249 else
9250 {
9251 action_array.Insert(action);
9252 }
9253 }
9254
9255 void RemoveAction(typename actionName)
9256 {
9257 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9258 ActionBase action = player.GetActionManager().GetAction(actionName);
9259 typename ai = action.GetInputType();
9260 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9261
9262 if (action_array)
9263 {
9264 action_array.RemoveItem(action);
9265 }
9266 }
9267
9268 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
9269 // Set -1 for params which should stay in default state
9270 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
9271 {
9272 ActionOverrideData overrideData = new ActionOverrideData();
9273 overrideData.m_CommandUID = commandUID;
9274 overrideData.m_CommandUIDProne = commandUIDProne;
9275 overrideData.m_StanceMask = stanceMask;
9276
9277 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
9278 if (!actionMap) // create new map of action > overidables map
9279 {
9280 actionMap = new TActionAnimOverrideMap();
9281 m_ItemActionOverrides.Insert(action, actionMap);
9282 }
9283
9284 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
9285
9286 }
9287
9288 void OnItemInHandsPlayerSwimStart(PlayerBase player);
9289
9290 ScriptedLightBase GetLight();
9291
9292 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9293 void LoadParticleConfigOnFire(int id)
9294 {
9295 if (!m_OnFireEffect)
9297
9300
9301 string config_to_search = "CfgVehicles";
9302 string muzzle_owner_config;
9303
9304 if (!m_OnFireEffect.Contains(id))
9305 {
9306 if (IsInherited(Weapon))
9307 config_to_search = "CfgWeapons";
9308
9309 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9310
9311 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9312
9313 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
9314
9315 if (config_OnFire_subclass_count > 0)
9316 {
9317 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9318
9319 for (int i = 0; i < config_OnFire_subclass_count; i++)
9320 {
9321 string particle_class = "";
9322 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9323 string config_OnFire_entry = config_OnFire_class + particle_class;
9324 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9325 WPOF_array.Insert(WPOF);
9326 }
9327
9328
9329 m_OnFireEffect.Insert(id, WPOF_array);
9330 }
9331 }
9332
9333 if (!m_OnBulletCasingEjectEffect.Contains(id))
9334 {
9335 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
9336 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9337
9338 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9339
9340 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9341
9342 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9343 {
9344 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9345
9346 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9347 {
9348 string particle_class2 = "";
9349 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9350 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9351 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9352 WPOBE_array.Insert(WPOBE);
9353 }
9354
9355
9356 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
9357 }
9358 }
9359 }
9360
9361 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9363 {
9366
9367 if (!m_OnOverheatingEffect.Contains(id))
9368 {
9369 string config_to_search = "CfgVehicles";
9370
9371 if (IsInherited(Weapon))
9372 config_to_search = "CfgWeapons";
9373
9374 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
9375 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9376
9377 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
9378 {
9379
9380 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
9381
9383 {
9384 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
9385 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9386 Error(error);
9387 return;
9388 }
9389
9390 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
9391 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
9392
9393
9394
9395 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9396 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9397
9398 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9399 {
9400 string particle_class = "";
9401 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9402 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9403 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
9404
9405 if (entry_type == CT_CLASS)
9406 {
9407 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9408 WPOOH_array.Insert(WPOF);
9409 }
9410 }
9411
9412
9413 m_OnOverheatingEffect.Insert(id, WPOOH_array);
9414 }
9415 }
9416 }
9417
9418 float GetOverheatingValue()
9419 {
9420 return m_OverheatingShots;
9421 }
9422
9423 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9424 {
9425 if (m_MaxOverheatingValue > 0)
9426 {
9428
9429 if (!m_CheckOverheating)
9431
9433 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9434
9435 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9436 }
9437 }
9438
9439 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9440 {
9442 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9443
9445 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9446
9448 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9449
9451 {
9453 }
9454 }
9455
9457 {
9459 }
9460
9461 void OnOverheatingDecay()
9462 {
9463 if (m_MaxOverheatingValue > 0)
9464 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9465 else
9467
9468 if (m_OverheatingShots <= 0)
9469 {
9472 }
9473 else
9474 {
9475 if (!m_CheckOverheating)
9477
9479 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9480 }
9481
9482 CheckOverheating(this, "", this);
9483 }
9484
9485 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9486 {
9488 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9489 }
9490
9491 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9492 {
9494 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9496 }
9497
9498 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9499 {
9501 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9502 }
9503
9504 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9505 {
9507 m_OverheatingParticles = new array<ref OverheatingParticle>;
9508
9509 OverheatingParticle OP = new OverheatingParticle();
9510 OP.RegisterParticle(p);
9511 OP.SetOverheatingLimitMin(min_heat_coef);
9512 OP.SetOverheatingLimitMax(max_heat_coef);
9513 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9514
9515 m_OverheatingParticles.Insert(OP);
9516 }
9517
9518 float GetOverheatingCoef()
9519 {
9520 if (m_MaxOverheatingValue > 0)
9522
9523 return -1;
9524 }
9525
9527 {
9529 {
9530 float overheat_coef = GetOverheatingCoef();
9531 int count = m_OverheatingParticles.Count();
9532
9533 for (int i = count; i > 0; --i)
9534 {
9535 int id = i - 1;
9536 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9537 Particle p = OP.GetParticle();
9538
9539 float overheat_min = OP.GetOverheatingLimitMin();
9540 float overheat_max = OP.GetOverheatingLimitMax();
9541
9542 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9543 {
9544 if (p)
9545 {
9546 p.Stop();
9547 OP.RegisterParticle(null);
9548 }
9549 }
9550 }
9551 }
9552 }
9553
9555 {
9557 {
9558 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9559 {
9560 int id = i - 1;
9561 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9562
9563 if (OP)
9564 {
9565 Particle p = OP.GetParticle();
9566
9567 if (p)
9568 {
9569 p.Stop();
9570 }
9571
9572 delete OP;
9573 }
9574 }
9575
9576 m_OverheatingParticles.Clear();
9578 }
9579 }
9580
9582 float GetInfectionChance(int system = 0, Param param = null)
9583 {
9584 return 0.0;
9585 }
9586
9587
9588 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9589 {
9590 return 250;//default value
9591 }
9592
9593 float GetFilterDamageRatio()
9594 {
9595 return 0;
9596 }
9597
9599 bool HasMuzzle()
9600 {
9601 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9602 return true;
9603
9604 return false;
9605 }
9606
9608 int GetMuzzleID()
9609 {
9610 if (!m_WeaponTypeToID)
9611 m_WeaponTypeToID = new map<string, int>;
9612
9613 if (m_WeaponTypeToID.Contains(GetType()))
9614 {
9615 return m_WeaponTypeToID.Get(GetType());
9616 }
9617 else
9618 {
9619 // Register new weapon ID
9621 }
9622
9624 }
9625
9632 {
9633 return -1;
9634 }
9635
9636
9637
9638 // -------------------------------------------------------------------------
9639 void ~ItemBase()
9640 {
9641 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
9642 {
9643 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9644 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9645
9646 if (r_index >= 0)
9647 {
9648 InventoryLocation r_il = new InventoryLocation;
9649 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9650
9651 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9652 int r_type = r_il.GetType();
9653 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9654 {
9655 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9656 }
9657 else if (r_type == InventoryLocationType.ATTACHMENT)
9658 {
9659 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9660 }
9661
9662 }
9663
9664 player.GetHumanInventory().ClearUserReservedLocation(this);
9665 }
9666
9667 if (m_LockingSound)
9668 SEffectManager.DestroyEffect(m_LockingSound);
9669 }
9670
9671
9672
9673 // -------------------------------------------------------------------------
9674 static int GetDebugActionsMask()
9675 {
9676 return ItemBase.m_DebugActionsMask;
9677 }
9678
9679 static bool HasDebugActionsMask(int mask)
9680 {
9681 return ItemBase.m_DebugActionsMask & mask;
9682 }
9683
9684 static void SetDebugActionsMask(int mask)
9685 {
9686 ItemBase.m_DebugActionsMask = mask;
9687 }
9688
9689 static void AddDebugActionsMask(int mask)
9690 {
9691 ItemBase.m_DebugActionsMask |= mask;
9692 }
9693
9694 static void RemoveDebugActionsMask(int mask)
9695 {
9696 ItemBase.m_DebugActionsMask &= ~mask;
9697 }
9698
9699 static void ToggleDebugActionsMask(int mask)
9700 {
9701 if (HasDebugActionsMask(mask))
9702 {
9704 }
9705 else
9706 {
9707 AddDebugActionsMask(mask);
9708 }
9709 }
9710
9711 // -------------------------------------------------------------------------
9712 void SetCEBasedQuantity()
9713 {
9714 if (GetEconomyProfile())
9715 {
9716 float q_max = GetEconomyProfile().GetQuantityMax();
9717 if (q_max > 0)
9718 {
9719 float q_min = GetEconomyProfile().GetQuantityMin();
9720 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9721
9722 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
9723 {
9724 ComponentEnergyManager comp = GetCompEM();
9725 if (comp && (comp.GetEnergyMaxPristine() || comp.GetEnergyAtSpawn()))//checking for a potential for energy, we need to check both values, as both are optional, only when both are set to 0, we know the item can't have energy
9726 {
9727 comp.SetEnergy0To1(quantity_randomized);
9728 }
9729 }
9730 else if (HasQuantity())
9731 {
9732 SetQuantityNormalized(quantity_randomized, false);
9733 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
9734 }
9735
9736 }
9737 }
9738 }
9739
9741 void LockToParent()
9742 {
9743 EntityAI parent = GetHierarchyParent();
9744
9745 if (parent)
9746 {
9747 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9748 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9749 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
9750 }
9751 }
9752
9754 void UnlockFromParent()
9755 {
9756 EntityAI parent = GetHierarchyParent();
9757
9758 if (parent)
9759 {
9760 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9761 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9762 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9763 }
9764 }
9765
9766 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9767 {
9768 /*
9769 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9770 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
9771 */
9772 ItemBase item2 = ItemBase.Cast(entity2);
9773
9774 if (g_Game.IsClient())
9775 {
9776 if (ScriptInputUserData.CanStoreInputUserData())
9777 {
9778 ScriptInputUserData ctx = new ScriptInputUserData;
9780 ctx.Write(-1);
9781 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9782 ctx.Write(i1);
9783 ctx.Write(item2);
9784 ctx.Write(use_stack_max);
9785 ctx.Write(-1);
9786 ctx.Send();
9787
9788 if (IsCombineAll(item2, use_stack_max))
9789 {
9790 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9791 }
9792 }
9793 }
9794 else if (!g_Game.IsMultiplayer())
9795 {
9796 CombineItems(item2, use_stack_max);
9797 }
9798 }
9799
9800 bool IsLiquidPresent()
9801 {
9802 return (GetLiquidType() != 0 && HasQuantity());
9803 }
9804
9805 bool IsLiquidContainer()
9806 {
9807 return m_LiquidContainerMask != 0;
9808 }
9809
9811 {
9812 return m_LiquidContainerMask;
9813 }
9814
9815 bool IsBloodContainer()
9816 {
9817 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9818 return false;
9819 }
9820
9821 bool IsNVG()
9822 {
9823 return false;
9824 }
9825
9828 bool IsExplosive()
9829 {
9830 return false;
9831 }
9832
9834 {
9835 return "";
9836 }
9837
9839
9840 bool IsLightSource()
9841 {
9842 return false;
9843 }
9844
9846 {
9847 return true;
9848 }
9849
9850 //--- ACTION CONDITIONS
9851 //direction
9852 bool IsFacingPlayer(PlayerBase player, string selection)
9853 {
9854 return true;
9855 }
9856
9857 bool IsPlayerInside(PlayerBase player, string selection)
9858 {
9859 return true;
9860 }
9861
9862 override bool CanObstruct()
9863 {
9864 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9865 return !player || !IsPlayerInside(player, "");
9866 }
9867
9868 override bool IsBeingPlaced()
9869 {
9870 return m_IsBeingPlaced;
9871 }
9872
9873 void SetIsBeingPlaced(bool is_being_placed)
9874 {
9875 m_IsBeingPlaced = is_being_placed;
9876 if (!is_being_placed)
9878 SetSynchDirty();
9879 }
9880
9881 //server-side
9882 void OnEndPlacement() {}
9883
9884 override bool IsHologram()
9885 {
9886 return m_IsHologram;
9887 }
9888
9889 bool CanBeDigged()
9890 {
9891 return m_CanBeDigged;
9892 }
9893
9895 {
9896 return 1;
9897 }
9898
9899 bool CanMakeGardenplot()
9900 {
9901 return false;
9902 }
9903
9904 void SetIsHologram(bool is_hologram)
9905 {
9906 m_IsHologram = is_hologram;
9907 SetSynchDirty();
9908 }
9909 /*
9910 protected float GetNutritionalEnergy()
9911 {
9912 Edible_Base edible = Edible_Base.Cast(this);
9913 return edible.GetFoodEnergy();
9914 }
9915
9916 protected float GetNutritionalWaterContent()
9917 {
9918 Edible_Base edible = Edible_Base.Cast(this);
9919 return edible.GetFoodWater();
9920 }
9921
9922 protected float GetNutritionalIndex()
9923 {
9924 Edible_Base edible = Edible_Base.Cast(this);
9925 return edible.GetFoodNutritionalIndex();
9926 }
9927
9928 protected float GetNutritionalFullnessIndex()
9929 {
9930 Edible_Base edible = Edible_Base.Cast(this);
9931 return edible.GetFoodTotalVolume();
9932 }
9933
9934 protected float GetNutritionalToxicity()
9935 {
9936 Edible_Base edible = Edible_Base.Cast(this);
9937 return edible.GetFoodToxicity();
9938
9939 }
9940 */
9941
9942
9943 // -------------------------------------------------------------------------
9944 override void OnMovedInsideCargo(EntityAI container)
9945 {
9946 super.OnMovedInsideCargo(container);
9947
9948 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9949 }
9950
9951 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9952 {
9953 super.EEItemLocationChanged(oldLoc, newLoc);
9954
9955 PlayerBase newPlayer = null;
9956 PlayerBase oldPlayer = null;
9957
9958 if (newLoc.GetParent())
9959 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9960
9961 if (oldLoc.GetParent())
9962 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9963
9964 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
9965 {
9966 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9967
9968 if (rIndex >= 0)
9969 {
9970 InventoryLocation rIl = new InventoryLocation;
9971 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9972
9973 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9974 int rType = rIl.GetType();
9975 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
9976 {
9977 rIl.GetParent().GetOnReleaseLock().Invoke(this);
9978 }
9979 else if (rType == InventoryLocationType.ATTACHMENT)
9980 {
9981 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
9982 }
9983
9984 }
9985 }
9986
9987 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
9988 {
9989 if (newPlayer)
9990 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9991
9992 if (newPlayer == oldPlayer)
9993 {
9994 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9995 {
9996 if (oldLoc.GetType() == InventoryLocationType.CARGO)
9997 {
9998 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9999 {
10000 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10001 }
10002 }
10003 else
10004 {
10005 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10006 }
10007 }
10008
10009 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10010 {
10011 int type = oldLoc.GetType();
10012 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
10013 {
10014 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10015 }
10016 else if (type == InventoryLocationType.ATTACHMENT)
10017 {
10018 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10019 }
10020 }
10021 if (!m_OldLocation)
10022 {
10023 m_OldLocation = new InventoryLocation;
10024 }
10025 m_OldLocation.Copy(oldLoc);
10026 }
10027 else
10028 {
10029 if (m_OldLocation)
10030 {
10031 m_OldLocation.Reset();
10032 }
10033 }
10034
10035 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
10036 }
10037 else
10038 {
10039 if (newPlayer)
10040 {
10041 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10042 if (resIndex >= 0)
10043 {
10044 InventoryLocation il = new InventoryLocation;
10045 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10046 ItemBase it = ItemBase.Cast(il.GetItem());
10047 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10048 int rel_type = il.GetType();
10049 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
10050 {
10051 il.GetParent().GetOnReleaseLock().Invoke(it);
10052 }
10053 else if (rel_type == InventoryLocationType.ATTACHMENT)
10054 {
10055 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
10056 }
10057 //it.GetOnReleaseLock().Invoke(it);
10058 }
10059 }
10060 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
10061 {
10062 //ThrowPhysically(oldPlayer, vector.Zero);
10063 m_ThrowItemOnDrop = false;
10064 }
10065
10066 if (m_OldLocation)
10067 {
10068 m_OldLocation.Reset();
10069 }
10070 }
10071
10072 if (oldLoc.GetType() == InventoryLocationType.TEMP)
10073 {
10074 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10075 }
10076
10077 if (newLoc.GetType() == InventoryLocationType.TEMP)
10078 {
10079 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10080 }
10081 }
10082
10083 override void EOnContact(IEntity other, Contact extra)
10084 {
10086 {
10087 int liquidType = -1;
10088 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
10089 if (impactSpeed > 0.0)
10090 {
10091 m_ImpactSpeed = impactSpeed;
10092 #ifndef SERVER
10093 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10094 #else
10095 m_WantPlayImpactSound = true;
10096 SetSynchDirty();
10097 #endif
10098 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
10099 }
10100 }
10101
10102 #ifdef SERVER
10103 if (GetCompEM() && GetCompEM().IsPlugged())
10104 {
10105 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
10106 GetCompEM().UnplugThis();
10107 }
10108 #endif
10109 }
10110
10111 void RefreshPhysics();
10112
10113 override void OnCreatePhysics()
10114 {
10116 }
10117
10118 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10119 {
10120
10121 }
10122 // -------------------------------------------------------------------------
10123 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
10124 {
10125 super.OnItemLocationChanged(old_owner, new_owner);
10126
10127 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10128 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10129
10130 if (!relatedPlayer && playerNew)
10131 relatedPlayer = playerNew;
10132
10133 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10134 {
10135 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
10136 if (actionMgr)
10137 {
10138 ActionBase currentAction = actionMgr.GetRunningAction();
10139 if (currentAction)
10140 currentAction.OnItemLocationChanged(this);
10141 }
10142 }
10143
10144 Man ownerPlayerOld = null;
10145 Man ownerPlayerNew = null;
10146
10147 if (old_owner)
10148 {
10149 if (old_owner.IsMan())
10150 {
10151 ownerPlayerOld = Man.Cast(old_owner);
10152 }
10153 else
10154 {
10155 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10156 }
10157 }
10158 else
10159 {
10160 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
10161 {
10162 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
10163
10164 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
10165 {
10166 GetCompEM().UnplugThis();
10167 }
10168 }
10169 }
10170
10171 if (new_owner)
10172 {
10173 if (new_owner.IsMan())
10174 {
10175 ownerPlayerNew = Man.Cast(new_owner);
10176 }
10177 else
10178 {
10179 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10180 }
10181 }
10182
10183 if (ownerPlayerOld != ownerPlayerNew)
10184 {
10185 if (ownerPlayerOld)
10186 {
10187 array<EntityAI> subItemsExit = new array<EntityAI>;
10188 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
10189 for (int i = 0; i < subItemsExit.Count(); i++)
10190 {
10191 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
10192 itemExit.OnInventoryExit(ownerPlayerOld);
10193 }
10194 }
10195
10196 if (ownerPlayerNew)
10197 {
10198 array<EntityAI> subItemsEnter = new array<EntityAI>;
10199 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
10200 for (int j = 0; j < subItemsEnter.Count(); j++)
10201 {
10202 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
10203 itemEnter.OnInventoryEnter(ownerPlayerNew);
10204 }
10205 }
10206 }
10207 else if (ownerPlayerNew != null)
10208 {
10209 PlayerBase nplayer;
10210 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10211 {
10212 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10213 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
10214 for (int k = 0; k < subItemsUpdate.Count(); k++)
10215 {
10216 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
10217 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10218 }
10219 }
10220 }
10221
10222 if (old_owner)
10223 old_owner.OnChildItemRemoved(this);
10224 if (new_owner)
10225 new_owner.OnChildItemReceived(this);
10226 }
10227
10228 // -------------------------------------------------------------------------------
10229 override void EEDelete(EntityAI parent)
10230 {
10231 super.EEDelete(parent);
10232 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10233 if (player)
10234 {
10235 OnInventoryExit(player);
10236
10237 if (player.IsAlive())
10238 {
10239 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10240 if (r_index >= 0)
10241 {
10242 InventoryLocation r_il = new InventoryLocation;
10243 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10244
10245 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10246 int r_type = r_il.GetType();
10247 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10248 {
10249 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10250 }
10251 else if (r_type == InventoryLocationType.ATTACHMENT)
10252 {
10253 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10254 }
10255
10256 }
10257
10258 player.RemoveQuickBarEntityShortcut(this);
10259 }
10260 }
10261 }
10262 // -------------------------------------------------------------------------------
10263 override void EEKilled(Object killer)
10264 {
10265 super.EEKilled(killer);
10266
10268 if (killer && killer.IsFireplace() && CanExplodeInFire())
10269 {
10270 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10271 {
10272 if (IsMagazine())
10273 {
10274 if (Magazine.Cast(this).GetAmmoCount() > 0)
10275 {
10276 ExplodeAmmo();
10277 }
10278 }
10279 else
10280 {
10281 Explode(DamageType.EXPLOSION);
10282 }
10283 }
10284 }
10285 }
10286
10287 override void OnWasAttached(EntityAI parent, int slot_id)
10288 {
10289 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10290
10291 super.OnWasAttached(parent, slot_id);
10292
10293 if (HasQuantity())
10294 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10295
10296 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10297 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
10298 }
10299
10300 override void OnWasDetached(EntityAI parent, int slot_id)
10301 {
10302 super.OnWasDetached(parent, slot_id);
10303
10304 if (HasQuantity())
10305 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10306
10307 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10308 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
10309 }
10310
10311 override string ChangeIntoOnAttach(string slot)
10312 {
10313 int idx;
10314 TStringArray inventory_slots = new TStringArray;
10315 TStringArray attach_types = new TStringArray;
10316
10317 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10318 if (inventory_slots.Count() < 1) //is string
10319 {
10320 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10321 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10322 }
10323 else //is array
10324 {
10325 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10326 }
10327
10328 idx = inventory_slots.Find(slot);
10329 if (idx < 0)
10330 return "";
10331
10332 return attach_types.Get(idx);
10333 }
10334
10335 override string ChangeIntoOnDetach()
10336 {
10337 int idx = -1;
10338 string slot;
10339
10340 TStringArray inventory_slots = new TStringArray;
10341 TStringArray detach_types = new TStringArray;
10342
10343 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10344 if (inventory_slots.Count() < 1) //is string
10345 {
10346 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10347 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10348 }
10349 else //is array
10350 {
10351 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10352 if (detach_types.Count() < 1)
10353 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10354 }
10355
10356 for (int i = 0; i < inventory_slots.Count(); i++)
10357 {
10358 slot = inventory_slots.Get(i);
10359 }
10360
10361 if (slot != "")
10362 {
10363 if (detach_types.Count() == 1)
10364 idx = 0;
10365 else
10366 idx = inventory_slots.Find(slot);
10367 }
10368 if (idx < 0)
10369 return "";
10370
10371 return detach_types.Get(idx);
10372 }
10373
10374 void ExplodeAmmo()
10375 {
10376 //timer
10377 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
10378
10379 //min/max time
10380 float min_time = 1;
10381 float max_time = 3;
10382 float delay = Math.RandomFloat(min_time, max_time);
10383
10384 explode_timer.Run(delay, this, "DoAmmoExplosion");
10385 }
10386
10387 void DoAmmoExplosion()
10388 {
10389 Magazine magazine = Magazine.Cast(this);
10390 int pop_sounds_count = 6;
10391 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10392
10393 //play sound
10394 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10395 string sound_name = pop_sounds[ sound_idx ];
10396 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
10397
10398 //remove ammo count
10399 magazine.ServerAddAmmoCount(-1);
10400
10401 //if condition then repeat -> ExplodeAmmo
10402 float min_temp_to_explode = 100; //min temperature for item to explode
10403
10404 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
10405 {
10406 ExplodeAmmo();
10407 }
10408 }
10409
10410 // -------------------------------------------------------------------------------
10411 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
10412 {
10413 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
10414
10415 const int CHANCE_DAMAGE_CARGO = 4;
10416 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10417 const int CHANCE_DAMAGE_NOTHING = 2;
10418
10419 if (IsClothing() || IsContainer() || IsItemTent())
10420 {
10421 float dmg = damageResult.GetDamage("","Health") * -0.5;
10422 int chances;
10423 int rnd;
10424
10425 if (GetInventory().GetCargo())
10426 {
10427 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10428 rnd = Math.RandomInt(0,chances);
10429
10430 if (rnd < CHANCE_DAMAGE_CARGO)
10431 {
10432 DamageItemInCargo(dmg);
10433 }
10434 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10435 {
10437 }
10438 }
10439 else
10440 {
10441 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10442 rnd = Math.RandomInt(0,chances);
10443
10444 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10445 {
10447 }
10448 }
10449 }
10450 }
10451
10452 bool DamageItemInCargo(float damage)
10453 {
10454 CargoBase cargo = GetInventory().GetCargo();
10455 if (cargo)
10456 {
10457 int item_count = cargo.GetItemCount();
10458 if (item_count > 0)
10459 {
10460 int random_pick = Math.RandomInt(0, item_count);
10461 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
10462 if (!item.IsExplosive())
10463 {
10464 item.AddHealth("","",damage);
10465 return true;
10466 }
10467 }
10468 }
10469 return false;
10470 }
10471
10472 bool DamageItemAttachments(float damage)
10473 {
10474 GameInventory inventory = GetInventory();
10475 int attachment_count = inventory.AttachmentCount();
10476 if (attachment_count > 0)
10477 {
10478 int random_pick = Math.RandomInt(0, attachment_count);
10479 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
10480 if (!attachment.IsExplosive())
10481 {
10482 attachment.AddHealth("","",damage);
10483 return true;
10484 }
10485 }
10486 return false;
10487 }
10488
10489 override bool IsSplitable()
10490 {
10491 return m_CanThisBeSplit;
10492 }
10493 //----------------
10494 override bool CanBeSplit()
10495 {
10496 if (IsSplitable() && (GetQuantity() > 1))
10497 return GetInventory().CanRemoveEntity();
10498
10499 return false;
10500 }
10501
10502 protected bool ShouldSplitQuantity(float quantity)
10503 {
10504 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
10505 if (!IsSplitable())
10506 return false;
10507
10508 // nothing to split?
10509 if (GetQuantity() <= 1)
10510 return false;
10511
10512 // check if we should re-use the item instead of creating a new copy?
10513 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
10514 int delta = GetQuantity() - quantity;
10515 if (delta == 0)
10516 return false;
10517
10518 // valid to split
10519 return true;
10520 }
10521
10522 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10523 {
10524 if (g_Game.IsClient())
10525 {
10526 if (ScriptInputUserData.CanStoreInputUserData())
10527 {
10528 ScriptInputUserData ctx = new ScriptInputUserData;
10530 ctx.Write(1);
10531 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10532 ctx.Write(i1);
10533 ctx.Write(destination_entity);
10534 ctx.Write(true);
10535 ctx.Write(slot_id);
10536 ctx.Send();
10537 }
10538 }
10539 else if (!g_Game.IsMultiplayer())
10540 {
10541 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
10542 }
10543 }
10544
10545 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10546 {
10547 float split_quantity_new;
10548 ItemBase new_item;
10549 float quantity = GetQuantity();
10550 float stack_max = GetTargetQuantityMax(slot_id);
10551 InventoryLocation loc = new InventoryLocation;
10552
10553 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10554 {
10555 if (stack_max <= GetQuantity())
10556 split_quantity_new = stack_max;
10557 else
10558 split_quantity_new = GetQuantity();
10559
10560 if (ShouldSplitQuantity(split_quantity_new))
10561 {
10562 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10563 if (new_item)
10564 {
10565 new_item.SetResultOfSplit(true);
10566 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10567 AddQuantity(-split_quantity_new, false, true);
10568 new_item.SetQuantity(split_quantity_new, false, true);
10569 }
10570 }
10571 }
10572 else if (destination_entity && slot_id == -1)
10573 {
10574 if (quantity > stack_max)
10575 split_quantity_new = stack_max;
10576 else
10577 split_quantity_new = quantity;
10578
10579 if (ShouldSplitQuantity(split_quantity_new))
10580 {
10581 GameInventory destinationInventory = destination_entity.GetInventory();
10582 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10583 {
10584 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10585 new_item = ItemBase.Cast(o);
10586 }
10587
10588 if (new_item)
10589 {
10590 new_item.SetResultOfSplit(true);
10591 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10592 AddQuantity(-split_quantity_new, false, true);
10593 new_item.SetQuantity(split_quantity_new, false, true);
10594 }
10595 }
10596 }
10597 else
10598 {
10599 if (stack_max != 0)
10600 {
10601 if (stack_max < GetQuantity())
10602 {
10603 split_quantity_new = GetQuantity() - stack_max;
10604 }
10605
10606 if (split_quantity_new == 0)
10607 {
10608 if (!g_Game.IsMultiplayer())
10609 player.PhysicalPredictiveDropItem(this);
10610 else
10611 player.ServerDropEntity(this);
10612 return;
10613 }
10614
10615 if (ShouldSplitQuantity(split_quantity_new))
10616 {
10617 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10618
10619 if (new_item)
10620 {
10621 new_item.SetResultOfSplit(true);
10622 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10623 SetQuantity(split_quantity_new, false, true);
10624 new_item.SetQuantity(stack_max, false, true);
10625 new_item.PlaceOnSurface();
10626 }
10627 }
10628 }
10629 }
10630 }
10631
10632 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10633 {
10634 float split_quantity_new;
10635 ItemBase new_item;
10636 float quantity = GetQuantity();
10637 float stack_max = GetTargetQuantityMax(slot_id);
10638 InventoryLocation loc = new InventoryLocation;
10639
10640 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10641 {
10642 if (stack_max <= GetQuantity())
10643 split_quantity_new = stack_max;
10644 else
10645 split_quantity_new = GetQuantity();
10646
10647 if (ShouldSplitQuantity(split_quantity_new))
10648 {
10649 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10650 if (new_item)
10651 {
10652 new_item.SetResultOfSplit(true);
10653 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10654 AddQuantity(-split_quantity_new, false, true);
10655 new_item.SetQuantity(split_quantity_new, false, true);
10656 }
10657 }
10658 }
10659 else if (destination_entity && slot_id == -1)
10660 {
10661 if (quantity > stack_max)
10662 split_quantity_new = stack_max;
10663 else
10664 split_quantity_new = quantity;
10665
10666 if (ShouldSplitQuantity(split_quantity_new))
10667 {
10668 GameInventory destinationInventory = destination_entity.GetInventory();
10669 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10670 {
10671 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10672 new_item = ItemBase.Cast(o);
10673 }
10674
10675 if (new_item)
10676 {
10677 new_item.SetResultOfSplit(true);
10678 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10679 AddQuantity(-split_quantity_new, false, true);
10680 new_item.SetQuantity(split_quantity_new, false, true);
10681 }
10682 }
10683 }
10684 else
10685 {
10686 if (stack_max != 0)
10687 {
10688 if (stack_max < GetQuantity())
10689 {
10690 split_quantity_new = GetQuantity() - stack_max;
10691 }
10692
10693 if (ShouldSplitQuantity(split_quantity_new))
10694 {
10695 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10696
10697 if (new_item)
10698 {
10699 new_item.SetResultOfSplit(true);
10700 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10701 SetQuantity(split_quantity_new, false, true);
10702 new_item.SetQuantity(stack_max, false, true);
10703 new_item.PlaceOnSurface();
10704 }
10705 }
10706 }
10707 }
10708 }
10709
10710 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10711 {
10712 if (g_Game.IsClient())
10713 {
10714 if (ScriptInputUserData.CanStoreInputUserData())
10715 {
10716 ScriptInputUserData ctx = new ScriptInputUserData;
10718 ctx.Write(4);
10719 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10720 ctx.Write(thiz);
10721 dst.WriteToContext(ctx);
10722 ctx.Send();
10723 }
10724 }
10725 else if (!g_Game.IsMultiplayer())
10726 {
10728 }
10729 }
10730
10731 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10732 {
10733 if (g_Game.IsClient())
10734 {
10735 if (ScriptInputUserData.CanStoreInputUserData())
10736 {
10737 ScriptInputUserData ctx = new ScriptInputUserData;
10739 ctx.Write(2);
10740 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10741 ctx.Write(dummy);
10742 ctx.Write(destination_entity);
10743 ctx.Write(true);
10744 ctx.Write(idx);
10745 ctx.Write(row);
10746 ctx.Write(col);
10747 ctx.Send();
10748 }
10749 }
10750 else if (!g_Game.IsMultiplayer())
10751 {
10752 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10753 }
10754 }
10755
10756 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
10757 {
10759 }
10760
10761 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
10762 {
10763 float quantity = GetQuantity();
10764 float split_quantity_new;
10765 ItemBase new_item;
10766 if (dst.IsValid())
10767 {
10768 int slot_id = dst.GetSlot();
10769 float stack_max = GetTargetQuantityMax(slot_id);
10770
10771 if (quantity > stack_max)
10772 split_quantity_new = stack_max;
10773 else
10774 split_quantity_new = quantity;
10775
10776 if (ShouldSplitQuantity(split_quantity_new))
10777 {
10778 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10779
10780 if (new_item)
10781 {
10782 new_item.SetResultOfSplit(true);
10783 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10784 AddQuantity(-split_quantity_new, false, true);
10785 new_item.SetQuantity(split_quantity_new, false, true);
10786 }
10787
10788 return new_item;
10789 }
10790 }
10791
10792 return null;
10793 }
10794
10795 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10796 {
10797 float quantity = GetQuantity();
10798 float split_quantity_new;
10799 ItemBase new_item;
10800 if (destination_entity)
10801 {
10802 float stackable = GetTargetQuantityMax();
10803 if (quantity > stackable)
10804 split_quantity_new = stackable;
10805 else
10806 split_quantity_new = quantity;
10807
10808 if (ShouldSplitQuantity(split_quantity_new))
10809 {
10810 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10811 if (new_item)
10812 {
10813 new_item.SetResultOfSplit(true);
10814 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10815 AddQuantity(-split_quantity_new, false, true);
10816 new_item.SetQuantity(split_quantity_new, false, true);
10817 }
10818 }
10819 }
10820 }
10821
10822 void SplitIntoStackMaxHandsClient(PlayerBase player)
10823 {
10824 if (g_Game.IsClient())
10825 {
10826 if (ScriptInputUserData.CanStoreInputUserData())
10827 {
10828 ScriptInputUserData ctx = new ScriptInputUserData;
10830 ctx.Write(3);
10831 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10832 ctx.Write(i1);
10833 ItemBase destination_entity = this;
10834 ctx.Write(destination_entity);
10835 ctx.Write(true);
10836 ctx.Write(0);
10837 ctx.Send();
10838 }
10839 }
10840 else if (!g_Game.IsMultiplayer())
10841 {
10842 SplitIntoStackMaxHands(player);
10843 }
10844 }
10845
10846 void SplitIntoStackMaxHands(PlayerBase player)
10847 {
10848 float quantity = GetQuantity();
10849 float split_quantity_new;
10850 ref ItemBase new_item;
10851 if (player)
10852 {
10853 float stackable = GetTargetQuantityMax();
10854 if (quantity > stackable)
10855 split_quantity_new = stackable;
10856 else
10857 split_quantity_new = quantity;
10858
10859 if (ShouldSplitQuantity(split_quantity_new))
10860 {
10861 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10862 new_item = ItemBase.Cast(in_hands);
10863 if (new_item)
10864 {
10865 new_item.SetResultOfSplit(true);
10866 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10867 AddQuantity(-split_quantity_new, false, true);
10868 new_item.SetQuantity(split_quantity_new, false, true);
10869 }
10870 }
10871 }
10872 }
10873
10874 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10875 {
10876 float quantity = GetQuantity();
10877 float split_quantity_new = Math.Floor(quantity * 0.5);
10878
10879 if (!ShouldSplitQuantity(split_quantity_new))
10880 return;
10881
10882 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10883
10884 if (new_item)
10885 {
10886 if (new_item.GetQuantityMax() < split_quantity_new)
10887 {
10888 split_quantity_new = new_item.GetQuantityMax();
10889 }
10890
10891 new_item.SetResultOfSplit(true);
10892 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10893
10894 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10895 {
10896 AddQuantity(-1, false, true);
10897 new_item.SetQuantity(1, false, true);
10898 }
10899 else
10900 {
10901 AddQuantity(-split_quantity_new, false, true);
10902 new_item.SetQuantity(split_quantity_new, false, true);
10903 }
10904 }
10905 }
10906
10907 void SplitItem(PlayerBase player)
10908 {
10909 float quantity = GetQuantity();
10910 float split_quantity_new = Math.Floor(quantity / 2);
10911
10912 if (!ShouldSplitQuantity(split_quantity_new))
10913 return;
10914
10915 InventoryLocation invloc = new InventoryLocation;
10916 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
10917
10918 ItemBase new_item;
10919 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10920
10921 if (new_item)
10922 {
10923 if (new_item.GetQuantityMax() < split_quantity_new)
10924 {
10925 split_quantity_new = new_item.GetQuantityMax();
10926 }
10927 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10928 {
10929 AddQuantity(-1, false, true);
10930 new_item.SetQuantity(1, false, true);
10931 }
10932 else if (split_quantity_new > 1)
10933 {
10934 AddQuantity(-split_quantity_new, false, true);
10935 new_item.SetQuantity(split_quantity_new, false, true);
10936 }
10937 }
10938 }
10939
10941 void OnQuantityChanged(float delta)
10942 {
10943 SetWeightDirty();
10944 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
10945
10946 if (parent)
10947 parent.OnAttachmentQuantityChangedEx(this, delta);
10948
10949 if (IsLiquidContainer())
10950 {
10951 if (GetQuantityNormalized() <= 0.0)
10952 {
10954 }
10955 else if (GetLiquidType() == LIQUID_NONE)
10956 {
10957 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
10959 }
10960 }
10961 }
10962
10965 {
10966 // insert code here
10967 }
10968
10970 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
10971 {
10973 }
10974
10975 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
10976 {
10977 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10978
10979 if (g_Game.IsServer())
10980 {
10981 if (newLevel == GameConstants.STATE_RUINED)
10982 {
10984 EntityAI parent = GetHierarchyParent();
10985 if (parent && parent.IsFireplace())
10986 {
10987 CargoBase cargo = GetInventory().GetCargo();
10988 if (cargo)
10989 {
10990 for (int i = 0; i < cargo.GetItemCount(); ++i)
10991 {
10992 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
10993 }
10994 }
10995 }
10996 }
10997
10998 if (IsResultOfSplit())
10999 {
11000 // reset the splitting result flag, return to normal item behavior
11001 SetResultOfSplit(false);
11002 return;
11003 }
11004
11005 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11006 {
11007 SetCleanness(0);//unclean the item upon damage dealt
11008 }
11009 }
11010 }
11011
11012 // just the split? TODO: verify
11013 override void OnRightClick()
11014 {
11015 super.OnRightClick();
11016
11017 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
11018 {
11019 if (g_Game.IsClient())
11020 {
11021 if (ScriptInputUserData.CanStoreInputUserData())
11022 {
11023 EntityAI root = GetHierarchyRoot();
11024 Man playerOwner = GetHierarchyRootPlayer();
11025 InventoryLocation dst = new InventoryLocation;
11026
11027 // If we have no hierarchy root player and the root is the same as this item the source item is in the vicinity so we want to create the new split item there also
11028 if (!playerOwner && root && root == this)
11029 {
11031 }
11032 else
11033 {
11034 // Check if we can place the new split item in the same parent where the source item is placed in or otherwise drop it in vicinity
11035 GetInventory().GetCurrentInventoryLocation(dst);
11036 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
11037 {
11038 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
11039 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
11040 {
11042 }
11043 else
11044 {
11045 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
11046 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
11047 this shouldnt cause issues within this scope*/
11048 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
11049 {
11051 }
11052 else
11053 {
11054 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11055 }
11056 }
11057 }
11058 }
11059
11060 ScriptInputUserData ctx = new ScriptInputUserData;
11062 ctx.Write(4);
11063 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11064 ctx.Write(thiz);
11065 dst.WriteToContext(ctx);
11066 ctx.Write(true); // dummy
11067 ctx.Send();
11068 }
11069 }
11070 else if (!g_Game.IsMultiplayer())
11071 {
11072 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
11073 }
11074 }
11075 }
11076
11077 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
11078 {
11079 if (root)
11080 {
11081 vector m4[4];
11082 root.GetTransform(m4);
11083 dst.SetGround(this, m4);
11084 }
11085 else
11086 {
11087 GetInventory().GetCurrentInventoryLocation(dst);
11088 }
11089 }
11090
11091 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
11092 {
11093 //TODO: delete check zero quantity check after fix double posts hands fsm events
11094 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
11095 return false;
11096
11097 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11098 return false;
11099
11100 //can_this_be_combined = ConfigGetBool("canBeSplit");
11102 return false;
11103
11104
11105 Magazine mag = Magazine.Cast(this);
11106 if (mag)
11107 {
11108 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11109 return false;
11110
11111 if (stack_max_limit)
11112 {
11113 Magazine other_mag = Magazine.Cast(other_item);
11114 if (other_item)
11115 {
11116 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11117 return false;
11118 }
11119
11120 }
11121 }
11122 else
11123 {
11124 //TODO: delete check zero quantity check after fix double posts hands fsm events
11125 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
11126 return false;
11127
11128 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
11129 return false;
11130 }
11131
11132 PlayerBase player = null;
11133 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
11134 {
11135 if (player.GetInventory().HasAttachment(this))
11136 return false;
11137
11138 if (player.IsItemsToDelete())
11139 return false;
11140 }
11141
11142 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11143 return false;
11144
11145 int slotID;
11146 string slotName;
11147 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11148 return false;
11149
11150 return true;
11151 }
11152
11153 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
11154 {
11155 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
11156 }
11157
11158 bool IsResultOfSplit()
11159 {
11160 return m_IsResultOfSplit;
11161 }
11162
11163 void SetResultOfSplit(bool value)
11164 {
11165 m_IsResultOfSplit = value;
11166 }
11167
11168 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
11169 {
11170 return ComputeQuantityUsedEx(other_item, use_stack_max);
11171 }
11172
11173 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
11174 {
11175 float other_item_quantity = other_item.GetQuantity();
11176 float this_free_space;
11177
11178 float stack_max = GetQuantityMax();
11179
11180 this_free_space = stack_max - GetQuantity();
11181
11182 if (other_item_quantity > this_free_space)
11183 {
11184 return this_free_space;
11185 }
11186 else
11187 {
11188 return other_item_quantity;
11189 }
11190 }
11191
11192 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
11193 {
11194 CombineItems(ItemBase.Cast(entity2),use_stack_max);
11195 }
11196
11197 void CombineItems(ItemBase other_item, bool use_stack_max = true)
11198 {
11199 if (!CanBeCombined(other_item, false))
11200 return;
11201
11202 if (!IsMagazine() && other_item)
11203 {
11204 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
11205 if (quantity_used != 0)
11206 {
11207 float hp1 = GetHealth01("","");
11208 float hp2 = other_item.GetHealth01("","");
11209 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
11210 hpResult = hpResult / (GetQuantity() + quantity_used);
11211
11212 hpResult *= GetMaxHealth();
11213 Math.Round(hpResult);
11214 SetHealth("", "Health", hpResult);
11215
11216 AddQuantity(quantity_used);
11217 other_item.AddQuantity(-quantity_used);
11218 }
11219 }
11220 OnCombine(other_item);
11221 }
11222
11223 void OnCombine(ItemBase other_item)
11224 {
11225 #ifdef SERVER
11226 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11227 GetHierarchyParent().IncreaseLifetimeUp();
11228 #endif
11229 };
11230
11231 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
11232 {
11233 PlayerBase p = PlayerBase.Cast(player);
11234
11235 array<int> recipesIds = p.m_Recipes;
11236 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11237 if (moduleRecipesManager)
11238 {
11239 EntityAI itemInHands = player.GetEntityInHands();
11240 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
11241 }
11242
11243 for (int i = 0;i < recipesIds.Count(); i++)
11244 {
11245 int key = recipesIds.Get(i);
11246 string recipeName = moduleRecipesManager.GetRecipeName(key);
11247 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
11248 }
11249 }
11250
11251 // -------------------------------------------------------------------------
11252 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11253 {
11254 super.GetDebugActions(outputList);
11255
11256 //quantity
11257 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
11258 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
11259 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
11260 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
11261 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11262
11263 //health
11264 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
11265 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
11266 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
11267 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11268 //temperature
11269 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
11270 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
11271 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
11272 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11273
11274 //wet
11275 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
11276 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
11277 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11278
11279 //liquidtype
11280 if (IsLiquidContainer())
11281 {
11282 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
11283 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
11284 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11285 }
11286
11287 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
11288 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11289
11290 // watch
11291 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
11292 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
11293 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11294
11295 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
11296
11297 InventoryLocation loc = new InventoryLocation();
11298 GetInventory().GetCurrentInventoryLocation(loc);
11299 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
11300 {
11301 if (Gizmo_IsSupported())
11302 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
11303 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
11304 }
11305
11306 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11307 }
11308
11309 // -------------------------------------------------------------------------
11310 // -------------------------------------------------------------------------
11311 // -------------------------------------------------------------------------
11312 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
11313 {
11314 super.OnAction(action_id, player, ctx);
11315
11316 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
11317 {
11318 switch (action_id)
11319 {
11320 case EActions.GIZMO_OBJECT:
11321 if (GetGizmoApi())
11322 GetGizmoApi().SelectObject(this);
11323 return true;
11324 case EActions.GIZMO_PHYSICS:
11325 if (GetGizmoApi())
11326 GetGizmoApi().SelectPhysics(GetPhysics());
11327 return true;
11328 }
11329 }
11330
11331 if (g_Game.IsServer())
11332 {
11333 switch (action_id)
11334 {
11335 case EActions.DELETE:
11336 Delete();
11337 return true;
11338 }
11339 }
11340
11341 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
11342 {
11343 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11344 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
11345 PlayerBase p = PlayerBase.Cast(player);
11346 if (EActions.RECIPES_RANGE_START < 1000)
11347 {
11348 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11349 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11350 }
11351 }
11352 #ifndef SERVER
11353 else if (action_id == EActions.WATCH_PLAYER)
11354 {
11355 PluginDeveloper.SetDeveloperItemClientEx(player);
11356 }
11357 #endif
11358 if (g_Game.IsServer())
11359 {
11360 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11361 {
11362 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11363 OnDebugButtonPressServer(id + 1);
11364 }
11365
11366 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11367 {
11368 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11369 InsertAgent(agent_id,100);
11370 }
11371
11372 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11373 {
11374 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11375 RemoveAgent(agent_id2);
11376 }
11377
11378 else if (action_id == EActions.ADD_QUANTITY)
11379 {
11380 if (IsMagazine())
11381 {
11382 Magazine mag = Magazine.Cast(this);
11383 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11384 }
11385 else
11386 {
11387 AddQuantity(GetQuantityMax() * 0.2);
11388 }
11389
11390 if (m_EM)
11391 {
11392 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11393 }
11394 //PrintVariables();
11395 }
11396
11397 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
11398 {
11399 if (IsMagazine())
11400 {
11401 Magazine mag2 = Magazine.Cast(this);
11402 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11403 }
11404 else
11405 {
11406 AddQuantity(- GetQuantityMax() * 0.2);
11407 }
11408 if (m_EM)
11409 {
11410 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11411 }
11412 //PrintVariables();
11413 }
11414
11415 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
11416 {
11417 SetQuantity(0);
11418
11419 if (m_EM)
11420 {
11421 m_EM.SetEnergy(0);
11422 }
11423 }
11424
11425 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
11426 {
11428
11429 if (m_EM)
11430 {
11431 m_EM.SetEnergy(m_EM.GetEnergyMax());
11432 }
11433 }
11434
11435 else if (action_id == EActions.ADD_HEALTH)
11436 {
11437 AddHealth("","",GetMaxHealth("","Health")/5);
11438 }
11439 else if (action_id == EActions.REMOVE_HEALTH)
11440 {
11441 AddHealth("","",-GetMaxHealth("","Health")/5);
11442 }
11443 else if (action_id == EActions.DESTROY_HEALTH)
11444 {
11445 SetHealth01("","",0);
11446 }
11447 else if (action_id == EActions.WATCH_ITEM)
11448 {
11450 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
11451 #ifdef DEVELOPER
11452 SetDebugDeveloper_item(this);
11453 #endif
11454 }
11455
11456 else if (action_id == EActions.ADD_TEMPERATURE)
11457 {
11458 AddTemperature(20);
11459 //PrintVariables();
11460 }
11461
11462 else if (action_id == EActions.REMOVE_TEMPERATURE)
11463 {
11464 AddTemperature(-20);
11465 //PrintVariables();
11466 }
11467
11468 else if (action_id == EActions.FLIP_FROZEN)
11469 {
11470 SetFrozen(!GetIsFrozen());
11471 //PrintVariables();
11472 }
11473
11474 else if (action_id == EActions.ADD_WETNESS)
11475 {
11476 AddWet(GetWetMax()/5);
11477 //PrintVariables();
11478 }
11479
11480 else if (action_id == EActions.REMOVE_WETNESS)
11481 {
11482 AddWet(-GetWetMax()/5);
11483 //PrintVariables();
11484 }
11485
11486 else if (action_id == EActions.LIQUIDTYPE_UP)
11487 {
11488 int curr_type = GetLiquidType();
11489 SetLiquidType(curr_type * 2);
11490 //AddWet(1);
11491 //PrintVariables();
11492 }
11493
11494 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11495 {
11496 int curr_type2 = GetLiquidType();
11497 SetLiquidType(curr_type2 / 2);
11498 }
11499
11500 else if (action_id == EActions.MAKE_SPECIAL)
11501 {
11502 auto debugParams = DebugSpawnParams.WithPlayer(player);
11503 OnDebugSpawnEx(debugParams);
11504 }
11505
11506 }
11507
11508
11509 return false;
11510 }
11511
11512 // -------------------------------------------------------------------------
11513
11514
11517 void OnActivatedByTripWire();
11518
11520 void OnActivatedByItem(notnull ItemBase item);
11521
11522 //----------------------------------------------------------------
11523 //returns true if item is able to explode when put in fire
11524 bool CanExplodeInFire()
11525 {
11526 return false;
11527 }
11528
11529 //----------------------------------------------------------------
11530 bool CanEat()
11531 {
11532 return true;
11533 }
11534
11535 //----------------------------------------------------------------
11536 override bool IsIgnoredByConstruction()
11537 {
11538 return true;
11539 }
11540
11541 //----------------------------------------------------------------
11542 //has FoodStages in config?
11543 bool HasFoodStage()
11544 {
11545 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11546 return g_Game.ConfigIsExisting(config_path);
11547 }
11548
11550 FoodStage GetFoodStage()
11551 {
11552 return null;
11553 }
11554
11555 bool CanBeCooked()
11556 {
11557 return false;
11558 }
11559
11560 bool CanBeCookedOnStick()
11561 {
11562 return false;
11563 }
11564
11566 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11568
11569 //----------------------------------------------------------------
11570 bool CanRepair(ItemBase item_repair_kit)
11571 {
11572 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11573 return module_repairing.CanRepair(this, item_repair_kit);
11574 }
11575
11576 //----------------------------------------------------------------
11577 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11578 {
11579 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11580 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11581 }
11582
11583 //----------------------------------------------------------------
11584 int GetItemSize()
11585 {
11586 /*
11587 vector v_size = this.ConfigGetVector("itemSize");
11588 int v_size_x = v_size[0];
11589 int v_size_y = v_size[1];
11590 int size = v_size_x * v_size_y;
11591 return size;
11592 */
11593
11594 return 1;
11595 }
11596
11597 //----------------------------------------------------------------
11598 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11599 bool CanBeMovedOverride()
11600 {
11601 return m_CanBeMovedOverride;
11602 }
11603
11604 //----------------------------------------------------------------
11605 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11606 void SetCanBeMovedOverride(bool setting)
11607 {
11608 m_CanBeMovedOverride = setting;
11609 }
11610
11611 //----------------------------------------------------------------
11619 void MessageToOwnerStatus(string text)
11620 {
11621 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11622
11623 if (player)
11624 {
11625 player.MessageStatus(text);
11626 }
11627 }
11628
11629 //----------------------------------------------------------------
11637 void MessageToOwnerAction(string text)
11638 {
11639 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11640
11641 if (player)
11642 {
11643 player.MessageAction(text);
11644 }
11645 }
11646
11647 //----------------------------------------------------------------
11655 void MessageToOwnerFriendly(string text)
11656 {
11657 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11658
11659 if (player)
11660 {
11661 player.MessageFriendly(text);
11662 }
11663 }
11664
11665 //----------------------------------------------------------------
11673 void MessageToOwnerImportant(string text)
11674 {
11675 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11676
11677 if (player)
11678 {
11679 player.MessageImportant(text);
11680 }
11681 }
11682
11683 override bool IsItemBase()
11684 {
11685 return true;
11686 }
11687
11688 // Checks if item is of questioned kind
11689 override bool KindOf(string tag)
11690 {
11691 bool found = false;
11692 string item_name = this.GetType();
11693 ref TStringArray item_tag_array = new TStringArray;
11694 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11695
11696 int array_size = item_tag_array.Count();
11697 for (int i = 0; i < array_size; i++)
11698 {
11699 if (item_tag_array.Get(i) == tag)
11700 {
11701 found = true;
11702 break;
11703 }
11704 }
11705 return found;
11706 }
11707
11708
11709 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11710 {
11711 //Debug.Log("OnRPC called");
11712 super.OnRPC(sender, rpc_type,ctx);
11713
11714 //Play soundset for attachment locking (ActionLockAttachment.c)
11715 switch (rpc_type)
11716 {
11717 #ifndef SERVER
11718 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11719 Param2<bool, string> p = new Param2<bool, string>(false, "");
11720
11721 if (!ctx.Read(p))
11722 return;
11723
11724 bool play = p.param1;
11725 string soundSet = p.param2;
11726
11727 if (play)
11728 {
11729 if (m_LockingSound)
11730 {
11732 {
11733 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11734 }
11735 }
11736 else
11737 {
11738 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11739 }
11740 }
11741 else
11742 {
11743 SEffectManager.DestroyEffect(m_LockingSound);
11744 }
11745
11746 break;
11747 #endif
11748
11749 }
11750
11751 if (GetWrittenNoteData())
11752 {
11753 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11754 }
11755 }
11756
11757 //-----------------------------
11758 // VARIABLE MANIPULATION SYSTEM
11759 //-----------------------------
11760 int NameToID(string name)
11761 {
11762 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11763 return plugin.GetID(name);
11764 }
11765
11766 string IDToName(int id)
11767 {
11768 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11769 return plugin.GetName(id);
11770 }
11771
11773 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11774 {
11775 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11776 //read the flags
11777 int varFlags;
11778 if (!ctx.Read(varFlags))
11779 return;
11780
11781 if (varFlags & ItemVariableFlags.FLOAT)
11782 {
11783 ReadVarsFromCTX(ctx);
11784 }
11785 }
11786
11787 override void SerializeNumericalVars(array<float> floats_out)
11788 {
11789 //some variables handled on EntityAI level already!
11790 super.SerializeNumericalVars(floats_out);
11791
11792 // the order of serialization must be the same as the order of de-serialization
11793 //--------------------------------------------
11794 if (IsVariableSet(VARIABLE_QUANTITY))
11795 {
11796 floats_out.Insert(m_VarQuantity);
11797 }
11798 //--------------------------------------------
11799 if (IsVariableSet(VARIABLE_WET))
11800 {
11801 floats_out.Insert(m_VarWet);
11802 }
11803 //--------------------------------------------
11804 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11805 {
11806 floats_out.Insert(m_VarLiquidType);
11807 }
11808 //--------------------------------------------
11809 if (IsVariableSet(VARIABLE_COLOR))
11810 {
11811 floats_out.Insert(m_ColorComponentR);
11812 floats_out.Insert(m_ColorComponentG);
11813 floats_out.Insert(m_ColorComponentB);
11814 floats_out.Insert(m_ColorComponentA);
11815 }
11816 //--------------------------------------------
11817 if (IsVariableSet(VARIABLE_CLEANNESS))
11818 {
11819 floats_out.Insert(m_Cleanness);
11820 }
11821 }
11822
11823 override void DeSerializeNumericalVars(array<float> floats)
11824 {
11825 //some variables handled on EntityAI level already!
11826 super.DeSerializeNumericalVars(floats);
11827
11828 // the order of serialization must be the same as the order of de-serialization
11829 int index = 0;
11830 int mask = Math.Round(floats.Get(index));
11831
11832 index++;
11833 //--------------------------------------------
11834 if (mask & VARIABLE_QUANTITY)
11835 {
11836 if (m_IsStoreLoad)
11837 {
11838 SetStoreLoadedQuantity(floats.Get(index));
11839 }
11840 else
11841 {
11842 float quantity = floats.Get(index);
11843 SetQuantity(quantity, true, false, false, false);
11844 }
11845 index++;
11846 }
11847 //--------------------------------------------
11848 if (mask & VARIABLE_WET)
11849 {
11850 float wet = floats.Get(index);
11851 SetWet(wet);
11852 index++;
11853 }
11854 //--------------------------------------------
11855 if (mask & VARIABLE_LIQUIDTYPE)
11856 {
11857 int liquidtype = Math.Round(floats.Get(index));
11858 SetLiquidType(liquidtype);
11859 index++;
11860 }
11861 //--------------------------------------------
11862 if (mask & VARIABLE_COLOR)
11863 {
11864 m_ColorComponentR = Math.Round(floats.Get(index));
11865 index++;
11866 m_ColorComponentG = Math.Round(floats.Get(index));
11867 index++;
11868 m_ColorComponentB = Math.Round(floats.Get(index));
11869 index++;
11870 m_ColorComponentA = Math.Round(floats.Get(index));
11871 index++;
11872 }
11873 //--------------------------------------------
11874 if (mask & VARIABLE_CLEANNESS)
11875 {
11876 int cleanness = Math.Round(floats.Get(index));
11877 SetCleanness(cleanness);
11878 index++;
11879 }
11880 }
11881
11882 override void WriteVarsToCTX(ParamsWriteContext ctx)
11883 {
11884 super.WriteVarsToCTX(ctx);
11885
11886 //--------------------------------------------
11887 if (IsVariableSet(VARIABLE_QUANTITY))
11888 {
11889 ctx.Write(GetQuantity());
11890 }
11891 //--------------------------------------------
11892 if (IsVariableSet(VARIABLE_WET))
11893 {
11894 ctx.Write(GetWet());
11895 }
11896 //--------------------------------------------
11897 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11898 {
11899 ctx.Write(GetLiquidType());
11900 }
11901 //--------------------------------------------
11902 if (IsVariableSet(VARIABLE_COLOR))
11903 {
11904 int r,g,b,a;
11905 GetColor(r,g,b,a);
11906 ctx.Write(r);
11907 ctx.Write(g);
11908 ctx.Write(b);
11909 ctx.Write(a);
11910 }
11911 //--------------------------------------------
11912 if (IsVariableSet(VARIABLE_CLEANNESS))
11913 {
11914 ctx.Write(GetCleanness());
11915 }
11916 }
11917
11918 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
11919 {
11920 if (!super.ReadVarsFromCTX(ctx,version))
11921 return false;
11922
11923 int intValue;
11924 float value;
11925
11926 if (version < 140)
11927 {
11928 if (!ctx.Read(intValue))
11929 return false;
11930
11931 m_VariablesMask = intValue;
11932 }
11933
11934 if (m_VariablesMask & VARIABLE_QUANTITY)
11935 {
11936 if (!ctx.Read(value))
11937 return false;
11938
11939 if (IsStoreLoad())
11940 {
11942 }
11943 else
11944 {
11945 SetQuantity(value, true, false, false, false);
11946 }
11947 }
11948 //--------------------------------------------
11949 if (version < 140)
11950 {
11951 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11952 {
11953 if (!ctx.Read(value))
11954 return false;
11955 SetTemperatureDirect(value);
11956 }
11957 }
11958 //--------------------------------------------
11959 if (m_VariablesMask & VARIABLE_WET)
11960 {
11961 if (!ctx.Read(value))
11962 return false;
11963 SetWet(value);
11964 }
11965 //--------------------------------------------
11966 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
11967 {
11968 if (!ctx.Read(intValue))
11969 return false;
11970 SetLiquidType(intValue);
11971 }
11972 //--------------------------------------------
11973 if (m_VariablesMask & VARIABLE_COLOR)
11974 {
11975 int r,g,b,a;
11976 if (!ctx.Read(r))
11977 return false;
11978 if (!ctx.Read(g))
11979 return false;
11980 if (!ctx.Read(b))
11981 return false;
11982 if (!ctx.Read(a))
11983 return false;
11984
11985 SetColor(r,g,b,a);
11986 }
11987 //--------------------------------------------
11988 if (m_VariablesMask & VARIABLE_CLEANNESS)
11989 {
11990 if (!ctx.Read(intValue))
11991 return false;
11992 SetCleanness(intValue);
11993 }
11994 //--------------------------------------------
11995 if (version >= 138 && version < 140)
11996 {
11997 if (m_VariablesMask & VARIABLE_TEMPERATURE)
11998 {
11999 if (!ctx.Read(intValue))
12000 return false;
12001 SetFrozen(intValue);
12002 }
12003 }
12004
12005 return true;
12006 }
12007
12008 //----------------------------------------------------------------
12009 override bool OnStoreLoad(ParamsReadContext ctx, int version)
12010 {
12011 m_IsStoreLoad = true;
12013 {
12014 m_FixDamageSystemInit = true;
12015 }
12016
12017 if (!super.OnStoreLoad(ctx, version))
12018 {
12019 m_IsStoreLoad = false;
12020 return false;
12021 }
12022
12023 if (version >= 114)
12024 {
12025 bool hasQuickBarIndexSaved;
12026
12027 if (!ctx.Read(hasQuickBarIndexSaved))
12028 {
12029 m_IsStoreLoad = false;
12030 return false;
12031 }
12032
12033 if (hasQuickBarIndexSaved)
12034 {
12035 int itmQBIndex;
12036
12037 //Load quickbar item bind
12038 if (!ctx.Read(itmQBIndex))
12039 {
12040 m_IsStoreLoad = false;
12041 return false;
12042 }
12043
12044 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12045 if (itmQBIndex != -1 && parentPlayer)
12046 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12047 }
12048 }
12049 else
12050 {
12051 // Backup of how it used to be
12052 PlayerBase player;
12053 int itemQBIndex;
12054 if (version == int.MAX)
12055 {
12056 if (!ctx.Read(itemQBIndex))
12057 {
12058 m_IsStoreLoad = false;
12059 return false;
12060 }
12061 }
12062 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12063 {
12064 //Load quickbar item bind
12065 if (!ctx.Read(itemQBIndex))
12066 {
12067 m_IsStoreLoad = false;
12068 return false;
12069 }
12070 if (itemQBIndex != -1 && player)
12071 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12072 }
12073 }
12074
12075 if (version < 140)
12076 {
12077 // variable management system
12078 if (!LoadVariables(ctx, version))
12079 {
12080 m_IsStoreLoad = false;
12081 return false;
12082 }
12083 }
12084
12085 //agent trasmission system
12086 if (!LoadAgents(ctx, version))
12087 {
12088 m_IsStoreLoad = false;
12089 return false;
12090 }
12091 if (version >= 132)
12092 {
12093 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12094 if (raib)
12095 {
12096 if (!raib.OnStoreLoad(ctx,version))
12097 {
12098 m_IsStoreLoad = false;
12099 return false;
12100 }
12101 }
12102 }
12103
12104 m_IsStoreLoad = false;
12105 return true;
12106 }
12107
12108 //----------------------------------------------------------------
12109
12110 override void OnStoreSave(ParamsWriteContext ctx)
12111 {
12112 super.OnStoreSave(ctx);
12113
12114 PlayerBase player;
12115 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12116 {
12117 ctx.Write(true); // Keep track of if we should actually read this in or not
12118 //Save quickbar item bind
12119 int itemQBIndex = -1;
12120 itemQBIndex = player.FindQuickBarEntityIndex(this);
12121 ctx.Write(itemQBIndex);
12122 }
12123 else
12124 {
12125 ctx.Write(false); // Keep track of if we should actually read this in or not
12126 }
12127
12128 SaveAgents(ctx);//agent trasmission system
12129
12130 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12131 if (raib)
12132 {
12133 raib.OnStoreSave(ctx);
12134 }
12135 }
12136 //----------------------------------------------------------------
12137
12138 override void AfterStoreLoad()
12139 {
12140 super.AfterStoreLoad();
12141
12143 {
12145 }
12146
12147 if (GetStoreLoadedQuantity() != float.LOWEST)
12148 {
12150 SetStoreLoadedQuantity(float.LOWEST);//IMPORTANT to do this !! we use 'm_StoreLoadedQuantity' inside SetQuantity to distinguish between initial quantity setting and the consequent(normal gameplay) calls
12151 }
12152 }
12153
12154 override void EEOnAfterLoad()
12155 {
12156 super.EEOnAfterLoad();
12157
12159 {
12160 m_FixDamageSystemInit = false;
12161 }
12162
12165 }
12166
12167 bool CanBeDisinfected()
12168 {
12169 return false;
12170 }
12171
12172
12173 //----------------------------------------------------------------
12174 override void OnVariablesSynchronized()
12175 {
12176 if (m_Initialized)
12177 {
12178 #ifdef PLATFORM_CONSOLE
12179 //bruteforce it is
12180 if (IsSplitable())
12181 {
12182 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
12183 if (menu)
12184 {
12185 menu.Refresh();
12186 }
12187 }
12188 #endif
12189 }
12190
12192 {
12193 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
12194 m_WantPlayImpactSound = false;
12195 }
12196
12198 {
12199 SetWeightDirty();
12201 }
12202 if (m_VarWet != m_VarWetPrev)
12203 {
12206 }
12207
12208 if (m_SoundSyncPlay != 0)
12209 {
12212
12213 m_SoundSyncPlay = 0;
12214 m_SoundSyncSlotID = -1;
12215 }
12216 if (m_SoundSyncStop != 0)
12217 {
12219 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
12220 m_SoundSyncStop = 0;
12221 }
12222
12223 super.OnVariablesSynchronized();
12224 }
12225
12226 //------------------------- Quantity
12227 //----------------------------------------------------------------
12229 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
12230 {
12231 if (!IsServerCheck(allow_client))
12232 return false;
12233
12234 if (!HasQuantity())
12235 return false;
12236
12237 float min = GetQuantityMin();
12238 float max = GetQuantityMax();
12239
12240 if (value <= (min + 0.001))
12241 value = min;
12242
12243 if (value == min)
12244 {
12245 if (destroy_config)
12246 {
12247 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12248 if (dstr)
12249 {
12250 m_VarQuantity = Math.Clamp(value, min, max);
12251 this.Delete();
12252 return true;
12253 }
12254 }
12255 else if (destroy_forced)
12256 {
12257 m_VarQuantity = Math.Clamp(value, min, max);
12258 this.Delete();
12259 return true;
12260 }
12261 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
12262 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
12263 }
12264
12265 float delta = m_VarQuantity;
12266 m_VarQuantity = Math.Clamp(value, min, max);
12267
12268 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12269 {
12270 EntityAI parent = GetHierarchyRoot();
12271 InventoryLocation iLoc = new InventoryLocation();
12272 GetInventory().GetCurrentInventoryLocation(iLoc);
12273 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
12274 {
12275 int iLocSlot = iLoc.GetSlot();
12276 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
12277 {
12278 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
12279 }
12280 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
12281 {
12282 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
12283 }
12284 }
12285 }
12286
12287 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
12288 {
12289 delta = m_VarQuantity - delta;
12290
12291 if (delta)
12292 OnQuantityChanged(delta);
12293 }
12294
12295 SetVariableMask(VARIABLE_QUANTITY);
12296
12297 return false;
12298 }
12299
12300 //----------------------------------------------------------------
12302 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
12303 {
12304 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
12305 }
12306 //----------------------------------------------------------------
12307 void SetQuantityMax()
12308 {
12309 float max = GetQuantityMax();
12310 SetQuantity(max);
12311 }
12312
12313 override void SetQuantityToMinimum()
12314 {
12315 float min = GetQuantityMin();
12316 SetQuantity(min);
12317 }
12318 //----------------------------------------------------------------
12320 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
12321 {
12322 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
12323 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
12324 SetQuantity(result, destroy_config, destroy_forced);
12325 }
12326
12327 //----------------------------------------------------------------
12329 override float GetQuantityNormalized()
12330 {
12331 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
12332 }
12333
12335 {
12336 return GetQuantityNormalized();
12337 }
12338
12339 /*void SetAmmoNormalized(float value)
12340 {
12341 float value_clamped = Math.Clamp(value, 0, 1);
12342 Magazine this_mag = Magazine.Cast(this);
12343 int max_rounds = this_mag.GetAmmoMax();
12344 int result = value * max_rounds;//can the rounded if higher precision is required
12345 this_mag.SetAmmoCount(result);
12346 }*/
12347 //----------------------------------------------------------------
12348 override int GetQuantityMax()
12349 {
12350 int slot = -1;
12351 GameInventory inventory = GetInventory();
12352 if (inventory)
12353 {
12354 InventoryLocation il = new InventoryLocation;
12355 inventory.GetCurrentInventoryLocation(il);
12356 slot = il.GetSlot();
12357 }
12358
12359 return GetTargetQuantityMax(slot);
12360 }
12361
12362 override int GetTargetQuantityMax(int attSlotID = -1)
12363 {
12364 float quantity_max = 0;
12365
12366 if (IsSplitable()) //only stackable/splitable items can check for stack size
12367 {
12368 if (attSlotID != -1)
12369 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12370
12371 if (quantity_max <= 0)
12372 quantity_max = m_VarStackMax;
12373 }
12374
12375 if (quantity_max <= 0)
12376 quantity_max = m_VarQuantityMax;
12377
12378 return quantity_max;
12379 }
12380 //----------------------------------------------------------------
12381 override int GetQuantityMin()
12382 {
12383 return m_VarQuantityMin;
12384 }
12385 //----------------------------------------------------------------
12386 int GetQuantityInit()
12387 {
12388 return m_VarQuantityInit;
12389 }
12390
12391 //----------------------------------------------------------------
12392 override bool HasQuantity()
12393 {
12394 return !(GetQuantityMax() - GetQuantityMin() == 0);
12395 }
12396
12397 override float GetQuantity()
12398 {
12399 return m_VarQuantity;
12400 }
12401
12402 bool IsFullQuantity()
12403 {
12404 return GetQuantity() >= GetQuantityMax();
12405 }
12406
12407 //Calculates weight of single item without attachments and cargo
12408 override float GetSingleInventoryItemWeightEx()
12409 {
12410 //this needs to be first stored inside local variables, when returned directly during inside return call, the result is completely different due to enforce script bug
12411 float weightEx = GetWeightEx();//overall weight of the item
12412 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
12413 return weightEx - special;
12414 }
12415
12416 // Obsolete, use GetSingleInventoryItemWeightEx() instead
12418 {
12420 }
12421
12422 override protected float GetWeightSpecialized(bool forceRecalc = false)
12423 {
12424 if (IsSplitable()) //quantity determines size of the stack
12425 {
12426 #ifdef DEVELOPER
12427 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12428 {
12429 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12430 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
12431 }
12432 #endif
12433
12434 return GetQuantity() * GetConfigWeightModified();
12435 }
12436 else if (HasEnergyManager())// items with energy manager
12437 {
12438 #ifdef DEVELOPER
12439 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12440 {
12441 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12442 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
12443 }
12444 #endif
12445 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12446 }
12447 else//everything else
12448 {
12449 #ifdef DEVELOPER
12450 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12451 {
12452 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12453 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
12454 }
12455 #endif
12456 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12457 }
12458 }
12459
12461 int GetNumberOfItems()
12462 {
12463 int item_count = 0;
12464 ItemBase item;
12465
12466 GameInventory inventory = GetInventory();
12467 CargoBase cargo = inventory.GetCargo();
12468 if (cargo != NULL)
12469 {
12470 item_count = cargo.GetItemCount();
12471 }
12472
12473 int nAttachments = inventory.AttachmentCount();
12474 for (int i = 0; i < nAttachments; ++i)
12475 {
12476 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
12477 if (item)
12478 item_count += item.GetNumberOfItems();
12479 }
12480 return item_count;
12481 }
12482
12484 float GetUnitWeight(bool include_wetness = true)
12485 {
12486 float weight = 0;
12487 float wetness = 1;
12488 if (include_wetness)
12489 wetness += GetWet();
12490 if (IsSplitable()) //quantity determines size of the stack
12491 {
12492 weight = wetness * m_ConfigWeight;
12493 }
12494 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12495 {
12496 weight = 1;
12497 }
12498 return weight;
12499 }
12500
12501 //-----------------------------------------------------------------
12502
12503 override void ClearInventory()
12504 {
12505 GameInventory inventory = GetInventory();
12506 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
12507 {
12508 array<EntityAI> items = new array<EntityAI>;
12509 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
12510 for (int i = 0; i < items.Count(); ++i)
12511 {
12512 ItemBase item = ItemBase.Cast(items.Get(i));
12513 if (item)
12514 {
12515 g_Game.ObjectDelete(item);
12516 }
12517 }
12518 }
12519 }
12520
12521 //------------------------- Energy
12522
12523 //----------------------------------------------------------------
12524 float GetEnergy()
12525 {
12526 float energy = 0;
12527 if (HasEnergyManager())
12528 {
12529 energy = GetCompEM().GetEnergy();
12530 }
12531 return energy;
12532 }
12533
12534
12535 override void OnEnergyConsumed()
12536 {
12537 super.OnEnergyConsumed();
12538
12540 }
12541
12542 override void OnEnergyAdded()
12543 {
12544 super.OnEnergyAdded();
12545
12547 }
12548
12549 // Converts energy (from Energy Manager) to quantity, if enabled.
12551 {
12552 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12553 {
12554 if (HasQuantity())
12555 {
12556 float energy_0to1 = GetCompEM().GetEnergy0To1();
12557 SetQuantityNormalized(energy_0to1);
12558 }
12559 }
12560 }
12561
12562 //----------------------------------------------------------------
12563 float GetHeatIsolationInit()
12564 {
12565 return ConfigGetFloat("heatIsolation");
12566 }
12567
12568 float GetHeatIsolation()
12569 {
12570 return m_HeatIsolation;
12571 }
12572
12573 float GetDryingIncrement(string pIncrementName)
12574 {
12575 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12576 if (g_Game.ConfigIsExisting(paramPath))
12577 return g_Game.ConfigGetFloat(paramPath);
12578
12579 return 0.0;
12580 }
12581
12582 float GetSoakingIncrement(string pIncrementName)
12583 {
12584 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12585 if (g_Game.ConfigIsExisting(paramPath))
12586 return g_Game.ConfigGetFloat(paramPath);
12587
12588 return 0.0;
12589 }
12590 //----------------------------------------------------------------
12591 override void SetWet(float value, bool allow_client = false)
12592 {
12593 if (!IsServerCheck(allow_client))
12594 return;
12595
12596 float min = GetWetMin();
12597 float max = GetWetMax();
12598
12599 float previousValue = m_VarWet;
12600
12601 m_VarWet = Math.Clamp(value, min, max);
12602
12603 if (previousValue != m_VarWet)
12604 {
12605 SetVariableMask(VARIABLE_WET);
12606 OnWetChanged(m_VarWet, previousValue);
12607 }
12608 }
12609 //----------------------------------------------------------------
12610 override void AddWet(float value)
12611 {
12612 SetWet(GetWet() + value);
12613 }
12614 //----------------------------------------------------------------
12615 override void SetWetMax()
12616 {
12618 }
12619 //----------------------------------------------------------------
12620 override float GetWet()
12621 {
12622 return m_VarWet;
12623 }
12624 //----------------------------------------------------------------
12625 override float GetWetMax()
12626 {
12627 return m_VarWetMax;
12628 }
12629 //----------------------------------------------------------------
12630 override float GetWetMin()
12631 {
12632 return m_VarWetMin;
12633 }
12634 //----------------------------------------------------------------
12635 override float GetWetInit()
12636 {
12637 return m_VarWetInit;
12638 }
12639 //----------------------------------------------------------------
12640 override void OnWetChanged(float newVal, float oldVal)
12641 {
12642 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12643 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12644 if (newLevel != oldLevel)
12645 {
12646 OnWetLevelChanged(newLevel,oldLevel);
12647 }
12648 }
12649
12650 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12651 {
12652 SetWeightDirty();
12653 }
12654
12655 override EWetnessLevel GetWetLevel()
12656 {
12657 return GetWetLevelInternal(m_VarWet);
12658 }
12659
12660 //----------------------------------------------------------------
12661
12662 override void SetStoreLoad(bool value)
12663 {
12664 m_IsStoreLoad = value;
12665 }
12666
12667 override bool IsStoreLoad()
12668 {
12669 return m_IsStoreLoad;
12670 }
12671
12672 override void SetStoreLoadedQuantity(float value)
12673 {
12674 m_StoreLoadedQuantity = value;
12675 }
12676
12677 override float GetStoreLoadedQuantity()
12678 {
12679 return m_StoreLoadedQuantity;
12680 }
12681
12682 //----------------------------------------------------------------
12683
12684 float GetItemModelLength()
12685 {
12686 if (ConfigIsExisting("itemModelLength"))
12687 {
12688 return ConfigGetFloat("itemModelLength");
12689 }
12690 return 0;
12691 }
12692
12693 float GetItemAttachOffset()
12694 {
12695 if (ConfigIsExisting("itemAttachOffset"))
12696 {
12697 return ConfigGetFloat("itemAttachOffset");
12698 }
12699 return 0;
12700 }
12701
12702 override void SetCleanness(int value, bool allow_client = false)
12703 {
12704 if (!IsServerCheck(allow_client))
12705 return;
12706
12707 int previousValue = m_Cleanness;
12708
12709 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12710
12711 if (previousValue != m_Cleanness)
12712 SetVariableMask(VARIABLE_CLEANNESS);
12713 }
12714
12715 override int GetCleanness()
12716 {
12717 return m_Cleanness;
12718 }
12719
12721 {
12722 return true;
12723 }
12724
12725 //----------------------------------------------------------------
12726 // ATTACHMENT LOCKING
12727 // Getters relevant to generic ActionLockAttachment
12728 int GetLockType()
12729 {
12730 return m_LockType;
12731 }
12732
12733 string GetLockSoundSet()
12734 {
12735 return m_LockSoundSet;
12736 }
12737
12738 //----------------------------------------------------------------
12739 //------------------------- Color
12740 // sets items color variable given color components
12741 override void SetColor(int r, int g, int b, int a)
12742 {
12747 SetVariableMask(VARIABLE_COLOR);
12748 }
12750 override void GetColor(out int r,out int g,out int b,out int a)
12751 {
12756 }
12757
12758 bool IsColorSet()
12759 {
12760 return IsVariableSet(VARIABLE_COLOR);
12761 }
12762
12764 string GetColorString()
12765 {
12766 int r,g,b,a;
12767 GetColor(r,g,b,a);
12768 r = r/255;
12769 g = g/255;
12770 b = b/255;
12771 a = a/255;
12772 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12773 }
12774 //----------------------------------------------------------------
12775 //------------------------- LiquidType
12776
12777 override void SetLiquidType(int value, bool allow_client = false)
12778 {
12779 if (!IsServerCheck(allow_client))
12780 return;
12781
12782 int old = m_VarLiquidType;
12783 m_VarLiquidType = value;
12784 OnLiquidTypeChanged(old,value);
12785 SetVariableMask(VARIABLE_LIQUIDTYPE);
12786 }
12787
12788 int GetLiquidTypeInit()
12789 {
12790 return ConfigGetInt("varLiquidTypeInit");
12791 }
12792
12793 override int GetLiquidType()
12794 {
12795 return m_VarLiquidType;
12796 }
12797
12798 protected void OnLiquidTypeChanged(int oldType, int newType)
12799 {
12800 if (newType == LIQUID_NONE && GetIsFrozen())
12801 SetFrozen(false);
12802 }
12803
12805 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12806 {
12807 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12808 }
12809
12810 // -------------------------------------------------------------------------
12812 void OnInventoryEnter(Man player)
12813 {
12814 PlayerBase nplayer;
12815 if (PlayerBase.CastTo(nplayer, player))
12816 {
12817 m_CanPlayImpactSound = true;
12818 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12819 }
12820 }
12821
12822 // -------------------------------------------------------------------------
12824 void OnInventoryExit(Man player)
12825 {
12826 PlayerBase nplayer;
12827 if (PlayerBase.CastTo(nplayer,player))
12828 {
12829 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12830 }
12831
12832 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12833
12834 if (HasEnergyManager())
12835 {
12836 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
12837 }
12838 }
12839
12840 // ADVANCED PLACEMENT EVENTS
12841 override void OnPlacementStarted(Man player)
12842 {
12843 super.OnPlacementStarted(player);
12844
12845 SetTakeable(false);
12846 }
12847
12848 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
12849 {
12850 if (m_AdminLog)
12851 {
12852 m_AdminLog.OnPlacementComplete(player, this);
12853 }
12854
12855 super.OnPlacementComplete(player, position, orientation);
12856 }
12857
12858 //-----------------------------
12859 // AGENT SYSTEM
12860 //-----------------------------
12861 //--------------------------------------------------------------------------
12862 bool ContainsAgent(int agent_id)
12863 {
12864 if (agent_id & m_AttachedAgents)
12865 {
12866 return true;
12867 }
12868 else
12869 {
12870 return false;
12871 }
12872 }
12873
12874 //--------------------------------------------------------------------------
12875 override void RemoveAgent(int agent_id)
12876 {
12877 if (ContainsAgent(agent_id))
12878 {
12879 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12880 }
12881 }
12882
12883 //--------------------------------------------------------------------------
12884 override void RemoveAllAgents()
12885 {
12886 m_AttachedAgents = 0;
12887 }
12888 //--------------------------------------------------------------------------
12889 override void RemoveAllAgentsExcept(int agent_to_keep)
12890 {
12891 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12892 }
12893 // -------------------------------------------------------------------------
12894 override void InsertAgent(int agent, float count = 1)
12895 {
12896 if (count < 1)
12897 return;
12898 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12900 }
12901
12903 void TransferAgents(int agents)
12904 {
12906 }
12907
12908 // -------------------------------------------------------------------------
12909 override int GetAgents()
12910 {
12911 return m_AttachedAgents;
12912 }
12913 //----------------------------------------------------------------------
12914
12915 /*int GetContaminationType()
12916 {
12917 int contamination_type;
12918
12919 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
12920 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
12921 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
12922 const int DIRTY_MASK = eAgents.WOUND_AGENT;
12923
12924 Edible_Base edible = Edible_Base.Cast(this);
12925 int agents = GetAgents();
12926 if (edible)
12927 {
12928 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
12929 if (profile)
12930 {
12931 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
12932 }
12933 }
12934 if (agents & CONTAMINATED_MASK)
12935 {
12936 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
12937 }
12938 if (agents & POISONED_MASK)
12939 {
12940 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
12941 }
12942 if (agents & NERVE_GAS_MASK)
12943 {
12944 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
12945 }
12946 if (agents & DIRTY_MASK)
12947 {
12948 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
12949 }
12950
12951 return agents;
12952 }*/
12953
12954 // -------------------------------------------------------------------------
12955 bool LoadAgents(ParamsReadContext ctx, int version)
12956 {
12957 if (!ctx.Read(m_AttachedAgents))
12958 return false;
12959 return true;
12960 }
12961 // -------------------------------------------------------------------------
12963 {
12964
12966 }
12967 // -------------------------------------------------------------------------
12968
12970 override void CheckForRoofLimited(float timeTresholdMS = 3000)
12971 {
12972 super.CheckForRoofLimited(timeTresholdMS);
12973
12974 float time = g_Game.GetTime();
12975 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12976 {
12977 m_PreviousRoofTestTime = time;
12978 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12979 }
12980 }
12981
12982 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
12983 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
12984 {
12985 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
12986 {
12987 return 0;
12988 }
12989
12990 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
12991 {
12992 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
12993 if (filter)
12994 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
12995 else
12996 return 0;//otherwise return 0 when no filter attached
12997 }
12998
12999 string subclassPath, entryName;
13000
13001 switch (type)
13002 {
13003 case DEF_BIOLOGICAL:
13004 entryName = "biological";
13005 break;
13006 case DEF_CHEMICAL:
13007 entryName = "chemical";
13008 break;
13009 default:
13010 entryName = "biological";
13011 break;
13012 }
13013
13014 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
13015
13016 return g_Game.ConfigGetFloat(subclassPath + entryName);
13017 }
13018
13019
13020
13022 override void EEOnCECreate()
13023 {
13024 if (!IsMagazine())
13026
13028 }
13029
13030
13031 //-------------------------
13032 // OPEN/CLOSE USER ACTIONS
13033 //-------------------------
13035 void Open();
13036 void Close();
13037 bool IsOpen()
13038 {
13039 return true;
13040 }
13041
13042 override bool CanDisplayCargo()
13043 {
13044 return IsOpen();
13045 }
13046
13047
13048 // ------------------------------------------------------------
13049 // CONDITIONS
13050 // ------------------------------------------------------------
13051 override bool CanPutInCargo(EntityAI parent)
13052 {
13053 if (parent)
13054 {
13055 if (parent.IsInherited(DayZInfected))
13056 return true;
13057
13058 if (!parent.IsRuined())
13059 return true;
13060 }
13061
13062 return true;
13063 }
13064
13065 override bool CanPutAsAttachment(EntityAI parent)
13066 {
13067 if (!super.CanPutAsAttachment(parent))
13068 {
13069 return false;
13070 }
13071
13072 if (!IsRuined() && !parent.IsRuined())
13073 {
13074 return true;
13075 }
13076
13077 return false;
13078 }
13079
13080 override bool CanReceiveItemIntoCargo(EntityAI item)
13081 {
13082 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13083 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13084 // return false;
13085
13086 return super.CanReceiveItemIntoCargo(item);
13087 }
13088
13089 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
13090 {
13091 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13092 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13093 // return false;
13094
13095 GameInventory attachmentInv = attachment.GetInventory();
13096 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13097 {
13098 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13099 return false;
13100 }
13101
13102 InventoryLocation loc = new InventoryLocation();
13103 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13104 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
13105 return false;
13106
13107 return super.CanReceiveAttachment(attachment, slotId);
13108 }
13109
13110 override bool CanReleaseAttachment(EntityAI attachment)
13111 {
13112 if (!super.CanReleaseAttachment(attachment))
13113 return false;
13114
13115 return GetInventory().AreChildrenAccessible();
13116 }
13117
13118 /*override bool CanLoadAttachment(EntityAI attachment)
13119 {
13120 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13121 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13122 // return false;
13123
13124 GameInventory attachmentInv = attachment.GetInventory();
13125 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13126 {
13127 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
13128 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
13129
13130 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13131 return false;
13132 }
13133
13134 return super.CanLoadAttachment(attachment);
13135 }*/
13136
13137 // Plays muzzle flash particle effects
13138 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13139 {
13140 int id = muzzle_owner.GetMuzzleID();
13141 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
13142
13143 if (WPOF_array)
13144 {
13145 for (int i = 0; i < WPOF_array.Count(); i++)
13146 {
13147 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13148
13149 if (WPOF)
13150 {
13151 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13152 }
13153 }
13154 }
13155 }
13156
13157 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
13158 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13159 {
13160 int id = muzzle_owner.GetMuzzleID();
13161 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
13162
13163 if (WPOBE_array)
13164 {
13165 for (int i = 0; i < WPOBE_array.Count(); i++)
13166 {
13167 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13168
13169 if (WPOBE)
13170 {
13171 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13172 }
13173 }
13174 }
13175 }
13176
13177 // Plays all weapon overheating particles
13178 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13179 {
13180 int id = muzzle_owner.GetMuzzleID();
13181 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13182
13183 if (WPOOH_array)
13184 {
13185 for (int i = 0; i < WPOOH_array.Count(); i++)
13186 {
13187 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13188
13189 if (WPOOH)
13190 {
13191 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13192 }
13193 }
13194 }
13195 }
13196
13197 // Updates all weapon overheating particles
13198 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13199 {
13200 int id = muzzle_owner.GetMuzzleID();
13201 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13202
13203 if (WPOOH_array)
13204 {
13205 for (int i = 0; i < WPOOH_array.Count(); i++)
13206 {
13207 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13208
13209 if (WPOOH)
13210 {
13211 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13212 }
13213 }
13214 }
13215 }
13216
13217 // Stops overheating particles
13218 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13219 {
13220 int id = muzzle_owner.GetMuzzleID();
13221 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13222
13223 if (WPOOH_array)
13224 {
13225 for (int i = 0; i < WPOOH_array.Count(); i++)
13226 {
13227 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13228
13229 if (WPOOH)
13230 {
13231 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13232 }
13233 }
13234 }
13235 }
13236
13237 //----------------------------------------------------------------
13238 //Item Behaviour - unified approach
13239 override bool IsHeavyBehaviour()
13240 {
13241 if (m_ItemBehaviour == 0)
13242 {
13243 return true;
13244 }
13245
13246 return false;
13247 }
13248
13249 override bool IsOneHandedBehaviour()
13250 {
13251 if (m_ItemBehaviour == 1)
13252 {
13253 return true;
13254 }
13255
13256 return false;
13257 }
13258
13259 override bool IsTwoHandedBehaviour()
13260 {
13261 if (m_ItemBehaviour == 2)
13262 {
13263 return true;
13264 }
13265
13266 return false;
13267 }
13268
13269 bool IsDeployable()
13270 {
13271 return false;
13272 }
13273
13275 float GetDeployTime()
13276 {
13277 return UATimeSpent.DEFAULT_DEPLOY;
13278 }
13279
13280
13281 //----------------------------------------------------------------
13282 // Item Targeting (User Actions)
13283 override void SetTakeable(bool pState)
13284 {
13285 m_IsTakeable = pState;
13286 SetSynchDirty();
13287 }
13288
13289 override bool IsTakeable()
13290 {
13291 return m_IsTakeable;
13292 }
13293
13294 // For cases where we want to show object widget which cant be taken to hands
13296 {
13297 return false;
13298 }
13299
13301 protected void PreLoadSoundAttachmentType()
13302 {
13303 string att_type = "None";
13304
13305 if (ConfigIsExisting("soundAttType"))
13306 {
13307 att_type = ConfigGetString("soundAttType");
13308 }
13309
13310 m_SoundAttType = att_type;
13311 }
13312
13313 override string GetAttachmentSoundType()
13314 {
13315 return m_SoundAttType;
13316 }
13317
13318 //----------------------------------------------------------------
13319 //SOUNDS - ItemSoundHandler
13320 //----------------------------------------------------------------
13321
13322 string GetPlaceSoundset(); // played when deploy starts
13323 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
13324 string GetDeploySoundset(); // played when deploy sucessfully finishes
13325 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
13326 string GetFoldSoundset(); // played when fold sucessfully finishes
13327
13329 {
13330 if (!m_ItemSoundHandler)
13332
13333 return m_ItemSoundHandler;
13334 }
13335
13336 // override to initialize sounds
13337 protected void InitItemSounds()
13338 {
13339 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
13340 return;
13341
13343
13344 if (GetPlaceSoundset() != string.Empty)
13345 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
13346
13347 if (GetDeploySoundset() != string.Empty)
13348 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
13349
13350 SoundParameters params = new SoundParameters();
13351 params.m_Loop = true;
13352 if (GetLoopDeploySoundset() != string.Empty)
13353 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
13354 }
13355
13356 // Start sound using ItemSoundHandler
13357 void StartItemSoundServer(int id, int slotId)
13358 {
13359 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
13360 {
13361 m_SoundSyncSlotID = slotId;
13362 m_SoundSyncPlay = id;
13363
13364 SetSynchDirty();
13365
13366 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
13367 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
13368 }
13369 }
13370
13371 void StartItemSoundServer(int id)
13372 {
13373 StartItemSoundServer(id, InventorySlots.INVALID);
13374 }
13375
13376 // Stop sound using ItemSoundHandler
13377 void StopItemSoundServer(int id)
13378 {
13379 if (!g_Game.IsServer())
13380 return;
13381
13382 m_SoundSyncStop = id;
13383 SetSynchDirty();
13384
13385 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
13386 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
13387 }
13388
13389 protected void ClearStartItemSoundServer()
13390 {
13391 m_SoundSyncPlay = 0;
13392 m_SoundSyncSlotID = InventorySlots.INVALID;
13393 }
13394
13395 protected void ClearStopItemSoundServer()
13396 {
13397 m_SoundSyncStop = 0;
13398 }
13399
13400 void OnApply(PlayerBase player);
13401
13403 {
13404 return 1.0;
13405 };
13406 //returns applicable selection
13407 array<string> GetHeadHidingSelection()
13408 {
13410 }
13411
13413 {
13415 }
13416
13417 WrittenNoteData GetWrittenNoteData() {};
13418
13420 {
13421 SetDynamicPhysicsLifeTime(0.01);
13422 m_ItemBeingDroppedPhys = false;
13423 }
13424
13426 {
13427 array<string> zone_names = new array<string>;
13428 GetDamageZones(zone_names);
13429 for (int i = 0; i < zone_names.Count(); i++)
13430 {
13431 SetHealthMax(zone_names.Get(i),"Health");
13432 }
13433 SetHealthMax("","Health");
13434 }
13435
13437 void SetZoneDamageCEInit()
13438 {
13439 float global_health = GetHealth01("","Health");
13440 array<string> zones = new array<string>;
13441 GetDamageZones(zones);
13442 //set damage of all zones to match global health level
13443 for (int i = 0; i < zones.Count(); i++)
13444 {
13445 SetHealth01(zones.Get(i),"Health",global_health);
13446 }
13447 }
13448
13450 bool IsCoverFaceForShave(string slot_name)
13451 {
13452 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13453 }
13454
13455 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13456 {
13457 if (!hasRootAsPlayer)
13458 {
13459 if (refParentIB)
13460 {
13461 // parent is wet
13462 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
13463 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13464 // parent has liquid inside
13465 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
13466 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13467 // drying
13468 else if (m_VarWet > m_VarWetMin)
13469 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
13470 }
13471 else
13472 {
13473 // drying on ground or inside non-itembase (car, ...)
13474 if (m_VarWet > m_VarWetMin)
13475 AddWet(-1 * delta * GetDryingIncrement("ground"));
13476 }
13477 }
13478 }
13479
13480 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13481 {
13483 {
13484 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
13485 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13486 {
13487 float heatPermCoef = 1.0;
13488 EntityAI ent = this;
13489 while (ent)
13490 {
13491 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13492 ent = ent.GetHierarchyParent();
13493 }
13494
13495 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13496 }
13497 }
13498 }
13499
13500 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13501 {
13502 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13503 EntityAI parent = GetHierarchyParent();
13504 if (!parent)
13505 {
13506 hasParent = false;
13507 hasRootAsPlayer = false;
13508 }
13509 else
13510 {
13511 hasParent = true;
13512 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13513 refParentIB = ItemBase.Cast(parent);
13514 }
13515 }
13516
13517 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13518 {
13519 // this is stub, implemented on Edible_Base
13520 }
13521
13522 bool CanDecay()
13523 {
13524 // return true used on selected food clases so they can decay
13525 return false;
13526 }
13527
13528 protected bool CanProcessDecay()
13529 {
13530 // this is stub, implemented on Edible_Base class
13531 // used to determine whether it is still necessary for the food to decay
13532 return false;
13533 }
13534
13535 protected bool CanHaveWetness()
13536 {
13537 // return true used on selected items that have a wetness effect
13538 return false;
13539 }
13540
13542 bool CanBeConsumed(ConsumeConditionData data = null)
13543 {
13544 return !GetIsFrozen() && IsOpen();
13545 }
13546
13547 override void ProcessVariables()
13548 {
13549 bool hasParent = false, hasRootAsPlayer = false;
13550 ItemBase refParentIB;
13551
13552 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13553 bool foodDecay = g_Game.IsFoodDecayEnabled();
13554
13555 if (wwtu || foodDecay)
13556 {
13557 bool processWetness = wwtu && CanHaveWetness();
13558 bool processTemperature = wwtu && CanHaveTemperature();
13559 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13560
13561 if (processWetness || processTemperature || processDecay)
13562 {
13563 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13564
13565 if (processWetness)
13566 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13567
13568 if (processTemperature)
13569 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13570
13571 if (processDecay)
13572 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13573 }
13574 }
13575 }
13576
13579 {
13580 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13581 }
13582
13583 override float GetTemperatureFreezeThreshold()
13584 {
13586 return Liquid.GetFreezeThreshold(GetLiquidType());
13587
13588 return super.GetTemperatureFreezeThreshold();
13589 }
13590
13591 override float GetTemperatureThawThreshold()
13592 {
13594 return Liquid.GetThawThreshold(GetLiquidType());
13595
13596 return super.GetTemperatureThawThreshold();
13597 }
13598
13599 override float GetItemOverheatThreshold()
13600 {
13602 return Liquid.GetBoilThreshold(GetLiquidType());
13603
13604 return super.GetItemOverheatThreshold();
13605 }
13606
13607 override float GetTemperatureFreezeTime()
13608 {
13609 if (HasQuantity())
13610 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13611
13612 return super.GetTemperatureFreezeTime();
13613 }
13614
13615 override float GetTemperatureThawTime()
13616 {
13617 if (HasQuantity())
13618 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13619
13620 return super.GetTemperatureThawTime();
13621 }
13622
13624 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13626 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13627
13628 bool IsCargoException4x3(EntityAI item)
13629 {
13630 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13631 }
13632
13634 {
13635 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13636 }
13637
13639 void AddLightSourceItem(ItemBase lightsource)
13640 {
13641 m_LightSourceItem = lightsource;
13642 }
13643
13645 {
13646 m_LightSourceItem = null;
13647 }
13648
13650 {
13651 return m_LightSourceItem;
13652 }
13653
13655 array<int> GetValidFinishers()
13656 {
13657 return null;
13658 }
13659
13661 bool GetActionWidgetOverride(out typename name)
13662 {
13663 return false;
13664 }
13665
13666 bool PairWithDevice(notnull ItemBase otherDevice)
13667 {
13668 if (g_Game.IsServer())
13669 {
13670 ItemBase explosive = otherDevice;
13672 if (!trg)
13673 {
13674 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13675 explosive = this;
13676 }
13677
13678 explosive.PairRemote(trg);
13679 trg.SetControlledDevice(explosive);
13680
13681 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13682 trg.SetPersistentPairID(persistentID);
13683 explosive.SetPersistentPairID(persistentID);
13684
13685 return true;
13686 }
13687 return false;
13688 }
13689
13691 float GetBaitEffectivity()
13692 {
13693 float ret = 1.0;
13694 if (HasQuantity())
13695 ret *= GetQuantityNormalized();
13696 ret *= GetHealth01();
13697
13698 return ret;
13699 }
13700
13701 #ifdef DEVELOPER
13702 override void SetDebugItem()
13703 {
13704 super.SetDebugItem();
13705 _itemBase = this;
13706 }
13707
13708 override string GetDebugText()
13709 {
13710 string text = super.GetDebugText();
13711
13712 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13713 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13714
13715 return text;
13716 }
13717 #endif
13718
13719 bool CanBeUsedForSuicide()
13720 {
13721 return true;
13722 }
13723
13725 //DEPRECATED BELOW
13727 // Backwards compatibility
13728 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13729 {
13730 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13731 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13732 }
13733
13734 // replaced by ItemSoundHandler
13735 protected EffectSound m_SoundDeployFinish;
13736 protected EffectSound m_SoundPlace;
13737 protected EffectSound m_DeployLoopSoundEx;
13738 protected EffectSound m_SoundDeploy;
13739 bool m_IsPlaceSound;
13740 bool m_IsDeploySound;
13742
13743 string GetDeployFinishSoundset();
13744 void PlayDeploySound();
13745 void PlayDeployFinishSound();
13746 void PlayPlaceSound();
13747 void PlayDeployLoopSoundEx();
13748 void StopDeployLoopSoundEx();
13749 void SoundSynchRemoteReset();
13750 void SoundSynchRemote();
13751 bool UsesGlobalDeploy(){return false;}
13752 bool CanPlayDeployLoopSound(){return false;}
13754 bool IsPlaceSound(){return m_IsPlaceSound;}
13755 bool IsDeploySound(){return m_IsDeploySound;}
13756 void SetIsPlaceSound(bool is_place_sound);
13757 void SetIsDeploySound(bool is_deploy_sound);
13758
13759 [Obsolete("Use ItemSoundHandler instead")]
13761 void PlayAttachSound(string slot_type)
13762 {
13763 if (!g_Game.IsDedicatedServer())
13764 {
13765 if (ConfigIsExisting("attachSoundSet"))
13766 {
13767 string cfg_path = "";
13768 string soundset = "";
13769 string type_name = GetType();
13770
13771 TStringArray cfg_soundset_array = new TStringArray;
13772 TStringArray cfg_slot_array = new TStringArray;
13773 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13774 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13775
13776 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13777 {
13778 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13779 {
13780 if (cfg_slot_array[i] == slot_type)
13781 {
13782 soundset = cfg_soundset_array[i];
13783 break;
13784 }
13785 }
13786 }
13787
13788 if (soundset != "")
13789 {
13790 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13791 sound.SetAutodestroy(true);
13792 }
13793 }
13794 }
13795 }
13796
13797 void PlayDetachSound(string slot_type) {}
13798}
13799
13800EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13801{
13802 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13803 if (entity)
13804 {
13805 bool is_item = entity.IsInherited(ItemBase);
13806 if (is_item && full_quantity)
13807 {
13808 ItemBase item = ItemBase.Cast(entity);
13809 item.SetQuantity(item.GetQuantityInit());
13810 }
13811 }
13812 else
13813 {
13814 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13815 return NULL;
13816 }
13817 return entity;
13818}
13819
13820void SetupSpawnedItem(ItemBase item, float health, float quantity)
13821{
13822 if (item)
13823 {
13824 if (health > 0)
13825 item.SetHealth("", "", health);
13826
13827 if (item.CanHaveTemperature())
13828 {
13829 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13830 if (item.CanFreeze())
13831 item.SetFrozen(false);
13832 }
13833
13834 if (item.HasEnergyManager())
13835 {
13836 if (quantity >= 0)
13837 {
13838 item.GetCompEM().SetEnergy0To1(quantity);
13839 }
13840 else
13841 {
13842 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
13843 }
13844 }
13845 else if (item.IsMagazine())
13846 {
13847 Magazine mag = Magazine.Cast(item);
13848 if (quantity >= 0)
13849 {
13850 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13851 }
13852 else
13853 {
13854 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
13855 }
13856
13857 }
13858 else
13859 {
13860 if (quantity >= 0)
13861 {
13862 item.SetQuantityNormalized(quantity, false);
13863 }
13864 else
13865 {
13866 item.SetQuantity(Math.AbsFloat(quantity));
13867 }
13868
13869 }
13870 }
13871}
13872
13873#ifdef DEVELOPER
13874ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13875#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
EWetnessLevel
Определения 3_Game/DayZ/Entities/EntityAI.c:2
bool SetAttachSoundEvent()
void InventoryItemType()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_ITEM_MANIPULATION
class LogManager EntityAI
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionDropItem()
Определения ActionDropItem.c:34
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
string Debug()
Определения CachedEquipmentStorageBase.c:29
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
Определения ContaminatedArea_Dynamic.c:42
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
DayZGame GetDayZGame()
Определения DayZGame.c:3944
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:159
const int MIN
Определения EnConvert.c:28
const int MAX
Определения EnConvert.c:27
float GetTemperature()
Определения Environment.c:500
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool IsPrepareToDelete()
Определения FireplaceBase.c:643
override bool CanHaveTemperature()
Определения FireplaceBase.c:561
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6453
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5680
bool HidesSelectionBySlot()
Определения ItemBase.c:9413
float m_VarWetMin
Определения ItemBase.c:4937
void SplitItem(PlayerBase player)
Определения ItemBase.c:6908
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9634
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8895
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8330
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5685
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:9038
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6875
override bool IsHeavyBehaviour()
Определения ItemBase.c:9240
override void SetWetMax()
Определения ItemBase.c:8616
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9451
void ClearStartItemSoundServer()
Определения ItemBase.c:9390
float m_VarWet
Определения ItemBase.c:4934
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9481
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:3
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8890
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4997
bool CanBeMovedOverride()
Определения ItemBase.c:7600
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8592
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4983
void StartItemSoundServer(int id, int slotId)
Определения ItemBase.c:9358
override void ProcessVariables()
Определения ItemBase.c:9548
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:5011
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8423
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8956
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8806
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5271
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:5009
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9584
bool m_IsSoundSynchRemote
Определения ItemBase.c:9742
float m_OverheatingShots
Определения ItemBase.c:5004
void StopItemSoundServer(int id)
Определения ItemBase.c:9378
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5700
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5424
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9608
ref array< int > m_CompatibleLocks
Определения ItemBase.c:5021
bool CanBeCooked()
Определения ItemBase.c:7556
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5767
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:5035
bool m_RecipesInitialized
Определения ItemBase.c:4919
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6546
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9592
override void OnEnergyConsumed()
Определения ItemBase.c:8536
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8462
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8656
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8418
ref TIntArray m_InteractActions
Определения ItemBase.c:4985
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7620
float m_VarQuantity
Определения ItemBase.c:4925
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9753
override float GetWetMax()
Определения ItemBase.c:8626
bool CanBeUsedForSuicide()
Определения ItemBase.c:9720
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7193
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5905
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7774
void DoAmmoExplosion()
Определения ItemBase.c:6388
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4996
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6732
int GetItemSize()
Определения ItemBase.c:7585
bool m_CanBeMovedOverride
Определения ItemBase.c:4962
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6312
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5492
bool CanDecay()
Определения ItemBase.c:9523
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...
Определения ItemBase.c:8303
void SetQuantityMax()
Определения ItemBase.c:8308
override float GetQuantity()
Определения ItemBase.c:8398
int m_ColorComponentR
Определения ItemBase.c:4974
int m_ShotsToStartOverheating
Определения ItemBase.c:5006
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8641
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5499
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9139
void OnOverheatingDecay()
Определения ItemBase.c:5462
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8574
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4940
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5600
bool UsesGlobalDeploy()
Определения ItemBase.c:9752
int m_ItemBehaviour
Определения ItemBase.c:4955
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:9111
float m_HeatIsolation
Определения ItemBase.c:4950
float m_VarWetInit
Определения ItemBase.c:4936
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5945
void SetCEBasedQuantity()
Определения ItemBase.c:5713
bool m_CanPlayImpactSound
Определения ItemBase.c:4946
override string GetAttachmentSoundType()
Определения ItemBase.c:9314
float GetOverheatingCoef()
Определения ItemBase.c:5519
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9408
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9762
override bool IsStoreLoad()
Определения ItemBase.c:8668
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7169
bool IsLightSource()
Определения ItemBase.c:5841
bool m_HasQuantityBar
Определения ItemBase.c:4968
void SetResultOfSplit(bool value)
Определения ItemBase.c:7164
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6796
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6965
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5527
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8583
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9219
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8678
int m_LockType
Определения ItemBase.c:5022
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:5027
bool m_CanBeDigged
Определения ItemBase.c:4969
float m_ItemAttachOffset
Определения ItemBase.c:4952
float GetItemModelLength()
Определения ItemBase.c:8685
bool m_ThrowItemOnDrop
Определения ItemBase.c:4960
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7919
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8971
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8569
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7198
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9579
bool CanHaveWetness()
Определения ItemBase.c:9536
int m_CleannessMin
Определения ItemBase.c:4942
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8904
string IDToName(int id)
Определения ItemBase.c:7767
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9543
float GetHeatIsolationInit()
Определения ItemBase.c:8564
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7607
override bool HasQuantity()
Определения ItemBase.c:8393
float m_VarWetPrev
Определения ItemBase.c:4935
int m_SoundSyncStop
Определения ItemBase.c:5029
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9629
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4984
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5609
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5294
int m_VarLiquidType
Определения ItemBase.c:4954
int m_QuickBarBonus
Определения ItemBase.c:4956
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9302
override float GetWetInit()
Определения ItemBase.c:8636
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4948
int m_SoundSyncPlay
Определения ItemBase.c:5028
int m_MaxOverheatingValue
Определения ItemBase.c:5007
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4931
bool m_IsTakeable
Определения ItemBase.c:4959
bool ShouldSplitQuantity(float quantity)
Определения ItemBase.c:6503
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4999
string GetLockSoundSet()
Определения ItemBase.c:8734
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8765
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9656
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6971
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4911
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9329
override int GetQuantityMin()
Определения ItemBase.c:8382
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6711
override int GetQuickBarBonus()
Определения ItemBase.c:5179
override void SetTakeable(bool pState)
Определения ItemBase.c:9284
float m_OverheatingDecayInterval
Определения ItemBase.c:5008
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6523
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9501
bool CanProcessDecay()
Определения ItemBase.c:9529
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5690
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9645
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7571
bool can_this_be_combined
Определения ItemBase.c:4964
EffectSound m_SoundDeploy
Определения ItemBase.c:9739
int m_SoundSyncSlotID
Определения ItemBase.c:5030
int m_Count
Определения ItemBase.c:4930
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9692
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9276
override bool IsSplitable()
Определения ItemBase.c:6490
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6473
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7883
void ConvertEnergyToQuantity()
Определения ItemBase.c:8551
override void RemoveAllAgents()
Определения ItemBase.c:8885
override void SetQuantityToMinimum()
Определения ItemBase.c:8314
bool m_WantPlayImpactSound
Определения ItemBase.c:4945
override float GetTemperatureThawTime()
Определения ItemBase.c:9616
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4998
int m_ColorComponentG
Определения ItemBase.c:4975
float m_StoreLoadedQuantity
Определения ItemBase.c:4932
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7638
int m_ColorComponentA
Определения ItemBase.c:4977
int m_VarQuantityInit
Определения ItemBase.c:4927
float GetFilterDamageRatio()
Определения ItemBase.c:5594
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8778
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6942
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...
Определения ItemBase.c:8321
bool m_HideSelectionsBySlot
Определения ItemBase.c:5012
bool IsOverheatingEffectActive()
Определения ItemBase.c:5457
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5874
int GetLiquidContainerMask()
Определения ItemBase.c:5811
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
Определения ItemBase.c:7078
ref Timer m_CheckOverheating
Определения ItemBase.c:5005
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5505
float GetEnergy()
Определения ItemBase.c:8525
bool CanBeDigged()
Определения ItemBase.c:5890
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9662
bool IsNVG()
Определения ItemBase.c:5822
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8485
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9438
bool m_IsDeploySound
Определения ItemBase.c:9741
bool CanEat()
Определения ItemBase.c:7531
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9179
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9250
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9640
bool IsLiquidContainer()
Определения ItemBase.c:5806
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7551
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8409
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8963
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8363
int m_CleannessInit
Определения ItemBase.c:4941
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5589
override int GetAgents()
Определения ItemBase.c:8910
int m_VarQuantityMax
Определения ItemBase.c:4929
override bool IsHologram()
Определения ItemBase.c:5885
float GetItemAttachOffset()
Определения ItemBase.c:8694
bool IsPlaceSound()
Определения ItemBase.c:9755
static int GetDebugActionsMask()
Определения ItemBase.c:5675
override int GetLiquidType()
Определения ItemBase.c:8794
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9518
override bool IsItemBase()
Определения ItemBase.c:7684
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9260
void ExplodeAmmo()
Определения ItemBase.c:6375
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:7154
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8984
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9159
override void OnEnergyAdded()
Определения ItemBase.c:8543
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()
Определения ItemBase.c:5834
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9738
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7824
void StopItemDynamicPhysics()
Определения ItemBase.c:9420
bool HasFoodStage()
Определения ItemBase.c:7544
override void SetStoreLoad(bool value)
Определения ItemBase.c:8663
float GetOverheatingValue()
Определения ItemBase.c:5419
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8863
override void AddWet(float value)
Определения ItemBase.c:8611
bool IsLiquidPresent()
Определения ItemBase.c:5801
bool IsFullQuantity()
Определения ItemBase.c:8403
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:6084
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6847
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6823
int m_CleannessMax
Определения ItemBase.c:4943
float m_VarStackMax
Определения ItemBase.c:4931
ref Timer m_PhysDropTimer
Определения ItemBase.c:5018
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7656
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8673
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4972
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5440
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5755
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7578
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8799
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5486
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8721
bool m_IsOverheatingEffectActive
Определения ItemBase.c:5003
int m_LiquidContainerMask
Определения ItemBase.c:4953
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9456
override int GetCleanness()
Определения ItemBase.c:8716
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9667
bool IsDeploySound()
Определения ItemBase.c:9756
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5695
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9199
int m_VarQuantityMin
Определения ItemBase.c:4928
void PerformDamageSystemReinit()
Определения ItemBase.c:9426
override void ClearInventory()
Определения ItemBase.c:8504
static int m_LastRegisteredWeaponID
Определения ItemBase.c:5000
ItemBase GetLightSourceItem()
Определения ItemBase.c:9650
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7674
override float GetItemOverheatThreshold()
Определения ItemBase.c:9600
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4965
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7788
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6762
float m_ItemModelLength
Определения ItemBase.c:4951
bool m_IsHologram
Определения ItemBase.c:4958
static int m_DebugActionsMask
Определения ItemBase.c:4918
void KillAllOverheatingParticles()
Определения ItemBase.c:5555
bool CanBeCookedOnStick()
Определения ItemBase.c:7561
override int GetQuantityMax()
Определения ItemBase.c:8349
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7232
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8759
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8876
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4961
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:9066
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9798
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4912
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9729
override bool IsBeingPlaced()
Определения ItemBase.c:5869
int GetQuantityInit()
Определения ItemBase.c:8387
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7174
bool IsResultOfSplit()
Определения ItemBase.c:7159
bool m_FixDamageSystemInit
Определения ItemBase.c:4963
float m_ImpactSpeed
Определения ItemBase.c:4947
bool m_IsStoreLoad
Определения ItemBase.c:4966
int GetLiquidTypeInit()
Определения ItemBase.c:8789
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4981
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5742
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6633
int m_AttachedAgents
Определения ItemBase.c:4989
string m_LockSoundSet
Определения ItemBase.c:5024
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5363
float m_VarQuantityPrev
Определения ItemBase.c:4926
bool IsSoundSynchRemote()
Определения ItemBase.c:9754
bool m_CanShowQuantity
Определения ItemBase.c:4967
override void OnRightClick()
Определения ItemBase.c:7014
int m_ColorComponentB
Определения ItemBase.c:4976
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4914
bool IsActionTargetVisible()
Определения ItemBase.c:9296
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:6119
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6412
bool m_IsBeingPlaced
Определения ItemBase.c:4957
int NameToID(string name)
Определения ItemBase.c:7761
void ~ItemBase()
Определения ItemBase.c:5640
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8651
void ClearStopItemSoundServer()
Определения ItemBase.c:9396
override string ChangeIntoOnDetach()
Определения ItemBase.c:6336
float m_VarWetMax
Определения ItemBase.c:4938
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6757
int GetLockType()
Определения ItemBase.c:8729
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9736
override float GetWet()
Определения ItemBase.c:8621
EffectSound m_SoundPlace
Определения ItemBase.c:9737
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8335
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8703
bool m_IsPlaceSound
Определения ItemBase.c:9740
override float GetWetMin()
Определения ItemBase.c:8631
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:5032
override bool KindOf(string tag)
Определения ItemBase.c:7690
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:336
string GetDebugText()
Определения ModifierBase.c:71
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
int GetID()
Определения ActionBase.c:1335
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:974
GetInputType()
Определения ActionBase.c:221
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1325
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:550
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1320
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения 3_Game/DayZ/Entities/Man.c:48
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)
Определения ItemBase.c:21
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)
Определения InventoryLocation.c:507
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
InventoryLocation.
Определения InventoryLocation.c:30
override bool CanDisplayCargo()
Определения TentBase.c:91
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override string GetFoldSoundset()
Определения BaseBuildingBase.c:108
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:7
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:934
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:199
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
Определения GardenBase.c:242
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:113
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:397
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1238
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:489
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:409
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:496
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:266
override void AfterStoreLoad()
Определения BarbedWire.c:155
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1037
override void OnVariablesSynchronized()
Определения GardenBase.c:97
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:982
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:331
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:1008
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1170
override void InitItemSounds()
Определения BaseBuildingBase.c:94
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1032
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:365
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения ItemBase.c:14
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:40
proto native float GetDamage(string zoneName, string healthType)
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:916
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:113
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:515
const int DEF_CHEMICAL
Определения 3_Game/DayZ/constants.c:516
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:712
array< int > TIntArray
Определения EnScript.c:714
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:811
const int VARIABLE_LIQUIDTYPE
Определения 3_Game/DayZ/constants.c:635
const int VARIABLE_CLEANNESS
Определения 3_Game/DayZ/constants.c:638
const int VARIABLE_COLOR
Определения 3_Game/DayZ/constants.c:637
const int VARIABLE_TEMPERATURE
Определения 3_Game/DayZ/constants.c:633
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const int VARIABLE_WET
Определения 3_Game/DayZ/constants.c:634
const int LIQUID_NONE
Определения 3_Game/DayZ/constants.c:532
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения 3_Game/DayZ/constants.c:456
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
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.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native int GetColor()

Используется в Edible_Base::HandleFoodStageChangeAgents().