- Still many bugs
This commit is contained in:
Somebody
2024-07-10 09:50:37 +08:00
parent 1b95cbfa4a
commit d97c65aa14
6 changed files with 51 additions and 45 deletions

View File

@@ -64,15 +64,15 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission
StoryLineData.CurStoryLineId = storyExcel.StoryLineID;
Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!));
Player.SendPacket(new PacketStoryLineInfoScNotify(Player));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(storyExcel.StoryLineID));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(storyExcel.StoryLineID, ChangeStoryLineAction.FinishAction));
if (entryId > 0)
{
Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline);
Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, ChangeStoryLineAction.FinishAction);
}
else
{
Player.EnterMissionScene(storyExcel.InitEntranceID, storyExcel.InitGroupID, storyExcel.InitAnchorID, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline);
Player.EnterMissionScene(storyExcel.InitEntranceID, storyExcel.InitGroupID, storyExcel.InitAnchorID, true, ChangeStoryLineAction.FinishAction);
}
var record = new StoryLineInfo()
@@ -89,13 +89,13 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission
StoryLineData.RunningStoryLines[storyExcel.StoryLineID] = record;
}
public void EnterStoryLine(int storyLineId)
public void EnterStoryLine(int storyLineId, bool tp = true)
{
if (StoryLineData.CurStoryLineId == storyLineId) return; // already in this story line
if (storyLineId == 0) // leave story line
{
LeaveStoryLine(true);
LeaveStoryLine(tp);
return;
}
@@ -120,8 +120,12 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission
StoryLineData.CurStoryLineId = lineInfo.StoryLineId;
Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!));
Player.SendPacket(new PacketStoryLineInfoScNotify(Player));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(StoryLineData.CurStoryLineId));
Player.LoadScene(lineInfo.SavedPlaneId, lineInfo.SavedFloorId, lineInfo.SavedEntryId, lineInfo.SavedPos, lineInfo.SavedRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline);
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(StoryLineData.CurStoryLineId, ChangeStoryLineAction.Client));
if (tp)
{
Player.LoadScene(lineInfo.SavedPlaneId, lineInfo.SavedFloorId, lineInfo.SavedEntryId, lineInfo.SavedPos, lineInfo.SavedRot, true, ChangeStoryLineAction.Client);
}
}
public void LeaveStoryLine(bool tp)
@@ -151,11 +155,11 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission
Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!));
Player.SendPacket(new PacketStoryLineInfoScNotify(Player));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0, ChangeStoryLineAction.None));
if (tp)
{
Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline);
Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, ChangeStoryLineAction.None);
StoryLineData.OldPlaneId = 0;
StoryLineData.OldEntryId = 0;
@@ -195,17 +199,17 @@ namespace EggLink.DanhengServer.GameServer.Game.Mission
Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!));
Player.SendPacket(new PacketStoryLineInfoScNotify(Player));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0));
Player.SendPacket(new PacketChangeStoryLineFinishScNotify(0, ChangeStoryLineAction.None));
if (tp)
{
if (entryId > 0)
{
Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline);
Player.EnterMissionScene(entryId, anchorGroupId, anchorId, true, ChangeStoryLineAction.None);
}
else
{
Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, EnterSceneReasonStatus.EnterSceneReasonChangeStoryline);
Player.LoadScene(StoryLineData.OldPlaneId, StoryLineData.OldFloorId, StoryLineData.OldEntryId, StoryLineData.OldPos, StoryLineData.OldRot, true, ChangeStoryLineAction.FinishAction);
}
}
}

View File

