Files
hjha-server/GameModule/FriendRoom/DoJoinFriendRoom.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

346 lines
13 KiB
C#

using Server.Pack;
using Server.Data;
using GameData;
using MrWu.Debug;
using Game.Player;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using GameDAL.FriendRoom;
using Server.Core;
using GameMessage;
namespace Server
{
/// <summary>
/// 朋友房管理
/// </summary>
public partial class FriendRoomManager
{
/// <summary>
/// 处理加入到某个朋友房的桌子
/// </summary>
public class DoJoinFriendRoom
{
/// <summary>
/// 是否加入成功
/// </summary>
public bool result;
/// <summary>
/// 如果加入失败,失败提示
/// </summary>
public string errinfo;
/// <summary>
/// 错误码
/// </summary>
public int errorCode;
/// <summary>
/// 房间所在的模块,当房间不在本模块时有值
/// </summary>
public ServerNode desknode;
/// <summary>
/// 包头
/// </summary>
public readonly PackHead head;
/// <summary>
/// 加入房间的包裹
/// </summary>
public readonly JoinRoom jpk;
/// <summary>
/// 如果是竞技比赛房间,是否要询问,竞技比赛该玩家可不可以加入该房间
/// </summary>
public readonly bool checkClub;
/// <summary>
/// 是否自动进入房间
/// </summary>
public readonly bool isAuto;
/// <summary>
/// 是否是竞技比赛
/// </summary>
public readonly bool isClub;
/// <summary>
/// 玩家所在俱乐部
/// </summary>
public int ClubId;
/// <summary>
/// 玩家的俱乐部分数
/// </summary>
public double Score;
public bool IsTestPack;
public List<int> SeatmateLimitList;
/// <summary>
/// 处理朋友房的加入
/// </summary>
/// <param name="head">包头</param>
/// <param name="jpk">包</param>
/// <param name="checkClub">检查竞技比赛</param>
/// <param name="jfr"></param>
/// <param name="isClub"></param>
public DoJoinFriendRoom(PackHead head, JoinRoom jpk, JoinFriendRoom jfr, bool checkClub = false,
bool isClub = false)
{
this.head = head;
this.jpk = jpk;
this.checkClub = checkClub;
this.isAuto = jfr == null ? false : jfr.isAuto == 1;
this.isClub = isClub;
this.ClubId = jfr == null ? 0 : jfr.ClubId;
this.Score = jfr == null ? 0 : jfr.Score;
SeatmateLimitList = jfr?.SeatmateLimitList ?? new List<int>();
}
/// <summary>
/// 没有这个房间的处理
/// </summary>
void NoDesk(string weiyima, int roomnum)
{
this.result = false;
errinfo = "无此房间,请重试!";
errorCode = MessageErrCode.ClubJoinDeskNotDesk;
/*
if (!isAuto)
{
Debug.Error("无此房间号:" + weiyima + "," + roomnum + "," + isClub);
//没有这个房间号
SendManager.SendErrorInfo_Socket(head.userid, 0, 4, head.GetModuleUtil());
}
else
{
Debug.Warning("自动进入,进不去,退出游戏!");
var tmp = PlayerCollection.instance.FindPlayer_Userid(head.userid);
if (tmp == null)
{
Debug.Error("玩家加入房间时 -找不到玩家:" + tmp.userid);
}
else
GameManager.instance.QuitGame(tmp, "NoDesk");
}
*/
}
void InDesk()
{
PlayerDataAsyc pl = PlayerCollection.Instance.FindPlayerByUserId(head.userid);
if (pl == null)
{
result = false;
errinfo = "请求失败,请稍后再试!";
Debug.Error("服务器错误登录了却没找到人:" + head.userid);
PlayerFun.UnLockPlayer(head.userid, GameBase.instance.myUtil, false);
return;
}
int rmnum;
pl.ClubId = this.ClubId;
pl.ClubScore = this.Score;
if (int.TryParse(jpk.roomNum, out rmnum)
&& instance.ting.InTing(pl, instance.room.id, ref errinfo, ref errorCode,rmnum, jpk.pwd, isClub))
{
Desk dsk = instance.FindDesk(pl.friendRoomNum);
if (dsk == null)
{
Debug.Error("服务器错误!dsk not find");
}
else
{
dsk.SendPlayersinfo(2, pl.userid, pl.nickname);
}
result = true;
#if DEBUG
pl.IsTest = IsTestPack;
#endif
}
else
{
Debug.Error($"InTing Error errorCode:{errorCode} errinfo:{errinfo}");
result = false;
GameManager.instance.QuitGame(pl, "InDesk", false);
}
}
/// <summary>
/// 开始处理
/// </summary>
/// <returns></returns>
public async Task Start()
{
if (this.jpk == null)
{
Debug.Error("客户端发包错误!");
this.result = false;
errinfo = "请求失败!";
errorCode = MessageErrCode.ClubJoinDeskUnknow;
return;
}
int roomnum;
if (!int.TryParse(jpk.roomNum, out roomnum))
{
Debug.Warning("房间号不是数字:" + jpk.roomNum);
this.result = false;
errinfo = "请求失败!";
errorCode = MessageErrCode.ClubJoinDeskNumError;
return;
}
var desk = instance.FindDesk(int.Parse(jpk.roomNum));
if ((!isClub && desk != null && desk.deskinfo != null && desk.deskinfo.creatStyle == 5))
{
Debug.Warning("房间号无效,加入失败!");
//xu add 修改玩家输入房号不能加入俱乐部的桌子 2021年1月5日
result = false;
errinfo = "房间号无效,加入失败!";
errorCode = MessageErrCode.ClubJoinDeskNumError;
return;
}
if (isClub)
{
/*
* 0731 --over
* 上次写了一个脚本,里面有个方法是检查玩家是否属于禁止同桌的组
* 这里调用下,如果不能加入
* 则运行下面这段代码
* result = false;
errinfo = "反作弊检查,禁止加入房间!";
yield break;
*
*
* */
if (desk != null && desk.deskinfo != null && desk.deskinfo.creatStyle == 5)
{
int[] user = new int[desk.deskinfo.nowPlayerCnt];
int idx = 0;
for (int i = 0; i < desk.deskinfo.pls.Length; i++)
{
if (desk.deskinfo.pls[i] != null)
{
user[idx++] = desk.deskinfo.pls[i].userid;
}
}
if (!ClubSeatmate.CheckSeatmate(SeatmateLimitList, user))
{
Debug.Warning("反作弊检查,禁止加入房间!");
result = false;
errinfo = "反作弊检查,禁止加入房间!";
errorCode = MessageErrCode.ClubJoinDeskNotAllowed;
return;
}
}
if (checkClub)
{
//如果要检查玩家是否可以加入该竞技比赛房间
//检查之后再回来
if (desk != null && desk.deskinfo != null && desk.deskinfo.creatStyle == 5)
{
//竞技比赛房间房间
CheckClub checkclub = new CheckClub(head.userid, desk.deskinfo.creatUserid);
await checkclub.Start();
if (!checkclub.result)
{
Debug.Warning("禁止加入房间!");
result = false;
errinfo = checkclub.errinfo;
errorCode = MessageErrCode.ClubJoinDeskNotAllowed;
return;
}
}
}
}
string weiyima = null;
ServerNode node = null;
//没有这个房间
if (!Room.GetWeiyima(roomnum, ref weiyima, ref node))
{
Debug.Warning("没有这个房间!");
NoDesk(weiyima, roomnum);
}
else
{
//有这个房间
if (GlobalManager.instance.myUtil.Equals(node))
{
LoginInfo loginInfo = LoginInfo.Create(head.userid, true, head.GetUtil(), head.ip,jpk.deviceinfo,head.clientVer,head);
await LoginManager.Instance.Start(loginInfo);
bool result = loginInfo.Result;
loginInfo.Dispose();
loginInfo = null;
//登录成功
if (result)
{
Debug.Info($"加入桌子:{roomnum}");
InDesk();
}
else
{
Debug.Warning($"请求失败,请稍后再试!");
result = false;
errorCode = MessageErrCode.ClubJoinDeskUnknow;
//errinfo = "请求失败,请稍后再试!";
}
/*
bool isLogin = isAuto;
if (!isLogin)
{
GameManager.Login login = new GameManager.Login(head.userid, true, head.GetModuleUtil(), head.ip, jpk.deviceinfo, head.clientVer);
yield return login.Start();
isLogin = login.result;
}
//本模块的房间
if (isLogin)
{//登录成功
InDesk();
}
else
{
}
*/
}
else
{
Debug.Log("kkkkk");
result = false;
desknode = node;
/*
//其他模块的房间 RPC 去配置模块拿游戏名称,发送给客户端..
if (isAuto)
{
Debug.Error("怎么可能,自动进入的房间怎么会是其他模块管理的!");
yield break;
}
bool isDie = ServerHeart.instanece.IsDie(node.id, node.nodeNum);
Coroutine.StartCoroutine(instance.SendGameTip(head, isDie, node.id));
*/
}
}
return;
}
}
}
}