提交示例代码

This commit is contained in:
Bob.Song
2026-03-05 11:39:06 +08:00
commit 25958f58c3
2534 changed files with 209593 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Network.Interface;
namespace Fantasy;
public sealed class C2G_GameInitCompleteRequestHandler : MessageRPC<C2G_GameInitCompleteRequest, G2C_GameInitCompleteResponse>
{
protected override async FTask Run(Session session, C2G_GameInitCompleteRequest request, G2C_GameInitCompleteResponse response, Action reply)
{
var account = session.GetComponent<Account>();
var requestPushContainer = request.PushContainer;
var requestPushUnitInfo = request.PushUnitInfo;
var requestAoi = request.Aoi;
// 当调用reply方法的时候就会马上返回G2C_GameInitCompleteResponse消息给客户端了。
// 这时候客户端await等待就会继续执行。
reply();
// 比如这个代码就是推送给客户端的。
if (requestPushContainer)
{
// 推送容器的数据给客户端。
ContainerHelper.SendAllContainerInfo(account);
}
await FTask.CompletedTask;
}
}

View File

@@ -0,0 +1,41 @@
using Fantasy.Async;
using Fantasy.Entitas;
using Fantasy.Network;
using Fantasy.Network.Interface;
namespace Fantasy;
public class C2G_LoginRequestHandler : MessageRPC<C2G_LoginRequest, G2C_LoginResponse>
{
protected override async FTask Run(Session session, C2G_LoginRequest request, G2C_LoginResponse response, Action reply)
{
// 由于本课程中,主要讲解的是物品和背包的内容,所以这里就简单的创建了一个登陆逻辑。
// 这个登陆逻辑,并不能用于商用,只是为了当前的课程服务的临时。
// 如果想学习完整的注册登陆的流程,建议关注下我的注册登陆的课程。
var scene = session.Scene;
// 再数据库中查询用户名和密码是否存在。
var account = await scene.World.DataBase.First<Account>(d =>
d.UserName == request.UserName && d.Password == request.PassWord, true);
if (account == null)
{
// 如果没有就创建一个新的实体,并且保存到数据库中。
account = UnitFactory.CreatePlayer(scene, 1, request.UserName, request.PassWord);
// account = Entity.Create<Account>(scene, true, true);
// account.UserName = request.UserName;
// account.Password = request.PassWord;
// // 增加背包组件
// var bagComponent = account.AddComponent<BagComponent>();
// // 创建一个临时物品,并且放入到临时背包中
// var item = ItemFactory.Create(scene, 1, 1, true);
// bagComponent.AddItem(item);
// 把实体保存到数据库中。
await scene.World.DataBase.Save(account);
}
// 把当前账号添加到Session下好处有下面的几个方面:
// 1、客在Session下很方便的获得到当前账号。
// 2、当Session断开了也就是客户端跟服务器断开连接了会自动执行小伙这个Account。
account.Session = session;
session.AddComponent(account);
Log.Debug($"登陆成功 UserName:{request.UserName} Password:{request.PassWord}");
}
}

View File

@@ -0,0 +1,42 @@
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Network.Interface;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
namespace Fantasy;
public sealed class C2G_StartCreateItemHandler : Message<C2G_StartCreateItem>
{
// protected override async FTask Run(Session session, C2G_StartCreateItem message)
// {
// var account = session.GetComponent<Account>();
//
// if (account == null)
// {
// session.Dispose();
// return;
// }
//
// var item = ItemFactory.Create(session.Scene, 1000001, 1, true);
// var addItemErrorCode = ContainerHelper.AddItem(account, ContainerType.Bag, item, ItemReason.ItemTestAdd, true);
// Log.Debug($"addItemErrorCode:{addItemErrorCode}");
// await session.Scene.World.DataBase.Save(account);
// await FTask.CompletedTask;
// }
protected override async FTask Run(Session session, C2G_StartCreateItem message)
{
var account = session.GetComponent<Account>();
if (account == null)
{
session.Dispose();
return;
}
var items = new List<Item>();
ContainerHelper.GetItemsByConfigId(account, ContainerType.Bag, 1000001, items);
Log.Debug($"MountEquip:{EquipHelper.MountEquip(account, items[0])}");
await session.Scene.World.DataBase.Save(account);
}
}

View File

@@ -0,0 +1,23 @@
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Network.Interface;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
namespace Fantasy;
public class C2G_UseItemRequestHandler : MessageRPC<C2G_UseItemRequest, G2C_UseItemResponse>
{
protected override async FTask Run(Session session, C2G_UseItemRequest request, G2C_UseItemResponse response, Action reply)
{
var account = session.GetComponent<Account>();
if (account == null)
{
session.Dispose();
return;
}
response.ErrorCode = ItemUseHelper.UseItem(account, (ContainerType)request.ContainerType, request.ItemId, request.Count);
await FTask.CompletedTask;
}
}