@@ -454,18 +454,18 @@ namespace EggLink.DanhengServer.Game.Player
return null;
}
public void EnterScene(int entryId, int teleportId, bool sendPacket, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone, int storyLineId = 0)
public bool EnterScene(int entryId, int teleportId, bool sendPacket, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None, int storyLineId = 0)
{
if (storyLineId != StoryLineManager!.StoryLineData.CurStoryLineId)
if (storyLineId != StoryLineManager?.StoryLineData.CurStoryLineId)
{
StoryLineManager!.EnterStoryLine(storyLineId);
StoryLineManager?.EnterStoryLine(storyLineId, entryId == 0); // entryId == 0 -> teleport
}
GameData.MapEntranceData.TryGetValue(entryId, out var entrance);
if (entrance == null) return;
if (entrance == null) return false;
GameData.GetFloorInfo(entrance.PlaneID, entrance.FloorID, out var floorInfo);
if (floorInfo == null) return;
if (floorInfo == null) return false;
int StartGroup = entrance.StartGroupID;
int StartAnchor = entrance.StartAnchorID;
@@ -487,10 +487,16 @@ namespace EggLink.DanhengServer.Game.Player
MissionManager?.HandleFinishType(MissionFinishTypeEnum.EnterMapByEntrance, entryId);
LoadScene(entrance.PlaneID, entrance.FloorID, entryId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, reason);
var beforeEntryId = Data.EntryId;
LoadScene(entrance.PlaneID, entrance.FloorID, entryId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, storyLineAction);
var afterEntryId = Data.EntryId;
return beforeEntryId != afterEntryId; // return true if entryId changed
}
public void EnterMissionScene(int entranceId, int anchorGroupId, int anchorId, bool sendPacket, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone)
public void EnterMissionScene(int entranceId, int anchorGroupId, int anchorId, bool sendPacket, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None)
{
GameData.MapEntranceData.TryGetValue(entranceId, out var entrance);
if (entrance == null) return;
@@ -508,7 +514,7 @@ namespace EggLink.DanhengServer.Game.Player
}
AnchorInfo? anchor = floorInfo.GetAnchorInfo(StartGroup, StartAnchor);
LoadScene(entrance.PlaneID, entrance.FloorID, entranceId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, reason);
LoadScene(entrance.PlaneID, entrance.FloorID, entranceId, anchor!.ToPositionProto(), anchor.ToRotationProto(), sendPacket, storyLineAction);
}
public void MoveTo(Position position)
@@ -530,7 +536,7 @@ namespace EggLink.DanhengServer.Game.Player
SendPacket(new PacketSceneEntityMoveScNotify(this));
}
public void LoadScene(int planeId, int floorId, int entryId, Position pos, Position rot, bool sendPacket, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone)
public void LoadScene(int planeId, int floorId, int entryId, Position pos, Position rot, bool sendPacket, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None)
{
GameData.MazePlaneData.TryGetValue(planeId, out var plane);
if (plane == null) return;
@@ -552,7 +558,7 @@ namespace EggLink.DanhengServer.Game.Player
// TODO: Sanify check
Data.Pos = pos;
Data.Rot = rot;
var sendMove = true;
var notSendMove = true;
SceneInstance instance = new(this, plane, floorId, entryId);
if (planeId != Data.PlaneId || floorId != Data.FloorId || entryId != Data.EntryId)
{
@@ -560,23 +566,23 @@ namespace EggLink.DanhengServer.Game.Player
Data.FloorId = floorId;
Data.EntryId = entryId;
}
else
else if (StoryLineManager?.StoryLineData.CurStoryLineId == 0)
{
sendMove = false;
notSendMove = false;
}
SceneInstance = instance;
MissionManager?.OnPlayerChangeScene();
Connection?.SendPacket(CmdIds.SyncServerSceneChangeNotify);
//if (sendPacket && sendMove)
//{
SendPacket(new PacketEnterSceneByServerScNotify(instance, reason));
//}
//else if (!sendMove)
//{
//SendPacket(new PacketSceneEntityMoveScNotify(this));
//}
if (sendPacket && notSendMove)
{
SendPacket(new PacketEnterSceneByServerScNotify(instance, storyLineAction));
}
else if (!notSendMove)
{
SendPacket(new PacketSceneEntityMoveScNotify(this));
}
MissionManager?.HandleFinishType(MissionFinishTypeEnum.EnterFloor);
MissionManager?.HandleFinishType(MissionFinishTypeEnum.NotInFloor);

View File

@@ -14,9 +14,9 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Scene
public override void OnHandle(Connection connection, byte[] header, byte[] data)
{
var req = EnterSceneCsReq.Parser.ParseFrom(data);
connection.Player?.EnterScene((int)req.EntryId, (int)req.TeleportId, true, EnterSceneReasonStatus.EnterSceneReasonNone, (int) req.GameStoryLineId);
var overMapTp = connection.Player?.EnterScene((int)req.EntryId, (int)req.TeleportId, true, storyLineId:(int) req.GameStoryLineId);
connection.SendPacket(new PacketEnterSceneScRsp(true, req.MapTp, (int)req.GameStoryLineId));
connection.SendPacket(new PacketEnterSceneScRsp(overMapTp == true, req.MapTp, (int)req.GameStoryLineId));
}
}
}

View File

@@ -10,11 +10,11 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Mission
{
public class PacketChangeStoryLineFinishScNotify : BasePacket
{
public PacketChangeStoryLineFinishScNotify(int curId) : base(CmdIds.ChangeStoryLineFinishScNotify)
public PacketChangeStoryLineFinishScNotify(int curId, ChangeStoryLineAction reason) : base(CmdIds.ChangeStoryLineFinishScNotify)
{
var proto = new ChangeStoryLineFinishScNotify
{
ActionType = ChangeStoryLineAction.Client,
ActionType = reason,
CurStoryLineId = (uint)curId,
};

View File

@@ -15,12 +15,12 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Mission
{
public PacketStoryLineInfoScNotify(PlayerInstance player) : base(CmdIds.StoryLineInfoScNotify)
{
var storyLineIdList = player.StoryLineManager!.StoryLineData.RunningStoryLines.Keys.Select(x => (uint)x).ToList();
storyLineIdList.Insert(0, 0);
var storyLineIdList = player.StoryLineManager?.StoryLineData.RunningStoryLines.Keys.Select(x => (uint)x).ToList();
storyLineIdList?.Insert(0, 0);
var proto = new StoryLineInfoScNotify
{
CurStoryLineId = (uint)player.StoryLineManager!.StoryLineData.CurStoryLineId,
CurStoryLineId = (uint)(player.StoryLineManager?.StoryLineData.CurStoryLineId ?? 0),
RunningStoryLineIdList = { storyLineIdList },
};

View File

@@ -6,20 +6,16 @@ namespace EggLink.DanhengServer.Server.Packet.Send.Scene
{
public class PacketEnterSceneByServerScNotify : BasePacket
{
public PacketEnterSceneByServerScNotify(SceneInstance scene, EnterSceneReasonStatus reason = EnterSceneReasonStatus.EnterSceneReasonNone) : base(CmdIds.EnterSceneByServerScNotify)
public PacketEnterSceneByServerScNotify(SceneInstance scene, ChangeStoryLineAction storyLineAction = ChangeStoryLineAction.None) : base(CmdIds.EnterSceneByServerScNotify)
{
var sceneInfo = scene.ToProto();
var notify = new EnterSceneByServerScNotify()
{
Scene = sceneInfo,
//Reason = reason,
Lineup = scene.Player.LineupManager!.GetCurLineup()!.ToProto(),
};
if (reason == EnterSceneReasonStatus.EnterSceneReasonChangeStoryline)
{
notify.Scene.BONACBOIIBE = 0;
}
notify.Scene.BONACBOIIBE = (uint) storyLineAction;
SetData(notify);
}