Beispiel #1
0
        public async Task OnRealmList()
        {
            if (!Authed)
            {
                return;
            }

            var realm_manager = GrainFactory.GetGrain <IRealmManager>(0);

            if (realm_manager == null) //something seriously went wrong!
            {
                return;
            }

            var realms = await realm_manager.GetRealms();

            PacketOut p = new PacketOut(AuthOp.REALM_LIST);

            p.Write((UInt16)0);  //size

            p.Write((int)0);

            //lets write a test realm!
            p.Write((UInt16)realms.Length);  //realmCount


            foreach (var r in realms)
            {
                p.Write((byte)0);  //type
                p.Write((byte)0);  //status
                p.Write((byte)0);  //flags
                p.WriteCString(r.RealmSettings.Name);
                p.WriteCString(r.RealmSettings.Address);
                p.Write(r.GetPopulationStatus());
                p.Write((byte)1);  //character count, TODO
                p.Write((byte)r.RealmSettings.Cat);
                p.Write((byte)0);  //unknown
            }

            //this should be a loop based on realmcount in future
            //end loop

            p.Write((byte)0x10);
            p.Write((byte)0);

            //rewrite size
            p.strm.Position = 1;
            p.Write((UInt16)(p.strm.Length - 3));
            p.strm.Position = p.strm.Length;

            await SendPacket(p);
        }
Beispiel #2
0
        public async Task HandleNameQuery(CMSG_NAME_QUERY pkt)
        {
            var player = GrainFactory.GetGrain <IPlayer>(pkt.guid.ToInt64());
            var valid  = await player.IsValid();

            var guid_packed = new PackedGUID(pkt.guid);

            PacketOut p = new PacketOut(RealmOp.SMSG_NAME_QUERY_RESPONSE);

            p.Write(guid_packed);

            if (!valid)
            {
                p.Write((byte)1); //unknown
                await SendPacket(p);

                return;
            }

            p.Write((byte)0); //known
            p.WriteCString(await player.GetName());

            var realmid = await player.GetRealmID();

            if (realmid != await GetRealmID()) //player is on a different realm to this session, append their realm name
            {
                var realm_manager = GrainFactory.GetGrain <IRealmManager>(0);
                p.WriteCString(await realm_manager.GetRealmName((int)realmid));
            }
            else
            {
                p.Write((byte)0); //null string aka same realm aka dont show anything extra
            }
            p.Write(await player.GetRace());
            p.Write(await player.GetGender());
            p.Write(await player.GetClass());
            p.Write((byte)0); //isNameDeclined

            await SendPacket(p);
        }
Beispiel #3
0
        protected override void SendCreateMonster(Player plr)
        {
            PacketOut Out = new PacketOut((byte)Opcodes.F_CREATE_MONSTER, 100 + Name.Length);

            Out.WriteUInt16(Oid);
            Out.WriteUInt16(0);

            Out.WriteUInt16(Heading);
            Out.WriteUInt16((ushort)WorldPosition.Z);
            Out.WriteUInt32((uint)WorldPosition.X);
            Out.WriteUInt32((uint)WorldPosition.Y);
            Out.WriteUInt16(0); // Speed Z
            // 18
            if (Spawn.Proto.Model2 != 0)
            {
                Out.WriteUInt16(StaticRandom.Instance.Next(0, 100) < 50 ? Spawn.Proto.Model1 : Spawn.Proto.Model2);
            }
            else
            {
                Out.WriteUInt16(Spawn.Proto.Model1);
            }

            Out.WriteByte(Scale);

            Out.WriteByte(Level);
            Out.WriteByte(Faction);

            Out.Fill(0, 4);
            Out.WriteByte(Spawn.Emote);
            Out.WriteByte(0); // ?
            Out.WriteUInt16(Spawn.Proto._Unks[1]);
            Out.WriteByte(0);
            Out.WriteUInt16(Spawn.Proto._Unks[2]);
            Out.WriteUInt16(Spawn.Proto._Unks[3]);
            Out.WriteUInt16(Spawn.Proto._Unks[4]);
            Out.WriteUInt16(Spawn.Proto._Unks[5]);
            Out.WriteUInt16(Spawn.Proto._Unks[6]);
            Out.WriteUInt16(Spawn.Proto.Title);

            // States region
            Out.WriteByte(1);
            Out.WriteByte(0x19);
            Out.WriteByte(0);

            // 47

            Out.WriteCString(Name);

            Out.WriteUInt16(0x010A); // Fig leaf data
            Out.WriteByte(0);
            Out.WriteUInt16(Owner.Oid);

            // Need to write OBJECT_STATE length here
            long objStateLenPos = Out.Position;

            Out.WriteByte(0);
            Out.WriteByte(5); // F_PLAYER_INVENTORY length
            Out.WriteByte(0); // unk
            MvtInterface.WriteMovementState(Out);

            long latestPos = Out.Position;

            Out.Position = objStateLenPos;
            Out.WriteByte((byte)(latestPos - (objStateLenPos + 3)));
            Out.Position = latestPos;

            // F_PLAYER_INVENTORY
            Out.WriteUInt16(Oid);
            Out.WriteByte(0);
            Out.WriteByte(0);
            Out.WriteByte(0);

            plr.SendPacket(Out);
        }
