注释优化
This commit is contained in:
parent
e240563206
commit
7306c0d8b6
|
@ -8,6 +8,7 @@ import (
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// NewRoom 创建一个默认的内置游戏房间 Room
|
||||||
func NewRoom[PlayerID comparable, Player game.Player[PlayerID]](guid int64, options ...RoomOption[PlayerID, Player]) *Room[PlayerID, Player] {
|
func NewRoom[PlayerID comparable, Player game.Player[PlayerID]](guid int64, options ...RoomOption[PlayerID, Player]) *Room[PlayerID, Player] {
|
||||||
room := &Room[PlayerID, Player]{
|
room := &Room[PlayerID, Player]{
|
||||||
guid: guid,
|
guid: guid,
|
||||||
|
@ -19,47 +20,60 @@ func NewRoom[PlayerID comparable, Player game.Player[PlayerID]](guid int64, opti
|
||||||
return room
|
return room
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Room 默认的内置游戏房间实现
|
||||||
|
// - 实现了最大人数控制、房主、踢出玩家、玩家维护等功能
|
||||||
|
// - 支持并发安全和非并发安全的模式
|
||||||
type Room[PlayerID comparable, Player game.Player[PlayerID]] struct {
|
type Room[PlayerID comparable, Player game.Player[PlayerID]] struct {
|
||||||
guid int64
|
guid int64
|
||||||
owner PlayerID
|
owner PlayerID
|
||||||
noMaster bool
|
noMaster bool
|
||||||
playerLimit int
|
playerLimit int
|
||||||
players hash.Map[PlayerID, Player]
|
players hash.Map[PlayerID, Player]
|
||||||
kickCheckHandle func(id, target PlayerID) error
|
kickCheckHandle func(room *Room[PlayerID, Player], id, target PlayerID) error
|
||||||
|
|
||||||
playerJoinRoomEventHandles []game.PlayerJoinRoomEventHandle[PlayerID, Player]
|
playerJoinRoomEventHandles []game.PlayerJoinRoomEventHandle[PlayerID, Player]
|
||||||
playerLeaveRoomEventHandles []game.PlayerLeaveRoomEventHandle[PlayerID, Player]
|
playerLeaveRoomEventHandles []game.PlayerLeaveRoomEventHandle[PlayerID, Player]
|
||||||
playerKickedOutEventHandles []game.PlayerKickedOutEventHandle[PlayerID, Player]
|
playerKickedOutEventHandles []game.PlayerKickedOutEventHandle[PlayerID, Player]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetGuid 获取房间唯一标识
|
||||||
func (slf *Room[PlayerID, Player]) GetGuid() int64 {
|
func (slf *Room[PlayerID, Player]) GetGuid() int64 {
|
||||||
return slf.guid
|
return slf.guid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetPlayerLimit 获取最大玩家上限
|
||||||
func (slf *Room[PlayerID, Player]) GetPlayerLimit() int {
|
func (slf *Room[PlayerID, Player]) GetPlayerLimit() int {
|
||||||
return slf.playerLimit
|
return slf.playerLimit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetPlayer 根据玩家id获取玩家
|
||||||
func (slf *Room[PlayerID, Player]) GetPlayer(id PlayerID) Player {
|
func (slf *Room[PlayerID, Player]) GetPlayer(id PlayerID) Player {
|
||||||
return slf.players.Get(id)
|
return slf.players.Get(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetPlayers 获取所有玩家
|
||||||
func (slf *Room[PlayerID, Player]) GetPlayers() hash.MapReadonly[PlayerID, Player] {
|
func (slf *Room[PlayerID, Player]) GetPlayers() hash.MapReadonly[PlayerID, Player] {
|
||||||
return slf.players.(hash.MapReadonly[PlayerID, Player])
|
return slf.players.(hash.MapReadonly[PlayerID, Player])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetPlayerCount 获取玩家数量
|
||||||
func (slf *Room[PlayerID, Player]) GetPlayerCount() int {
|
func (slf *Room[PlayerID, Player]) GetPlayerCount() int {
|
||||||
return slf.players.Size()
|
return slf.players.Size()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsExistPlayer 房间内是否存在某玩家
|
||||||
func (slf *Room[PlayerID, Player]) IsExistPlayer(id PlayerID) bool {
|
func (slf *Room[PlayerID, Player]) IsExistPlayer(id PlayerID) bool {
|
||||||
return slf.players.Exist(id)
|
return slf.players.Exist(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsOwner 检查特定玩家是否是房主
|
||||||
|
// - 当房间为无主模式(WithRoomNoMaster)时,将会始终返回false
|
||||||
func (slf *Room[PlayerID, Player]) IsOwner(id PlayerID) bool {
|
func (slf *Room[PlayerID, Player]) IsOwner(id PlayerID) bool {
|
||||||
return !slf.noMaster && slf.owner == id
|
return !slf.noMaster && slf.owner == id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ChangeOwner 改变房主
|
||||||
|
// - 当房间为无主模式(WithRoomNoMaster)时,将不会发生任何变化
|
||||||
func (slf *Room[PlayerID, Player]) ChangeOwner(id PlayerID) {
|
func (slf *Room[PlayerID, Player]) ChangeOwner(id PlayerID) {
|
||||||
if slf.noMaster || slf.owner == id {
|
if slf.noMaster || slf.owner == id {
|
||||||
return
|
return
|
||||||
|
@ -67,6 +81,7 @@ func (slf *Room[PlayerID, Player]) ChangeOwner(id PlayerID) {
|
||||||
slf.owner = id
|
slf.owner = id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Join 控制玩家加入到该房间
|
||||||
func (slf *Room[PlayerID, Player]) Join(player Player) error {
|
func (slf *Room[PlayerID, Player]) Join(player Player) error {
|
||||||
if slf.players.Size() >= slf.playerLimit && slf.playerLimit > 0 {
|
if slf.players.Size() >= slf.playerLimit && slf.playerLimit > 0 {
|
||||||
return ErrRoomPlayerLimit
|
return ErrRoomPlayerLimit
|
||||||
|
@ -80,6 +95,7 @@ func (slf *Room[PlayerID, Player]) Join(player Player) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Leave 控制玩家离开房间
|
||||||
func (slf *Room[PlayerID, Player]) Leave(id PlayerID) {
|
func (slf *Room[PlayerID, Player]) Leave(id PlayerID) {
|
||||||
player, exist := slf.players.GetExist(id)
|
player, exist := slf.players.GetExist(id)
|
||||||
if !exist {
|
if !exist {
|
||||||
|
@ -90,13 +106,17 @@ func (slf *Room[PlayerID, Player]) Leave(id PlayerID) {
|
||||||
slf.players.Delete(player.GetID())
|
slf.players.Delete(player.GetID())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KickOut 以某种原因踢出特定玩家
|
||||||
|
// - 当设置了房间踢出玩家的检查处理函数(WithRoomKickPlayerCheckHandle)时,将会根据检查结果进行处理,即便是无主模式。其他情况如下
|
||||||
|
// - 如果是无主模式(WithRoomNoMaster),将会返回错误
|
||||||
|
// - 如果不是房主发起的踢出玩家,将会返回错误
|
||||||
func (slf *Room[PlayerID, Player]) KickOut(id, target PlayerID, reason string) error {
|
func (slf *Room[PlayerID, Player]) KickOut(id, target PlayerID, reason string) error {
|
||||||
player, exist := slf.players.GetExist(target)
|
player, exist := slf.players.GetExist(target)
|
||||||
if !exist {
|
if !exist {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if slf.kickCheckHandle != nil {
|
if slf.kickCheckHandle != nil {
|
||||||
if err := slf.kickCheckHandle(id, target); err != nil {
|
if err := slf.kickCheckHandle(slf, id, target); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if slf.noMaster {
|
} else if slf.noMaster {
|
||||||
|
@ -110,6 +130,7 @@ func (slf *Room[PlayerID, Player]) KickOut(id, target PlayerID, reason string) e
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegPlayerJoinRoomEvent 玩家进入房间时将立即执行被注册的事件处理函数
|
||||||
func (slf *Room[PlayerID, Player]) RegPlayerJoinRoomEvent(handle game.PlayerJoinRoomEventHandle[PlayerID, Player]) {
|
func (slf *Room[PlayerID, Player]) RegPlayerJoinRoomEvent(handle game.PlayerJoinRoomEventHandle[PlayerID, Player]) {
|
||||||
slf.playerJoinRoomEventHandles = append(slf.playerJoinRoomEventHandles, handle)
|
slf.playerJoinRoomEventHandles = append(slf.playerJoinRoomEventHandles, handle)
|
||||||
}
|
}
|
||||||
|
@ -120,6 +141,7 @@ func (slf *Room[PlayerID, Player]) OnPlayerJoinRoomEvent(player Player) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegPlayerLeaveRoomEvent 玩家离开房间时将立即执行被注册的事件处理函数
|
||||||
func (slf *Room[PlayerID, Player]) RegPlayerLeaveRoomEvent(handle game.PlayerLeaveRoomEventHandle[PlayerID, Player]) {
|
func (slf *Room[PlayerID, Player]) RegPlayerLeaveRoomEvent(handle game.PlayerLeaveRoomEventHandle[PlayerID, Player]) {
|
||||||
slf.playerLeaveRoomEventHandles = append(slf.playerLeaveRoomEventHandles, handle)
|
slf.playerLeaveRoomEventHandles = append(slf.playerLeaveRoomEventHandles, handle)
|
||||||
}
|
}
|
||||||
|
@ -130,6 +152,7 @@ func (slf *Room[PlayerID, Player]) OnPlayerLeaveRoomEvent(player Player) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegPlayerKickedOutEvent 当玩家被踢出游戏时将立即执行被注册的事件处理函数
|
||||||
func (slf *Room[PlayerID, Player]) RegPlayerKickedOutEvent(handle game.PlayerKickedOutEventHandle[PlayerID, Player]) {
|
func (slf *Room[PlayerID, Player]) RegPlayerKickedOutEvent(handle game.PlayerKickedOutEventHandle[PlayerID, Player]) {
|
||||||
slf.playerKickedOutEventHandles = append(slf.playerKickedOutEventHandles, handle)
|
slf.playerKickedOutEventHandles = append(slf.playerKickedOutEventHandles, handle)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,9 +29,9 @@ func WithRoomNoMaster[PlayerID comparable, Player game.Player[PlayerID]]() RoomO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRoomKickPlayerCheckHandle 设置房间提出玩家的检查处理函数
|
// WithRoomKickPlayerCheckHandle 设置房间踢出玩家的检查处理函数
|
||||||
// - 当没有设置该函数时,如果不是房主,将无法进行踢出
|
// - 当没有设置该函数时,如果不是房主,将无法进行踢出
|
||||||
func WithRoomKickPlayerCheckHandle[PlayerID comparable, Player game.Player[PlayerID]](handle func(id, target PlayerID) error) RoomOption[PlayerID, Player] {
|
func WithRoomKickPlayerCheckHandle[PlayerID comparable, Player game.Player[PlayerID]](handle func(room *Room[PlayerID, Player], id, target PlayerID) error) RoomOption[PlayerID, Player] {
|
||||||
return func(room *Room[PlayerID, Player]) {
|
return func(room *Room[PlayerID, Player]) {
|
||||||
room.kickCheckHandle = handle
|
room.kickCheckHandle = handle
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue