Teleport via marks on map
This commit is contained in:
parent
42cca1e786
commit
cfa2cc934b
4 changed files with 63 additions and 10 deletions
|
@ -22,4 +22,14 @@ internal abstract class ControllerBase
|
||||||
Body = message.ToByteArray()
|
Body = message.ToByteArray()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected IResult Response(CmdType cmdType)
|
||||||
|
{
|
||||||
|
return new SinglePacketResult(new()
|
||||||
|
{
|
||||||
|
CmdType = cmdType,
|
||||||
|
Head = Memory<byte>.Empty,
|
||||||
|
Body = Memory<byte>.Empty
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,19 @@ namespace NahidaImpact.Gameserver.Controllers;
|
||||||
[NetController]
|
[NetController]
|
||||||
internal class SceneController : ControllerBase
|
internal class SceneController : ControllerBase
|
||||||
{
|
{
|
||||||
|
[NetCommand(CmdType.MarkMapReq)]
|
||||||
|
public async ValueTask<IResult> OnMarkMapReq(SceneManager sceneManager)
|
||||||
|
{
|
||||||
|
MarkMapReq request = Packet!.DecodeBody<MarkMapReq>();
|
||||||
|
if (request.Mark != null)
|
||||||
|
{
|
||||||
|
Vector teleportToPosition = request.Mark.Pos;
|
||||||
|
await sceneManager.TeleportTo(teleportToPosition.X, 800, teleportToPosition.Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response(CmdType.MarkMapRsp);
|
||||||
|
}
|
||||||
|
|
||||||
[NetCommand(CmdType.EvtDoSkillSuccNotify)]
|
[NetCommand(CmdType.EvtDoSkillSuccNotify)]
|
||||||
public async ValueTask<IResult> OnEvtDoSkillSuccNotify(SceneManager sceneManager)
|
public async ValueTask<IResult> OnEvtDoSkillSuccNotify(SceneManager sceneManager)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,6 +16,7 @@ internal class Player(ExcelTableCollection excelTables)
|
||||||
public uint CurTeamIndex { get; set; }
|
public uint CurTeamIndex { get; set; }
|
||||||
|
|
||||||
public uint CurAvatarEntityId { get; set; }
|
public uint CurAvatarEntityId { get; set; }
|
||||||
|
public Vector LastMainWorldPos { get; set; } = new();
|
||||||
|
|
||||||
private readonly ExcelTableCollection _excelTables = excelTables;
|
private readonly ExcelTableCollection _excelTables = excelTables;
|
||||||
|
|
||||||
|
@ -35,8 +36,18 @@ internal class Player(ExcelTableCollection excelTables)
|
||||||
Index = 1
|
Index = 1
|
||||||
});
|
});
|
||||||
CurTeamIndex = 1;
|
CurTeamIndex = 1;
|
||||||
|
|
||||||
|
LastMainWorldPos = GetDefaultMainWorldPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Vector GetDefaultMainWorldPos() => new()
|
||||||
|
{
|
||||||
|
X = 2336.789f,
|
||||||
|
Y = 249.98896f,
|
||||||
|
Z = -751.3081f
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
public GameAvatarTeam GetCurrentTeam()
|
public GameAvatarTeam GetCurrentTeam()
|
||||||
=> AvatarTeams.Find(team => team.Index == CurTeamIndex)!;
|
=> AvatarTeams.Find(team => team.Index == CurTeamIndex)!;
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,22 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent
|
||||||
_enterState = SceneEnterState.Complete;
|
_enterState = SceneEnterState.Complete;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async ValueTask TeleportTo(float x, float y, float z)
|
||||||
|
{
|
||||||
|
SceneEntity? entity = _entityManager.GetEntityById(_player.CurAvatarEntityId);
|
||||||
|
if (entity == null) return;
|
||||||
|
|
||||||
|
entity.MotionInfo.Pos = new Vector
|
||||||
|
{
|
||||||
|
X = x,
|
||||||
|
Y = y,
|
||||||
|
Z = z
|
||||||
|
};
|
||||||
|
|
||||||
|
_player.LastMainWorldPos = entity.MotionInfo.Pos;
|
||||||
|
await ReEnterCurScene(EnterType.Jump);
|
||||||
|
}
|
||||||
|
|
||||||
public async ValueTask ResetAllCoolDownsForAvatar(uint entityId)
|
public async ValueTask ResetAllCoolDownsForAvatar(uint entityId)
|
||||||
{
|
{
|
||||||
await _entityManager.ChangeAvatarFightPropAsync(entityId, FightProp.FIGHT_PROP_NONEXTRA_SKILL_CD_MINUS_RATIO, 1);
|
await _entityManager.ChangeAvatarFightPropAsync(entityId, FightProp.FIGHT_PROP_NONEXTRA_SKILL_CD_MINUS_RATIO, 1);
|
||||||
|
@ -131,7 +147,9 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent
|
||||||
GameAvatar gameAvatar = _player.Avatars.Find(avatar => avatar.Guid == guid)!;
|
GameAvatar gameAvatar = _player.Avatars.Find(avatar => avatar.Guid == guid)!;
|
||||||
|
|
||||||
AvatarEntity avatarEntity = _entityFactory.CreateAvatar(gameAvatar, _player.Uid);
|
AvatarEntity avatarEntity = _entityFactory.CreateAvatar(gameAvatar, _player.Uid);
|
||||||
avatarEntity.SetPosition(2336.789f, 249.98896f, -751.3081f);
|
|
||||||
|
Vector initialPos = _player.LastMainWorldPos;
|
||||||
|
avatarEntity.SetPosition(initialPos.X, initialPos.Y, initialPos.Z);
|
||||||
|
|
||||||
_teamAvatars.Add(avatarEntity);
|
_teamAvatars.Add(avatarEntity);
|
||||||
}
|
}
|
||||||
|
@ -156,7 +174,12 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent
|
||||||
return ValueTask.CompletedTask;
|
return ValueTask.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async ValueTask EnterSceneAsync(uint sceneId)
|
public async ValueTask ReEnterCurScene(EnterType enterType)
|
||||||
|
{
|
||||||
|
await EnterSceneAsync(_sceneId, enterType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async ValueTask EnterSceneAsync(uint sceneId, EnterType enterType = EnterType.Self)
|
||||||
{
|
{
|
||||||
if (_beginTime != 0) ResetState();
|
if (_beginTime != 0) ResetState();
|
||||||
|
|
||||||
|
@ -165,21 +188,17 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent
|
||||||
EnterToken = ++_enterTokenSeed;
|
EnterToken = ++_enterTokenSeed;
|
||||||
|
|
||||||
_enterState = SceneEnterState.EnterRequested;
|
_enterState = SceneEnterState.EnterRequested;
|
||||||
|
|
||||||
await _session.NotifyAsync(CmdType.PlayerEnterSceneNotify, new PlayerEnterSceneNotify
|
await _session.NotifyAsync(CmdType.PlayerEnterSceneNotify, new PlayerEnterSceneNotify
|
||||||
{
|
{
|
||||||
SceneBeginTime = _beginTime,
|
SceneBeginTime = _beginTime,
|
||||||
SceneId = _sceneId,
|
SceneId = _sceneId,
|
||||||
SceneTransaction = CreateTransaction(_sceneId, _player.Uid, _beginTime),
|
SceneTransaction = CreateTransaction(_sceneId, _player.Uid, _beginTime),
|
||||||
Pos = new()
|
Pos = _player.LastMainWorldPos,
|
||||||
{
|
|
||||||
X = 2191.16357421875f,
|
|
||||||
Y = 214.65115356445312f,
|
|
||||||
Z = -1120.633056640625f
|
|
||||||
},
|
|
||||||
TargetUid = _player.Uid,
|
TargetUid = _player.Uid,
|
||||||
EnterSceneToken = EnterToken,
|
EnterSceneToken = EnterToken,
|
||||||
PrevPos = new(),
|
PrevPos = new(),
|
||||||
Type = EnterType.Self
|
Type = enterType
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue