#region License // Copyright (C) 2020 Reetus // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #endregion using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using ClassicAssist.Shared; using ClassicAssist.Misc; using ClassicAssist.Shared.Resources; using ClassicAssist.UO.Data; using ClassicAssist.UO.Network.PacketFilter; using ClassicAssist.UO.Network.Packets; using ClassicAssist.UO.Objects; using UOC = ClassicAssist.Shared.UO.Commands; namespace ClassicAssist.Data.Macros.Commands { public static class WandCommands { public enum WandTypes { Clumsy, Identification, Heal, Feeblemind, Weaken, Magic_Arrow, Harm, Fireball, Greater_Heal, Lightning, Mana_Drain } private static readonly Dictionary _wandClilocs = new Dictionary { { WandTypes.Clumsy, new[] { 3002011, 1017326 } }, { WandTypes.Identification, new[] { 1044063, 1017350 } }, { WandTypes.Heal, new[] { 3002014, 1017329 } }, { WandTypes.Feeblemind, new[] { 3002013, 1017327 } }, { WandTypes.Weaken, new[] { 3002018, 1017328 } }, { WandTypes.Magic_Arrow, new[] { 3002015, 1060492 } }, { WandTypes.Harm, new[] { 3002022, 1017334 } }, { WandTypes.Fireball, new[] { 3002028, 1060487 } }, { WandTypes.Greater_Heal, new[] { 3002039, 1017330 } }, { WandTypes.Lightning, new[] { 3002040, 1060491 } }, { WandTypes.Mana_Drain, new[] { 3002041, 1017339 } } }; private static readonly int[] _wandIds = { 0xDF2, 0xDF3, 0xDF4, 0xDF5 }; [CommandsDisplay( Category = nameof( Strings.Entity ), Parameters = new[] { nameof( ParameterType.WandName ), nameof( ParameterType.IntegerValue ) } )] [CommandsDisplayStringSeeAlso( new[] { nameof( WandTypes ) } )] public static bool EquipWand( string wandName, int minimumCharges = -1 ) { try { WandTypes wandType = Utility.GetEnumValueByName( wandName ); int containerSerial = AliasCommands.ResolveSerial( "backpack" ); Item[] matches = FindWands( wandType, containerSerial, minimumCharges ).Result; if ( matches == null ) { UOC.SystemMessage( Strings.Cannot_find_item___ ); return false; } ActionCommands.EquipItem( matches.First().Serial, Layer.OneHanded ); return true; } catch ( InvalidOperationException ) { UOC.SystemMessage( string.Format( Strings.Invalid_skill_name___0__, wandName ) ); } return false; } [CommandsDisplay( Category = nameof( Strings.Entity ), Parameters = new[] { nameof( ParameterType.WandName ), nameof( ParameterType.SerialOrAlias ), nameof( ParameterType.IntegerValue ) } )] [CommandsDisplayStringSeeAlso( new[] { nameof( WandTypes ) } )] public static bool FindWand( string wandName, object containerSource = null, int minimumCharges = -1 ) { try { WandTypes wandType = Utility.GetEnumValueByName( wandName ); int containerSerial = AliasCommands.ResolveSerial( containerSource ); if ( containerSource == null ) { containerSerial = -1; } Item[] matches = FindWands( wandType, containerSerial, minimumCharges ).Result; if ( matches == null ) { UOC.SystemMessage( Strings.Cannot_find_item___ ); return false; } AliasCommands.SetMacroAlias( "found", matches.First().Serial ); if ( MacroManager.QuietMode ) { return true; } UOC.SystemMessage( string.Format( Strings.Object___0___updated___, "found" ) ); return true; } catch ( InvalidOperationException ) { UOC.SystemMessage( string.Format( Strings.Invalid_skill_name___0__, wandName ) ); } return false; } private static async Task FindWands( WandTypes wandType, int containerSerial, int minimumCharges ) { if ( !Engine.Features.HasFlag( FeatureFlags.AOS ) ) { Item[] allWands = Engine.Items.SelectEntities( i => _wandIds.Contains( i.ID ) && ( containerSerial == -1 || i.IsDescendantOf( containerSerial ) ) ); if ( allWands == null ) { return null; } foreach ( Item wand in allWands ) { Engine.SendPacketToServer( new LookRequest( wand.Serial ) ); await UOC.WaitForIncomingPacketFilterAsync( new PacketFilterInfo( 0xBF, new[] { PacketFilterConditions.ShortAtPositionCondition( 0x10, 3 ), PacketFilterConditions.IntAtPositionCondition( wand.Serial, 5 ) } ), 2500 ); } } Item[] matches = Engine.Items.SelectEntities( i => _wandIds.Contains( i.ID ) && ( containerSerial == -1 || i.IsDescendantOf( containerSerial ) ) && i.Properties != null && i.Properties.Any( p => _wandClilocs[wandType].Contains( p.Cliloc ) && ( minimumCharges == -1 || int.Parse( p.Arguments[0] ) >= minimumCharges ) ) ); return matches; } } }