Added badges

main
Tiger 2023-09-29 20:20:28 +02:00
parent 6e9b6d0449
commit 66744ead65
12 changed files with 221 additions and 3 deletions

View File

@ -5,5 +5,5 @@ namespace Tiger.Communication.Messages;
public interface IMessageHandler
{
Task TryHandleAsync(GameSession session, ClientMessage request);
Task TryHandleAsync(GameSession gameSession, ClientMessage request);
}

View File

@ -150,7 +150,7 @@ public enum IncomingHeaders : short
GetRoomEntryTileEvent = 3559,
GetRoomSettingsEvent = 3129,
GetRoomVisitsEvent = 3526,
GetSelectedBadgesEvent = 2091,
GetSelectedBadgesMessageEvent = 2091,
GetSellablePetPalettesEvent = 1756,
GetSongInfoEvent = 3082,
GetSoundSettingsEvent = 2388,

View File

@ -0,0 +1,28 @@
using Tiger.Communication.Messages.Interfaces;
using Tiger.Communication.Messages.Outgoing.Inventory.Badges;
using Tiger.Communication.Messages.Types;
using Tiger.Networking.Game.Sessions;
namespace Tiger.Communication.Messages.Incoming.Inventory.Badges;
public class GetBadgesEvent : IMessageEvent
{
private readonly IGameSessionManager _gameSessionManager;
public GetBadgesEvent(IGameSessionManager gameSessionManager)
{
_gameSessionManager = gameSessionManager;
}
public IncomingHeaders Header => IncomingHeaders.GetBadgesEvent;
public async Task HandleAsync(GameSession gameSession, ClientMessage request)
{
if (gameSession.Habbo == null)
{
await _gameSessionManager.CloseAsync("Not logged in", gameSession);
return;
}
await gameSession.SendComposerAsync(new BadgesComposer(gameSession.Habbo.Badges));
}
}

View File

@ -0,0 +1,59 @@
using System.Collections.ObjectModel;
using Tiger.Communication.Messages.Interfaces;
using Tiger.Communication.Messages.Outgoing.Users;
using Tiger.Communication.Messages.Types;
using Tiger.Game.Habbos;
using Tiger.Networking.Game.Sessions;
using Tiger.Storage;
namespace Tiger.Communication.Messages.Incoming.Inventory.Badges;
public class SetActivatedBadgesEvent : IMessageEvent
{
private readonly IGameSessionManager _gameSessionManager;
private readonly IRepository<Badge> _badgeRepository;
public SetActivatedBadgesEvent(IGameSessionManager gameSessionManager, IRepository<Badge> badgeRepository)
{
_gameSessionManager = gameSessionManager;
_badgeRepository = badgeRepository;
}
public IncomingHeaders Header => IncomingHeaders.SetActivatedBadgesEvent;
public async Task HandleAsync(GameSession gameSession, ClientMessage request)
{
if (gameSession.Habbo == null)
{
await _gameSessionManager.CloseAsync("Not logged in", gameSession);
return;
}
if (gameSession.Habbo.Badges == null)
return;
var wearingBadges = new Collection<Badge>();
foreach (var currentBadge in gameSession.Habbo.Badges)
{
currentBadge.Slot = 0;
}
for (var i = 0; i < 5; i++)
{
var slotId = request.ReadInt32();
var code = request.ReadString();
if (slotId == null || slotId is < 1 or > 5 || string.IsNullOrEmpty(code)) continue;
var badge = gameSession.Habbo.Badges.FirstOrDefault(b => b.Code == code);
if (badge == null) continue;
badge.Slot = slotId.Value;
wearingBadges.Add(badge);
_badgeRepository.SaveAsync(badge);
}
await gameSession.SendComposerAsync(new HabboUserBadgesMessageComposer(gameSession.Habbo.Id, wearingBadges));
}
}

View File

@ -0,0 +1,37 @@
using Tiger.Communication.Messages.Interfaces;
using Tiger.Communication.Messages.Outgoing.Users;
using Tiger.Communication.Messages.Types;
using Tiger.Game.Habbos;
using Tiger.Networking.Game.Sessions;
using Tiger.Storage;
namespace Tiger.Communication.Messages.Incoming.Users;
public class GetSelectedBadgesMessageEvent : IMessageEvent
{
private readonly IGameSessionManager _gameSessionManager;
private readonly IRepository<Badge> _badgeRepository;
public GetSelectedBadgesMessageEvent(IGameSessionManager gameSessionManager, IRepository<Badge> badgeRepository)
{
_gameSessionManager = gameSessionManager;
_badgeRepository = badgeRepository;
}
public IncomingHeaders Header => IncomingHeaders.GetSelectedBadgesMessageEvent;
public async Task HandleAsync(GameSession gameSession, ClientMessage request)
{
if (gameSession.Habbo == null)
{
await _gameSessionManager.CloseAsync("Not logged in", gameSession);
return;
}
var habboId = request.ReadInt32();
if (habboId == null) return;
var badges = await _badgeRepository.FindByAsync(b => b.Habbo.Id == habboId && b.Slot > 0);
await gameSession.SendComposerAsync(new HabboUserBadgesMessageComposer(habboId.Value, badges.ToList()));
}
}

