class ActionFillBottleBaseCB : ActionContinuousBaseCB { private int m_liquid_type; private float m_BaseFillQuantity; override void CreateActionComponent() { m_liquid_type = ActionFillBottleBase.Cast(m_ActionData.m_Action).GetLiquidType(m_ActionData.m_Player, m_ActionData.m_Target, m_ActionData.m_MainItem); if (m_liquid_type == LIQUID_GASOLINE) { m_BaseFillQuantity = UAQuantityConsumed.FUEL; } else if (m_liquid_type == LIQUID_SNOW) { m_BaseFillQuantity = UAQuantityConsumed.FILL_SNOW; } else { m_BaseFillQuantity = UAQuantityConsumed.FILL_LIQUID; } m_ActionData.m_ActionComponent = new CAContinuousFill(m_BaseFillQuantity, m_liquid_type); } }; class ActionFillBottleBase: ActionContinuousBase { private const float WATER_DEPTH = 0.5; private const string ALLOWED_WATER_SURFACES = string.Format("%1|%2|%3", UAWaterType.FRESH, UAWaterType.STILL, UAWaterType.SNOW); protected int m_AllowedLiquidMask; void ActionFillBottleBase() { m_CallbackClass = ActionFillBottleBaseCB; m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_FILLBOTTLEPOND; m_FullBody = true; m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT; m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW; m_Text = "#fill"; m_AllowedLiquidMask = LIQUID_GROUP_DRINKWATER | LIQUID_GASOLINE; m_AllowedLiquidMask &= ~LIQUID_SNOW; } override void CreateConditionComponents() { m_ConditionItem = new CCINonRuined(); m_ConditionTarget = new CCTNone() } override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item) { Object targetObject = target.GetObject(); if (targetObject) { if (vector.DistanceSq(player.GetPosition(), targetObject.GetPosition()) > UAMaxDistances.DEFAULT * UAMaxDistances.DEFAULT) return false; } else { CCTWaterSurfaceEx waterCheck = new CCTWaterSurfaceEx(UAMaxDistances.DEFAULT, m_AllowedLiquidMask); if (!waterCheck.Can(player, target)) return false; } int liquidType = GetLiquidType(player, target, item); if (item.GetQuantity() > item.GetQuantityMin()) liquidType = Liquid.TranslateLiquidType(liquidType); return liquidType != LIQUID_NONE && Liquid.CanFillContainer(item,liquidType); } override bool ActionConditionContinue(ActionData action_data) { return action_data.m_MainItem.GetQuantity() < action_data.m_MainItem.GetQuantityMax(); } override protected int GetStanceMask(PlayerBase player) { vector water_info = HumanCommandSwim.WaterLevelCheck(player, player.GetPosition()); if (water_info[1] > WATER_DEPTH) { return DayZPlayerConstants.STANCEMASK_ERECT; } else { return DayZPlayerConstants.STANCEMASK_CROUCH; } } override protected int GetActionCommandEx(ActionData actionData) { int commandUID = DayZPlayerConstants.CMD_ACTIONFB_FILLBOTTLEPOND; if (actionData.m_Target.GetObject()) { commandUID = DayZPlayerConstants.CMD_ACTIONFB_FILLBOTTLEWELL; } return commandUID; } int GetLiquidType(PlayerBase player, ActionTarget target, ItemBase item) { int liquidType = LIQUID_NONE; if ( target.GetObject() ) { liquidType = target.GetObject().GetLiquidSourceType(); } else { string surfaceType; vector hit_pos = target.GetCursorHitPos(); GetGame().SurfaceGetType3D(hit_pos[0], hit_pos[1], hit_pos[2], surfaceType); if (surfaceType == "") { if ( hit_pos[1] <= g_Game.SurfaceGetSeaLevel() + 0.001 ) { liquidType = LIQUID_SALTWATER; } } else { liquidType = SurfaceInfo.GetByName(surfaceType).GetLiquidType(); } } return liquidType & m_AllowedLiquidMask; } void SetupStance(PlayerBase player) { //returns in format (totalWaterDepth, characterDepht, 0) vector water_info = HumanCommandSwim.WaterLevelCheck(player, player.GetPosition()); if (water_info[1] > WATER_DEPTH) { m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT; } else { m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH; } } override bool IsLockTargetOnUse() { return false; } // deprecated private const int ALLOWED_LIQUID; }