Example #1
0
    public static PacketWriter UpdateUGCBanner(UGCBanner ugcBanner)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.UGC);

        pWriter.Write(UGCMode.UpdateUGCBanner);
        pWriter.WriteUGCBanner(ugcBanner.Id, ugcBanner.Slots);

        return(pWriter);
    }
Example #2
0
    public static PacketWriter ActivateBanner(UGCBanner ugcBanner)
    {
        PacketWriter pWriter = PacketWriter.Of(SendOp.UGC);

        pWriter.Write(UGCMode.ActivateBanner);
        pWriter.WriteActiveBannerSlot(ugcBanner);

        return(pWriter);
    }
Example #3
0
    private static UGC HandleCreateUGCBanner(GameSession session, PacketReader packet)
    {
        Player player = session.Player;

        long      bannerId = packet.ReadLong();
        UGCBanner banner   = GameServer.UGCBannerManager.GetBanner(bannerId);

        if (banner is null)
        {
            Logger.Warning("Banner {0} not found.", bannerId);
            return(null);
        }

        // get metadata for prices
        AdBannerMetadata metadata = AdBannerMetadataStorage.GetMetadata(bannerId);

        if (metadata is null)
        {
            Logger.Warning("Banner {0} metadata not found.", bannerId);
        }


        byte count = packet.ReadByte();

        UGC newUgc = new($"AD Banner {bannerId}", player.CharacterId, player.Name, player.Account.Id, 0, UGCType.Banner);

        for (int i = 0; i < count; i++)
        {
            long id = packet.ReadLong();
            packet.ReadInt();  // 1
            packet.ReadLong(); // banner id
            packet.ReadInt();  // date as YYYYMMDD
            int hour = packet.ReadInt();
            packet.ReadLong();

            if (!player.Account.Meret.Modify(-metadata.Prices[hour]))
            {
                return(null);
            }

            BannerSlot bannerSlot = banner.Slots.FirstOrDefault(x => x.Id == id);
            if (bannerSlot is null)
            {
                Logger.Warning("Invalid banner slot with id {id} and hour {hour}.", id, hour);
                return(null);
            }

            bannerSlot.UGC = newUgc;
            DatabaseManager.BannerSlot.UpdateUGCUid(bannerSlot.Id, newUgc.Uid);
        }

        return(newUgc);
    }
Example #4
0
    private static void HandleUpdateBanner(GameSession session, PacketReader packet)
    {
        long bannerId  = packet.ReadLong();
        int  hourCount = packet.ReadInt();

        if (hourCount is < 0 or > 24)
        {
            return;
        }

        UGCBanner ugcBanner = GameServer.UGCBannerManager.GetBanner(bannerId);

        if (ugcBanner is null)
        {
            Logger.Error("Banner not found: " + bannerId);
            return;
        }

        List <BannerSlot> newSlots = new();

        for (int i = 0; i < hourCount; i++)
        {
            packet.ReadLong();
            packet.ReadInt();                   // 1
            long bannerId2 = packet.ReadLong(); // bannerId
            int  date      = packet.ReadInt();  // date as YYYYMMDD
            int  hour      = packet.ReadInt();
            packet.ReadLong();

            if (ugcBanner.Slots.Any(x => x.Hour == hour && x.Date == date))
            {
                Logger.Warning("Banner slot already exists for hour {hour}.", hour);
                continue;
            }

            BannerSlot bannerSlot = new(bannerId2, date, hour);
            ugcBanner.Slots.Add(bannerSlot);
            newSlots.Add(bannerSlot);
        }

        GameServer.UGCBannerManager.UpdateBanner(ugcBanner);
        session.Send(UGCPacket.ReserveBannerSlots(ugcBanner.Id, newSlots));
    }
Example #5
0
    private static void WriteActiveBannerSlot(this PacketWriter pWriter, UGCBanner ugcBanner)
    {
        pWriter.WriteLong(ugcBanner.Id);
        BannerSlot activeSlot = ugcBanner.Slots.FirstOrDefault(x => x.Active);

        pWriter.WriteBool(activeSlot is not null);
        if (activeSlot is null)
        {
            return;
        }

        pWriter.Write(UGCType.Banner);
        pWriter.WriteInt(2);
        pWriter.WriteLong(activeSlot.UGC.AccountId);
        pWriter.WriteLong(activeSlot.UGC.CharacterId);
        pWriter.WriteUnicodeString(); // unknown
        pWriter.WriteUnicodeString(activeSlot.UGC.CharacterName);
        pWriter.WriteLong(activeSlot.UGC.Uid);
        pWriter.WriteUnicodeString(activeSlot.UGC.Guid.ToString());
        pWriter.WriteByte(3);
        pWriter.WriteByte(1);
        pWriter.WriteLong(activeSlot.BannerId);
        byte loopCounter = 1; // not sure when more than 1 is used

        pWriter.WriteByte(loopCounter);
        for (byte i = 0; i < loopCounter; i++)
        {
            pWriter.WriteLong(activeSlot.Id);
            pWriter.WriteInt(2);
            pWriter.WriteLong(activeSlot.BannerId);
            pWriter.WriteInt(activeSlot.Date);
            pWriter.WriteInt(activeSlot.Hour);
            pWriter.WriteLong();
        }

        pWriter.WriteUnicodeString(activeSlot.UGC.Url);
    }
Example #6
0
    private static void HandleConfirmationPacket(GameSession session, PacketReader packet)
    {
        UGCType type = (UGCType)packet.ReadByte();

        packet.ReadByte();
        packet.ReadByte();
        packet.ReadInt();
        long accountId   = packet.ReadLong();
        long characterId = packet.ReadLong();

        packet.ReadInt();
        long   ugcUid  = packet.ReadLong();
        string ugcGuid = packet.ReadUnicodeString();

        Player player = session.Player;

        if (accountId != player.Account.Id || characterId != player.CharacterId || ugcUid == 0)
        {
            return;
        }

        UGC ugc = DatabaseManager.UGC.FindByUid(ugcUid);

        if (ugc is null || ugc.Guid != Guid.Parse(ugcGuid))
        {
            return;
        }

        session.Send(UGCPacket.SetUGCUrl(ugc));

        switch (type)
        {
        case UGCType.Furniture or UGCType.Item or UGCType.Mount:
            Item item = DatabaseManager.Items.FindByUgcUid(ugcUid);
            if (item is null)
            {
                return;
            }

            item.SetMetadataValues();

            player.Inventory.AddItem(session, item, true);
            switch (item.Ugc.Type)
            {
            case UGCType.Furniture:
                session.Send(UGCPacket.UpdateUGCFurnishing(player.FieldPlayer, item));
                break;

            case UGCType.Item:
                session.Send(UGCPacket.UpdateUGCItem(player.FieldPlayer, item));
                break;

            case UGCType.Mount:
                session.Send(UGCPacket.UpdateUGCMount(player.FieldPlayer, item));
                break;
            }

            break;

        case UGCType.GuildEmblem:
        {
            Guild guild = GameServer.GuildManager.GetGuildById(player.Guild.Id);

            guild.Emblem = ugc.Url;
            DatabaseManager.Guilds.UpdateEmblem(guild.Id, ugc.Url);

            guild.BroadcastPacketGuild(GuildPacket.ChangeEmblemUrl(ugc.Url));
            guild.BroadcastPacketGuild(GuildPacket.GuildNoticeEmblemChange(player.Name, ugc.Url));
            break;
        }

        case UGCType.GuildBanner:
        {
            Guild guild = GameServer.GuildManager.GetGuildById(player.Guild.Id);

            UGC oldUGCBanner = guild.Banners.FirstOrDefault(x => x.GuildPosterId == ugc.GuildPosterId);
            if (oldUGCBanner is not null)
            {
                guild.Banners.Remove(oldUGCBanner);
                DatabaseManager.UGC.Delete(oldUGCBanner.Uid);
            }

            guild.Banners.Add(ugc);
            DatabaseManager.Guilds.UpdateBanners(guild.Id, guild.Banners);

            guild.BroadcastPacketGuild(GuildPacket.UpdateBannerUrl(player, ugc));
            break;
        }

        case UGCType.Banner:
            UGCBanner ugcBanner = GameServer.UGCBannerManager.UpdateBannerSlots(ugc);
            if (ugcBanner is null)
            {
                return;
            }

            session.Send(UGCPacket.UpdateUGCBanner(ugcBanner));
            // TrophyManager.OnReserveBanner();
            break;
        }
    }