Files
DanhengServer-OpenSource/GameServer/Game/MatchThree/MatchThreeRoomInstance.cs
2024-11-30 18:38:18 +08:00

110 lines
3.2 KiB
C#

using EggLink.DanhengServer.GameServer.Game.MatchThree.Member;
using EggLink.DanhengServer.GameServer.Game.Player;
using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lobby;
using EggLink.DanhengServer.Proto;
namespace EggLink.DanhengServer.GameServer.Game.MatchThree;
public class MatchThreeRoomInstance(int roomId, FightGameMode mode)
{
public List<MatchThreeMemberInstance> Members { get; set; } = [];
public int RoomId { get; set; } = roomId;
public FightGameMode GameMode { get; set; } = mode;
public bool InMatch { get; set; }
public async ValueTask AddMember(MatchThreeMemberInstance member)
{
Members.Add(member);
if (Members.Count == 1) // reroll a leader
{
Members.First().CharacterType = LobbyCharacterType.LobbyCharacterLeader;
}
await SyncInfo(LobbyModifyType.JoinLobby);
}
public async ValueTask RemoveMember(MatchThreeMemberInstance member)
{
Members.Remove(member);
if (member.CharacterType == LobbyCharacterType.LobbyCharacterLeader) // reroll a leader
{
if (Members.Count != 0)
{
Members.First().CharacterType = LobbyCharacterType.LobbyCharacterLeader;
}
}
await SyncInfo(LobbyModifyType.QuitLobby);
}
public async ValueTask AddMember(PlayerInstance player, int birdId, LobbyCharacterType characterType)
{
await AddMember(new MatchThreeMemberInstance(player, birdId, characterType, this));
}
public MatchThreeMemberInstance? GetMemberByUid(int uid)
{
return Members.Find(member => member.Player.Uid == uid);
}
public async ValueTask ModifyPlayerInfo(PlayerInstance player, PlayerExtraInfo extraInfo, LobbyModifyType modifyType)
{
var member = GetMemberByUid(player.Uid);
if (member == null) return;
member.Bird.BirdId = (int)extraInfo.GameBirdInfo.BirdId;
member.Status = modifyType == LobbyModifyType.Operating ? LobbyCharacterStatus.Operating : LobbyCharacterStatus.Idle;
await SyncInfo(modifyType);
}
public async ValueTask StartMatch()
{
InMatch = true;
foreach (var member in Members)
{
member.Status = LobbyCharacterStatus.Matching;
}
await SyncInfo(LobbyModifyType.Match);
if (!MatchThreeService.MatchingThread.IsAlive)
MatchThreeService.MatchingThread.Start();
}
public async ValueTask CancelMatch()
{
InMatch = false;
foreach (var member in Members)
{
member.Status = LobbyCharacterStatus.Idle;
}
await SyncInfo(LobbyModifyType.CancelMatch);
}
public async ValueTask DestroyRoom(LobbyModifyType type)
{
InMatch = false;
foreach (var member in Members)
{
member.Status = LobbyCharacterStatus.Fighting;
}
await SyncInfo(type);
}
public async ValueTask SyncInfo(LobbyModifyType modifyType = LobbyModifyType.None)
{
foreach (var member in Members)
{
await member.Player.SendPacket(new PacketLobbySyncInfoScNotify(this, member.Player.Uid, modifyType));
}
}
}