public static PacketWriter WriteCharacterInfo(long characterId, Player player)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.CharInfo);

        pWriter.WriteLong(characterId);
        pWriter.WriteBool(player != null);
        if (player == null)
        {
            return(pWriter);
        }
        pWriter.WriteLong(); // unknown
        pWriter.WriteLong(player.CharacterId);
        pWriter.WriteLong(TimeInfo.Now());

        PacketWriter characterBuffer = new();

        characterBuffer.WriteLong(player.AccountId);
        characterBuffer.WriteLong(player.CharacterId);
        characterBuffer.WriteUnicodeString(player.Name);
        characterBuffer.WriteShort(player.Levels.Level);
        characterBuffer.Write(player.Job);
        characterBuffer.Write(player.JobCode);
        characterBuffer.WriteInt((int)player.Gender);
        characterBuffer.WriteInt(player.Levels.PrestigeLevel);
        characterBuffer.WriteByte();
        WriteStats(characterBuffer, player);

        // Unknown data
        characterBuffer.WriteZero(1300);

        characterBuffer.WriteUnicodeString(player.ProfileUrl);
        characterBuffer.WriteUnicodeString(player.Motto);

        if (player.Guild == null)
        {
            characterBuffer.WriteUnicodeString(string.Empty);
            characterBuffer.WriteUnicodeString(string.Empty);
        }
        else
        {
            characterBuffer.WriteUnicodeString(player.Guild.Name);
            characterBuffer.WriteUnicodeString(player.Guild.Ranks[player.GuildMember.Rank].Name);
        }

        characterBuffer.WriteUnicodeString(player.Account.Home?.Name ?? string.Empty);
        characterBuffer.WriteZero(12);
        characterBuffer.WriteInt(player.TitleId);
        characterBuffer.WriteInt(player.Titles.Count);
        foreach (int titleId in player.Titles)
        {
            characterBuffer.WriteInt(titleId);
        }
        characterBuffer.WriteInt(player.TrophyCount.Sum());
        characterBuffer.WriteInt();  // gear score
        characterBuffer.WriteLong(); // timestamp
        characterBuffer.WriteLong();
        characterBuffer.Write(player.SkinColor);
        characterBuffer.WriteZero(14);

        pWriter.WriteInt(characterBuffer.Length);
        pWriter.WriteBytes(characterBuffer.ToArray());

        PacketWriter appearanceBuffer = new();

        CharacterListPacket.WriteEquipsAndCosmetics(appearanceBuffer, player);

        appearanceBuffer.WriteByte(1);
        appearanceBuffer.WriteLong();
        appearanceBuffer.WriteLong();
        appearanceBuffer.WriteByte();

        pWriter.WriteInt(appearanceBuffer.Length);
        pWriter.WriteBytes(appearanceBuffer.ToArray());

        PacketWriter badgeBuffer = new();

        CharacterListPacket.WriteBadges(badgeBuffer, player);

        pWriter.WriteInt(badgeBuffer.Length);
        pWriter.WriteBytes(badgeBuffer.ToArray());

        return(pWriter);
    }
예제 #2
0
    public static PacketWriter AddPlayer(IFieldActor <Player> fieldPlayer)
    {
        Player       player  = fieldPlayer.Value;
        PacketWriter pWriter = PacketWriter.Of(SendOp.FIELD_ADD_PLAYER);

        pWriter.WriteInt(fieldPlayer.ObjectId);
        CharacterListPacket.WriteCharacter(player, pWriter);

        // Skills
        pWriter.Write(player.JobCode);
        pWriter.WriteByte(1);
        pWriter.Write(player.Job);
        pWriter.WriteSkills(player);

        // Coords
        pWriter.Write(fieldPlayer.Coord);
        pWriter.Write(fieldPlayer.Rotation);
        pWriter.WriteByte();

        // Stats
        pWriter.WriteFieldStats(fieldPlayer.Stats);

        pWriter.WriteBool(fieldPlayer.OnCooldown);
        pWriter.WriteBool(player.Guide?.Value.Type == 0);
        pWriter.WriteInt();
        pWriter.WriteLong();
        pWriter.WriteLong();

        // ???
        bool flagA = false;

        pWriter.WriteBool(flagA);
        if (flagA)
        {
            pWriter.WriteLong();
            pWriter.WriteUnicodeString();
            pWriter.WriteUnicodeString();
            pWriter.WriteByte();
            pWriter.WriteInt();
            pWriter.WriteLong();
            pWriter.WriteLong();
            pWriter.WriteUnicodeString();
            pWriter.WriteLong();
            pWriter.WriteUnicodeString();
            pWriter.WriteByte();
        }

        pWriter.WriteInt(1);
        pWriter.Write(player.SkinColor);
        pWriter.WriteUnicodeString(player.ProfileUrl);

        pWriter.WriteBool(player.Mount != null);
        if (player.Mount != null)
        {
            pWriter.WriteMount(player.Mount);

            // Unknown
            byte countA = 0;
            pWriter.WriteByte(countA);
            for (int i = 0; i < countA; i++)
            {
                pWriter.WriteInt();
                pWriter.WriteByte();
            }
        }
        pWriter.WriteInt();
        pWriter.WriteLong(TimeInfo.Now()); // some timestamp
        pWriter.WriteInt();
        pWriter.WriteInt();

        bool appearance = true;

        pWriter.WriteBool(appearance);
        if (appearance)
        {
            PacketWriter appearanceBuffer = new();
            CharacterListPacket.WriteEquipsAndCosmetics(appearanceBuffer, player);

            appearanceBuffer.WriteByte(1);
            appearanceBuffer.WriteLong();
            appearanceBuffer.WriteLong();
            appearanceBuffer.WriteByte();

            pWriter.WriteDeflated(appearanceBuffer.Buffer, 0, appearanceBuffer.Length);
        }
        else
        {
            pWriter.WriteDeflated(new byte[1], 0, 1); // Empty buffer
        }

        bool unusuedBuffer = false;

        pWriter.WriteBool(unusuedBuffer);
        if (unusuedBuffer)
        {
            // kms2 outfits? Unused buffer for gms2
        }
        else
        {
            pWriter.WriteDeflated(new byte[1], 0, 1); // Empty buffer
        }

        List <Item> badges = player.Inventory.Badges.Where(x => x != null).ToList();

        pWriter.WriteBool(badges.Count > 0);
        if (badges.Count > 0)
        {
            PacketWriter badgesBuffer = new();
            CharacterListPacket.WriteBadges(badgesBuffer, player);
            pWriter.WriteDeflated(badgesBuffer.Buffer, 0, badgesBuffer.Length);
        }
        else
        {
            pWriter.WriteDeflated(new byte[1], 0, 1); // Empty buffer
        }

        JobPacket.WritePassiveSkills(pWriter, fieldPlayer);

        pWriter.WriteInt();
        pWriter.WriteInt();
        pWriter.WriteByte();
        pWriter.WriteInt();
        pWriter.WriteByte();
        pWriter.WriteByte();
        pWriter.WriteInt(player.TitleId);
        pWriter.WriteShort(player.InsigniaId);
        pWriter.WriteByte();
        pWriter.WriteInt();
        pWriter.WriteByte();
        pWriter.WriteLong(); // Another timestamp
        pWriter.WriteInt(int.MaxValue);
        pWriter.WriteByte();
        pWriter.WriteInt(); // MushkingRoyale taileffect kill count
        pWriter.WriteInt();
        pWriter.WriteShort();

        return(pWriter);
    }