Beispiel #4
0
        protected override void SendCreateMonster(Player plr)
        {
            PacketOut Out = new PacketOut((byte)Opcodes.F_CREATE_MONSTER, 110 + States.Count + (Name?.Length ?? Spawn.Proto.Name.Length));

            Out.WriteUInt16(Oid);
            Out.WriteUInt16(0);

            Out.WriteUInt16(Heading);
            Out.WriteUInt16((ushort)WorldPosition.Z);
            Out.WriteUInt32((uint)WorldPosition.X);
            Out.WriteUInt32((uint)WorldPosition.Y);
            Out.WriteUInt16(0); // Speed Z
            Out.WriteUInt16(Spawn.Proto.Model1);
            Out.WriteByte(Scale);

            Out.WriteByte(Level);
            Out.WriteByte(Faction);

            Out.WriteByte(0);
            Out.WriteByte(SiegeInterface != null && SiegeInterface.IsDeployed ? (byte)1 : (byte)0);
            Out.Fill(0, 2);
            Out.WriteByte(Spawn.Emote);
            Out.WriteByte(0); // ?
            Out.WriteUInt16(Spawn.Proto._Unks[1]);
            Out.WriteByte(0);
            Out.WriteUInt16(Spawn.Proto._Unks[2]);
            Out.WriteUInt16(Spawn.Proto._Unks[3]);
            Out.WriteUInt16(Spawn.Proto._Unks[4]);
            Out.WriteUInt16(Spawn.Proto._Unks[5]);
            Out.WriteUInt16(Spawn.Proto._Unks[6]);
            Out.WriteUInt16(Spawn.Proto.Title);

            Out.WriteByte((byte)States.Count);
            Out.Write(States.ToArray(), 0, States.Count);

            Out.WriteByte(0);

            Out.WriteCString(Name ?? Spawn.Proto.Name);

            // Fig leaf data

            if (Spawn.Proto.CreatureType == (byte)GameData.CreatureTypes.SIEGE)
            {
                Out.Fill(0, 3);
                Out.WriteByte(0x8); // Player-placed Siege
                Out.WriteByte(0x1);
                Out.WriteByte(0x0A);
            }
            // End fig leaf data

            Out.WriteByte(0);

            Out.WriteUInt16(0); // Owner OID

            // Need to write OBJECT_STATE length here
            long objStateLenPos = Out.Position;

            Out.WriteByte(0);
            Out.WriteByte(5); // F_PLAYER_INVENTORY length
            Out.WriteByte(0); // unk
            MvtInterface.WriteMovementState(Out);

            long latestPos = Out.Position;

            Out.Position = objStateLenPos;
            Out.WriteByte((byte)(latestPos - (objStateLenPos + 3)));
            Out.Position = latestPos;

            // F_PLAYER_INVENTORY
            Out.WriteUInt16(Oid);
            Out.WriteByte(0);
            Out.WriteByte(0);
            Out.WriteByte(0);

            plr.SendPacket(Out);
        }
