Compare commits

..

4 commits

Author SHA1 Message Date
44b9bf8580 Merge pull request 'Auto .NET version Roll-Forward for skill issue people' (#1) from YYHEggEgg/FreeSR:main into main
Reviewed-on: #1
2024-03-25 16:06:30 +00:00
Soldier 11
a8bdaa63a5 Auto .NET version Roll-Forward 2024-02-26 19:44:46 +08:00
moux23333
ec84048099 Update README.md 2024-02-21 15:04:17 +08:00
moux23333
205cc9e120 support 2.0.5 2024-02-21 14:41:22 +08:00
25 changed files with 6580 additions and 32802 deletions

View file

@ -5,6 +5,7 @@
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RollForward>Major</RollForward>
</PropertyGroup>
<ItemGroup>

View file

@ -28,7 +28,7 @@
context.Response.StatusCode = HttpStatusCode.OK;
context.Response.ContentType = "application/json";
await context.Response.WriteAllJsonAsync(DispatchResponseBuilder.Create()
.Retcode((int)RetcodeStatus.RetSucc)
.Retcode(0)
.Message("OK")
.Object("data", dataObject)
.Build());

View file

@ -12,7 +12,7 @@
context.Response.StatusCode = HttpStatusCode.OK;
context.Response.ContentType = "application/json";
await context.Response.WriteAllJsonAsync(DispatchResponseBuilder.Create()
.Retcode((int)RetcodeStatus.RetSucc)
.Retcode(0)
.Message("OK")
.Object("data", Data)
.Build());

View file

@ -11,7 +11,7 @@
context.Response.StatusCode = HttpStatusCode.OK;
context.Response.ContentType = "application/json";
await context.Response.WriteAllJsonAsync(DispatchResponseBuilder.Create()
.Retcode((int)RetcodeStatus.RetSucc)
.Retcode(0)
.Boolean("success", true)
.String("message", "")
.Build());

View file

@ -22,7 +22,7 @@
var accountData = DispatchHelper.ToLoginResponseData();
await context.Response.WriteAllJsonAsync(DispatchResponseBuilder.Create()
.Retcode((int)RetcodeStatus.RetSucc)
.Retcode(0)
.Message("OK")
.Object("data", new JObject
{

View file

@ -25,7 +25,7 @@
context.Response.ContentType = "text/plain";
await context.Response.WriteAllAsync(Convert.ToBase64String(ProtobufUtil.Serialize(new RegionList
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
TopServerRegionName = RegionManager.GetTopServerRegionName(),
RegionInfoLists = { RegionManager.GetRegionList() }
})));

View file

@ -25,10 +25,13 @@
B5 = true,
B6 = true,
B7 = true,
Gfemaboifee = true,
B8 = true,
useTcp = true,
//MdkResVersion = "5335706",
AssetBundleUrl = "https://autopatchcn.bhsr.com/asb/BetaLive/output_6355877_591cdefefe9b",
ExResourceUrl = "https://autopatchcn.bhsr.com/design_data/BetaLive/output_6367879_26191d7cc23b",
AssetBundleUrl = "https://autopatchos.starrails.com/asb/BetaLive/output_6510636_cb4da670a18a",
ExResourceUrl = "https://autopatchos.starrails.com/design_data/BetaLive/output_6519585_2be8ac313835",
IfixVersion = "https://autopatchos.starrails.com/ifix/BetaLive/output_6523427_28cc5c21c689",
LuaUrl = "https://autopatchos.starrails.com/lua/BetaLive/output_6516960_dede96733b5b",
})));
return true;

View file

@ -13,7 +13,7 @@
context.Response.StatusCode = HttpStatusCode.OK;
context.Response.ContentType = "application/json";
await context.Response.WriteAllJsonAsync(DispatchResponseBuilder.Create()
.Retcode((int)RetcodeStatus.RetSucc)
.Retcode(0)
.Message("OK")
.Object("data", CaptchaData)
.Build());

