fix: 크로스 프로젝트 통신 버그 수정

- Tokens 타입 string? → Dictionary<string,string>? (Go API JSON object 역직렬화 실패 수정)
- 409 응답 핸들러 return false → return null (컴파일 에러 수정)
- INTO_BOSS_RAID 파티원 각자에게 본인 토큰과 함께 전달 (기존: 파티장에게 N번 중복)
- GetPlayer null 체크 추가 (NullReferenceException 방지)
- BossId 하드코딩 1 → packet.RaidId 사용
- Player 클래스에 Experience/AttackPower 등 전투 스탯 필드 추가
- ToPlayerInfo에서 새 필드 매핑 추가
- OnIntoChannelParty Nickname을 Session.UserName에서 가져오도록 수정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-17 00:20:20 +09:00
parent 39ef81d48a
commit a5eedb2fb2
4 changed files with 68 additions and 11 deletions

View File

@@ -406,7 +406,12 @@ public class GameServer : ServerBase
Mp = player.Mp,
MaxMp = player.MaxMp,
Position = new Position { X = player.PosX, Y = player.PosY, Z = player.PosZ },
RotY = player.RotY
RotY = player.RotY,
Experience = player.Experience,
NextExp = player.NextExp,
AttackPower = player.AttackPower,
AttackRange = player.AttackRange,
SprintMultiplier = player.SprintMultiplier
};
}
@@ -574,12 +579,17 @@ public class GameServer : ServerBase
if (memberPeer != null)
{
// 세션에서 username 조회
string nickname = memberPeer.Tag is Session s && !string.IsNullOrEmpty(s.UserName)
? s.UserName
: memberId.ToString();
// 새 채널에 유저 추가
Player newPlayer = new()
{
HashKey = memberId,
PlayerId = memberId,
Nickname = memberId.ToString()
Nickname = nickname
};
cm.AddUser(packet.ChannelId, memberId, newPlayer, memberPeer);
@@ -1073,10 +1083,16 @@ public class GameServer : ServerBase
List<string> userNames = new List<string>();
foreach (int memberId in party.PartyMemberIds)
{
userNames.Add(channel.GetPlayer(memberId).Nickname);
Player? member = channel.GetPlayer(memberId);
if (member == null)
{
continue;
}
userNames.Add(member.Nickname);
}
BossRaidResult? result = await RestApi.Instance.BossRaidAccesssAsync(userNames, 1);
BossRaidResult? result = await RestApi.Instance.BossRaidAccesssAsync(userNames, packet.RaidId);
// 입장 실패
if (result == null || result.BossId <= 0)
@@ -1143,11 +1159,13 @@ public class GameServer : ServerBase
SendTo(memberPeer, PacketSerializer.Serialize((ushort)PacketCode.CHANGE_MAP, response));
// 모두에게 레이드로 이동 (할당된 실제 레이드 맵 ID 전달)
SendTo(peer,
// 각 파티원에게 레이드 입장 정보 전달 (본인의 토큰 포함)
string? memberToken = null;
result.Tokens?.TryGetValue(memberPlayer.Nickname, out memberToken);
SendTo(memberPeer,
PacketSerializer.Serialize((ushort)PacketCode.INTO_BOSS_RAID,
new IntoBossRaidPacket
{ RaidId = assignedRaidMapId, IsSuccess = true, Session = result.SessionName, Token = result.Tokens }));
{ RaidId = assignedRaidMapId, IsSuccess = true, Session = result.SessionName, Token = memberToken }));
}
Log.Debug("[GameServer] INTO_BOSS_RAID HashKey={Key} PartyId={PartyId} AssignedRaidMapId={RaidId}", hashKey, party.PartyId,