Beispiel #5
0
        public override void SendMeTo(Player plr)
        {
            PacketOut Out = new PacketOut((byte)Opcodes.F_CREATE_MONSTER, 128);

            Out.WriteUInt16(Oid);
            Out.WriteUInt16(0);

            Out.WriteUInt16(Heading);
            Out.WriteUInt16((ushort)WorldPosition.Z);
            Out.WriteUInt32((uint)WorldPosition.X);
            Out.WriteUInt32((uint)WorldPosition.Y);
            Out.WriteUInt16(0);            // Speed Z
            Out.WriteUInt16(Proto.Model1); // model ID

            Out.WriteByte(0x32);           // scale

            Out.WriteByte(Owner.Level);
            Out.WriteByte(Faction);
            Out.Fill(0, 6);
            Out.WriteUInt16(1); // Unk5
            Out.Fill(0, 13);

            // State 19?
            Out.WriteByte(1);    // Spawn Length
            Out.WriteByte(0x19); // Spawn Data

            Out.WriteByte(0);

            Out.WriteCString(Name);
            Out.WriteUInt32(3);
            Out.WriteUInt16(0x010A); // Fig leaf data
            Out.WriteByte(0);
            Out.WriteUInt16(Owner.Oid);
            Out.WriteByte(18); // Cheating - length of embedded OBJECT_STATE packet which is for heading only
            Out.WriteByte(5);  // Cheating - length of embedded PLAYER_INVENTORY packet which is empty
            Out.WriteByte(0);

            // F_OBJECT_STATE 00
            Out.WriteUInt16(Oid);
            Out.WriteUInt16((ushort)X);
            Out.WriteUInt16((ushort)Y);
            Out.WriteUInt16((ushort)Z);
            Out.WriteByte(PctHealth);
            Out.WriteByte(0);   // flags
            Out.WriteByte((byte)Zone.ZoneId);
            Out.WriteByte(4);   // 0
            Out.WriteUInt32(3); // 0
            Out.WriteUInt16R(Heading);

            // F_PLAYER_INVENTORY
            Out.WriteUInt16(Oid);
            Out.WriteByte(0);
            Out.WriteByte(0);
            Out.WriteByte(0);

            plr.SendPacket(Out);

            Out = new PacketOut((byte)Opcodes.F_UPDATE_STATE);
            Out.WriteUInt16(Oid);
            Out.WriteByte(1);
            Out.WriteByte(7);
            Out.Fill(0, 6);
            plr.SendPacket(Out);

            base.SendMeTo(plr);
        }
Beispiel #6
0
        public Task <PacketOut> BuildEnum()
        {
            PacketOut p = new PacketOut();

            if (_IsValid())
            {
                p.Write(oGUID);
                p.WriteCString(State.Name);
                p.Write(_GetRace());
                p.Write(_GetClass());
                p.Write(_GetGender());
                p.Write(_GetSkin());
                p.Write(_GetFace());
                p.Write(_GetHairStyle());
                p.Write(_GetHairColor());
                p.Write(_GetFacialHair());
                p.Write((byte)1);         //level to do
                p.Write((int)0);          //zone to do
                p.Write((int)0);          //map to do
                p.Write(State.PositionX); //positionx
                p.Write(State.PositionY); //positiony
                p.Write(State.PositionZ); //positionz
                p.Write((int)0);          //guildid
                p.Write((int)0);          //charflags (stuff like hide helm, is a ghost from death, needs a rename, is locked)
                p.Write((int)0);          //customisationflags (race change, faction change etc)
                p.Write((byte)0);         //firstlogin
                p.Write((int)0);          //petdisplayid
                p.Write((int)0);          //petlevel
                p.Write((int)0);          //petfamilyid

                //this is a loop of the item display slots, to do when implementing items
                for (int i = 0; i < 23; ++i)
                {
                    p.Write((int)0);  //item display
                    p.Write((byte)0); //inventory type
                    p.Write((int)0);  //enchantment
                }
            }
            else
            {
                p.Write((UInt64)0);        //guid
                p.WriteCString("Unknown"); //name
                p.Write((byte)0);          //race
                p.Write((byte)0);          //class
                p.Write((byte)0);          //gender
                p.Write((byte)0);          //skin
                p.Write((byte)0);          //face
                p.Write((byte)0);          //hairstyle
                p.Write((byte)0);          //haircolor
                p.Write((byte)0);          //facialhair
                p.Write((byte)1);          //level
                p.Write((int)0);           //zoneid
                p.Write((int)0);           //mapid
                p.Write((float)0);         //positionx
                p.Write((float)0);         //positiony
                p.Write((float)0);         //positionz
                p.Write((int)0);           //guildid
                p.Write((int)0);           //charflags
                p.Write((int)0);           //customisationflags
                p.Write((byte)0);          //firstlogin
                p.Write((int)0);           //petdisplayid
                p.Write((int)0);           //petlevel
                p.Write((int)0);           //petfamilyid

                //this is a loop of the item display slots, to do when implementing items
                for (int i = 0; i < 23; ++i)
                {
                    p.Write((int)0);  //item display
                    p.Write((byte)0); //inventory type
                    p.Write((int)0);  //enchantment
                }
            }


            return(Task.FromResult(p));
        }