feat: add minigame room player service
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
053a95b4fb
commit
31afce6882
@@ -34,8 +34,24 @@ namespace XWorld.Framework.Tests
|
||||
SelfPlayerId = 1001,
|
||||
Players =
|
||||
{
|
||||
new PlayerInfo { PlayerId = 1001, Name = "Alice", IsAI = false },
|
||||
new PlayerInfo { PlayerId = -1, Name = "AI", IsAI = true },
|
||||
new PlayerInfo
|
||||
{
|
||||
PlayerId = 1001,
|
||||
Name = "Alice",
|
||||
IsAI = false,
|
||||
Level = 12,
|
||||
AppearanceType = 3,
|
||||
AvatarId = 77,
|
||||
},
|
||||
new PlayerInfo
|
||||
{
|
||||
PlayerId = -1,
|
||||
Name = "AI",
|
||||
IsAI = true,
|
||||
Level = 1,
|
||||
AppearanceType = 0,
|
||||
AvatarId = 0,
|
||||
},
|
||||
},
|
||||
};
|
||||
var d = MatchFoundMsg.Decode(m.Encode());
|
||||
@@ -46,8 +62,13 @@ namespace XWorld.Framework.Tests
|
||||
Assert.Equal(1001, d.Players[0].PlayerId);
|
||||
Assert.Equal("Alice", d.Players[0].Name);
|
||||
Assert.False(d.Players[0].IsAI);
|
||||
Assert.Equal(12, d.Players[0].Level);
|
||||
Assert.Equal(3, d.Players[0].AppearanceType);
|
||||
Assert.Equal(77, d.Players[0].AvatarId);
|
||||
Assert.Equal(-1, d.Players[1].PlayerId);
|
||||
Assert.Equal("AI", d.Players[1].Name);
|
||||
Assert.True(d.Players[1].IsAI);
|
||||
Assert.Equal(1, d.Players[1].Level);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -169,5 +190,35 @@ namespace XWorld.Framework.Tests
|
||||
Assert.NotNull(d.Players);
|
||||
Assert.Empty(d.Players);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MatchFound_DecodesLegacyPlayersWithoutDisplayFields()
|
||||
{
|
||||
var w = new PacketWriter();
|
||||
w.WriteString("legacy-room");
|
||||
w.WriteVarInt(1);
|
||||
w.WriteVarInt(1001);
|
||||
w.WriteVarUInt(2);
|
||||
w.WriteVarInt(1001);
|
||||
w.WriteString("LegacyAlice");
|
||||
w.WriteBool(false);
|
||||
w.WriteVarInt(-1);
|
||||
w.WriteString("AI");
|
||||
w.WriteBool(true);
|
||||
|
||||
MatchFoundMsg d = MatchFoundMsg.Decode(w.ToArray());
|
||||
|
||||
Assert.Equal("legacy-room", d.RoomId);
|
||||
Assert.Equal(2, d.Players.Count);
|
||||
Assert.Equal(1001, d.Players[0].PlayerId);
|
||||
Assert.Equal("LegacyAlice", d.Players[0].Name);
|
||||
Assert.False(d.Players[0].IsAI);
|
||||
Assert.Equal(0, d.Players[0].Level);
|
||||
Assert.Equal(0, d.Players[0].AppearanceType);
|
||||
Assert.Equal(0, d.Players[0].AvatarId);
|
||||
Assert.Equal(-1, d.Players[1].PlayerId);
|
||||
Assert.Equal("AI", d.Players[1].Name);
|
||||
Assert.True(d.Players[1].IsAI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
using System.Collections.Generic;
|
||||
using Xunit;
|
||||
using XWorld.Framework;
|
||||
|
||||
namespace XWorld.Framework.Tests
|
||||
{
|
||||
public class RoomPlayerServiceTests
|
||||
{
|
||||
[Fact]
|
||||
public void SetRoomPlayers_StoresSnapshotAndSupportsLookup()
|
||||
{
|
||||
var service = new RoomPlayerService();
|
||||
var source = new List<PlayerInfo>
|
||||
{
|
||||
new PlayerInfo
|
||||
{
|
||||
PlayerId = 10,
|
||||
Name = "Alice",
|
||||
IsAI = false,
|
||||
Level = 7,
|
||||
AppearanceType = 2,
|
||||
AvatarId = 100,
|
||||
},
|
||||
new PlayerInfo
|
||||
{
|
||||
PlayerId = -1,
|
||||
Name = "AI",
|
||||
IsAI = true,
|
||||
Level = 1,
|
||||
AppearanceType = 0,
|
||||
AvatarId = 0,
|
||||
},
|
||||
};
|
||||
|
||||
service.SetRoomPlayers(source);
|
||||
source[0].Name = "Mutated";
|
||||
|
||||
IReadOnlyList<PlayerInfo> players = service.GetRoomPlayers();
|
||||
|
||||
Assert.Equal(2, players.Count);
|
||||
Assert.Equal("Alice", players[0].Name);
|
||||
Assert.True(service.TryGetRoomPlayer(10, out PlayerInfo alice));
|
||||
Assert.Equal(7, alice.Level);
|
||||
Assert.Equal(2, alice.AppearanceType);
|
||||
Assert.Equal(100, alice.AvatarId);
|
||||
Assert.True(service.TryGetRoomPlayer(-1, out PlayerInfo ai));
|
||||
Assert.True(ai.IsAI);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReturnedPlayers_AreDefensiveCopies()
|
||||
{
|
||||
var service = new RoomPlayerService();
|
||||
service.SetRoomPlayers(new[]
|
||||
{
|
||||
new PlayerInfo { PlayerId = 10, Name = "Alice", IsAI = false },
|
||||
});
|
||||
|
||||
IReadOnlyList<PlayerInfo> first = service.GetRoomPlayers();
|
||||
first[0].Name = "Changed";
|
||||
|
||||
IReadOnlyList<PlayerInfo> second = service.GetRoomPlayers();
|
||||
Assert.Equal("Alice", second[0].Name);
|
||||
|
||||
Assert.True(service.TryGetRoomPlayer(10, out PlayerInfo lookup));
|
||||
lookup.Name = "ChangedAgain";
|
||||
Assert.True(service.TryGetRoomPlayer(10, out PlayerInfo lookupAgain));
|
||||
Assert.Equal("Alice", lookupAgain.Name);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RequestPlayerInfo_ReturnsCachedPlayerOrNull()
|
||||
{
|
||||
var service = new RoomPlayerService();
|
||||
service.SetRoomPlayers(new[]
|
||||
{
|
||||
new PlayerInfo { PlayerId = 10, Name = "Alice", IsAI = false, Level = 5 },
|
||||
});
|
||||
|
||||
PlayerInfo? loaded = null;
|
||||
service.RequestPlayerInfo(10, p => loaded = p);
|
||||
|
||||
Assert.NotNull(loaded);
|
||||
Assert.Equal("Alice", loaded.Name);
|
||||
Assert.Equal(5, loaded.Level);
|
||||
|
||||
PlayerInfo? missing = new PlayerInfo { PlayerId = 99, Name = "should be replaced" };
|
||||
service.RequestPlayerInfo(99, p => missing = p);
|
||||
Assert.Null(missing);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SetRoomPlayers_NullClearsTheRoom()
|
||||
{
|
||||
var service = new RoomPlayerService();
|
||||
service.SetRoomPlayers(new[]
|
||||
{
|
||||
new PlayerInfo { PlayerId = 10, Name = "Alice", IsAI = false },
|
||||
});
|
||||
|
||||
service.SetRoomPlayers(null);
|
||||
|
||||
Assert.Empty(service.GetRoomPlayers());
|
||||
Assert.False(service.TryGetRoomPlayer(10, out _));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user