Started on rooms, also created the private room categories map and made Repository log errors on exception instead of breaking
parent
df75c4d4e6
commit
b5fbeb7852
|
@ -1,4 +1,5 @@
|
||||||
using Tiger.Communication.Messages.Interfaces;
|
using Tiger.Communication.Messages.Interfaces;
|
||||||
|
using Tiger.Communication.Messages.Outgoing;
|
||||||
using Tiger.Communication.Messages.Outgoing.Navigator;
|
using Tiger.Communication.Messages.Outgoing.Navigator;
|
||||||
using Tiger.Communication.Messages.Types;
|
using Tiger.Communication.Messages.Types;
|
||||||
using Tiger.Game.Navigator;
|
using Tiger.Game.Navigator;
|
||||||
|
@ -27,7 +28,14 @@ public class NavigatorSearchEvent : IMessageEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_navigatorManager.NavigatorViews.TryGetValue(request.ReadString(), out var navigatorView)) return;
|
if (!_navigatorManager.NavigatorViews.TryGetValue(request.ReadString(), out var navigatorView)) return;
|
||||||
|
var qry = request.ReadString();
|
||||||
|
|
||||||
await gameSession.SendComposerAsync(new NavigatorSearchComposer(navigatorView, request.ReadString(), gameSession.Habbo));
|
var message = new ServerMessage((short)OutgoingHeaders.NavigatorSearch);
|
||||||
|
message.AppendString(navigatorView.Code);
|
||||||
|
message.AppendString(qry);
|
||||||
|
await navigatorView.Compose(message, gameSession.Habbo, qry);
|
||||||
|
await gameSession.SendMessageAsync(message);
|
||||||
|
|
||||||
|
// await gameSession.SendComposerAsync(new NavigatorSearchComposer(navigatorView, request.ReadString(), gameSession.Habbo));
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -23,6 +23,6 @@ public class NavigatorSearchComposer : IMessageComposer
|
||||||
{
|
{
|
||||||
message.AppendString(_navigatorView.Code);
|
message.AppendString(_navigatorView.Code);
|
||||||
message.AppendString(_query);
|
message.AppendString(_query);
|
||||||
_navigatorView.Compose(message, _habbo, _query);
|
_navigatorView.Compose(message, _habbo, _query).Wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -6,5 +6,5 @@ namespace Tiger.Game.Navigator.Views;
|
||||||
public interface INavigatorView
|
public interface INavigatorView
|
||||||
{
|
{
|
||||||
string Code { get; }
|
string Code { get; }
|
||||||
void Compose(ServerMessage message, Habbo habbo, string query);
|
Task Compose(ServerMessage message, Habbo habbo, string query);
|
||||||
}
|
}
|
|
@ -1,11 +1,16 @@
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using Tiger.Communication.Messages.Types;
|
using Tiger.Communication.Messages.Types;
|
||||||
using Tiger.Game.Habbos;
|
using Tiger.Game.Habbos;
|
||||||
|
using Tiger.Game.Rooms;
|
||||||
|
using Tiger.Storage;
|
||||||
|
|
||||||
namespace Tiger.Game.Navigator.Views;
|
namespace Tiger.Game.Navigator.Views;
|
||||||
|
|
||||||
public class MyWorldView : INavigatorView
|
public class MyWorldView : INavigatorView
|
||||||
{
|
{
|
||||||
|
private readonly IRepository<Room> _roomRepository;
|
||||||
|
|
||||||
private const int OwnRoomsType = 0;
|
private const int OwnRoomsType = 0;
|
||||||
private const int FavoriteRoomsType = 1;
|
private const int FavoriteRoomsType = 1;
|
||||||
private const int GroupRoomsType = 2;
|
private const int GroupRoomsType = 2;
|
||||||
|
@ -25,11 +30,12 @@ public class MyWorldView : INavigatorView
|
||||||
{"Rooms Where I Have Rights", RightsRoomType}
|
{"Rooms Where I Have Rights", RightsRoomType}
|
||||||
};
|
};
|
||||||
|
|
||||||
public MyWorldView()
|
public MyWorldView(IRepository<Room> roomRepository)
|
||||||
{
|
{
|
||||||
|
_roomRepository = roomRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Compose(ServerMessage message, Habbo habbo, string query)
|
public async Task Compose(ServerMessage message, Habbo habbo, string query)
|
||||||
{
|
{
|
||||||
message.AppendInt32(_categories.Count);
|
message.AppendInt32(_categories.Count);
|
||||||
|
|
||||||
|
@ -41,14 +47,23 @@ public class MyWorldView : INavigatorView
|
||||||
message.AppendBoolean(false); // closed?
|
message.AppendBoolean(false); // closed?
|
||||||
message.AppendInt32(0); // mode?
|
message.AppendInt32(0); // mode?
|
||||||
|
|
||||||
var rooms = GetRoomsByType(habbo, type);
|
var rooms = await GetRoomsByType(habbo, type);
|
||||||
|
|
||||||
message.AppendInt32(rooms.Count); // TODO: Rooms, this will ALWAYS return 0.
|
message.AppendInt32(rooms.Count);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ICollection GetRoomsByType(Habbo habbo, int type)
|
foreach (var room in rooms)
|
||||||
{
|
{
|
||||||
return new List<object>();
|
room.Serialize(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<ICollection<Room>> GetRoomsByType(Habbo habbo, int type)
|
||||||
|
{
|
||||||
|
return type switch
|
||||||
|
{
|
||||||
|
OwnRoomsType => (await _roomRepository.FindByAsync(r => r.Owner == habbo)).ToList(),
|
||||||
|
_ => new Collection<Room>()
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -6,8 +6,9 @@ namespace Tiger.Game.Navigator.Views;
|
||||||
public class OfficialView : INavigatorView
|
public class OfficialView : INavigatorView
|
||||||
{
|
{
|
||||||
public string Code => "official_view";
|
public string Code => "official_view";
|
||||||
public void Compose(ServerMessage message, Habbo habbo, string query)
|
public async Task Compose(ServerMessage message, Habbo habbo, string query)
|
||||||
{
|
{
|
||||||
message.AppendInt32(0);
|
message.AppendInt32(0);
|
||||||
|
await Task.CompletedTask;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,5 +3,7 @@ namespace Tiger.Game.Rooms;
|
||||||
public interface IRoomManager
|
public interface IRoomManager
|
||||||
{
|
{
|
||||||
IDictionary<int, RoomPrivateCategory> PrivateCategories { get; }
|
IDictionary<int, RoomPrivateCategory> PrivateCategories { get; }
|
||||||
|
IDictionary<int, RoomModel> RoomModels { get; }
|
||||||
Task LoadPrivateCategoriesAsync();
|
Task LoadPrivateCategoriesAsync();
|
||||||
|
Task LoadRoomModels();
|
||||||
}
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
namespace Tiger.Game.Rooms.Mapping.Tiles;
|
||||||
|
|
||||||
|
public class RoomTile
|
||||||
|
{
|
||||||
|
public int X { get; set; }
|
||||||
|
public int Y { get; set; }
|
||||||
|
public double Height { get; set; }
|
||||||
|
public RoomTileState TileState { get; set; }
|
||||||
|
|
||||||
|
public RoomTile(int x, int y, double height, RoomTileState tileState)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Height = height;
|
||||||
|
TileState = tileState;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
namespace Tiger.Game.Rooms.Mapping.Tiles;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Empty and Unavailable can be set in both the RoomTile and RoomPoint.
|
||||||
|
/// RoomTile belongs to the Model (the tile is either unavailable or empty)
|
||||||
|
/// RoomPoint belongs to the Grid (the tile has multiple states based on once actors and items are added)
|
||||||
|
/// </summary>
|
||||||
|
public enum RoomTileState
|
||||||
|
{
|
||||||
|
Empty,
|
||||||
|
Unavailable,
|
||||||
|
HasWalkableStackableItem,
|
||||||
|
WalkBlockedByItem,
|
||||||
|
StackBlockedByItem,
|
||||||
|
TileLockedByItem,
|
||||||
|
BlockedByUser
|
||||||
|
}
|
|
@ -0,0 +1,131 @@
|
||||||
|
using Tiger.Communication.Messages.Types;
|
||||||
|
using Tiger.Game.Habbos;
|
||||||
|
|
||||||
|
namespace Tiger.Game.Rooms;
|
||||||
|
|
||||||
|
public class Room
|
||||||
|
{
|
||||||
|
public virtual int Id { get; set; }
|
||||||
|
public virtual string Name { get; set; } = null!;
|
||||||
|
public virtual string Description { get; set; } = null!;
|
||||||
|
public virtual int ModelId { get; set; }
|
||||||
|
public virtual string Password { get; set; } = null!;
|
||||||
|
public virtual string State { get; set; } = null!;
|
||||||
|
public virtual int UsersIn { get; set; }
|
||||||
|
public virtual int UsersMax { get; set; }
|
||||||
|
public virtual int Score { get; set; }
|
||||||
|
public virtual string Floor { get; set; } = null!;
|
||||||
|
public virtual string Wallpaper { get; set; } = null!;
|
||||||
|
public virtual string Landscape { get; set; } = null!;
|
||||||
|
public virtual int WallThickness { get; set; }
|
||||||
|
public virtual int WallHeight { get; set; }
|
||||||
|
public virtual int FloorThickness { get; set; }
|
||||||
|
public virtual string MoodlightData { get; set; } = null!;
|
||||||
|
public virtual IList<string> Tags { get; set; } = new List<string>();
|
||||||
|
public virtual bool IsPublic { get; set; }
|
||||||
|
public virtual bool IsStaffPicked { get; set; }
|
||||||
|
public virtual bool AllowOtherPets { get; set; }
|
||||||
|
public virtual bool AllowOtherPetsEat { get; set; }
|
||||||
|
public virtual bool AllowWalkthrough { get; set; }
|
||||||
|
public virtual bool HideWalls { get; set; }
|
||||||
|
public virtual int ChatMode { get; set; }
|
||||||
|
public virtual int ChatWeight { get; set; }
|
||||||
|
public virtual int ChatSpeed { get; set; }
|
||||||
|
public virtual int ChatHearingDistance { get; set; }
|
||||||
|
public virtual int ChatProtection { get; set; }
|
||||||
|
public virtual bool OverrideModel { get; set; }
|
||||||
|
public virtual int WhoCanMute { get; set; }
|
||||||
|
public virtual int WhoCanKick { get; set; }
|
||||||
|
public virtual int WhoCanBan { get; set; }
|
||||||
|
public virtual int RollerSpeed { get; set; }
|
||||||
|
public virtual bool Promoted { get; set; }
|
||||||
|
public virtual int TradeMode { get; set; }
|
||||||
|
public virtual bool MoveDiagonally { get; set; }
|
||||||
|
public virtual bool JukeboxActive { get; set; }
|
||||||
|
public virtual bool HideWired { get; set; }
|
||||||
|
public virtual bool IsForSale { get; set; }
|
||||||
|
public virtual Habbo? Owner { get; set; }
|
||||||
|
public virtual RoomPrivateCategory Category { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual int StateNumber => State switch
|
||||||
|
{
|
||||||
|
"locked" => 1,
|
||||||
|
"password" => 2,
|
||||||
|
"invisible" => 3,
|
||||||
|
_ => 0
|
||||||
|
};
|
||||||
|
|
||||||
|
public virtual int Base
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var @base = 0;
|
||||||
|
|
||||||
|
// if (Guild != null)
|
||||||
|
// {
|
||||||
|
// @base += 2;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (Promoted)
|
||||||
|
// {
|
||||||
|
// @base += 4;
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (!IsPublic)
|
||||||
|
{
|
||||||
|
@base += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsPublic && AllowOtherPets)
|
||||||
|
{
|
||||||
|
@base += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
return @base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Serialize(ServerMessage response)
|
||||||
|
{
|
||||||
|
response.AppendInt32(Id);
|
||||||
|
response.AppendString(Name);
|
||||||
|
|
||||||
|
if (IsPublic)
|
||||||
|
{
|
||||||
|
response.AppendInt32(0);
|
||||||
|
response.AppendString(string.Empty);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
response.AppendInt32(Owner?.Id ?? 0);
|
||||||
|
response.AppendString(Owner?.Username ?? string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
response.AppendInt32(StateNumber);
|
||||||
|
response.AppendInt32(UsersIn);
|
||||||
|
response.AppendInt32(UsersMax);
|
||||||
|
response.AppendString(Description);
|
||||||
|
response.AppendInt32(0);
|
||||||
|
response.AppendInt32(Score);
|
||||||
|
response.AppendInt32(0);
|
||||||
|
response.AppendInt32(Category.Id);
|
||||||
|
|
||||||
|
response.AppendInt32(Tags.Count);
|
||||||
|
|
||||||
|
foreach (var tag in Tags)
|
||||||
|
{
|
||||||
|
response.AppendString(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
response.AppendInt32(Base);
|
||||||
|
|
||||||
|
// if (Guild != null)
|
||||||
|
// {
|
||||||
|
// response.AppendInt32(Guild.Id);
|
||||||
|
// response.WriteString(Guild.Name);
|
||||||
|
// response.WriteString(Guild.Badge);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TODO: Promotion
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,16 +6,21 @@ namespace Tiger.Game.Rooms;
|
||||||
public class RoomManager : IRoomManager
|
public class RoomManager : IRoomManager
|
||||||
{
|
{
|
||||||
private readonly IRepository<RoomPrivateCategory> _roomPrivateCategoryRepository;
|
private readonly IRepository<RoomPrivateCategory> _roomPrivateCategoryRepository;
|
||||||
|
private readonly IRepository<RoomModel> _roomModelRepository;
|
||||||
private readonly ILogger<IRoomManager> _logger;
|
private readonly ILogger<IRoomManager> _logger;
|
||||||
|
|
||||||
public IDictionary<int, RoomPrivateCategory> PrivateCategories { get; private set; }
|
public IDictionary<int, RoomPrivateCategory> PrivateCategories { get; private set; }
|
||||||
|
public IDictionary<int, RoomModel> RoomModels { get; private set; }
|
||||||
|
|
||||||
public RoomManager(IRepository<RoomPrivateCategory> roomPrivateCategoryRepository, ILogger<IRoomManager> logger)
|
public RoomManager(IRepository<RoomPrivateCategory> roomPrivateCategoryRepository,
|
||||||
|
IRepository<RoomModel> roomModelRepository, ILogger<IRoomManager> logger)
|
||||||
{
|
{
|
||||||
_roomPrivateCategoryRepository = roomPrivateCategoryRepository;
|
_roomPrivateCategoryRepository = roomPrivateCategoryRepository;
|
||||||
|
_roomModelRepository = roomModelRepository;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
|
||||||
PrivateCategories = new Dictionary<int, RoomPrivateCategory>();
|
PrivateCategories = new Dictionary<int, RoomPrivateCategory>();
|
||||||
|
RoomModels = new Dictionary<int, RoomModel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task LoadPrivateCategoriesAsync()
|
public async Task LoadPrivateCategoriesAsync()
|
||||||
|
@ -25,4 +30,16 @@ public class RoomManager : IRoomManager
|
||||||
|
|
||||||
_logger.LogInformation("Loaded {Count} private room categories", PrivateCategories.Count);
|
_logger.LogInformation("Loaded {Count} private room categories", PrivateCategories.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task LoadRoomModels()
|
||||||
|
{
|
||||||
|
RoomModels = (await _roomModelRepository.FindByAsync()).ToDictionary(rpc => rpc.Id);
|
||||||
|
|
||||||
|
foreach (var model in RoomModels.Values)
|
||||||
|
{
|
||||||
|
model.Parse();
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("Loaded and parsed {Count} room models", RoomModels.Count);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
using FluentNHibernate.Mapping;
|
||||||
|
using Tiger.Storage;
|
||||||
|
|
||||||
|
namespace Tiger.Game.Rooms;
|
||||||
|
|
||||||
|
public class RoomMap : ClassMap<Room>
|
||||||
|
{
|
||||||
|
public RoomMap()
|
||||||
|
{
|
||||||
|
Table("rooms");
|
||||||
|
Id(x => x.Id).Column("id").GeneratedBy.Identity();
|
||||||
|
Map(x => x.Name).Column("name").Not.Nullable();
|
||||||
|
Map(x => x.Description).Column("description").Not.Nullable();
|
||||||
|
Map(x => x.ModelId).Column("model_id").Not.Nullable();
|
||||||
|
Map(x => x.Password).Column("password").Nullable();
|
||||||
|
Map(x => x.State).Column("state").Not.Nullable();
|
||||||
|
Map(x => x.UsersIn).Column("users_in").Not.Nullable();
|
||||||
|
Map(x => x.UsersMax).Column("users_max").Not.Nullable();
|
||||||
|
Map(x => x.Score).Column("score").Not.Nullable();
|
||||||
|
Map(x => x.Floor).Column("floor").Not.Nullable();
|
||||||
|
Map(x => x.Wallpaper).Column("wallpaper").Not.Nullable();
|
||||||
|
Map(x => x.Landscape).Column("landscape").Not.Nullable();
|
||||||
|
Map(x => x.WallThickness).Column("wall_thickness").Not.Nullable();
|
||||||
|
Map(x => x.WallHeight).Column("wall_height").Not.Nullable();
|
||||||
|
Map(x => x.FloorThickness).Column("floor_thickness").Not.Nullable();
|
||||||
|
Map(x => x.MoodlightData).Column("moodlight_data").Nullable();
|
||||||
|
Map(x => x.Tags).Column("tags").CustomType<StringListTypeConverter>().Nullable();
|
||||||
|
Map(x => x.IsPublic).Column("is_public").Not.Nullable();
|
||||||
|
Map(x => x.IsStaffPicked).Column("is_staff_picked").Not.Nullable();
|
||||||
|
Map(x => x.AllowOtherPets).Column("allow_other_pets").Not.Nullable();
|
||||||
|
Map(x => x.AllowOtherPetsEat).Column("allow_other_pets_eat").Not.Nullable();
|
||||||
|
Map(x => x.AllowWalkthrough).Column("allow_walkthrough").Not.Nullable();
|
||||||
|
Map(x => x.HideWalls).Column("hide_walls").Not.Nullable();
|
||||||
|
Map(x => x.ChatMode).Column("chat_mode").Not.Nullable();
|
||||||
|
Map(x => x.ChatWeight).Column("chat_weight").Not.Nullable();
|
||||||
|
Map(x => x.ChatSpeed).Column("chat_speed").Not.Nullable();
|
||||||
|
Map(x => x.ChatHearingDistance).Column("chat_hearing_distance").Not.Nullable();
|
||||||
|
Map(x => x.ChatProtection).Column("chat_protection").Not.Nullable();
|
||||||
|
Map(x => x.OverrideModel).Column("override_model").Not.Nullable();
|
||||||
|
Map(x => x.WhoCanMute).Column("who_can_mute").Not.Nullable();
|
||||||
|
Map(x => x.WhoCanKick).Column("who_can_kick").Not.Nullable();
|
||||||
|
Map(x => x.WhoCanBan).Column("who_can_ban").Not.Nullable();
|
||||||
|
Map(x => x.RollerSpeed).Column("roller_speed").Not.Nullable();
|
||||||
|
Map(x => x.Promoted).Column("promoted").Not.Nullable();
|
||||||
|
Map(x => x.TradeMode).Column("trade_mode").Not.Nullable();
|
||||||
|
Map(x => x.MoveDiagonally).Column("move_diagonally").Not.Nullable();
|
||||||
|
Map(x => x.JukeboxActive).Column("jukebox_active").Not.Nullable();
|
||||||
|
Map(x => x.HideWired).Column("hide_wired").Not.Nullable();
|
||||||
|
Map(x => x.IsForSale).Column("is_for_sale").Not.Nullable();
|
||||||
|
References(x => x.Owner).Column("owner_id").Nullable();
|
||||||
|
References(x => x.Category).Column("category_id").Not.Nullable();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
using Tiger.Game.Rooms.Mapping.Tiles;
|
||||||
|
|
||||||
|
namespace Tiger.Game.Rooms;
|
||||||
|
|
||||||
|
public class RoomModel
|
||||||
|
{
|
||||||
|
public virtual int Id { get; set; }
|
||||||
|
public virtual string Name { get; set; } = null!;
|
||||||
|
public virtual int DoorX { get; set; }
|
||||||
|
public virtual int DoorY { get; set; }
|
||||||
|
public virtual int DoorDirection { get; set; }
|
||||||
|
public virtual string Heightmap { get; set; } = null!;
|
||||||
|
|
||||||
|
public virtual (int X, int Y) MapSize { get; set; }
|
||||||
|
|
||||||
|
public virtual RoomTile[,] RoomTiles { get; set; }
|
||||||
|
|
||||||
|
public virtual void Parse()
|
||||||
|
{
|
||||||
|
var raw = Heightmap.Replace("\r\n", "\r").Split('\r');
|
||||||
|
|
||||||
|
MapSize = (raw[0].Length, raw.Length);
|
||||||
|
|
||||||
|
RoomTiles = new RoomTile[MapSize.X, MapSize.Y];
|
||||||
|
|
||||||
|
for (var y = 0; y < MapSize.Y; y++)
|
||||||
|
{
|
||||||
|
for (var x = 0; x < MapSize.X; x++)
|
||||||
|
{
|
||||||
|
if (double.TryParse(raw[y][x].ToString(), out var height))
|
||||||
|
{
|
||||||
|
RoomTiles[x, y] = new RoomTile(x, y, height, RoomTileState.Empty);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RoomTiles[x, y] = new RoomTile(x, y, 0, RoomTileState.Unavailable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using FluentNHibernate.Mapping;
|
||||||
|
|
||||||
|
namespace Tiger.Game.Rooms;
|
||||||
|
|
||||||
|
public class RoomModelMap : ClassMap<RoomModel>
|
||||||
|
{
|
||||||
|
public RoomModelMap()
|
||||||
|
{
|
||||||
|
Table("room_models");
|
||||||
|
LazyLoad();
|
||||||
|
Id(rm => rm.Id).Column("id").GeneratedBy.Identity();
|
||||||
|
Map(rm => rm.Name).Column("name").Not.Nullable();
|
||||||
|
Map(rm => rm.DoorX).Column("door_x").Not.Nullable();
|
||||||
|
Map(rm => rm.DoorY).Column("door_y").Not.Nullable();
|
||||||
|
Map(rm => rm.DoorDirection).Column("door_direction").Not.Nullable();
|
||||||
|
Map(rm => rm.Heightmap).Column("heightmap").Not.Nullable();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,17 @@
|
||||||
|
using FluentNHibernate.Mapping;
|
||||||
|
|
||||||
namespace Tiger.Game.Rooms;
|
namespace Tiger.Game.Rooms;
|
||||||
|
|
||||||
public class RoomPrivateCategoryMap
|
public class RoomPrivateCategoryMap : ClassMap<RoomPrivateCategory>
|
||||||
{
|
{
|
||||||
|
public RoomPrivateCategoryMap()
|
||||||
|
{
|
||||||
|
Table("room_private_categories");
|
||||||
|
LazyLoad();
|
||||||
|
Id(rpc => rpc.Id).Column("id").GeneratedBy.Identity();
|
||||||
|
Map(rpc => rpc.MinRank).Column("min_rank").Not.Nullable();
|
||||||
|
Map(rpc => rpc.Code).Column("code").Not.Nullable();
|
||||||
|
Map(rpc => rpc.Name).Column("name").Not.Nullable();
|
||||||
|
Map(rpc => rpc.CanTrade).Column("can_trade").Not.Nullable();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -25,4 +25,11 @@ public class GameSession
|
||||||
await WebSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Binary, true,
|
await WebSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Binary, true,
|
||||||
CancellationToken.None);
|
CancellationToken.None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task SendMessageAsync(ServerMessage message)
|
||||||
|
{
|
||||||
|
var bytes = message.ToArray();
|
||||||
|
await WebSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Binary, true,
|
||||||
|
CancellationToken.None);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -60,6 +60,7 @@ provider.GetRequiredService<IFigureDataManager>();
|
||||||
await provider.GetRequiredService<ILandingViewManager>().LoadPromoArticlesAsync();
|
await provider.GetRequiredService<ILandingViewManager>().LoadPromoArticlesAsync();
|
||||||
await provider.GetRequiredService<IAchievementManager>().LoadAchievementsAsync();
|
await provider.GetRequiredService<IAchievementManager>().LoadAchievementsAsync();
|
||||||
await provider.GetRequiredService<IRoomManager>().LoadPrivateCategoriesAsync();
|
await provider.GetRequiredService<IRoomManager>().LoadPrivateCategoriesAsync();
|
||||||
|
await provider.GetRequiredService<IRoomManager>().LoadRoomModels();
|
||||||
|
|
||||||
provider.GetRequiredService<IWebSocketServer>().Start($"http://{configuration["Network:Game:Ip"]}:{configuration["Network:Game:Port"]}/");
|
provider.GetRequiredService<IWebSocketServer>().Start($"http://{configuration["Network:Game:Ip"]}:{configuration["Network:Game:Port"]}/");
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using NHibernate;
|
using NHibernate;
|
||||||
using NHibernate.Linq;
|
using NHibernate.Linq;
|
||||||
|
|
||||||
|
@ -7,24 +8,43 @@ namespace Tiger.Storage;
|
||||||
public class Repository<T> : IRepository<T> where T : class
|
public class Repository<T> : IRepository<T> where T : class
|
||||||
{
|
{
|
||||||
private readonly ISession _session;
|
private readonly ISession _session;
|
||||||
|
private readonly ILogger<IRepository<T>> _logger;
|
||||||
|
|
||||||
public Repository(ISession session)
|
public Repository(ISession session, ILogger<IRepository<T>> logger)
|
||||||
{
|
{
|
||||||
_session = session;
|
_session = session;
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<T?> FindAsync(object id)
|
public async Task<T?> FindAsync(object id)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
return await _session.GetAsync<T>(id);
|
return await _session.GetAsync<T>(id);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Tried to get {Type} with id {Id}", typeof(T).Name, id);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task SaveAsync(T entity)
|
public async Task SaveAsync(T entity)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
await _session.SaveOrUpdateAsync(entity);
|
await _session.SaveOrUpdateAsync(entity);
|
||||||
await _session.FlushAsync();
|
await _session.FlushAsync();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Tried to save {Type}", typeof(T).Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task SaveManyAsync(params T[] entities)
|
public async Task SaveManyAsync(params T[] entities)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
foreach (var entity in entities)
|
foreach (var entity in entities)
|
||||||
{
|
{
|
||||||
|
@ -33,8 +53,15 @@ public class Repository<T> : IRepository<T> where T : class
|
||||||
|
|
||||||
await _session.FlushAsync();
|
await _session.FlushAsync();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Tried to save many {Type}", typeof(T).Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task SaveManyAsync(IEnumerable<T> entities)
|
public async Task SaveManyAsync(IEnumerable<T> entities)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
foreach (var entity in entities)
|
foreach (var entity in entities)
|
||||||
{
|
{
|
||||||
|
@ -43,8 +70,15 @@ public class Repository<T> : IRepository<T> where T : class
|
||||||
|
|
||||||
await _session.FlushAsync();
|
await _session.FlushAsync();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Tried to save many {Type}", typeof(T).Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<T>> FindByAsync(Expression<Func<T, bool>>? expression)
|
public async Task<IEnumerable<T>> FindByAsync(Expression<Func<T, bool>>? expression)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var query = _session.Query<T>();
|
var query = _session.Query<T>();
|
||||||
|
|
||||||
|
@ -55,9 +89,23 @@ public class Repository<T> : IRepository<T> where T : class
|
||||||
|
|
||||||
return await query.ToListAsync();
|
return await query.ToListAsync();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Tried find many {Type} by query", typeof(T).Name);
|
||||||
|
return Array.Empty<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<T?> FindOneByAsync(Expression<Func<T, bool>> expression)
|
public async Task<T?> FindOneByAsync(Expression<Func<T, bool>> expression)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
return await _session.Query<T>().FirstOrDefaultAsync(expression);
|
return await _session.Query<T>().FirstOrDefaultAsync(expression);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Tried find single {Type} by query", typeof(T).Name);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue