Skip to content

Commit 5ad5527

Browse files
committed
Change all projects to .NET 6 and update nuget packages.
WIP Add back some of the AuthServer and FrontServer logic.
1 parent 0b4f266 commit 5ad5527

File tree

64 files changed

+1855
-43
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1855
-43
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<ProjectReference Include="..\src\Libraries\Shinobytes.Ravenfall.Core\Shinobytes.Ravenfall.Core.csproj" />
14+
<ProjectReference Include="..\src\Libraries\Shinobytes.Ravenfall.Data.EntityFramework\Shinobytes.Ravenfall.Data.EntityFramework.csproj" />
15+
</ItemGroup>
16+
17+
<ItemGroup>
18+
<Reference Include="RavenNest.BusinessLogic">
19+
<HintPath>..\..\RavenNest\src\RavenNest.BusinessLogic\bin\Debug\netcoreapp3.1\RavenNest.BusinessLogic.dll</HintPath>
20+
</Reference>
21+
<Reference Include="RavenNest.DataModels">
22+
<HintPath>..\..\RavenNest\src\RavenNest.DataModels\bin\Debug\netcoreapp3.1\RavenNest.DataModels.dll</HintPath>
23+
</Reference>
24+
<Reference Include="RavenNest.Models">
25+
<HintPath>..\..\Ravenfall-Legacy\Assets\Libraries\RavenNest.Models.dll</HintPath>
26+
</Reference>
27+
</ItemGroup>
28+
29+
</Project>

DownloadPlayerData/Mapper.cs

Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,345 @@
1+
using GameServer;
2+
using RavenNest.BusinessLogic;
3+
using RavenNest.DataModels;
4+
using System;
5+
using System.Collections.Concurrent;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Reflection;
9+
using System.Runtime.CompilerServices;
10+
using System.Security.Cryptography.X509Certificates;
11+
using System.Text;
12+
using System.Threading.Tasks;
13+
14+
namespace DownloadPlayerData
15+
{
16+
public class Mapper
17+
{
18+
private static string GetHexColor(HairColor color)
19+
{
20+
switch (color)
21+
{
22+
case HairColor.Blonde:
23+
return "#A8912A";
24+
case HairColor.Blue:
25+
return "#0D9BB9";
26+
case HairColor.Brown:
27+
return "#3C2823";
28+
case HairColor.Grey:
29+
return "#595959";
30+
case HairColor.Pink:
31+
return "#DF62C7";
32+
case HairColor.Red:
33+
return "#C52A4A";
34+
default:
35+
return "#000000";
36+
}
37+
}
38+
39+
private static string GetHexColor(SkinColor color)
40+
{
41+
switch (color)
42+
{
43+
case SkinColor.Light:
44+
return "#d6b8ae";
45+
case SkinColor.Medium:
46+
return "#faa276";
47+
default:
48+
return "#40251e";
49+
}
50+
}
51+
52+
private static SyntyAppearance GenerateRandomSyntyAppearance()
53+
{
54+
var gender = Utility.Random<Gender>();
55+
var skinColor = GetHexColor(Utility.Random<SkinColor>());
56+
var hairColor = GetHexColor(Utility.Random<HairColor>());
57+
var beardColor = GetHexColor(Utility.Random<HairColor>());
58+
return new SyntyAppearance
59+
{
60+
Id = Guid.NewGuid(),
61+
Gender = gender,
62+
SkinColor = skinColor,
63+
HairColor = hairColor,
64+
BeardColor = beardColor,
65+
StubbleColor = skinColor,
66+
WarPaintColor = hairColor,
67+
EyeColor = "#000000",
68+
Eyebrows = Utility.Random(0, gender == Gender.Male ? 10 : 7),
69+
Hair = Utility.Random(0, 38),
70+
FacialHair = gender == Gender.Male ? Utility.Random(0, 18) : -1,
71+
Head = Utility.Random(0, 23),
72+
HelmetVisible = true
73+
};
74+
}
75+
76+
public static Skills GetSkills(Player player)
77+
{
78+
var skill = DataMapper.Map<Skills, RavenNest.Models.Skills>(player.Skills);
79+
skill.Id = Guid.NewGuid();
80+
return skill;
81+
}
82+
83+
public static Character GetCharacter(Player player, User user)
84+
{
85+
return new Character
86+
{
87+
Id = Guid.NewGuid(),
88+
Name = player.Name,
89+
AppearanceId = player.Appearance.Id,
90+
ResourcesId = player.Resources.Id,
91+
SkillsId = player.Skills.Id,
92+
StateId = player.State.Id,
93+
StatisticsId = player.Statistics.Id,
94+
SyntyAppearanceId = player.Appearance.Id,
95+
UserId = user.Id,
96+
Created = DateTime.UtcNow,
97+
};
98+
}
99+
100+
internal static SyntyAppearance GetAppearance(Player player)
101+
{
102+
var app = DataMapper.Map<SyntyAppearance, RavenNest.Models.SyntyAppearance>(player.Appearance);
103+
if (app.Id == Guid.Empty)
104+
{
105+
app = GenerateRandomSyntyAppearance();
106+
}
107+
app.Id = Guid.NewGuid();
108+
return app;
109+
}
110+
111+
internal static Resources GetResources(Player player)
112+
{
113+
var res = DataMapper.Map<Resources, RavenNest.Models.Resources>(player.Resources);
114+
115+
res.Id = Guid.NewGuid();
116+
return res;
117+
}
118+
119+
internal static CharacterState GetState(Player player)
120+
{
121+
var state = DataMapper.Map<CharacterState, RavenNest.Models.CharacterState>(player.State);
122+
123+
state.Id = Guid.NewGuid();
124+
return state;
125+
}
126+
127+
internal static InventoryItem[] GetInventoryItems(Player player)
128+
{
129+
var items = player.InventoryItems.Select(x => Map(x)).ToArray();
130+
return MergeItems(items);
131+
}
132+
133+
private static InventoryItem[] MergeItems(InventoryItem[] items)
134+
{
135+
List<InventoryItem> output = new List<InventoryItem>();
136+
137+
foreach (var item in items.GroupBy(x => x.ItemId))
138+
{
139+
var typeList = item.ToList();
140+
var characterId = typeList[0].CharacterId;
141+
var itemId = typeList[0].ItemId;
142+
143+
var equipped = typeList.FirstOrDefault(x => x.Equipped);
144+
var total = typeList.Sum(x => x.Amount);
145+
if (equipped != null)
146+
{
147+
output.Add(new InventoryItem
148+
{
149+
CharacterId = equipped.CharacterId,
150+
Equipped = true,
151+
Amount = 1,
152+
Id = Guid.NewGuid(),
153+
ItemId = equipped.ItemId
154+
});
155+
--total;
156+
}
157+
if (total > 0)
158+
{
159+
output.Add(new InventoryItem
160+
{
161+
Amount = total,
162+
CharacterId = characterId,
163+
ItemId = itemId,
164+
Equipped = false,
165+
Id = Guid.NewGuid()
166+
});
167+
}
168+
}
169+
170+
return output.ToArray();
171+
}
172+
173+
private static InventoryItem Map(RavenNest.Models.InventoryItem x)
174+
{
175+
var item = DataMapper.Map<InventoryItem, RavenNest.Models.InventoryItem>(x);
176+
item.Id = Guid.NewGuid();
177+
return item;
178+
}
179+
180+
internal static User GetUser(Player player)
181+
{
182+
return new User
183+
{
184+
Id = Guid.NewGuid(),
185+
PasswordHash = player.PasswordHash,
186+
Created = DateTime.UtcNow,
187+
DisplayName = player.Name,
188+
IsAdmin = player.IsAdmin,
189+
IsModerator = player.IsModerator,
190+
UserId = player.UserId,
191+
UserName = player.UserName
192+
};
193+
}
194+
195+
internal static Statistics GetStatistics(Player player)
196+
{
197+
var stats = DataMapper.Map<Statistics, RavenNest.Models.Statistics>(player.Statistics);
198+
stats.Id = Guid.NewGuid();
199+
return stats;
200+
}
201+
202+
internal static MarketItem GetMarketItem(RavenNest.Models.MarketItem item)
203+
{
204+
return new MarketItem
205+
{
206+
Id = Guid.NewGuid(),
207+
Amount = item.Amount,
208+
Created = DateTime.UtcNow,
209+
ItemId = item.ItemId,
210+
PricePerItem = item.PricePerItem
211+
};
212+
}
213+
}
214+
215+
public class QueryBuilder
216+
{
217+
private readonly Type[] numericTypes = new Type[] {
218+
typeof(byte), typeof(sbyte), typeof(ushort), typeof(short), typeof(uint), typeof(int), typeof(ulong), typeof(long), typeof(decimal), typeof(float), typeof(double),
219+
typeof(byte?), typeof(sbyte?), typeof(ushort?), typeof(short?), typeof(uint?), typeof(int?), typeof(ulong?), typeof(long?), typeof(decimal?), typeof(float?), typeof(double?)
220+
};
221+
private readonly ConcurrentDictionary<Type, PropertyInfo[]> propertyCache = new ConcurrentDictionary<Type, PropertyInfo[]>();
222+
223+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
224+
private IEnumerable<string> GetSqlReadyPropertyValues(IEntity entity, PropertyInfo[] properties)
225+
{
226+
return properties.Select(x => GetSqlReadyPropertyValue(x.PropertyType, x.GetValue(entity)));
227+
}
228+
229+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
230+
private IEnumerable<string> GetSqlReadyPropertySet(IEntity entity, PropertyInfo[] properties)
231+
{
232+
return properties.Select(x => x.Name + "=" + GetSqlReadyPropertyValue(x.PropertyType, x.GetValue(entity)));
233+
}
234+
235+
private string GetSqlReadyPropertyValue(Type type, object value)
236+
{
237+
if (value == null) return "NULL";
238+
if (type == typeof(string) || type == typeof(char)
239+
|| type == typeof(DateTime) || type == typeof(TimeSpan)
240+
|| type == typeof(DateTime?) || type == typeof(TimeSpan?)
241+
|| type == typeof(Guid?) || type == typeof(Guid))
242+
{
243+
244+
return $"'{Sanitize(value?.ToString())}'";
245+
}
246+
247+
if (type.IsEnum)
248+
{
249+
return ((int)value).ToString();
250+
}
251+
252+
if (numericTypes.Any(x => x == type))
253+
{
254+
return value.ToString().Replace(',', '.').Replace('−', '-');
255+
}
256+
257+
if (typeof(bool) == type)
258+
{
259+
return (bool)value == true ? "1" : "0";
260+
}
261+
262+
if (typeof(bool?) == type)
263+
{
264+
var b = (value as bool?);
265+
return b.GetValueOrDefault() ? "1" : "0";
266+
}
267+
268+
return "NULL";
269+
}
270+
271+
private string Sanitize(string value)
272+
{
273+
// TODO: Implement
274+
// We should be using sqlparameters but how do we bulk that properly?
275+
return value?.Replace("'", "''");
276+
}
277+
private PropertyInfo[] GetProperties(Type type)
278+
{
279+
if (propertyCache.TryGetValue(type, out var properties))
280+
{
281+
return properties;
282+
}
283+
284+
return propertyCache[type] = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
285+
}
286+
287+
private PropertyInfo GetProperty(Type type, string propertyName)
288+
{
289+
return GetProperties(type).FirstOrDefault(x => x.Name == propertyName);
290+
}
291+
internal string Insert<T>(T entity) where T : IEntity
292+
{
293+
var type = entity.GetType();
294+
var props = GetProperties(type);
295+
var propertyNames = string.Join(", ", props.Select(x => x.Name));
296+
var values = string.Join(",", GetSqlReadyPropertyValues(entity, props));
297+
298+
var sb = new StringBuilder();
299+
sb.AppendLine("INSERT INTO [" + type.Name + "]");
300+
sb.AppendLine("(" + propertyNames + ")");
301+
sb.AppendLine("VALUES (" + values + ");");
302+
return sb.ToString();
303+
}
304+
305+
internal string InsertMany<T>(IEnumerable<T> entity) where T : IEntity
306+
{
307+
var type = typeof(T);
308+
var props = GetProperties(type);
309+
var propertyNames = string.Join(", ", props.Select(x => x.Name));
310+
var values = string.Join(",\r\n", entity.Select(x => "(" + string.Join(",", GetSqlReadyPropertyValues(x, props)) + ")"));
311+
312+
var sb = new StringBuilder();
313+
sb.Append("INSERT INTO [" + type.Name + "] ");
314+
sb.AppendLine("(" + propertyNames + ") VALUES");
315+
sb.AppendLine(values);
316+
return sb.ToString();
317+
}
318+
319+
internal string InsertIfNotExists<T>(T entity, string keyName = "Id") where T : IEntity
320+
{
321+
var type = entity.GetType();
322+
var props = GetProperties(type);
323+
var propertyNames = string.Join(", ", props.Select(x => x.Name));
324+
var values = string.Join(",", GetSqlReadyPropertyValues(entity, props));
325+
var propertySets = string.Join(",", GetSqlReadyPropertySet(entity, props.Where(x => x.Name != "Id").ToArray()));
326+
327+
var sb = new StringBuilder();
328+
sb.AppendLine("MERGE " + type.Name + " x");
329+
sb.AppendLine("USING (" + propertySets + ") temp");
330+
sb.AppendLine("ON temp." + keyName + " = x." + keyName);
331+
sb.AppendLine("WHEN NOT MATCHED THEN");
332+
sb.AppendLine("INSERT (" + propertyNames + ")");
333+
sb.AppendLine("VALUES (" + values + ");");
334+
return sb.ToString();
335+
336+
/*
337+
MERGE User u
338+
USING (Id = user.Id, UserId = user.UserId, DisplayName = user.DisplayName, IsAdmin = user.IsAdmin, IsModerator = user.IsModerator, Created = user.Created) temp
339+
ON temp.UserId = u.UserId
340+
WHEN NOT MATCHED THEN
341+
INSERT (Id, UserId, DisplayName, IsAdmin, IsModerator, Created) VALUES(temp.Id, temp.UserId, temp.DisplayName, temp.IsAdmin, temp.IsModerator, temp.Created);
342+
*/
343+
}
344+
}
345+
}

0 commit comments

Comments
 (0)