mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-03 04:36:03 +08:00
Fix bug
- Still many bugs
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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 },
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user