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