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); }
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); }
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); }
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); }
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); }
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)); }