View File

@ -0,0 +1,37 @@
using Tiger.Communication.Messages.Interfaces;
using Tiger.Communication.Messages.Types;
using Tiger.Game.Habbos;
namespace Tiger.Communication.Messages.Outgoing.Inventory.Badges;
public class BadgesComposer : IMessageComposer
{
private readonly IReadOnlyList<Badge> _badges;
public BadgesComposer(IEnumerable<Badge>? badges)
{
_badges = badges != null ? badges.ToList() : new List<Badge>();
}
public OutgoingHeaders Header => OutgoingHeaders.BadgesComposer;
public void Compose(ServerMessage message)
{
message.AppendInt32(_badges.Count);
foreach (var badge in _badges)
{
message.AppendInt32(badge.Id);
message.AppendString(badge.Code);
}
var wearingBadges = _badges.Where(b => b.Slot > 0).ToList();
message.AppendInt32(wearingBadges.Count);
foreach (var wearingBadge in wearingBadges)
{
message.AppendInt32(wearingBadge.Slot);
message.AppendString(wearingBadge.Code);
}
}
}

View File

@ -432,7 +432,7 @@ public enum OutgoingHeaders
UpdateStackHeightTileHeightComposer = 2816,
UpdateThreadMessageComposer = 2528,
UseObjectMessageComposer = 1774,
UserBadgesComposer = 1087,
HabboUserBadgesMessageComposer = 1087,
UserBannedMessageComposer = 1683,
UserBcLimitsComposer = -1,
UserChangeMessageComposer = 3920,

View File

@ -0,0 +1,30 @@
using Tiger.Communication.Messages.Interfaces;
using Tiger.Communication.Messages.Types;
using Tiger.Game.Habbos;
namespace Tiger.Communication.Messages.Outgoing.Users;
public class HabboUserBadgesMessageComposer : IMessageComposer
{
private readonly int _habboId;
private readonly ICollection<Badge> _badges;
public HabboUserBadgesMessageComposer(int habboId, ICollection<Badge> badges)
{
_habboId = habboId;
_badges = badges;
}
public OutgoingHeaders Header => OutgoingHeaders.HabboUserBadgesMessageComposer;
public void Compose(ServerMessage message)
{
message.AppendInt32(_habboId);
message.AppendInt32(_badges.Count);
foreach (var badge in _badges)
{
message.AppendInt32(badge.Slot);
message.AppendString(badge.Code);
}
}
}

9
Game/Habbos/Badge.cs Normal file
View File

@ -0,0 +1,9 @@
namespace Tiger.Game.Habbos;
public class Badge
{
public virtual int Id { get; set; }
public virtual Habbo Habbo { get; set; } = null!;
public virtual string Code { get; set; } = null!;
public virtual int Slot { get; set; }
}

16
Game/Habbos/BadgeMap.cs Normal file
View File

@ -0,0 +1,16 @@
using FluentNHibernate.Mapping;
namespace Tiger.Game.Habbos;
public class BadgeMap : ClassMap<Badge>
{
public BadgeMap()
{
Table("habbo_badges");
LazyLoad();
Id(b => b.Id).Column("id").GeneratedBy.Identity();
References(b => b.Habbo).Column("habbo_id").Not.Nullable();
Map(b => b.Code).Column("code").Not.Nullable();
Map(b => b.Slot).Column("slot").Not.Nullable();
}
}

View File

@ -18,4 +18,5 @@ public class Habbo
public virtual int? GroupId { get; set; }
public virtual string? SsoTicket { get; set; }
public virtual IEnumerable<Activitypoints>? Activitypoints { get; set; }
public virtual IEnumerable<Badge>? Badges { get; set; }
}

View File

@ -24,5 +24,6 @@ public class HabboMap : ClassMap<Habbo>
Map(h => h.GroupId).Column("group_id").Nullable();
Map(h => h.SsoTicket).Column("sso_ticket").Nullable();
HasMany<Activitypoints>(h => h.Activitypoints).LazyLoad().Inverse().Cascade.All();
HasMany<Badge>(h => h.Badges).LazyLoad().Inverse().Cascade.All();
}
}