KCP gameserver with packet dispatch, scene streaming, combat, gacha and the shop, plus a small HTTP server for the login flow and the wish history page. Game data under assets is pulled out of the client instead of being typed by hand. The excel tables come from the packed bin container and the spawn points from the compiled scene scripts.
86 lines
2.9 KiB
C#
86 lines
2.9 KiB
C#
using Yuanshen.Gameserver.Controllers.Attributes;
|
|
using Yuanshen.Gameserver.Controllers.Result;
|
|
using Yuanshen.Gameserver.Game;
|
|
using Yuanshen.Gameserver.Network.Session;
|
|
using Yuanshen.Protocol;
|
|
|
|
namespace Yuanshen.Gameserver.Controllers;
|
|
|
|
[NetController]
|
|
internal sealed class SceneController : ControllerBase
|
|
{
|
|
[NetCommand(CmdType.EnterSceneReadyReq)]
|
|
public async ValueTask<IResult> OnEnterSceneReadyReq(NetSession session, GameState state)
|
|
{
|
|
await session.NotifyAsync(CmdType.EnterScenePeerNotify, new EnterScenePeerNotify
|
|
{
|
|
DestSceneId = GameState.SceneId,
|
|
PeerId = Player.PeerId,
|
|
HostPeerId = Player.PeerId,
|
|
EnterSceneToken = state.EnterSceneToken
|
|
});
|
|
|
|
return Response(CmdType.EnterSceneReadyRsp, new EnterSceneReadyRsp
|
|
{
|
|
EnterSceneToken = state.EnterSceneToken
|
|
});
|
|
}
|
|
|
|
[NetCommand(CmdType.SceneInitFinishReq)]
|
|
public async ValueTask<IResult> OnSceneInitFinishReq(NetSession session, GameState state, SceneManager sceneManager, Player player)
|
|
{
|
|
await session.NotifyAsync(CmdType.WorldDataNotify, new WorldDataNotify
|
|
{
|
|
WorldPropMap =
|
|
{
|
|
{ 1u, new PropValue { Type = 1, Ival = 0, Val = 0 } },
|
|
{ 2u, new PropValue { Type = 2, Ival = 0, Val = 0 } }
|
|
}
|
|
});
|
|
|
|
await session.NotifyAsync(CmdType.WorldPlayerInfoNotify, new WorldPlayerInfoNotify
|
|
{
|
|
PlayerInfoList =
|
|
{
|
|
new OnlinePlayerInfo
|
|
{
|
|
Uid = player.Uid,
|
|
Nickname = "Traveler",
|
|
PlayerLevel = 1,
|
|
CurPlayerNumInWorld = 1,
|
|
WorldLevel = 0
|
|
}
|
|
},
|
|
PlayerUidList = { player.Uid }
|
|
});
|
|
|
|
await session.NotifyAsync(CmdType.PlayerEnterSceneInfoNotify, sceneManager.BuildEnterSceneInfo());
|
|
await session.NotifyAsync(CmdType.SceneTeamUpdateNotify, sceneManager.BuildSceneTeamUpdate());
|
|
|
|
return Response(CmdType.SceneInitFinishRsp, new SceneInitFinishRsp
|
|
{
|
|
EnterSceneToken = state.EnterSceneToken
|
|
});
|
|
}
|
|
|
|
[NetCommand(CmdType.EnterSceneDoneReq)]
|
|
public async ValueTask<IResult> OnEnterSceneDoneReq(GameState state, SceneManager sceneManager, WorldSpawner worldSpawner)
|
|
{
|
|
await sceneManager.SpawnActiveAvatarAsync(VisionType.VisionMeet);
|
|
await worldSpawner.EnterSceneAsync(state.CurrentPos);
|
|
|
|
return Response(CmdType.EnterSceneDoneRsp, new EnterSceneDoneRsp
|
|
{
|
|
EnterSceneToken = state.EnterSceneToken
|
|
});
|
|
}
|
|
|
|
[NetCommand(CmdType.PostEnterSceneReq)]
|
|
public ValueTask<IResult> OnPostEnterSceneReq(GameState state)
|
|
{
|
|
return ValueTask.FromResult(Response(CmdType.PostEnterSceneRsp, new PostEnterSceneRsp
|
|
{
|
|
EnterSceneToken = state.EnterSceneToken
|
|
}));
|
|
}
|
|
}
|