Fix: Proper challenge monster spawn

This commit is contained in:
WatchAndyTW
2024-05-22 18:50:49 +08:00
parent 7c93eca33f
commit 487ad7c8b7
6 changed files with 114 additions and 3 deletions

View File

@@ -23,5 +23,6 @@
public const int STAMINA_RESERVE_RECOVERY_TIME = 1080; // 18 minutes
public const int CHALLENGE_ENTRANCE = 100000103;
public const int CHALLENGE_STORY_ENTRANCE = 102020107;
}
}

View File

@@ -0,0 +1,102 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Config;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Game.Player;
using EggLink.DanhengServer.Game.Scene;
using EggLink.DanhengServer.Game.Scene.Entity;
using EggLink.DanhengServer.Util;
namespace EggLink.DanhengServer.Game.Challenge
{
public class ChallengeEntityLoader(SceneInstance scene, PlayerInstance player) : SceneEntityLoader(scene)
{
public PlayerInstance Player = player;
public override void LoadEntity()
{
if (Scene.IsLoaded) return;
// Get challenge instance
if (Player.ChallengeInstance == null) return;
ChallengeInstance instance = Player.ChallengeInstance;
// Setup first stage
var excel = instance.Excel;
Scene.FloorInfo!.Groups.TryGetValue(excel.MazeGroupID1, out var groupData);
if (groupData != null)
{
LoadGroup(groupData);
};
// Set leave entry
Scene.LeaveEntityId = instance.IsStory() ? GameConstants.CHALLENGE_STORY_ENTRANCE : GameConstants.CHALLENGE_ENTRANCE;
foreach (var group in Scene.FloorInfo.Groups.Values)
{
// Skip non-server groups
if (group.LoadSide != Enums.Scene.GroupLoadSideEnum.Server) continue;
// Dont load the groups that have monsters in them
if (group.PropList.Count > 0 && group.MonsterList.Count > 0)
{
LoadGroup(group);
}
}
Scene.IsLoaded = true;
}
public override EntityMonster? LoadMonster(MonsterInfo info, GroupInfo group, bool sendPacket = false)
{
if (info.IsClientOnly || info.IsDelete)
{
return null;
}
Console.WriteLine(0);
// Get challenge instance
if (Player.ChallengeInstance == null) return null;
ChallengeInstance instance = Player.ChallengeInstance;
Console.WriteLine(1);
// Get current stage monster infos
Dictionary<int, ChallengeConfigExcel.ChallengeMonsterInfo> challengeMonsters;
if (instance.Excel.MazeGroupID1 == group.Id)
{
challengeMonsters = instance.Excel.ChallengeMonsters1;
}
else if (instance.Excel.MazeGroupID2 == group.Id)
{
challengeMonsters = instance.Excel.ChallengeMonsters2;
}
else
{
return null;
}
Console.WriteLine(2);
// Get challenge monster info
if (!challengeMonsters.ContainsKey(info.ID)) return null;
var challengeMonsterInfo = challengeMonsters[info.ID];
Console.WriteLine(3);
// Get excels from game data
if (!GameData.NpcMonsterDataData.ContainsKey(challengeMonsterInfo.NpcMonsterId)) return null;
NPCMonsterDataExcel npcMonsterExcel = GameData.NpcMonsterDataData[challengeMonsterInfo.NpcMonsterId];
Console.WriteLine(4);
// Create monster from group monster info
EntityMonster entity = new EntityMonster(scene, info.ToPositionProto(), info.ToRotationProto(), group.Id, info.ID, npcMonsterExcel, info);
entity.EventID = challengeMonsterInfo.EventId;
entity.CustomStageID = challengeMonsterInfo.EventId;
Scene.AddEntity(entity, sendPacket);
return entity;
}
public override EntityNpc? LoadNpc(NpcInfo info, GroupInfo group, bool sendPacket = false)
{
return null;
}
}
}

View File

@@ -140,7 +140,7 @@ namespace EggLink.DanhengServer.Game.Challenge
foreach (var id in Excel.StoryExcel.BattleTargetID!)
{
battle.AddBattleTarget(1, id, GetTotalScore(), 0);
battle.AddBattleTarget(5, id, GetTotalScore(), 0);
}
}
}

View File

@@ -76,7 +76,6 @@ namespace EggLink.DanhengServer.Game.Challenge
Player.ChallengeInstance = instance;
// Set first lineup before we enter scenes
instance.SetCurrentExtraLineup(ExtraLineupType.LineupChallenge);
Player.LineupManager!.SetCurLineup(instance.CurrentExtraLineup);
// Enter scene

View File

@@ -4,6 +4,7 @@ using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Game.Battle;
using EggLink.DanhengServer.Game.Challenge;
using EggLink.DanhengServer.Game.ChessRogue.Cell;
using EggLink.DanhengServer.Game.Player;
using EggLink.DanhengServer.Game.Rogue.Scene;
@@ -27,6 +28,7 @@ namespace EggLink.DanhengServer.Game.Scene
public int PlaneId;
public int EntryId;
public int LeaveEntityId;
public int LastEntityId;
public bool IsLoaded = false;
@@ -46,6 +48,7 @@ namespace EggLink.DanhengServer.Game.Scene
PlaneId = excel.PlaneID;
FloorId = floorId;
EntryId = entryId;
LeaveEntityId = 0;
SyncLineup(true, true);
@@ -64,6 +67,9 @@ namespace EggLink.DanhengServer.Game.Scene
EntityLoader = new RogueEntityLoader(this, Player);
}
break;
case Enums.Scene.PlaneTypeEnum.Challenge:
EntityLoader = new ChallengeEntityLoader(this, Player);
break;
default:
EntityLoader = new(this);
break;

View File

@@ -24,7 +24,10 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Challenge
// Leave scene
player.LineupManager.SetCurLineup(0);
player.EnterScene(GameConstants.CHALLENGE_ENTRANCE, 0, true);
int leaveEntryId = GameConstants.CHALLENGE_ENTRANCE;
if (player.SceneInstance.LeaveEntityId != 0) leaveEntryId = player.SceneInstance.LeaveEntityId;
player.EnterScene(leaveEntryId, 0, true);
}
connection.SendPacket(CmdIds.LeaveChallengeScRsp);