mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
Fix: Proper challenge monster spawn
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
102
GameServer/Game/Challenge/ChallengeEntityLoader.cs
Normal file
102
GameServer/Game/Challenge/ChallengeEntityLoader.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user