コード例 #1
0
    public static async Task <IResult> Post(HttpRequest request)
    {
        Stream bodyStream = request.Body;

        MemoryStream memoryStream = await CopyStream(bodyStream);

        if (memoryStream.Length == 0)
        {
            return(Results.BadRequest());
        }

        PacketReader pReader = new(memoryStream.ToArray());

        int     flagA       = pReader.ReadInt();
        UGCType mode        = (UGCType)pReader.ReadInt();
        long    accountId   = pReader.ReadLong();
        long    characterId = pReader.ReadLong();
        long    ugcUid      = pReader.ReadLong();
        int     id          = pReader.ReadInt(); // item id, guild id, others?
        int     flagB       = pReader.ReadInt();
        long    unk         = pReader.ReadLong();

        byte[]? fileBytes = pReader.ReadBytes(pReader.Available);

        return(mode switch
        {
            UGCType.ProfileAvatar => HandleProfileAvatar(fileBytes, characterId),
            UGCType.Item or UGCType.Furniture or UGCType.Mount => HandleItem(fileBytes, id, ugcUid),
            UGCType.ItemIcon => HandleItemIcon(fileBytes, id, ugcUid),
            UGCType.GuildEmblem => HandleGuildEmblem(fileBytes, ugcUid, id),
            UGCType.Banner => HandleBanner(fileBytes, ugcUid, id),
            UGCType.GuildBanner => HandleGuildBanner(fileBytes, ugcUid, id),
            _ => HandleUnknownMode(mode)
        });
コード例 #2
0
ファイル: UGCHandler.cs プロジェクト: Etchavious/MapleServer2
    private static void HandleUpload(GameSession session, PacketReader packet)
    {
        packet.ReadLong();
        UGCType type = (UGCType)packet.ReadByte();

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

        packet.ReadLong();
        packet.ReadInt();
        packet.ReadShort();
        packet.ReadShort();

        UGC newUGC = null;

        switch (type)
        {
        case UGCType.Furniture or UGCType.Item or UGCType.Mount:
            newUGC = HandleCreateUGCItem(packet, session, characterId, accountId, type);
            break;

        case UGCType.GuildEmblem:
            newUGC = new($"{session.Player.Guild.Name} Emblem", characterId, session.Player.Name, accountId, 0, type);
            break;

        case UGCType.GuildBanner:
            packet.ReadLong();     // guild id
            int bannerId = packet.ReadInt();
            newUGC = new($"{session.Player.Guild.Name} Banner", characterId, session.Player.Name, accountId, 0, type, bannerId);
            break;

        case UGCType.Banner:
            newUGC = HandleCreateUGCBanner(session, packet);
            break;

        default:
            Logger.Warning("Unknown UGC type {0}", type);
            break;
        }

        if (newUGC is null)
        {
            return;
        }

        session.Send(UGCPacket.CreateUGC(newUGC));
    }
コード例 #3
0
ファイル: UGCHandler.cs プロジェクト: Etchavious/MapleServer2
    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;
        }
    }
コード例 #4
0
ファイル: UGCHandler.cs プロジェクト: Etchavious/MapleServer2
    private static UGC HandleCreateUGCItem(PacketReader packet, GameSession session, long characterId, long accountId, UGCType type)
    {
        long   unk      = packet.ReadLong(); // some kind of UID
        int    itemId   = packet.ReadInt();
        int    amount   = packet.ReadInt();
        string itemName = packet.ReadUnicodeString();

        packet.ReadByte();
        long cost       = packet.ReadLong();
        bool useVoucher = packet.ReadBool();

        UgcDesignMetadata metadata = UgcDesignMetadataStorage.GetItem(itemId);

        if (metadata is null)
        {
            return(null);
        }

        if (useVoucher)
        {
            Item voucher = session.Player.Inventory.GetAllByTag("FreeDesignCoupon").FirstOrDefault();
            if (voucher is null)
            {
                return(null);
            }

            session.Player.Inventory.ConsumeItem(session, voucher.Uid, 1);
        }
        else
        {
            switch (metadata.CurrencyType)
            {
            case CurrencyType.Meso when !session.Player.Wallet.Meso.Modify(-cost):
                return(null);

            case CurrencyType.Meret when !session.Player.Account.Meret.Modify(-cost):
                return(null);
            }
        }

        Item item = new(itemId, amount, metadata.Rarity);

        item.Ugc.UpdateItem(itemName, characterId, session.Player.Name, accountId, metadata.SalePrice, type);
        DatabaseManager.Items.Update(item);
        return(item.Ugc);
    }