View file

@ -13,7 +13,7 @@
var accountData = DispatchHelper.ToLoginResponseData();
await context.Response.WriteAllJsonAsync(DispatchResponseBuilder.Create()
.Retcode((int)RetcodeStatus.RetSucc)
.Retcode(0)
.Message("OK")
.Object("data", new JObject
{

View file

@ -5,6 +5,7 @@
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RollForward>Major</RollForward>
</PropertyGroup>
<ItemGroup>

View file

@ -13,7 +13,7 @@
var response = new GetAvatarDataScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
IsAll = request.IsGetAll
};
@ -21,7 +21,7 @@
1001,1002,1003,1004,1005,1006,1008,1009,1013,
1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,
1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1217,
1302,1303,1305,1306,1307,1312};
1301,1302,1303,1304,1305,1306,1307,1308,1312};
foreach (uint id in characters)
{

View file

@ -50,10 +50,10 @@ namespace FreeSR.Gateserver.Manager.Handlers
GroupId = 19,
InstId = 300001,
EntityId = 4194583,
Prop = new Mpdmfpohnnc
Prop = new ScenePropInfo
{
Hdmeecedleh = 1,
Kkjiblpgfpa = 808
PropState = 1,
PropId = 808
},
Motion = new MotionInfo
{
@ -100,7 +100,7 @@ namespace FreeSR.Gateserver.Manager.Handlers
session.Send(CmdType.CmdSetLineupNameScRsp, new SetLineupNameScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
Name = request.Name,
Index = request.Index
});
@ -114,18 +114,14 @@ namespace FreeSR.Gateserver.Manager.Handlers
Dictionary<uint, List<uint>> monsterIds = new Dictionary<uint, List<uint>>
{
{ 1, new List<uint> { 3001010, 3001020, 3001020, 3001010 } },
{ 2, new List<uint> { 3002030, 3002010, 3002010, 3002030 } },
{ 3, new List<uint> { 3011010, 3012020, 3011010 } },
{ 4, new List<uint> { 3003010, 3003020 } },
{ 5, new List<uint> { 3024020 } },
{ 6, new List<uint> { 3014020 } },
{ 7, new List<uint> { 3002050 } }
{ 1, new List<uint> { 3013010, 3012010, 3013010, 3001010 } },
{ 2, new List<uint> { 8034010 } },
{ 3, new List<uint> { 3014022 } },
};
Dictionary<uint, uint> monsterLevels = new Dictionary<uint, uint>
{
{1,70},{2,70},{3,60},{4,65},{5,55},{6,60},{7,75}
{1,70},{2,70},{3,60}
};
//basic
@ -190,11 +186,11 @@ namespace FreeSR.Gateserver.Manager.Handlers
}
//monster
for (uint i = 1; i <= 7; i++)
for (uint i = 1; i <= monsterIds.Count; i++)
{
SceneMonsterWave monsterInfo = new SceneMonsterWave
{
Knkmjldpekj = i,
Pkgenfbhofi = i,
MonsterParam = new SceneMonsterParam
{
Level = monsterLevels[i],
@ -219,7 +215,7 @@ namespace FreeSR.Gateserver.Manager.Handlers
var response = new StartCocoonStageScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
CocoonId = request.CocoonId,
Wave = request.Wave,
PropEntityId = request.PropEntityId,
@ -235,7 +231,7 @@ namespace FreeSR.Gateserver.Manager.Handlers
var request = data as PVEBattleResultCsReq;
session.Send(CmdType.CmdPVEBattleResultScRsp, new PVEBattleResultScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
EndStatus = request.EndStatus
});
}

View file

@ -7,15 +7,15 @@
internal static class LineupReqGroup
{
public static uint Avatar1 = 8001;
public static uint Avatar2 = 1307;
public static uint Avatar3 = 1306;
public static uint Avatar4 = 1312;
public static uint Avatar2 = 1308;
public static uint Avatar3 = 1304;
public static uint Avatar4 = 1301;
[Handler(CmdType.CmdGetCurLineupDataCsReq)]
public static void OnGetCurLineupDataCsReq(NetSession session, int cmdId, object _)
{
var response = new GetCurLineupDataScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
};
response.Lineup = new LineupInfo
@ -50,7 +50,7 @@
{
var response = new GetAllLineupDataScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
CurIndex = 0,
};
@ -88,7 +88,7 @@
session.Send(CmdType.CmdChangeLineupLeaderScRsp, new ChangeLineupLeaderScRsp
{
Slot = request.Slot,
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
});
}
@ -104,7 +104,7 @@
session.Send(CmdType.CmdJoinLineupScRsp, new JoinLineupScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
});
}
@ -116,7 +116,6 @@
Avatar1 = 0; Avatar2 = 0; Avatar3 = 0; Avatar4 = 0;
foreach (LineupSlotData slotData in request.LineupSlotLists)
{
Console.WriteLine($"Replace Slot:{slotData.Slot} Id:{slotData.Id}");
if (slotData.Slot == 0) Avatar1 = slotData.Id;
if (slotData.Slot == 1) Avatar2 = slotData.Id;
if (slotData.Slot == 2) Avatar3 = slotData.Id;
@ -126,7 +125,7 @@
RefreshLineup(session);
session.Send(CmdType.CmdReplaceLineupScRsp, new ReplaceLineupScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
});
}
@ -134,7 +133,6 @@
public static void OnQuitLineupCsReq(NetSession session, int cmdId, object data)
{
var request = data as QuitLineupCsReq;
Console.WriteLine($"CmdQuitLineupCsReq BaseAvatarId:{request.BaseAvatarId} Index:{request.Index} PlaneId:{request.PlaneId}");
if (request.BaseAvatarId == Avatar1) Avatar1 = 0;
if (request.BaseAvatarId == Avatar2) Avatar2 = 0;
if (request.BaseAvatarId == Avatar3) Avatar3 = 0;
@ -143,13 +141,12 @@
RefreshLineup(session);
session.Send(CmdType.CmdQuitLineupScRsp, new QuitLineupScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
BaseAvatarId = request.BaseAvatarId,
IsVirtual = request.IsVirtual
});
}
public static void RefreshLineup(NetSession session) {
Console.WriteLine($"Team refreshed!{Avatar1} {Avatar2} {Avatar3} {Avatar4}");
var characters = new uint[] { Avatar1, Avatar2, Avatar3, Avatar4 };
var response = new SyncLineupNotify
{

View file

@ -12,7 +12,7 @@
var request = data as GetMissionStatusCsReq;
GetMissionStatusScRsp response = new GetMissionStatusScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
};
response.FinishedMainMissionIdLists = new uint[] {
@ -113,7 +113,7 @@
{
foreach (uint id in request.SubMissionIdLists)
{
response.MissionEventStatusLists.Add(new Mission()
response.SubMissionStatusLists.Add(new Mission()
{
Id = id,
Progress = 0,
@ -126,7 +126,7 @@
{
foreach (uint id in request.MainMissionIdLists)
{
response.SubMissionStatusLists.Add(new Mission()
response.MissionEventStatusLists.Add(new Mission()
{
Id = id,
Progress = 0,

View file

@ -12,31 +12,31 @@
public static void OnGetNpcTakenRewardCsReq(NetSession session, int cmdId, object data)
{
var npcRewardReq = data as Eddbhmdjadb;
var npcRewardReq = data as GetNpcTakenRewardCsReq;
session.Send(CmdType.CmdGetNpcTakenRewardScRsp, new Nikhfbniagb
session.Send(CmdType.CmdGetNpcTakenRewardScRsp, new GetNpcTakenRewardScRsp
{
NpcId = npcRewardReq.Okonlennkfb,
Retcode = (uint)RetcodeStatus.RetSucc
NpcId = npcRewardReq.NpcId,
Retcode = 0
});
}
[Handler(CmdType.CmdGetFirstTalkByPerformanceNpcCsReq)]
public static void OnGetFirstTalkByPerformanceNpcCsReq(NetSession session, int cmdId, object data)
{
var npcPerformanceReq = data as Jknjlicadhe;
var npcPerformanceReq = data as GetFirstTalkByPerformanceNpcCsReq;
var response = new Kpbeklbbihd
var response = new GetFirstTalkByPerformanceNpcScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
};
foreach(uint id in npcPerformanceReq.Ffgeablhjmms)
foreach(uint id in npcPerformanceReq.FirstTalkIdLists)
{
response.Hhldcbegobcs.Add(new NpcMeetStatusInfo
response.NpcMeetStatusLists.Add(new NpcMeetStatusInfo
{
Jgndlkbohij = true,
Okonlennkfb = id
IsMeet = true,
MeetId = id
});
}

View file

@ -22,9 +22,14 @@
session.Send(CmdType.CmdPlayerHeartBeatScRsp, new PlayerHeartBeatScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
DownloadData = new ClientDownloadData(),
DownloadData = new ClientDownloadData
{
Version = 51,
Time = DateTimeOffset.Now.ToUnixTimeMilliseconds(),
Data = Convert.FromBase64String("G0x1YVMBGZMNChoKBAQICHhWAAAAAAAAAAAAAAAod0ABD0BGcmVlU1JMdWEudHh0AAAAAAAAAAAAAQccAAAAJABAAClAQAApgEAAKcBAAFYAAQAsgAABXUBBAOSAQQAkAUAAKcFBAikBQgIpQUIC7AAAAWyAAACWgAIA6cDCAMEAwwEWAQMAqoABgKlBgQCpQUMDqYFDAxLAQwMRQACAqUGBAJ9BRIiewP1/GQCAABIAAAAEA0NTBAxVbml0eUVuZ2luZQQLR2FtZU9iamVjdAQFRmluZAQpVUlSb290L0Fib3ZlRGlhbG9nL0JldGFIaW50RGlhbG9nKENsb25lKQQYR2V0Q29tcG9uZW50c0luQ2hpbGRyZW4EB3R5cGVvZgQEUlBHBAdDbGllbnQEDkxvY2FsaXplZFRleHQTAAAAAAAAAAAEB0xlbmd0aBMBAAAAAAAAAAQLZ2FtZU9iamVjdAQFbmFtZQQJSGludFRleHQEBXRleHQUYTxiPkZyZWVTUiBpcyBhIGZyZWUgc29mdHdhcmUuRnJlZVNS5piv5LiA5Liq5YWN6LS56L2v5Lu244CCIGh0dHBzOi8vZGlzY29yZC5nZy9yZXZlcnNlZHJvb21zPC9iPgEAAAABAAAAAAAcAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAAAAFAAAABgAAAAYAAAAEAAAACQAAAAYAAAAEb2JqBgAAABwAAAAHY29tcHRzDgAAABwAAAAMKGZvciBpbmRleCkSAAAAGwAAAAwoZm9yIGxpbWl0KRIAAAAbAAAACyhmb3Igc3RlcCkSAAAAGwAAAAJpEwAAABoAAAABAAAABV9FTlY=")
},
ClientTimeMs = heartbeatReq.ClientTimeMs,
ServerTimeMs = (ulong)DateTimeOffset.Now.ToUnixTimeMilliseconds()
});
@ -35,19 +40,17 @@
{
session.Send(CmdType.CmdGetHeroBasicTypeInfoScRsp, new GetHeroBasicTypeInfoScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
Gender = Gender.GenderMan,
Cdkjkpnjjjas ={
new Hlbbodklpbo
BasicTypeInfoLists ={
new PlayerHeroBasicTypeInfo
{
Peihhlcchfj = HeroBasicType.BoyWarrior,
BasicType = HeroBasicType.BoyWarrior,
Rank = 1,
Chmeifanmags = {}
Knhaecbafbas = {}
}
},
CurBasicType = HeroBasicType.BoyWarrior,
Bhepmbpaojp = false,
Cnlbajkmnbn = false
});
}
@ -71,10 +74,10 @@
session.Send(CmdType.CmdPlayerLoginScRsp, new PlayerLoginScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
//IsNewPlayer = false,
LoginRandom = request.LoginRandom,
Stamina = 100,
Stamina = 240,
ServerTimestampMs = (ulong)DateTimeOffset.Now.ToUnixTimeSeconds() * 1000,
BasicInfo = new PlayerBasicInfo
{
@ -95,24 +98,12 @@
{
session.Send(CmdType.CmdPlayerGetTokenScRsp, new PlayerGetTokenScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
Uid = 1337,
//BlackInfo = null,
Msg = "OK",
SecretKeySeed = 0
});
var annData = new AnnounceData
{
BeginTime = 0,
EndTime = DateTimeOffset.Now.ToUnixTimeSeconds() + 10,
Jhjbgmmpccj = Encoding.UTF8.GetString(Convert.FromBase64String("RnJlZVNSIGlzIGEgZnJlZSBhbmQgb3Blbi1zb3VyY2Ugc29mdHdhcmUsIGlmIHlvdSBwYWlkIGZvciB0aGlzLCB5b3UgaGF2ZSBiZWVuIHNjYW1tZWQhIEZyZWVTUuaYr+S4gOS4quWFjei0ueS4lOW8gOa6kOeahOi9r+S7tu+8jOWmguaenOS9oOaYr+iKsemSseS5sOadpeeahO+8jOivtOaYjuS9oOiiq+mql+S6hu+8gXJlcG9zaXRvcnkgbGluayDku5PlupPlnLDlnYA6aHR0cHM6Ly9naXQueGVvbmRldi5jb20vTW91eDIzMzMzL0ZyZWVTUg=="))
};
session.Send(CmdType.CmdServerAnnounceNotify, new ServerAnnounceNotify
{
Opgimnkoknjs = {annData},
});
}
}
}

View file

@ -3,6 +3,7 @@
using FreeSR.Gateserver.Manager.Handlers.Core;
using FreeSR.Gateserver.Network;
using FreeSR.Proto;
using System.Numerics;
internal static class SceneReqGroup
@ -15,9 +16,9 @@
GameModeType = 1,
//Bkmbkahohif = 1,
//Admbbnbnibk = 1,
EntryId = 1030101,
PlaneId = 10301,
FloorId = 10301001,
EntryId = 2032101,
PlaneId = 20321,
FloorId = 20321001,
};
/*scene.EntityLists.Add(new SceneEntityInfo
@ -35,8 +36,47 @@
session.Send(CmdType.CmdGetCurSceneInfoScRsp, new GetCurSceneInfoScRsp
{
Scene = scene,
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
});
}
[Handler(CmdType.CmdGetSceneMapInfoCsReq)]
public static void OnGetSceneMapInfoCsReq(NetSession session, int cmdId, object data)
{
var request = data as GetSceneMapInfoCsReq;
uint[] back = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0 };
var mapinfo = new SceneMapInfo
{
Retcode = 0,
LightenSectionLists = back,
ChestLists = {
new ChestInfo
{
ChestType = ChestType.MapInfoChestTypeNormal
},
new ChestInfo
{
ChestType = ChestType.MapInfoChestTypePuzzle
},
new ChestInfo
{
ChestType = ChestType.MapInfoChestTypeChallenge
}
},
};
var response = new GetSceneMapInfoScRsp
{
Retcode = 0,
EntryId = request.EntryIdLists[0],
CurMapEntryId = request.EntryId,
SceneMapInfoes = { mapinfo },
LightenSectionLists = back,
};
session.Send(CmdType.CmdGetSceneMapInfoScRsp, response);
}
}
}

View file

@ -14,7 +14,7 @@
{
var response = new GetTutorialGuideScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc
Retcode = 0
};
uint[] guides = new uint[]
@ -50,7 +50,7 @@
var response = new GetTutorialScRsp
{
Retcode = (uint)RetcodeStatus.RetSucc,
Retcode = 0,
};
foreach (uint id in completedTutorials)

View file

@ -25,16 +25,17 @@
//{CmdType.CmdGetQuestDataCsReq, typeof(GetQuestDataCsReq)},
//{CmdType.CmdGetChallengeCsReq, typeof(GetChallengeCsReq)},
{CmdType.CmdGetCurSceneInfoCsReq, typeof(GetCurSceneInfoCsReq)},
{CmdType.CmdGetSceneMapInfoCsReq, typeof(GetSceneMapInfoCsReq)},
{CmdType.CmdGetBasicInfoCsReq, typeof(GetBasicInfoCsReq)},
{CmdType.CmdGetHeroBasicTypeInfoCsReq, typeof(Hlbbodklpbo)},
{CmdType.CmdGetHeroBasicTypeInfoCsReq, typeof(GetHeroBasicTypeInfoCsReq)},
{CmdType.CmdPlayerHeartBeatCsReq, typeof(PlayerHeartBeatCsReq)},
//{CmdType.CmdGetGachaInfoCsReq, typeof(GetGachaInfoCsReq)},
//{CmdType.CmdDoGachaCsReq, typeof(DoGachaCsReq)},
{CmdType.CmdGetNpcTakenRewardCsReq, typeof(Eddbhmdjadb)},
{CmdType.CmdGetFirstTalkByPerformanceNpcCsReq, typeof(Jknjlicadhe)},
{CmdType.CmdGetNpcTakenRewardCsReq, typeof(GetNpcTakenRewardCsReq)},
{CmdType.CmdGetFirstTalkByPerformanceNpcCsReq, typeof(GetFirstTalkByPerformanceNpcCsReq)},
{CmdType.CmdSceneEntityMoveCsReq, typeof(SceneEntityMoveCsReq)},
{CmdType.CmdReplaceLineupCsReq, typeof(ReplaceLineupCsReq)},

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,7 @@
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RollForward>Major</RollForward>
</PropertyGroup>
<ItemGroup>

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,7 @@
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RollForward>Major</RollForward>
</PropertyGroup>
<ItemGroup>

View file

@ -5,6 +5,7 @@
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RollForward>Major</RollForward>
</PropertyGroup>
<ItemGroup>

View file

@ -1,14 +1,14 @@
# FreeSR - Server Software Reimplementation for a Certain Turn-Based Anime Game
**FreeSR** is an open-source server software reimplementation for a certain turn-based anime game, specifically version 1.6.5 developed by xeondev. This project aims to provide a platform for running private servers, enabling players to enjoy the game in a controlled environment with modified or additional features. The open-source version of FreeSR missing some and has empty classes, inviting contributors to actively participate by raising issues or submitting pull requests.
**FreeSR** is an open-source server software reimplementation for a certain turn-based anime game, specifically version 2.0.5 developed by xeondev. This project aims to provide a platform for running private servers, enabling players to enjoy the game in a controlled environment with modified or additional features. The open-source version of FreeSR missing some and has empty classes, inviting contributors to actively participate by raising issues or submitting pull requests.
## Introduction
The "FreeSR" project is an initiative to recreate the server-side functionality of a certain turn-based anime game, version 1.6.5, which was originally developed by xeondev.
The "FreeSR" project is an initiative to recreate the server-side functionality of a certain turn-based anime game, version 2.0.5, which was originally developed by xeondev.
## Features
- Server software reimplementation for a certain turn-based anime game (version 1.6.5)
- Server software reimplementation for a certain turn-based anime game (version 2.0.5)
- Open-source with permissive licensing
- Extensible architecture allowing for custom modifications and additional features
- Regular updates and maintenance to address issues and improve functionality