Stránka 1 z 1

QuestBook

Napsal: 31.08.2010 16:20:56
od Mole Two
Pri poklikani na svitek na paperdollu otevre questbook. Ucini questbook neviditelnym v baglu pokud je zobrazen jako "maly" (pro zmenu zpet na velky je treba a) odstranit skript b) smazat UO.WaitMenu( "Moznosti Quest Booku", "Vypis hotovych questu" );)

Kód: Vybrat vše

using System;
using System.Linq;
using Phoenix.Communication;
using Phoenix.WorldData;

namespace Phoenix.Scripts {
    public class QuestBook {
        private const ushort BookGraphic = 0x1EA7;
        private const ushort BookAltGraphic = 0x0FBE;
        private const ushort BookColor = 0x0B7A;

        [ClientMessageHandler( 0xb8 )]
        public CallbackResult OnProfileRequest( byte[] data, CallbackResult prevResult ) {
            UOItem book = World.Player.Backpack.Items.Where( i => i.Color == BookColor && ( i.Graphic == BookGraphic || i.Graphic == BookAltGraphic ) ).FirstOrDefault();

            if ( book.Exist ) {
                UO.WaitMenu( "Moznosti Quest Booku", "Vypis hotovych questu" );
                book.Use();
            }

            return CallbackResult.Eat;
        }

        [ServerMessageHandler( 0x3c, Priority = CallbackPriority.Lowest )]
        public CallbackResult OnAddMultipleItems( byte[] data, CallbackResult prevResult ) {
            PacketReader reader = new PacketReader( data );
            reader.Skip( 3 ); // opcode, size
            ushort itemCount = reader.ReadUInt16();

            for ( int i = 0; i < itemCount; i++ ) {
                reader.Skip( 4 ); // serial
                ushort graphic = reader.ReadUInt16();
                reader.Skip( 7 ); // offset, amount, x, y
                uint container = reader.ReadUInt32();
                ushort color = reader.ReadUInt16();

                if ( graphic != BookGraphic || color != BookColor || container != World.Player.Backpack )
                    continue;

                PacketWriter writer = new PacketWriter( 0x3c );
                writer.WriteBlockSize();
                writer.Write( ( ushort )( itemCount - 1 ) );

                byte[] buffer = new byte[ ( itemCount - 1 ) * 19 ];
                Array.Copy( data, 5, buffer, 0, data.Length - 5 - 19 );

                int currentOffset = 5 + i * 19;
                int lastOffset = 5 + ( itemCount - 1 ) * 19;

                if ( currentOffset != lastOffset )
                    Array.Copy( data, lastOffset, buffer, currentOffset - 5, 19 );

                writer.Write( buffer );

                Core.SendToClient( writer.GetBytes(), false );

                return CallbackResult.Sent;
            }
            return prevResult;
        }

        [ServerMessageHandler( 0x25, Priority = CallbackPriority.Lowest )]
        public CallbackResult OnItemAddedToContainer( byte[] data, CallbackResult prevResult ) {
            PacketReader reader = new PacketReader( data );
            reader.Skip( 1 ); // opcode
            uint serial = reader.ReadUInt32();
            ushort graphic = reader.ReadUInt16();
            reader.Skip( 7 ); // offset, stack, x, y
            uint container = reader.ReadUInt32();
            ushort color = reader.ReadUInt16();

            if ( graphic == BookGraphic && color == BookColor && container == World.Player.Backpack ) {
                if ( World.GetItem( serial ).Exist )
                    UO.Hide( serial );
                return CallbackResult.Eat;
            }

            return CallbackResult.Normal;
        }
    }
}