Skip to content

Commit fd9318e

Browse files
committed
[增加]1. 增加发送道具的事件
1 parent caa65e2 commit fd9318e

File tree

4 files changed

+154
-98
lines changed

4 files changed

+154
-98
lines changed

GameFrameX.Apps/Common/Event/EventId.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public enum EventId
3434
/// </summary>
3535
GotNewPet,
3636

37+
/// <summary>
38+
/// 玩家发送道具
39+
/// </summary>
40+
PlayerSendItem,
41+
3742
#endregion
3843

3944
/// <summary>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2+
//
3+
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4+
//
5+
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6+
7+
namespace GameFrameX.Apps.Common.EventData;
8+
9+
/// <summary>
10+
/// 发送道具给玩家
11+
/// </summary>
12+
public sealed class PlayerSendItemEventData
13+
{
14+
/// <summary>
15+
/// 玩家ID
16+
/// </summary>
17+
public long PlayerId { get; }
18+
19+
/// <summary>
20+
/// 道具列表,键为道具ID,值为道具数量
21+
/// </summary>
22+
public Dictionary<int, long> Items { get; }
23+
24+
/// <summary>
25+
/// 构造函数
26+
/// </summary>
27+
/// <param name="playerId">玩家ID</param>
28+
/// <param name="items">道具列表</param>
29+
public PlayerSendItemEventData(long playerId, Dictionary<int, long> items)
30+
{
31+
PlayerId = playerId;
32+
Items = items;
33+
}
34+
}
Lines changed: 98 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,99 @@
1-
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2-
//
3-
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4-
//
5-
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6-
7-
using GameFrameX.Apps.Common.Session;
8-
using GameFrameX.Apps.Player.Bag.Entity;
9-
using GameFrameX.Config;
10-
using GameFrameX.Config.Tables;
11-
using GameFrameX.DataBase;
12-
using GameFrameX.Hotfix.Logic.Player.Bag;
13-
14-
namespace GameFrameX.Hotfix.Logic.Http.Bag;
15-
16-
/// <summary>
17-
/// 请求给玩家发送道具
18-
/// </summary>
19-
[HttpMessageMapping(typeof(ReqPlayerSendItemHttpHandler))]
20-
[HttpMessageRequest(typeof(ReqPlayerSendItemRequest))]
21-
[HttpMessageResponse(typeof(ReqPlayerSendItemResponse))]
22-
[Description("请求给玩家发送道具")]
23-
public sealed class ReqPlayerSendItemHttpHandler : BaseHttpHandler
24-
{
25-
public override async Task<string> Action(string ip, string url, HttpMessageRequestBase requestBase)
26-
{
27-
var request = (ReqPlayerSendItemRequest)requestBase;
28-
var playerSession = SessionManager.GetByRoleId(request.RoleId);
29-
Dictionary<int, long> itemDic = new Dictionary<int, long>();
30-
31-
var tbItemConfig = ConfigComponent.Instance.GetConfig<TbItemConfig>();
32-
if (tbItemConfig != null)
33-
{
34-
foreach (var item in request.Items)
35-
{
36-
if (tbItemConfig.Get(item.Key).IsNull())
37-
{
38-
continue;
39-
}
40-
41-
itemDic[item.Key] = item.Value;
42-
}
43-
}
44-
45-
if (playerSession.IsNotNull())
46-
{
47-
// 玩家在线
48-
var bagComponentAgent = await ActorManager.GetComponentAgent<BagComponentAgent>(request.RoleId);
49-
await bagComponentAgent.UpdateChanged(playerSession.WorkChannel, itemDic);
50-
}
51-
else
52-
{
53-
// 玩家不在线
54-
var bagState = await GameDb.FindAsync<BagState>(request.RoleId);
55-
56-
foreach (var item in itemDic)
57-
{
58-
if (bagState.List.TryGetValue(item.Key, out var value))
59-
{
60-
value.Count += item.Value;
61-
if (value.Count <= 0)
62-
{
63-
bagState.List.Remove(item.Key);
64-
}
65-
}
66-
else
67-
{
68-
var bagItem = new BagItemState
69-
{
70-
Count = item.Value,
71-
ItemId = item.Key,
72-
};
73-
bagState.List[item.Key] = bagItem;
74-
}
75-
}
76-
77-
await GameDb.SaveOneAsync(bagState);
78-
}
79-
80-
return HttpJsonResult.SuccessString(new ReqPlayerSendItemResponse { Items = itemDic, });
81-
}
82-
}
83-
84-
public sealed class ReqPlayerSendItemRequest : HttpMessageRequestBase
85-
{
86-
[Required]
87-
[Description("角色ID")]
88-
[Range(1, long.MaxValue)]
89-
public long RoleId { get; set; }
90-
91-
[Required] [Description("道具列表")] public Dictionary<int, long> Items { get; set; } = new Dictionary<int, long>();
92-
}
93-
94-
public sealed class ReqPlayerSendItemResponse : HttpMessageResponseBase
95-
{
96-
[Description("成功的道具列表")] public Dictionary<int, long> Items { get; set; } = new Dictionary<int, long>();
1+
// GameFrameX 组织下的以及组织衍生的项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
2+
//
3+
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE 文件。
4+
//
5+
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
6+
7+
using GameFrameX.Apps.Common.Event;
8+
using GameFrameX.Apps.Common.EventData;
9+
using GameFrameX.Apps.Common.Session;
10+
using GameFrameX.Apps.Player.Bag.Entity;
11+
using GameFrameX.Hotfix.Logic.Player.Bag;
12+
13+
namespace GameFrameX.Hotfix.Logic.Http.Bag;
14+
15+
/// <summary>
16+
/// 请求给玩家发送道具
17+
/// </summary>
18+
[HttpMessageMapping(typeof(ReqPlayerSendItemHttpHandler))]
19+
[HttpMessageRequest(typeof(ReqPlayerSendItemRequest))]
20+
[HttpMessageResponse(typeof(ReqPlayerSendItemResponse))]
21+
[Description("请求给玩家发送道具")]
22+
public sealed class ReqPlayerSendItemHttpHandler : BaseHttpHandler
23+
{
24+
public override async Task<string> Action(string ip, string url, HttpMessageRequestBase requestBase)
25+
{
26+
var request = (ReqPlayerSendItemRequest)requestBase;
27+
var playerSession = SessionManager.GetByRoleId(request.RoleId);
28+
Dictionary<int, long> itemDic = new Dictionary<int, long>();
29+
30+
var tbItemConfig = ConfigComponent.Instance.GetConfig<TbItemConfig>();
31+
if (tbItemConfig != null)
32+
{
33+
foreach (var item in request.Items)
34+
{
35+
if (tbItemConfig.Get(item.Key).IsNull())
36+
{
37+
continue;
38+
}
39+
40+
itemDic[item.Key] = item.Value;
41+
}
42+
}
43+
44+
// 发送道具事件
45+
var playerSendItemEventData = new OneParam<PlayerSendItemEventData>(new PlayerSendItemEventData(request.RoleId, itemDic));
46+
EventDispatcher.Dispatch(request.RoleId, (int)EventId.PlayerSendItem, playerSendItemEventData);
47+
if (playerSession.IsNotNull())
48+
{
49+
// 玩家在线
50+
var bagComponentAgent = await ActorManager.GetComponentAgent<BagComponentAgent>(request.RoleId);
51+
await bagComponentAgent.UpdateChanged(playerSession.WorkChannel, itemDic);
52+
}
53+
else
54+
{
55+
// 玩家不在线
56+
var bagState = await GameDb.FindAsync<BagState>(request.RoleId);
57+
58+
foreach (var item in itemDic)
59+
{
60+
if (bagState.List.TryGetValue(item.Key, out var value))
61+
{
62+
value.Count += item.Value;
63+
if (value.Count <= 0)
64+
{
65+
bagState.List.Remove(item.Key);
66+
}
67+
}
68+
else
69+
{
70+
var bagItem = new BagItemState
71+
{
72+
Count = item.Value,
73+
ItemId = item.Key,
74+
};
75+
bagState.List[item.Key] = bagItem;
76+
}
77+
}
78+
79+
await GameDb.SaveOneAsync(bagState);
80+
}
81+
82+
return HttpJsonResult.SuccessString(new ReqPlayerSendItemResponse { Items = itemDic, });
83+
}
84+
}
85+
86+
public sealed class ReqPlayerSendItemRequest : HttpMessageRequestBase
87+
{
88+
[Required]
89+
[Description("角色ID")]
90+
[Range(1, long.MaxValue)]
91+
public long RoleId { get; set; }
92+
93+
[Required] [Description("道具列表")] public Dictionary<int, long> Items { get; set; } = new Dictionary<int, long>();
94+
}
95+
96+
public sealed class ReqPlayerSendItemResponse : HttpMessageResponseBase
97+
{
98+
[Description("成功的道具列表")] public Dictionary<int, long> Items { get; set; } = new Dictionary<int, long>();
9799
}

GameFrameX.Hotfix/Logic/Player/Login/PlayerComponentAgent.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public async Task OnPlayerLogin(INetWorkChannel workChannel, ReqPlayerLogin reqL
4040
}
4141

4242
// 更新连接会话数据
43-
SessionManager.UpdateSession(workChannel.GameAppSession.SessionID, playerState.Id,playerState.Id.ToString());
43+
SessionManager.UpdateSession(workChannel.GameAppSession.SessionID, playerState.Id, playerState.Id.ToString());
4444
var respPlayerLogin = new RespPlayerLogin
4545
{
4646
UniqueId = reqLogin.UniqueId,
@@ -65,9 +65,24 @@ public async Task OnPlayerLogin(INetWorkChannel workChannel, ReqPlayerLogin reqL
6565
[Event(EventId.SessionRemove)]
6666
private class EL : EventListener<PlayerComponentAgent>
6767
{
68-
protected override Task HandleEvent(PlayerComponentAgent agent, Event evt)
68+
protected override Task HandleEvent(PlayerComponentAgent agent, GameEventArgs gameEventArgs)
6969
{
7070
return agent.OnLogout();
7171
}
7272
}
73+
74+
[Event(EventId.PlayerSendItem)]
75+
private class PlayerSendItemEventListener : EventListener<PlayerComponentAgent>
76+
{
77+
protected override Task HandleEvent(PlayerComponentAgent agent, GameEventArgs gameEventArgs)
78+
{
79+
if (agent == null)
80+
{
81+
LogHelper.Error("PlayerComponentAgent is null");
82+
return Task.CompletedTask;
83+
}
84+
85+
return agent.OnLogout();
86+
}
87+
}
7388
}

0 commit comments

Comments
 (0)