public static PacketWriter UpdateUGCBanner(UGCBanner ugcBanner) { PacketWriter pWriter = PacketWriter.Of(SendOp.UGC); pWriter.Write(UGCMode.UpdateUGCBanner); pWriter.WriteUGCBanner(ugcBanner.Id, ugcBanner.Slots); return(pWriter); }
public static PacketWriter ActivateBanner(UGCBanner ugcBanner) { PacketWriter pWriter = PacketWriter.Of(SendOp.UGC); pWriter.Write(UGCMode.ActivateBanner); pWriter.WriteActiveBannerSlot(ugcBanner); return(pWriter); }
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); }
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)); }
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); }
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; } }